diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..7987c32 Binary files /dev/null and b/.DS_Store differ diff --git a/Stage.lh b/Stage.lh new file mode 100644 index 0000000..79a2f03 --- /dev/null +++ b/Stage.lh @@ -0,0 +1,41957 @@ +{ + "_$ver": 1, + "_$id": "wqmu50ko", + "_$type": "Box", + "name": "Stage", + "width": 1080, + "height": 1920, + "_mouseState": 2, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "_$comp": [ + { + "_$type": "692a672b-2457-456c-8093-321ea7a10e1b", + "scriptPath": "../src/views/Stage.ts", + "btn_back": { + "_$ref": "pg501bsr" + }, + "btn_new": null, + "btn_pause": { + "_$ref": "m2fmtqrc" + }, + "obj_mask": { + "_$ref": "n15hk529" + }, + "label_score": { + "_$ref": "zgzyqyoc" + }, + "label_mistake": { + "_$ref": "azfx9pw2" + }, + "label_name": { + "_$ref": "qxei5ih3" + }, + "label_time": { + "_$ref": "m5cdq70n" + }, + "obj_blocks": { + "_$ref": "rco09ofg" + }, + "obj_pos": { + "_$ref": "rebw0lhh" + }, + "obj_candys": { + "_$ref": "2gza421u" + }, + "btn_undo": { + "_$ref": "uug6jz7y" + }, + "btn_erase": { + "_$ref": "ll1f1ee0" + }, + "btn_note": { + "_$ref": "umtydjve" + }, + "btn_hint": { + "_$ref": "ox4vivq3" + } + } + ], + "_$child": [ + { + "_$id": "xllpjjqz", + "_$type": "Box", + "name": "top", + "y": 60, + "width": 1080, + "height": 64, + "_mouseState": 2, + "centerX": 0, + "centerY": -868, + "_$child": [ + { + "_$id": "pg501bsr", + "_$type": "Box", + "name": "btn_back", + "x": 15, + "width": 69, + "height": 48, + "_mouseState": 2, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "ij5lctcm", + "_$type": "Image", + "name": "Image", + "width": 69, + "height": 48, + "mouseThrough": true, + "skin": "res://06a9c4a8-d664-4f3a-9c35-25b610195ced", + "useSourceSize": true, + "color": "#ffffff" + } + ] + }, + { + "_$id": "m2fmtqrc", + "_$type": "Box", + "name": "btn_pause", + "x": 990, + "width": 200, + "height": 200, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "5uhu17g4", + "_$type": "Image", + "name": "Image", + "width": 84, + "height": 84, + "mouseThrough": true, + "skin": "res://7d36066d-f01a-4a46-9eb7-109f58cdbc19", + "useSourceSize": true, + "color": "#ffffff" + } + ] + } + ] + }, + { + "_$id": "jtbep2gl", + "_$type": "Box", + "name": "Center", + "x": 15, + "y": 317, + "width": 1050, + "height": 1050, + "_mouseState": 2, + "centerX": 0, + "centerY": -118, + "_$child": [ + { + "_$id": "zgzyqyoc", + "_$type": "Label", + "name": "label_score", + "x": 375, + "y": -113, + "width": 300, + "height": 48, + "centerX": 0, + "centerY": -614, + "text": "Score:999", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(29, 92, 220, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "azfx9pw2", + "_$type": "Label", + "name": "label_mistake", + "y": -65, + "width": 300, + "height": 60, + "left": 0, + "centerY": -560, + "text": "mistake:3/3", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "valign": "middle" + }, + { + "_$id": "qxei5ih3", + "_$type": "Label", + "name": "label_name", + "x": 375, + "y": -65, + "width": 300, + "height": 60, + "centerX": 0, + "centerY": -560, + "text": "Hard", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "m5cdq70n", + "_$type": "Label", + "name": "label_time", + "x": 750, + "y": -65, + "width": 300, + "height": 60, + "right": 0, + "centerY": -560, + "text": "00:00:00", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "align": "right", + "valign": "middle" + }, + { + "_$id": "rco09ofg", + "_$type": "VBox", + "name": "blocks", + "width": 1050, + "height": 1050, + "space": -6, + "align": "center", + "_$child": [ + { + "_$id": "ji19nsfr", + "_$type": "HBox", + "name": "HBox(1)", + "width": 1050, + "height": 354, + "centerX": 0, + "space": -6, + "align": "middle", + "_$child": [ + { + "_$id": "ifbdhqpm", + "_$type": "Box", + "name": "Box(1)", + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "cg0dtpgy", + "_$type": "Sprite", + "name": "Sprite", + "width": 354, + "height": 354, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(123, 129, 140, 1)" + } + ] + }, + { + "_$id": "6ktbemg2", + "_$type": "Sprite", + "name": "Sprite", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(182, 186, 194, 1)" + } + ] + }, + { + "_$id": "0p7etajd", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "kncsl5nr", + "_$type": "HBox", + "name": "HBox(1)", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "nxwcvt47", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "9s02to7g", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "w4rp0icw", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "a2g39gn1", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "24klo4db", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ulb3mb22", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "dl8z88tm", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jv7fxeji", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "tddtrbzj", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2aksyyom", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2yvu9ody", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "wp173k1z", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "tuj01o0n", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "m9zgwhyn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "of4sihmd", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "1eeersok", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ab5gq4nj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zfpcf7w9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5fg81r36", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "0078se1y", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "atx1gjyd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "q54vof6z", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "51sb4lrl", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sob7gb57", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "1akyxdrq", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "uv85b48g", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "3y58nzu1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ira2z674", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "t5qnczud", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "oob9qbdu", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5xazl22z", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "mni2ciqc", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4xy40sp6", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "k8x2ikv2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "3lof345x", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xsxaynwa", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "x60qarjd", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "snzt1p47", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "eerzscvr", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "biu90d91", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "8mmm2ue7", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2mih5kh1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4nbwsip1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "88sb61br", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "vbqrwzm0", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "lan84jq1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xadotek1", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "xq4u6fap", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "anttl9u2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "oqfkhn4e", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "u0cws9sc", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "mm660zdm", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "swrhtfx8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "w6ip4pp9", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "c2vx50y1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6keqshpw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "gctkk2xk", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "fah20s7h", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "et0kswxm", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "f4yaprdr", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "w1knzrkz", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "s2tx7poj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "urnxe486", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "mafx4t6q", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "qcxumqg0", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xgdbzqm8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ut27kq6a", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "l8c2b6rq", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "o7hsrgw6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "7px440gs", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ubx0acvm", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "jbzmjc5n", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "15t73whj", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ptks0uiy", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "e33e8z46", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "bna5p5q6", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "69tg3dnd", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ydmg3rml", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bij5vi19", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "0v9eognt", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sh4u0ms2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "lkjqzmyj", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ufnco1de", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0u53cyuf", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "znzro225", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "5xptghmc", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4c3ynpjy", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zkmibcwu", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "mkfhe23j", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5c1b5r1k", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "smw478a7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "prdienon", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4pia3vkv", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "9c8sbs3v", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "rta9zbix", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "38qgl4bb", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "dxpommf1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hostecon", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hypxshbh", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4xsh4jzw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "u5sk9mib", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "029biyuj", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "z8hxoel7", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "en3hpe5v", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "hncv7axt", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "at0hkgtb", + "_$type": "HBox", + "name": "HBox(2)", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "k5l5a7eh", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "ft0hnmsq", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "uo8wppy5", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "t5p82klg", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "d3rzii0f", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ih6gh0n1", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "te0xdqs4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ghqukcp6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "fp8tvnne", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5wpzynwn", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hqm0fi6i", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "l7q8jevv", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "q5pamcf5", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5qvlzqm2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "nfvwtl7u", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "soshd436", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2m4snqr7", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "29h2766x", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "9k56b6en", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4zi2l85n", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3ar27rd4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "fqgoq68j", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "99kgvxcw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6wuu0c8b", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "4r2hx1a2", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "4q6y2k2q", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "jk1rt7cd", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "444wznl0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2ntftn5v", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "50alo9a9", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "lf6c5d7h", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "g6f6jgew", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ht6ku7xb", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "pt05qnz9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "9kmmuu8z", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "um83lpob", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "0ekqdyin", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "vzyxcuqn", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "e5eeos8w", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "7bz24m65", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "z9fi6n0e", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "g57y4mw4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "o4lqngdq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "utd99l6l", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "exaep1x9", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3lv3d6ul", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0wkudb0u", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "yhag9c2v", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "tg9doi0g", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "f909jkjq", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "fv9n4ck1", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "beekw1fr", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xcj5h6tv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "jn5uqa3h", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1pajzwbk", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "na9enh91", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "fs27gc3g", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "edppeq8g", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "u6t302hf", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "7jlw8xtg", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "5792jntg", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9b1da1rb", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "mfay08mz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qvweab9x", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "jux2chcb", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3qe0x7nw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "quk299vw", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "w0mrmmmy", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ped1710z", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "zq23qr8u", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "esr7yz5t", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "d9mzdcjg", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "p5bz9e6i", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ynydr9k6", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "25rhphjf", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "nv7k1u09", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "30s4hgxk", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vj18ya8e", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "zdhojrde", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2s3m5v1n", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "03pcw965", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "8i2r9bxx", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "nkzvtmo3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hqyluj9u", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "kypwgfem", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "1o2af2r8", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "wj3a96i0", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "69o8iiel", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "tbc3m7ko", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "rk8xrfx4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "crcp0nqh", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5xhlx4gf", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "3ztmbgvc", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0s3afxyi", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "6w5gzn6m", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ot0yo2h9", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "z3fyg0o8", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8sgm0ucw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "kzdqe202", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1e1ekgo7", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5qj8zq42", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "v7rb5bfb", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "6zz85vqh", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "yr8rrmq9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "ny4loivz", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "psq5afwv", + "_$type": "HBox", + "name": "HBox(3)", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "9cm6wsrs", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "fblvxxki", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "8sttwamm", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ene8jpxz", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "jkaq5c29", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "oiutd6se", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ugenyc32", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "eedf6bw9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "yohslz31", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "kpn4etab", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "94oipot0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bc4znuqr", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "qqbw3bu1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "lrfxltw2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "qqtjpxbh", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "5e6k3d10", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "6lk2ul7w", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7zl57qn4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "v2efsu61", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "d5qixwc1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gotv0cmm", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "e4cl8kh5", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ps0f7prx", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fioe498q", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "cwacmrx4", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "lraju7uk", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "mk2uduqj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kn3ndw0n", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "j9rltjf4", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "6z86g2kf", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "l8e2jtrk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "uk4z9b8d", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "o75oprzx", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bq96txsw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "ny1m1ia6", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "77x4zluo", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "l6b0lysp", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ecs1s0ly", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "97fh3u3x", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "ofgkblzc", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "uv9s5kq7", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "fl1jtiiq", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "owuyxehh", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dwk7vz4h", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "uex81l6r", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "h0m0ose5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "cz2vbh4s", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "h6ou1tou", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "9fbjrnin", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "vc2bv5dl", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "mm79kxid", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "r2d1oqrs", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "i1l5pj5b", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "tqbug068", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "06lha8hd", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0kffwc84", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "z2x8kb4x", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "oaubawkf", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "iikhru0q", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "twzq1qg0", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "1ymlz4nh", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "knqaex5e", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "egm6tz9y", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "4y04mzs1", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "k53i7n2m", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3bxby7kl", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "mijdqoim", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "z7xci9jr", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0ezgpe7p", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "6lt4s43f", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "79faejyf", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "o0kdqmsk", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ko0zrlpf", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "v84qgtky", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "f8tp2ixr", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "em1txmjd", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "hsigzlhp", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hrrovqd9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "fnowrtis", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "rj9bunal", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "n358nnok", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "mwl0ezt1", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "y9dd0dcb", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "w1ebxey8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "c7xvffci", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "trel3taq", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ox1l0jyz", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3io0iazl", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ylmukv6h", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "7yzqf301", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2xq346ue", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1uhr6lok", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "wlvj7hf3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "v0axe69b", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "vacolvdo", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "vojfusze", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1wc1aoai", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3vzox4vo", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6n3bdt7g", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "130jp9e2", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "o9lp2qjm", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "t21h9pgz", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ycvoyjio", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "iz4q59x4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "hlwumvut", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "k535eiso", + "_$type": "Box", + "name": "Box(2)", + "x": 348, + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "bhrs3a5d", + "_$type": "Sprite", + "name": "Sprite", + "width": 354, + "height": 354, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(123, 129, 140, 1)" + } + ] + }, + { + "_$id": "iv9lj2h9", + "_$type": "Sprite", + "name": "Sprite", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(182, 186, 194, 1)" + } + ] + }, + { + "_$id": "m5anshiw", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "x0n3f6lu", + "_$type": "HBox", + "name": "HBox(1)", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "32s4yex4", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "8jid1ah0", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "45q58gyf", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "pxl7r8rh", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "s1gcvfj4", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "yoiszvp8", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "0hx0s4m7", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fy6znuic", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "sv994fzm", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "aq6r849p", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bqs9gawb", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vi5ii0pw", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1o3awhga", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "88un5gvh", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "1idl0b9o", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "26l0p4vj", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "0zftlfqu", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "m31a475t", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "f6q2g88b", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "yq6yu788", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0jf4y4gz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "8k8kqo11", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "v0diybq2", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "y1c3yrm3", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "hg21o9df", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "81troy71", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "nn8usoxa", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "a2nxd17p", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "m0cdcl6e", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "94cjzlz5", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5g6d3ixa", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "58oa0l7s", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "xfrz933h", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vh64x3by", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "fi4rptz7", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "sbfcoxnh", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "ib4ak8hd", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ctvathgn", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "006kvttr", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "b5beio97", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "sb1p5xjo", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "votf1utr", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "g7gke5mn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7lf0ki4l", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "c74k1u5n", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nq0sj57j", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "3bl2z629", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "iof9x3m8", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "881siu8s", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "95qp0kdy", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "fxccrvjt", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "85lwumml", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "z23qwtrk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hbi3y99m", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "qn2bpb2y", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dxcixn4s", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "yv8zirif", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ojtcytrt", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "n45ccke3", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "wz8qybjc", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "c9wu1r3e", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "my7ziu79", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ywifivn5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "sbsnb3lg", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "3i4vbdzp", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4vleh6m6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vw67mt6c", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "bup7us59", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "c0rs9da0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "8khs477u", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6pgy7g5r", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "ouoyw5yg", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "5hig4b69", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "xxb1upjl", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "m67hz75b", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "yivwy4x1", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "aklit1tl", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "yoivwzdv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7eo5eewi", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "mvc88c4k", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "95s7ig06", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5ya5aq7w", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ct1hmoiw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kevcwa4c", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "hly4nx43", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "l8ca4y0n", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "sjez8u84", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1oypp1w9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "c66lileh", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "02r5yzc4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "62dx8rnc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "4mfqtcv2", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "blyahn7k", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ivmczuja", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "2scikl3p", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "tdfyxu4d", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "tqi8bf8r", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rlm95jiz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6puvulcd", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ikz91ajj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "udsxzuwq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "renny67a", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "0nrt4fav", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8ux0nnaq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "eg3evvb2", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "1fzpwvtd", + "_$type": "HBox", + "name": "HBox(2)", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "0usy4oqe", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "owv394hw", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "szee00yl", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "0kzggk13", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "wwdkqj4h", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "w37x78gh", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "c0rtni9i", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0nf5zt3j", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "78x5ekga", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "gx6k9hw8", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2n5kbu20", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "87pkyqy8", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "cyxrxugi", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "elezy4gy", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "yhdpe2em", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "7zbd5ccb", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "dr9fiemh", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nf2attda", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "sqf5ijjd", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "c9v9m5p1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bo7j6teu", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hzhycpwd", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ol0q6xfw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "no2zuw4f", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "9jwh9s9q", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "65t7m6fc", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "t5k9dhis", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "84xx9fsp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "yrdsxh1k", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "3ju4p5va", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dd2e9iaz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xd138tbh", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "f4qgl3p3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kuuj51f3", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "62s2mopy", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "nte8mjb6", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "qkas2edv", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "5szgpuuo", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "hy6h9mx6", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "8vegrmtv", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "efgdh7ac", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "a6xcwv15", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2oslwpsy", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "v3hj21ab", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "994ikmfp", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "t7ccw9zf", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hjxgeegj", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "bgv1mlan", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "l8j3ifco", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "7gs8q1pp", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "fqemska9", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "7dws53n4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "swtzkbht", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7w9uyjdw", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ih6dpvyq", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "n3kosmkm", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "263bhi4n", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "t419spa2", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "erb4odg3", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "m4k4gitn", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "z9q27ew3", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "wg0etici", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "z7b4qpu1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "luxz3eo5", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5zy9ca7b", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fkq6c1mw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "y5g6buqk", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "z6scrtdx", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ca6sjcro", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "n4g315h9", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xjlh8lqy", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "3bvi3z28", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "qicloi3b", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "01mf2tgr", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "yhy92ydv", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "vtr48sfo", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "mcx0qtdc", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7aclhwxk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vw3l2wbr", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "e5g06iwk", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gyw77u62", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "kod7gqwg", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "p8w9q45d", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "uauyjf1r", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "mx5uvevi", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "i9e3p0ta", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "cabzwnqh", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "leytmgd8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hp6l1h3p", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5uppja5e", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jkj4ojh1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1x49di6v", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "jcwraq9t", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hy8suauk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "su5faxks", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "5upud96d", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "gxvblwx5", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hxepywhn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1z15ksiv", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "92jo02g9", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "j3g416a0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vs9uc1rb", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "lsvi9jg3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kdfx39pt", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "k8xbf09g", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "i8egyfh3", + "_$type": "HBox", + "name": "HBox(3)", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "qw156jr5", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "o6vw8ojl", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "w4gxd6fs", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "5fq6gkcu", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "jjqphoxp", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ljqiqdqo", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "dwcz555u", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "mlhjzv9n", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "i5epc3fl", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "c0k5i9a4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "70f2wd9x", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "tw3sgjyo", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "pua2wugj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "unrzy1x2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "nud53ik7", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "1znnki0j", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9qzpulej", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dujik84o", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1p2tjq01", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "8jwv0sfe", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7n2hbpn2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "864t19sw", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "7nml5dkl", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "31n7ezej", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "lye8t3rh", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "7uncyggd", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "u1ref0g4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3qfp1hn2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "iiusfo1s", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "62j3x4jl", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zkejxwr4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "mlxjdvnq", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "t54o6ys6", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vkagseb3", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "mzqivads", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "zyd3ab5n", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "xsass6r7", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "l3nunfoc", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "pg4ma2dm", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "u8zt7kxb", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "e3isz75n", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2htvt2cb", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "z7io01wh", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "el86hf5s", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "7tm55hz3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ico2pph5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "yi5ab90i", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "srgvz8vr", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "9jljytk6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "c9shbhzu", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "buqtm7gu", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5wj29om7", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xeka7y77", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "p5m20b7b", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1na1cf7h", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "r0w7u7y4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "two6ue9d", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "jrkbyt0g", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "uwge64cb", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "wstaqnlx", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "rxid6d6s", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "o3hv96hh", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3mfyi7no", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hriszqny", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "tlfswvub", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "al73bsj7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ubitajd9", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "rhyhx0al", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "axsmmevp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "d2q1gabq", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "lxebza9f", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "fj6f0784", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ywxl8vi8", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "7qbitkxr", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "v61o2fjc", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "j1h0wyvv", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "tn5inz84", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qmd7hvct", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "cswo8f5m", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "mafrmty9", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rcv8bpd8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "j9hsnslj", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1o6hq77b", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kkpycpwt", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "08mmlfhe", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "s0f7tb10", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "py5s7txw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ptptma5z", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "mw5fgo60", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "85lkbbvj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "q3704lts", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "t6854srs", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "b70hy2nq", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "s1lzgdsb", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "mopc16bl", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "1wk2xgj1", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ooz76nj7", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "toqo9fg7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "8a0h8tjt", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "3n1i9ysf", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "48hxgduf", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "p6f2mdsn", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "l52optxr", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6tubvr4i", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "izm45p21", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "n5cfl7fy", + "_$type": "Box", + "name": "Box(3)", + "x": 696, + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "0svn001y", + "_$type": "Sprite", + "name": "Sprite", + "width": 354, + "height": 354, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(123, 129, 140, 1)" + } + ] + }, + { + "_$id": "xzsqyzrm", + "_$type": "Sprite", + "name": "Sprite", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(182, 186, 194, 1)" + } + ] + }, + { + "_$id": "p3haeau5", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "k98303v2", + "_$type": "HBox", + "name": "HBox(1)", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "vxtni2w4", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "i57cj52a", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "qdyg6708", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "0y1fbi64", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "lc0kfiqg", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "vu9qkirk", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9cutc12h", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "h9l1bmw8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "cnrk5swo", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "7hk4f4s4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wlnwod82", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5tlhvv60", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "vw50sfm5", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "tqvbv59z", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "vu5u6m2j", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "fxar52fq", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "gh6ln8de", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "s1xtn2i7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "pn8csz8a", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "gq84x1rp", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "d0vsk340", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "kw3dmflz", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "7n6m9nls", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kfz9zrhu", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "4tu2l55s", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "evdqnv4a", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2o12fj5j", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "h9f4xavw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2h7hgt62", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9z7iyzyz", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "x5rzzud0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "kdl5pkta", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "h4e27r1b", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kvoh6mdi", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "pq0leybp", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "x8rg51qp", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "ghu6ra8n", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "i7bdogx9", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "dbkx8q8z", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "wvzfsspd", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "llhxkru5", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "e8h055zt", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nxmx19s4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "nvt0ly6g", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "8ns7cirv", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rpzsk1b5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "rekbvx17", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "suo4inta", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "u8eh6i9p", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "d6knfim3", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ymb7ouzj", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "emqgctrq", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xp5lafsd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "wwonj887", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "65jd5iq7", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "npq0fftw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "svfd1j5s", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "203oc5n5", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6zm2u6y6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "i3d8t1h5", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "qn9ft47x", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ns677css", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "m61xxm3f", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "yg63uvyw", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "7ngw7dok", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ge3hxdvj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "b16frdlv", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "oddfxyjs", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bc4wr2hz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "419ny1os", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "shsqv5bk", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "okmeavwu", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "omtyys7r", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "uo290sls", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "08yu1ev6", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "bztwmd9l", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "o1gokrww", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "pt2pumof", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "jzvdjahd", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "e95e8if8", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3dpmmgfg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0kdtdovw", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "vwiqeapj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0m7f5ig7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "we5zg4xu", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "na9fyzzy", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ap9eye1t", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "d2fbadri", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "zks6gbn8", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "w445w2g2", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7bputa0q", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0147ax2f", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "v72lwqoa", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "h6jvn9qd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "6qpoa45i", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "e70u3jqh", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "td038vme", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7fd907wv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ie1mpcwv", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "7le8p4lj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qoo88l1t", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5849db3y", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "wd9ki5e8", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ojjdz6go", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "cy81g3hw", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "ishmaxu4", + "_$type": "HBox", + "name": "HBox(2)", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "5xckxp3a", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "kyftg1w3", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "q9oz1kh5", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "l981uhkd", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "jjzsjpgf", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "sohppcqi", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "zqo6dsf9", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zeaao1zm", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "w9yt62bd", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1totbnsj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "uu7f1afh", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "yg7quhwe", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "cpouvtyd", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "huawemfo", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "diysy3ln", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "9zu0clta", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "yflxpch0", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ljqclumt", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "i8oa2yde", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "bl981itd", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "f5cdfsv7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "nbffs6j3", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "8bhm0kwn", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wy72azdv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "31455k4c", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ozc8tzvc", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "m5ewgqwo", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0nmsm3cs", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6qbcyr1l", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "mt4q9nkw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xnyga32k", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "s6vohmnp", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2c6oh1cc", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "s0rm3mmp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "pmybfvnx", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5hksz6wk", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "d504gmne", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "8hvnop9y", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "xv59oizx", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "eiaz7r7k", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "dji0gkux", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "xac8uh52", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "opownsz9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "uecqbbeu", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "gj2s8pxj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2687svw6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "19ghm29i", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "6kprbphq", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0e8zhgjp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "lgrde9rr", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "mjsooxqj", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9pqyxwsa", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1aashu0r", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vw2oaixh", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "m7deahqz", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "pn5cy5le", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "mv1mkunk", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "st82i976", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ysn3zsqa", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "pqiqtx4x", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "mxs8htzf", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ce57v7hf", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5bli8im2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "e1yg13ku", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "w4c6t4l6", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "c4f93avu", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "39mmdhtx", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2kol3jos", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "oqtghka1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "r674kp2i", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "z2huikyj", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "fpyahw3e", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "1svuqx87", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "qi6oj9si", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "parqmz1f", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "l5cp0pab", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "tnw4xy32", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jxygobl0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ey2sk259", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "rx134mj3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bum08jrw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7c9ohcqj", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "sooup3kf", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "by7chfxt", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "jcg38eo7", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "eop21awl", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "kbsscp24", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "d7oheemy", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6lq3oipl", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "rylymi0j", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "tkouu536", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "o1ixcx6e", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "6att8juk", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xhs612xc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "33ygq0os", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "mhra145d", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "fewlcs4k", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gynmkf6b", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "lixzggdn", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "x4vmolha", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jftarnqm", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "frvxmqmw", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "b7mywvey", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "e4e9rik5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "exoshy55", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "mdk34tnr", + "_$type": "HBox", + "name": "HBox(3)", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "2x3erxba", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "ci7bs90v", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "6y9jrn77", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "9irucaig", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "goo1x9cv", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "gbx1w0eo", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "aronrh0x", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "e9qkmh59", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "au7f7ocb", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "b0iw2qk0", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "61w1zh5i", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "034zq9vj", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "mbkow8q3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "c9pvgh4z", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "a75nyvlo", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "onswfk2i", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "fcziybrp", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jul2mvwg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "tqg71ydj", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "s1vby8va", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sjm3zw7s", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "54jdmfcf", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ngzb31ka", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5e0h90zj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "x07k8i9n", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "cdk2urfe", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "c96fr8uk", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7t6a5p1f", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ilccl10u", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "zwjqyzii", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "y7rla5it", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "uwbkzo1p", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "8j6sbzlo", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ymqmlba4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "anht6vq6", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "4208v348", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "6ikrxi2j", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "yyuytyy0", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "zzrte8tk", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "xzjgkoih", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "rpsm38wi", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "v8j6b75p", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bjp2k0hk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "iltwarw2", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "esev56t1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8f9y24gj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qi701m78", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "cndsos76", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1esnb16g", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "edc013z5", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "vr7xr5t8", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "qv3nuepr", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "t9pmg8ej", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "d7yi6z6g", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "epxn088q", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "lgomt6e6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "09ddz1vi", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "x6q6ccwr", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4ubd7k2v", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "bk0tl3a5", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "f47yhbb1", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "o5c5fpap", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "beowhed7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "covi93tx", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "957fbbz6", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "cvrhlofb", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "n2oaykzn", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "yc3jthul", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "i8n0g9sf", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "rj1rgqc5", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hk7entvg", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "pknc3rha", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "8m6626i3", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ytt2xnyl", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "ho996bdd", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "qa9qa46q", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "3gpsocbv", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "redj3740", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bxch25xy", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9o99jk44", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "d75hjxsk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "yklsmvpr", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "wdjnz5j2", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "v35mtvd1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "b1em3ab3", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "b8u6yhju", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2s9ts0zu", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "iku32p2x", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "b4w73v5n", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "60erxy9x", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vnpyso0b", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xbsvudna", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "jy40vn32", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "413pg7dc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "tpqkczvn", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "jan34d9s", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "qps6xatx", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7y6uti9q", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "t5dsdmid", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "zwz136qj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4yltxyo9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "4q12pkhp", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "20xyimrv", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "m72all0c", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "ylb9bxjv", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "ibaygrjk", + "_$type": "HBox", + "name": "HBox(2)", + "y": 348, + "width": 1050, + "height": 354, + "centerX": 0, + "space": -6, + "align": "middle", + "_$child": [ + { + "_$id": "yib4t4qh", + "_$type": "Box", + "name": "Box(1)", + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "ln27doid", + "_$type": "Sprite", + "name": "Sprite", + "width": 354, + "height": 354, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(123, 129, 140, 1)" + } + ] + }, + { + "_$id": "t9v49gvf", + "_$type": "Sprite", + "name": "Sprite", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(182, 186, 194, 1)" + } + ] + }, + { + "_$id": "nn5tfjkk", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "wuzjq7rb", + "_$type": "HBox", + "name": "HBox(1)", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "rr5az3u7", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "fscu9hcy", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "5xow067j", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "jaksnft7", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "a7hvz6ij", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "zh3gj4ti", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "uqdnau4d", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hb4btkd4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1a2awhtk", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "3ndduyu2", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "owc5kqqr", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "z67f57p4", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "0b28p4lj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "f52dqlih", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "6flj198d", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ypsi90vh", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "pcnrag3r", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "t3xdfo4i", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ggc5vkzb", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "suwrms0i", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "e2s1eb1q", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5255q799", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1c9nphv5", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bifei2a9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "lvyw35oh", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "s93wtenm", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "di0cn2b1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0h74ps27", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "lmxn5da9", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ep7s6133", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hblb0ut4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xu47bozi", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5l6kpc30", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "15hnccyj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "myabqn84", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "pxs0da46", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "tu0nq8er", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ne1y0j8v", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "3stlz2vi", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "5whzn8xf", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "fyz83wvm", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "gfdjhgu2", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7v7xhxv5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "s0dsnstf", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "72uwufmy", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ri2a7d8v", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6p2ygvw6", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "u05cqm6s", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "r909snr9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "5j9q1wgl", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "juwwqlw9", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "erzvo9kf", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "b1m5f2t0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "zmbw0g1j", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "vorpqaiu", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "in2upr9w", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "l7vg6wty", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "fwwyekx1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2qy3gj5i", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "hl00qakl", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "n3sf393v", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ab298keg", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4eafbgbe", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1viyadiz", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "8vla86ru", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "joickdv5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "b79388zn", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "y3b6dpfy", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xir0ik5j", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "vpv030gm", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "8byemxdm", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "5hks5wj6", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "u9khuzkl", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "r5c91dim", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "rt1kufym", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "6xweu66i", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ywsfzbam", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gxkltypk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "d6mbsd46", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "llv3w7bh", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6ym1pgpt", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "okq1kzxs", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5eymh28j", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sf66yytj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "fhyipo3b", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ctyg8jn4", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2ql2rxuk", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sll3bm5q", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2sygd63d", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "nmot2o3b", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "l0gc08lq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "pm8amlc0", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "iqwj2x8p", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "pz5ba7jn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "8qfb52j6", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "jmnm639v", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9ce73di2", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "b5y1mw7w", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "16720a7x", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "jbxhrtdk", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8hgm984y", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "tcygauk3", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "91j7blcv", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4ffw58vj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "frmpcr5s", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "x87wkvt1", + "_$type": "HBox", + "name": "HBox(2)", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "qa9zryou", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "p9lbhnyk", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "92jtqtxl", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "4xmpj42u", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "emriiklr", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "w86m4xs2", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "e4uzok5u", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5v9k7o5e", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "g2cmukhz", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "0est5v8d", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1o9cimue", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "tu2lyy3w", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "o0bn7fjv", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jqqfhqp1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "dgn86hhp", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "fx3bj3l8", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "wpricgw8", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "pfwplhdg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "e55f43t3", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "88bhupu3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "n2u7kn1w", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "4r6o4d46", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "u4db7u2h", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0sazley2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "i3h0v4ja", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "g9olx26b", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "crhl1z5m", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "136610n4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "pl467sui", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "3ekfr014", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fb6bfca5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bbdifceh", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "0f3zhc5o", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dt4omqj2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "omzv25js", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "wimnzwui", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "itp0ruud", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "nyac3kwx", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "w7batm9v", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "s4uvbivp", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "5enkdy8s", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "qsk33vbn", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "424fps2i", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "767b5p78", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "az3ot6d5", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sgoqbo90", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ed2sz4bu", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "q96jvqx1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gpuc50rw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "kks1k4ed", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "2ypq5cbp", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "nlirc32v", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "c0tqulxl", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "juti0w37", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9p20rs2k", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "umswngdk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qplh2kye", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2utc1grm", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bjqiugbs", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "yjpa4xzk", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "hu8w9g8k", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "0koxl5oo", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "blbe9yon", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "37oznfs4", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "158kxnsd", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wuy6h1le", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "adtevgf0", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "6bggel0e", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "n2qz2255", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "02b6tmlb", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ri21yse1", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "glb33on4", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ao1usw2l", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "rolj7hoo", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "nki99y9z", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "rsa6wbf6", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "0ctfh5wp", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7ns45y8v", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "m6mwnj7g", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "m4ahxgby", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "oica2ih0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "9zb121k2", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "yhxzxiub", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ym0w97zi", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "b94cf6if", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "wibxuv47", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "nmhsxp7s", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "og51q1wn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "jjb7nlbi", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "eo9acmrc", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vxbw39by", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "c9hajvwl", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "oqul39b8", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2l4nvh1z", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "q4wd87uv", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "yhed1ug8", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "23vj7rfx", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xcxkzkzn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dyfsb7ln", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "glrfadfx", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8po83qiw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "l6cenm05", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "x682pjo1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jchqmzan", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "4lm0jhuz", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "thc7khbh", + "_$type": "HBox", + "name": "HBox(3)", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "yqmzzsyn", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "8s1ctev4", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "xif1i49o", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "20b57nme", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "eimutfk7", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "9fkoj7e0", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "vm8opkkx", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wl61dz2k", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7cwu8tc4", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "18s9pdmb", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qzvk2k6v", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "g2ihjlku", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "103i9ylr", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "9n5hqdku", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "9igec086", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "wmtp600a", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "yactnx1b", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "d17gptyv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "o7k6tkjq", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ckvercyl", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8zpip9ol", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "s69axshz", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "50kvoj2y", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xjqadx0m", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "hpmkee4b", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "73w7b2cw", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5xqisie6", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fufp88tt", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7az5gg8y", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "m8k0shb7", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jpjfhzdu", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "gy4slpa6", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "avz68gml", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6topwj7t", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "8kwryw58", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "krf13oxa", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "9qtyw23c", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "5y15m0ip", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "f3ztpuos", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "14mpt1e3", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "adbsn6u2", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "0xnw8215", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3ynd3ic8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6hfmd2s6", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "6xo9nuia", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "31bhekzx", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "p39zyqrd", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "xa96cx2r", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "33x9gnkj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "94tf66wr", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "81k1z3wu", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "7vrn7sas", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sv2n97pf", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "zq8d614m", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "afq9jeny", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6ag2lxu7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "wqp92wd7", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "xt608pwr", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dcjxa3f3", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "kisxriwy", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "j9fvixi6", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "xcg8w2tu", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "j3byq9t0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vo275pzu", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "r3r3vi6c", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rxxqo5qg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6el8vmpu", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1dmqpjcf", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7k12jamp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "itt0acr7", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "gpjho2ib", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "eux07j4d", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "xj68ei8j", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "38n1zhx6", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "n8lqdedi", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "fzsj4ek5", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "k563h6es", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1wbystbh", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "kdh6xla4", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "pkryqqjx", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1w47ie9v", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "tsa33842", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "k2nvili4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hcdouafq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "911x1a2s", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "lyma37uv", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "fyu1l9ei", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qcku63w1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qmnwatta", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "dfauawt3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "br2fq93x", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "mgnnj6vg", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "epz8w2yk", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ookuf2gg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "x4ge15uk", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "vwd1jarp", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "u13q9tnu", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "alzz7k01", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "9tmj6s1y", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "87l0wmfw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "igj7pdbk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "oiwqq6gb", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ldhkr1io", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "uyzdbadk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "f9w7eof9", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "0irq6abe", + "_$type": "Box", + "name": "Box(2)", + "x": 348, + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "im9e5azt", + "_$type": "Sprite", + "name": "Sprite", + "width": 354, + "height": 354, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(123, 129, 140, 1)" + } + ] + }, + { + "_$id": "x3ztvr8q", + "_$type": "Sprite", + "name": "Sprite", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(182, 186, 194, 1)" + } + ] + }, + { + "_$id": "k3t30l1y", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "m70euvc1", + "_$type": "HBox", + "name": "HBox(1)", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "mpely3ux", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "l96uesi0", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "4aacpnnd", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "x82h4b3d", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "u0inggg4", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "awd49qvf", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "iagazu6e", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1z32budr", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vay9uicp", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "gbsownge", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fzx6towu", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "uca6wcx2", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1x8yplak", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rrxzo1mz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "f9pj2vjp", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ue7rjcmb", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4y1djztr", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2urzqwds", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1re8ju45", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "om6uirbu", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ixayq0ta", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "cv4z87pc", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "u7rfpqff", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0b1p5owp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "mhc65lcr", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "frg2p1ou", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "xyyx56nt", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rqnphp4g", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0dowhd0y", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "c9ety15o", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ys2ipxy9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1jug42dl", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4co457vu", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4fco8pek", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "55yf2fwh", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bfdrdcts", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "9xxitvc5", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "m5ljp3xe", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "b3yvwf4r", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "z4l1w13m", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "x0unnbz6", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "n79d916v", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "df23e6nd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "maad0z7e", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "r8oqh0i4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "grit3zqt", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xxvf346i", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "0vlo9qi1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7mbz055f", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "c8bma05o", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "n0fqk0ep", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "8zmfk968", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "62qgetwo", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "n5x9yp89", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "6vztpfw9", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "y5dhq1uo", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bd8onxbo", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "di2yc4e2", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dgim8v1e", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "m1q5w552", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "w8acyza9", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9lbvjpul", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "46zvdozc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ld09m7i7", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1k8pz70j", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "uvd3hshw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "n0ns0qx6", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "gmoc4a7w", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "t62x49om", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "f1nckk58", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0wb0xbna", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "7wsm2ftu", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "fpfyrmvg", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "nc0l2smy", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "m04bh6at", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "j1eaubv5", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "onmd2j9k", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kpzgx48c", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "e26neiec", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "muj15t0b", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gplsz0xs", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "76scirr9", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9vmm9o32", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "b478ebnh", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "sps4y4jf", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ppwoviz8", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "mvu1ea4f", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "m149feuv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "l9ojy46n", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "6gpuefpq", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ljooco8m", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "914xddn8", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "wc93c844", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4j4m8hsd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "yvbkakjq", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "59zjky2q", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "7fq64wim", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "e38sdqwt", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "evxv59lq", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "qfp1etpf", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "d2gv8k5a", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "n5hc0ym1", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "p91enr0p", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "i1kwm3lr", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "07jyoi4w", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "qjavhdqf", + "_$type": "HBox", + "name": "HBox(2)", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "r3uf4851", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "45eh0rac", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "almtm9rc", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "t0mgo06t", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "44nomaa3", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ngwiw8we", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ldp5uioq", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4iiyre6u", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "aoosahoi", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9l97cs14", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5pgo390i", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "4ijnepib", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "q5sh9npg", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dv104ukl", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "i4abutio", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "92swhx0a", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "fnvtur02", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sq7p4nhl", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "3ydst0qi", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "aqps6ntl", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "d9g3r93u", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "p3l59pc5", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "n7kqey2w", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "tukt1q58", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "cikr8qfp", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "g6flrhpt", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "y3ttpogt", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ssaupkfb", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ofjd3dzb", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "yuptmy1k", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ab70kzci", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1gm7k977", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5nw2o112", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "q0mstz2v", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "37r6m67j", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "a2shgolg", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "hbypo1rh", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ghfwy7qe", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "kio634bb", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "eajl9azh", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "9thgup4d", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2i2nekw1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fesp0bzr", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "th07v09y", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "au476vg0", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "g2u284ry", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6z0qxdbv", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "o9go2nz1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7i13443q", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "uk89r6oi", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "98qkk0vz", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ty9nrei2", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "f8iz9qy9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "itgo92aj", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "3vbjp3aa", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "z75qvjhh", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "4jdevscj", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "55sitq84", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3a8uusrb", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "r6hrvtqy", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "hc36pnat", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9cxhepgr", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "9u5rse76", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "tazo2ao4", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "z15t5qfm", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4ybk2ah7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vn5hbspi", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "k95tzoc4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "unuegbx8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "0orct1o5", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "4rf28oh0", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "nwl2bg5u", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "gkuwzm7z", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "xxvnwebv", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "iiz7ev5q", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "csfwvqde", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ig5hk27f", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ujxs2grg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "lxiq162i", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "jhddur51", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "aswu3eww", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "h9nxg149", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "in41qydn", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "tbbfcbkd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "av4lplgh", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "5g9bkciq", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "xq2hepcb", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hn059pvh", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "k0k6pd64", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "wyj32u9a", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nhnrhmqp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "jjzrpkn9", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "apy7ewyy", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "x1xzl38v", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "cq3cvmnc", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "2mz8i447", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "hflmg7qj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bm70el0h", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "zekqh6z6", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "roqpg0z1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fz6sgpoi", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "gitd7g01", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "f85tj281", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "264vl59c", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "iak9nbla", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "segl4d9e", + "_$type": "HBox", + "name": "HBox(3)", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "jfvuwg9i", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "4uz6f9kw", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "71hm1o2c", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "mw1hp1la", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "umv1shit", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "mhkcfzsq", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "tw8tgj22", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vaft6sfs", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "97woyn5o", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "62wabatb", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4asi9bbf", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qkwi25lf", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "8xy5bvqy", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dc7wtzwq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "4lm9oq1g", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "lvhj5g04", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "hdq5w7ni", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "c03uqq4r", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1zcvw2h4", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4tiz754l", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "urhug8ac", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ajam1zz9", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "mi7bjyu9", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1s91bzq8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "h63nza2x", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "5gy100t5", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "kz0gqseq", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nzq2mpyj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "fiw1zrji", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "25n9j749", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8a3edzzg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "mtr72iwc", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "x6c6n37o", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "orb20x4z", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "wqlf0986", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6tgcwyra", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "d8gef9l8", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "vy9rrd0j", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "0mybno7m", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "f5a8i3z4", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "1xg5rkox", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "lhpt92eu", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nf4afb3j", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6n43xz8l", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "roasthfj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zvfzdeyn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hr792jjv", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "go1nax1d", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "arw9ow1l", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "kui2hjsd", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "1tk4l50m", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "efu4w6fi", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "th5q6oyo", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5xxu9ors", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "yuau430m", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nab61485", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "pvozo490", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "j4xznsu8", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qxbucpzd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "dhnqjg1q", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "q3eqgrah", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "xab4jn3h", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fyirl228", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ezucj8py", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "148eyudt", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "s1konvkh", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "zcfpyvk5", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "gxqwbju4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0yr7eex9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "98llgswk", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hqh9ikce", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "45q5emuq", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "76c3bw2e", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "dr04ys1s", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "pg61ebh4", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "l5tobbv9", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "hdf3s0dj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "p1xsad5c", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "c7qp8dja", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "lbwmaoh4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vvv7wks9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "mqcaufjj", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "znjpz5bk", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ogtdpsku", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "4qt9nbni", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "rp6ian2w", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "vao50ksj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "n29w0qhe", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "yj0klzff", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "md9oueow", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "s3zcd76j", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "15oos9tq", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "v37ij8y6", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4fw8dmk5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "0xpnpdeg", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "qaufbv2p", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "hjdqkryg", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hh7wxjnp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "jjmtbdjm", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "f5l85ueb", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wbg5caix", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "umnbsosz", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "fkcung7r", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "tcy3g5oa", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "882hmtlz", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "ahf5szkm", + "_$type": "Box", + "name": "Box(3)", + "x": 696, + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "06j9mkgh", + "_$type": "Sprite", + "name": "Sprite", + "width": 354, + "height": 354, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(123, 129, 140, 1)" + } + ] + }, + { + "_$id": "7boezlqk", + "_$type": "Sprite", + "name": "Sprite", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(182, 186, 194, 1)" + } + ] + }, + { + "_$id": "j3hgd1gw", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "k0fffh18", + "_$type": "HBox", + "name": "HBox(1)", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "5zr9ze2l", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "1sr1han1", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "jtf3nqqf", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "n9sgn4oy", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "uni5j627", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "e9e4brng", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "m68spdt9", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8iouh6ab", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "3b7hspbe", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "kqxc828q", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ik2a0433", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2ydvmpnh", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "h4b51r46", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gmqzdpyr", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "k234vuon", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "pcwn4msq", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "as6vm0y9", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "tcg02urm", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2w2a6bb3", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "pgfp4w45", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6m9ipv8t", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7ejy3n0g", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "96z1bpyw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "38r2n6k1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "zit274fh", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "13p9z4j4", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "lxtus8fz", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4bl1a8q0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "975vbjo4", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "r5jtkb6m", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "r1xzp8lx", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5q0qkij6", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ckzqn3ly", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nxlx2qgk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "q5o2t8qq", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ssrzwip0", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "j1r35cqb", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "q0jy10u4", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "s3otjabv", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "lp6lecss", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "8lvqw3jj", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "umvh173x", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "h5u7h82m", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "47x4a7uq", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ta6xhcng", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7fog4pj7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0hn7yipe", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "h3f6dx5v", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bi8s6csj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "gxs0wxss", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "40ndmzd0", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "w6k48a12", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "uu23oj01", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "olw3qmg4", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "78s82i8z", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "znnv4xat", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "er7o3qqf", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ay6esrxn", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "goko23qc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "4abc70l4", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "tsu0jfv7", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "6lg2tyln", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "p7pv7qzz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "guqj8wne", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "do8ndlmx", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6r1iaz6r", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "38e47iul", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "g1todqwm", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "krcbf8wr", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "l7w5t93e", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "fhh9viyc", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "93fdzocw", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "a20k2glg", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "r60rrgh7", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "o7xm326t", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "1zse8088", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "sz31kno3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0tso1lgt", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "h05jt065", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "zmgpnmm5", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5yxqimnt", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hp1ynl9u", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "fgyu112m", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sp7b2h2z", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "caogt9hh", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "hxx7d09t", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5qnb8bg0", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1vkslut0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "yrk2sfmq", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "0yuehod6", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3shexep6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "or5l96g4", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "w8o6wekd", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5ctbm3yg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "ankz5thi", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "448mg0pr", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "tltzm9a4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "mq5vuxrc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "f4eunih3", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "dw3e88bg", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "lkwkd2s8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "w29aazl1", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ti9fo6pr", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "it0xjq3l", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "ei27k9s2", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "lrjl4rta", + "_$type": "HBox", + "name": "HBox(2)", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "2xs0wml4", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "ba3rlr95", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "6uhzxf70", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "p6okm1w1", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "vk8c20kg", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "wj3tv9rm", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4bfqv7yd", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "880dqdsg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6fsaiixw", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "hp3gvurq", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "z25b3zxv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "3iebkruo", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "qhdks38k", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4hra2y3b", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "jsm4gpqn", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "45nn749r", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "cvz6eqip", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zunm3rxy", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "r7kz28ww", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "h24fsq6e", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "e2hcdx29", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "3jg0it3b", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "8ffwsz5t", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qdy88mej", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "mexlli3c", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ln6kvpie", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "6witfbrk", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2nfdskzs", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xhqh51y9", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "pxp4ih2x", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ey6dxytc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "i3uj2y0j", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "lgrw4koy", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "enflk5fl", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "mwtpct3q", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "56fg5vbc", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "fnnf2qgz", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "u3yc00nf", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "sfkhnda7", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "i5egq212", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "z2exic1u", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2kgwgch8", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "utah7cp5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "o9rl0oe6", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "fpxfh14f", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4i2i2f66", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "a5h91as6", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "bqehb5xw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "o5zxh1so", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "n7yafimq", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "msja5a7d", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "z5bnatgf", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6jch39go", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1sh8aa5r", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "rxxqosli", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5ee5e71w", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "27s13qk8", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "3glbgaz8", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "l9b7bgy5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "s0ajr0vl", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "kqoqa3a5", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "hw7nqerw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1c6naznp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "otddmrnv", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "khnae2yi", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jqmy36p9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "r58wgdej", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "h76a1bv4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "lrfmnu20", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "4vq8u32i", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6to8jw0l", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "s7cne56q", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "s2zradng", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "2omx5mas", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "2exiydrm", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "mhsjhnrw", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "my47on6l", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sffs77kw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5rp71l74", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1yrw459z", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vfec83zk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "kjdogsc1", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4ngi94yt", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fv0xl635", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "cnfqcz4g", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "jf5jhd1v", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "r9qtffo3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "s5yfnggi", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "fs9omrfa", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "keetg5vs", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gbtefkhx", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vob0gse1", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1wg1ydr4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "51zgpmag", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "1eb8u4w0", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "mfnb3ax0", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "rtzkoku8", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wpxfpuys", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ikhzcxjv", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4jnkbicz", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nxy6rbu6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xzy81j73", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "wlcttv9h", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7mawmch5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "bhnbqfsv", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "va639q59", + "_$type": "HBox", + "name": "HBox(3)", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "q38n6ycr", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "girkkp25", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "gfh3yqtl", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "sebfsqlj", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "tpu7lpw4", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "wuf51we9", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "qqme9egb", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ttxi0dwa", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qq07xh19", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "zbtmexws", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "pu2nc70w", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "klo8b42r", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "kc4did8e", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "y0asjgnj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "ntl0jqs4", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "qrmrynav", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "fjq8kd9h", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ggyqtjqh", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "rhk7vpdi", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "xkn59mew", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "koxq26wl", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ihffptbo", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "mlphej7c", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "pplnbt01", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "dsa8kq7k", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "oq4gyw1i", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "smjr7r0d", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qmmmvwp6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "oevt3uot", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "fkvotvfz", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "you0q888", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "93zmy27x", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5311vloz", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "52osx428", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "wvrorsfy", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "t8mngf81", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "p8v03hrt", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ef0hio9c", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "xwedtg7p", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "2dev4wwl", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "lpf95378", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "l7a1e1zx", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qzkeckwc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qrnhf9k6", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5re6iw0x", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "oubblicy", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7nsfq5xj", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "3wtdivks", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "53eitmqf", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "seufze2f", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "62sbchlx", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "gisloc18", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "io4zx1eu", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "wleygfsh", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "hw002q8n", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "htm0ujoo", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "50k30yi2", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "8sbinymr", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rs8ik5nj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "hpdnut8i", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "dhtr9um0", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "tl325q3x", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "spqcg701", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hng0qxdq", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "rei0f1lj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6d376sqj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dytfjux7", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "49qcuvs7", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "m8ambw8a", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "39j7nt8k", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "kytcy3ig", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "rd4t9b63", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "dwgi4uva", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "hi50sg61", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "m6smcsxy", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "v7h192uy", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "uii8umhs", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "e3tvmyyj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "gs8z4xv7", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "k1cn9g4m", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "pizcend6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "l6ssefkr", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1w8i422e", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "w8snpluq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "tbmwelr0", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "zh08v3zp", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "vi8ud60g", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7cdvyz56", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "rxy6vcnl", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "lm1bgkfd", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hjmoh0h9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "znbheym3", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "sg07mnj6", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "q1xoinel", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "4yh0im2t", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "88a5z3wi", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ig7jrl9v", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rtdhdk1q", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dj9b9wip", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "mziwvbyo", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4qhz5k03", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "gf3pyb5c", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "3f8m7bdp", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xo2i5oxe", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "62w706yr", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "vxbt2deu", + "_$type": "HBox", + "name": "HBox(3)", + "y": 696, + "width": 1050, + "height": 354, + "centerX": 0, + "space": -6, + "align": "middle", + "_$child": [ + { + "_$id": "okud56l7", + "_$type": "Box", + "name": "Box(1)", + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "o7lvw3jw", + "_$type": "Sprite", + "name": "Sprite", + "width": 354, + "height": 354, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(123, 129, 140, 1)" + } + ] + }, + { + "_$id": "yyeeq7sx", + "_$type": "Sprite", + "name": "Sprite", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(182, 186, 194, 1)" + } + ] + }, + { + "_$id": "z6c6lnu8", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "uggsnkgr", + "_$type": "HBox", + "name": "HBox(1)", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "x0gspicz", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "6mr7j3z1", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "2gwmds5f", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "1iwtmzpf", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "v5t5vq26", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "3gia62v1", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "lrbvzhid", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5ggm0mh9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2glhuk9f", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "haruma0s", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sg6u17bt", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "t6bp26dk", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "n69c4mdw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "mam405fu", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "70nnzcju", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "795o2nfp", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "xkh814g3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ppj1t328", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "c4sorjsl", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "nk8fnop6", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ni1cvjdc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "e06ra9cq", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "vv624oqi", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ha9dgwqd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "x5zynct0", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "zwe0zpxo", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "pgmsxua5", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "n5738fxq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "j6yc21lm", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "c9k0cyls", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "etal169x", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0znozvsp", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "z2kc7icj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "w3dgn204", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "hyrcodbx", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "cupkg0j7", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "wuym2wcl", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ymplpscf", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "cf1bxeii", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "f2tnf5jp", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "8da9h26l", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "zftgzq96", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "womv4xpa", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "h4z630oz", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "529w4xnx", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "k4fhro25", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bh5ydt8u", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "zqneddex", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "lkb0wcz5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "g3g8t7dc", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "e5jhj18j", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9n8b7zfl", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "e2imiupk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "sms4w2vp", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "os3b3vd7", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vgu2q9g0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0y2qdi79", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "nm30fj4p", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2yp2a09k", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "xv93nxa1", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "h4hs82w5", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "dgmg6oio", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "whrkruz4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "fai590w3", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "vurpd63m", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "y2h1oezd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "s0o4mtnj", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "lotmwlmv", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7wi5lp5x", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "lvvutl6y", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "zk0rnkb8", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "g2q87rao", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "5ccteekr", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "fr9dz6ir", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "cj758w2q", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "cag3bheq", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "c47wv6ae", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0z82lepk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "8h3d69wq", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "t576xx1s", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xhhn4q4q", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "appksqhl", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "0zq4ifcq", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4642g350", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "tjdf2jck", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "g8fqit9o", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5za39phy", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "oysgsoh9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "gutcddht", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "lds61t27", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fzft5z2e", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "j5x5rysf", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2jzlg5ri", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kybyjqro", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "di3731zq", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "svdeielm", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "n90xayat", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "954p8lvw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "jl15jnzc", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "u8ebcjye", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "f6vpt3in", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "quf33jju", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "26zw5k2f", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "uz26fd42", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "oytmvhke", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "dl543hac", + "_$type": "HBox", + "name": "HBox(2)", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "g2gbhfm8", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "a97zkhkj", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "aicitmtv", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "3ivui83c", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "vioilmme", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "jnxxoffk", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "thykci8w", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vftgmgs7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ixp6xn7x", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "elcd2ebh", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "55rd4vec", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "93ij5wqt", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "7eym48sf", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7etg3psd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "t8rpezgj", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ufd3g4sw", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "adnkf5h1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6nv84a20", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "yaqsuomq", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "54raa9jw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6ptezy62", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "h51v61jf", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "cznh1gn8", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "pqnwd1ke", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "l8ds50he", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "w8opbvqu", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "8qgatjsx", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0t3mqtke", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "i2e0446y", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "upulbxk4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vpzmfyk3", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "a9da72p5", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "aay1vdnd", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vfzo3q48", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "rtf1pod0", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "tkjxywtz", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "f40zxc2h", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "2zv7ij68", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "4h1itp08", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "oppkne4c", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ummkc26g", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "nw5s9pue", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "doqinkgo", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5w8xmg3r", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9rfa81er", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "avg6ax5m", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "8zn2q3do", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "za2syay0", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "we4yzekn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "xfbxani1", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "6dngz7ar", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "0tay4jvm", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "mosn2v4a", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ne092tff", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "cjqkpx4z", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "djwzwkt1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6y2cq9vw", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "q3zupxxl", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "uwl47n5v", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "gsqk9wpr", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "2sxnatmg", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "aixm3nus", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gz28yqkf", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ruhpv34a", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "rc6wlzuf", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "51ie5lsw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "l265z3ij", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "r04deise", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zkjhiu2a", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "nrffhyrh", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "3zkippzs", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "6ah7qamy", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "7adr16s0", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "nnynj4gs", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "24wt73ow", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "1kwl9l54", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ryin3g9z", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "epk1dt9i", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "p08glf33", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "080oyzhs", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "y032y597", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "4ctkh6h9", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "685hcros", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "yi4787wg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "tecvl9qf", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "cgjwl394", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "qvxqmj8p", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "w1k4hdwn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dd0jrtv0", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "x3z4ep1e", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "casgdsxm", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vfek8fea", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "nfru6x1b", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "yt51am05", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "43yynkon", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "z5nzqajj", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "c67d0wop", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "436xa84k", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "27lcxeke", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "tr7y4arg", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "uqdnuyta", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "3yczl8m5", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "70h7tgko", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "itosvw38", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "bfcxgq7d", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "7f6xrhwi", + "_$type": "HBox", + "name": "HBox(3)", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "m94scm9y", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "t9hq74ox", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "v4tsreew", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "z7oo42id", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "pp1whvnt", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "07aialay", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "yv5dzgbh", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jsx0cnge", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2903lg7r", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "m4onx6wv", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wyyskse0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "mdi47hvq", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "rwyo3yu5", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "56ckkdaz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "yry3yn1x", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "wenq6ot0", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2zsljt0t", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zrkczkxj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vrj10rmi", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "tszkby2k", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "9idhxtyo", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "8l4n91j8", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "3pes9p9s", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "y698xhno", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "muws0xas", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "1beelee1", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2ck17vur", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vnj2noq1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "a27nzj6y", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "8wnivt4u", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "t1ze12ni", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "4bypnxng", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "6ign7nl9", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gnix4mcx", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "6x46s36l", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "psme7ifm", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "f4g442l3", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "s9nzqn58", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "qmq7vtto", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "d2gj3la4", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "fp3llajz", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "y3xevn13", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nk5b811z", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "klels4s7", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "aqmnui28", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "j39fmz1h", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "b9c2s3zg", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "gvmu7pu7", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fm98a22o", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "e7zj7jxc", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "cxq4up82", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "pxhflx8z", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "r9zhxqip", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "macgvcme", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "qu9e2ez9", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "e4ctd7ua", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "pb64tqj2", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "n70dsnql", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "90so4rmv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "v4nyjctr", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "g4nh2cvv", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "jj122d6w", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vyd6tfb9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "p4ag3iud", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1q7zx3y6", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vbk2ip43", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7kcpzj6q", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "wd4bujn3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "cf31imyd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "n2b4go65", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2gdmnsf3", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "w7u4978x", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "dbzpf4bt", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "hnt6r0me", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "tqpirx9k", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "xredllj6", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "kzobangh", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1gy03ci6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0qziyt4l", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "mi7053ph", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xgxkgs75", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xemaej2g", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "7qhy5gyw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "47oj4r86", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "bzvjlotx", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "jpfdbr2w", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "huxlvfp3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "iaqxtuyl", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xf251t5g", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "k84ebbai", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "iv2mv3g8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "yrdgi0jo", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "346o2c17", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4ll849wk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "tg4ehkj8", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "wjjdcrbq", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "lwr5n7zt", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2qdpe5o9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "9icwe4rm", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "17xjsyai", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "svjw45ko", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "l1z75pul", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "hlzw84ip", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qy9a8jdn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "2vfgmtzf", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "kxxzovss", + "_$type": "Box", + "name": "Box(2)", + "x": 348, + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "n9fxq1wd", + "_$type": "Sprite", + "name": "Sprite", + "width": 354, + "height": 354, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(123, 129, 140, 1)" + } + ] + }, + { + "_$id": "5n8w4fkr", + "_$type": "Sprite", + "name": "Sprite", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(182, 186, 194, 1)" + } + ] + }, + { + "_$id": "tokaguhm", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "xfwahlkg", + "_$type": "HBox", + "name": "HBox(1)", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "dr9d1fwr", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "xz0un1mz", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "xpjs0jio", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "lt2zf60m", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "ko8oiexd", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "9fp96nyu", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "wc2wm1pj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "r4oox4cy", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "3fn201ev", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "aooqjmuh", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "875tn1m5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "t5b24pv3", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ynlveugw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "cc2pq34d", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "jx7whfzx", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "dpswicw7", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "d129oxvp", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "y2u1exjn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2r28jcpa", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ixz9bud2", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fl8yz6jd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2cm6xftp", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "z9ytloaf", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "mhrj1e79", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "pf24x09j", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "qnn83z3n", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1fwukwjg", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "m791q1gx", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "mqbj62j1", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "wtsym4jo", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bxbv2upe", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "d14xdgzc", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ybiionp1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "txtkswcz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "a9vt3ns2", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0zbhs5i9", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "rzqyl9it", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ny23uudy", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "nw9j0t3o", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "at00i9id", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "8qpkr596", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "cjoh5my5", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bodckx51", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "lij6ym07", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4nqjkfmy", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "a4w64z6o", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "wj5zbuia", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "igxbqihg", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "lcmhdpr9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "nmr7ukzw", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "75d7ry6r", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5pogss0u", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "odj9jzq9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "kl3rol49", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "6y9g4jrc", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "v8rlcjle", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vgv9snmp", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "a2sg75ik", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dsi5ekor", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "7a1w0kfc", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "0m9dz9gh", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9xhwr4dz", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "25nq5qdx", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "cmjyx2nx", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "sqis4e19", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "mpubmz5f", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vxpvxazo", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "j1mm5vv3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3qgyi7zv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "024os0tm", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ypey2ep3", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "nhxtct9e", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "5bcihvnn", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "q4p9dho0", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "qeorm7ma", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "38v33rol", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ixys9wu9", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5ifiuutk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1judnl4x", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "r14fi0v3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "b30zhd1o", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "wblsrjrc", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "z0ye2ojq", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ky5vzisn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "j9cbsf51", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "gnzm6pvu", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "p7ertmg4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "oz4adx4r", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7bhbnbyx", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "r7uhrapy", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0x4p1u13", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2lxff3s1", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "8m3bz2b6", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "klh8ydgc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "cj4ptc79", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "wdm6bsax", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "jrwdvr58", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vg9zzl31", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "l54xjk8g", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "apa1eji0", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4sayf05h", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ok3zj6yb", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "c0g1vter", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "knis2lw9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "xe2ajujw", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "t3a7m914", + "_$type": "HBox", + "name": "HBox(2)", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "8c5mx5iw", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "6flzc868", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ejhflt0v", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "gsiyubhw", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "arwjxare", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "nkqekil3", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "fyyjpq86", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qhoave6t", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "u9vdm42a", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "extqm4g6", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5gc1koai", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "f0swbqj8", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "g1iv2zpc", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "e64egnvi", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "ogr1ug3g", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "09zrqbbp", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "aaq0wp5l", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "n10rhkhc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "y12mkhtm", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9n9lq23o", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zlqbwyqz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bj2iipnc", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2zvxjb2g", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "tjwuu6bq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "2z8u6v5o", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "6pg6aa09", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "am8xn92c", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dla6hold", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "i4jf01x9", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "s3q3fkrj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "w0vzzg5f", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "9e5zt0i8", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ffdp7d6h", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4z6t50g7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "9izztwce", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "tlu0wodq", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "pa1i24br", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "m9o9enfe", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "l15527vy", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "uxgvhu45", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "87ezguto", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "xx6j9hfk", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "yk0m0uuv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bidvlr91", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9irc2cq9", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2vqed5n1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bm7wxvc8", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "offlmp2p", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ooho505n", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "s77ez37n", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "8linqvsm", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "84wbbwhh", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ztos0tl5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "3p138sn5", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "eipif1k4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "f22c1dqe", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "fybwnp1s", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "py8ng6qu", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kwtstx7d", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "5lqqdl0d", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ulbj7cbr", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "bz2mhsji", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jsjt9ur4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bkdtn7ma", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "7h4dv4im", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "re4m8d6u", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dwkwhmx9", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "w22dedsn", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "egh3zfam", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "h1mnmitv", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "09ipgcqs", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "l35p71o0", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "7fhp5mai", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "e6h2xb3f", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "buadw0ci", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "u6jg6z3g", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "s1kffys2", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nyirg7ru", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2bj6kfcd", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2032x3zt", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8qz39ada", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dzbyf3em", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "jz7rpgai", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "y2n5p5jh", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "na74dv5z", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "b450ie77", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ltxohodv", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "euf7wx0f", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bu7ayvfk", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "xo1fujbp", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ck90c3l9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5tebmjau", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ff46lxd6", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "41ejd2wv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "jn7np5md", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "opcaebc2", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5vabb76f", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dtssx1h2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dgukcclp", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5k2yf6dx", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jiyzn452", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "43m68eof", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "b42em8b1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qxehpl9d", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "hx84o2x2", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "wf0thok8", + "_$type": "HBox", + "name": "HBox(3)", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "pt30bqco", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "skjji8if", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "divtqurx", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "7khflhjt", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "kbu3yco5", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "0z954ui6", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "uepclb4c", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "thk335ek", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bkeuxur2", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5keh5njb", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "yhy31evy", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "huk5msje", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "uhchoxu8", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "k0yklrrr", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "hsdjf35a", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "2v4gjdjg", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "tqa0iyls", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gqarqyo6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ohff116w", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4u28vbyi", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8gxspa5z", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bz0retdt", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "6b9xjhz8", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2zoqd5r2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "cw5s3qe0", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "wq22h4ok", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "nmfe9tbx", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "94is7cm6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "9r8m3jen", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "n47ps1dt", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3fth40a1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6zkbw0ft", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "kfpwd5zg", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ovivuvmk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "hugu7lh1", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "aut6g2uu", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "ztxe3u7r", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "r4st0i18", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "qphv0kpk", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "wnwtfy6j", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "2m5fnk5r", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "o3s16ndb", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5z043lql", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "wua0q6xb", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "r3u37tof", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dpfs781t", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "tcsphz4i", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "u8bfvs5x", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ybi8p4r5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "fx82ck0f", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ol0toa5o", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "87qlrjnc", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0vo8gw4f", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "r9ikaekn", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5u1hih9m", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jck1pj4k", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ow8wh8kb", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ahkbzkty", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zyo305em", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "g9t1xh9v", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "5x0ihvc4", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "u5clx62o", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "b5uxlzpf", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ufno71wa", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "d4m9hwmi", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4upbi6xe", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "rj2uonso", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4nmn28p0", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "v8rsu222", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "k8oaxixn", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "l99qatf7", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "p98l41zt", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "fdve4w90", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "3r7p85ru", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "i6ct3ffd", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "aexmsp0p", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "c70ei922", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "a812a9c1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "emcxhfm7", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ga1dhbis", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "g8xv5yqg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2xkdwxvt", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1ivicpjb", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ed8naa8r", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "lijhh9xo", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "3klfmguu", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "blfw5gs8", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kza3sefp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "e75r1qoj", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "g1rsw0pn", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "yiskbooc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "nnflpj94", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5ueefs0o", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rj4lmjni", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "3xe0tm6j", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "zv4a8gp5", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "0oqqtxa1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wh5jdbqa", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hivf3zdp", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "y0aokqpe", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "pog0qki7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "x7muvqdx", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "pyupue93", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rvnr7r7m", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "y9liolka", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "nzlkn5qe", + "_$type": "Box", + "name": "Box(3)", + "x": 696, + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "aysubxmd", + "_$type": "Sprite", + "name": "Sprite", + "width": 354, + "height": 354, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(123, 129, 140, 1)" + } + ] + }, + { + "_$id": "8agogq0n", + "_$type": "Sprite", + "name": "Sprite", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(182, 186, 194, 1)" + } + ] + }, + { + "_$id": "4xo7vdle", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "yfru91v0", + "_$type": "HBox", + "name": "HBox(1)", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "18jz023s", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "mg94xesr", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "7yo5awpj", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "0sb1zwvp", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "ycamvg69", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "oobn63s1", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9ybb91my", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "eiy13g87", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "kwqgiulq", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "jovi70os", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ctkv83na", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "15bqlhh7", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "kos067ho", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qfcque9f", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "9ka70zh3", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "zu0mxetc", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "yalhh15b", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6of5vakz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "68cakhni", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ztfvw600", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "icohvdfo", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "n9ttkr5z", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "kgpxp3go", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1z93b2cj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "zrm54lpf", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "45lbm85n", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5se72ojw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "awvs7zkk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7dmcf2c7", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "vy5830r7", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "aayv4li8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "r3dgxo2s", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "uhfmvdfj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sr65uz9w", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "14beazgz", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "3g5iws1k", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "0z6r7lgm", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "fyqoiw87", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "q19sxyc4", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "s5gwer8q", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "c7m9s2jr", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "yxls0ydd", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "mfp0cnwk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dik8ajbc", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "18sdxrui", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xlkodswn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1qfn1g55", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "y94cim2o", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "c9vr7ojq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "ncvojtzt", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "rky8e8un", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "s8qkb00r", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4l6w35ao", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "l95dy3eb", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "zvs5igno", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nrs8p85a", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "rz1579l8", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4fsb7jcu", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nwth52zy", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "cq3t7ahv", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "oqunjm56", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ux1tvo3e", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ceoozhsq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7cbq4bb5", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5vy381zf", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "yqzp8ln9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1a73bsnd", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "xs4v0979", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1rceyl30", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "1e136xh7", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6rnduazv", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "hgazc0g4", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "h8pn71g0", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "f8psm90u", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "064byind", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "j26mhpt6", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9khyo3wb", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vmux9ogr", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "u02i95lo", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "r99pl3el", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "h5fuvx3k", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "p7qnptzb", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "pn2hg0ap", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zkzpgk2a", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "56x1wo9t", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "jq39py9t", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4rvokdsi", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2ihk8r6s", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vhz05hql", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "i9m7cfj7", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "p8d8ap4o", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "jn7fz4ml", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "zj4h711i", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ppfkwe9v", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "doqa89l2", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "7449p6vg", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "c3zxqj1e", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "k1hb61aj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "keqqhqer", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ydn81ub3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "243arfej", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "eljh3ywr", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "jq4607yr", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "flsxeuyq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "9ccymmhg", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "jbps6px5", + "_$type": "HBox", + "name": "HBox(2)", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "yybqilz2", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "ftnwcgb0", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "3r4r24hq", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "lgz8dhoq", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "3lh6ezgf", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "gsfdr2h1", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "f3t8phf4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hz060mb3", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "z9y1z66v", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "6l9w4rwy", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dr8tactx", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "wifx5g6u", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "hldtn0j0", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6dlub1lw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "geb1ml3j", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "5kg9bmkk", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "18xd6h9p", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6xc8ugp4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6x55zflo", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "yriqimbv", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8uef6gme", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "n6e5z8o7", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "t0w7o1tf", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "l9arntxk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "p08ghtio", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "vzpcx1t7", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "56gnh7w9", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dvp7paw5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qfoef4y9", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "zn4a4lrp", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "myvi62zx", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "4j9ym7s5", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "nspdbdxq", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "46z2wc8a", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "yr57d3xk", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "crp3c1h7", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "2s95s21z", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "msy16co2", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "uerkfr1r", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "qoxzhebe", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "sji5nmlj", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1aw21rle", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rski4re2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "amzxe5s1", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1v6xmq07", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jhxd9eln", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "riblbynf", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "kombq6fy", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "b37tx81o", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "lle3ozt8", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "gg4umpf7", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "8vjvtq05", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8y67niiz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "v93zwslw", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "b6zbnnal", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8viersyy", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "jp4xfoaw", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "rlkt4ysd", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "tod4qh5y", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "nle359zj", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "48fsj1yh", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "t2l9zo5c", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "amxltylf", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "26nmgh2p", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "i0jc73b1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vxqwwchp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "tbnagxjl", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "oirct4ys", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "r7qxs85g", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "v78rcz88", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "9h1jw0dh", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "pqs7ya1m", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "zh6pwhnq", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "chx0zvf7", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "tvj8o7ur", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "to3m4ken", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "mgbu0orp", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "cv8vwuy5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0kpu0at4", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "l4pwcr6k", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "9boi0jxk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "axq31blf", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "vjb3p17l", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sb7vkszg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "ysan08uk", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "6nat26m0", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "g7zl2u65", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "cltm8iqs", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5lxhepxz", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ufysoluf", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "z4ci369o", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "r60fp4m1", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "i45phs0a", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "maears96", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "bdik0pbr", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "m9e6xfeb", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "in508tqd", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1wczfdgn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "q1aafl6g", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "xniql0mw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gsc2prbi", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dargq5ww", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "lrqldjpt", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "n1f1r7oq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "mproru49", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "7shkzgql", + "_$type": "HBox", + "name": "HBox(3)", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "gwofn919", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "hob6zbr1", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "6jxjfoe4", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "d3d1zenj", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "k6q9gl87", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "08uyjwlk", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "dedv0at7", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wctx2xz3", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "zifz6hbv", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "soag1057", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "c12cn9o4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "51jyi3fm", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "yl5868c2", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "h2cd3kqc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "y9zgd477", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "hm7s42q0", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "a0fqa05g", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jvzupqpn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2ltsm5ci", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "fwy8uh5p", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xi37tukq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xzxkbbyw", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ko6f13gw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wb8hwlp8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "k2fji8f9", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "3o5l7iut", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "zu0wcun5", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "w1gtpq02", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "al9r7p6n", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "cms6odce", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wm7jop8x", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0ooccsri", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "847d4m1d", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bwzsexvc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "dxccds40", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ustff639", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "2zi5fq2l", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "9yueo6d4", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "erpjuu98", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "rx3ce71e", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ysoxb4av", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "b77wvun0", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "38tfjzks", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "tus8h4v7", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "fm7uq5gm", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "pod86g1p", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "n9mslqm3", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "3rdahkhu", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "92vtd8wx", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "9i0wgma6", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ejepsfmg", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "hq2iurgi", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "x28clgeg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "9buk4thl", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "c1wa0aqw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "d5al7w5c", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "top0r4cn", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "luwqr7uk", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6rjo8o23", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "noe31wz6", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "bxn4sthe", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "zudy1i2n", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "l3pizbx8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "lh7cs8wy", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "gfymqg63", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3dw3b5js", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "20tp7kcq", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ae8cci82", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "w081ge8s", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "81lpvp35", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "boxohgx8", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "lkyhal9u", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "13sob2qq", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "u7ddq4qd", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "jic9euzy", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "6573hh3m", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "jmj6the9", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "oxregu1v", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "q4e8bnev", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1h4auceq", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "teqy3uuc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "sdzflsw9", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "lvejx5lk", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5qampec4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "liw2g4mk", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "xi0wgo6w", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "l3vcbay1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "uybv27oy", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "treyd4vy", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "x7spyi0y", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wvm3pvxs", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "t0opop7v", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "lvhyc6sk", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zkls1h3g", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "mbn8dj5w", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "kr2mheui", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4n5pbbt6", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zxaoiy34", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "k443q162", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "kbfaxisz", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "v6g0l0ce", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qv75oe0t", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "a180tvay", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8ayc46nv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "vym622cf", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "rebw0lhh", + "_$type": "VBox", + "name": "pos", + "width": 1050, + "height": 1050, + "centerX": 0, + "centerY": 0, + "space": -6, + "align": "center", + "_$child": [ + { + "_$id": "t0p1akmn", + "_$type": "HBox", + "name": "HBox_1", + "width": 1050, + "height": 354, + "centerX": 0, + "space": -6, + "align": "middle", + "_$child": [ + { + "_$id": "gsrm6y57", + "_$type": "Box", + "name": "Box_1", + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "7ht41we1", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "65snbk3n", + "_$type": "HBox", + "name": "HBox_1", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "7xnlh90u", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "rn0bv96n", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "2o468ctg", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "7k140axf", + "_$type": "HBox", + "name": "HBox_2", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "qs9af6d3", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "hsqa11je", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "tjocmug8", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "mhu4hbj1", + "_$type": "HBox", + "name": "HBox_3", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "7xxgcd1s", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "qqy5yv77", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "uayqfi0l", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + } + ] + } + ] + }, + { + "_$id": "fmzn6rcj", + "_$type": "Box", + "name": "Box_2", + "x": 348, + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "mt2hgf7c", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "itfcdiev", + "_$type": "HBox", + "name": "HBox_1", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "0aga5k45", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "1tvj6v8q", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "mdxyb4e2", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "0dgfg5k9", + "_$type": "HBox", + "name": "HBox_2", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "jxr84775", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "j78tt0c1", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "vz2bvo32", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "wnkstwc6", + "_$type": "HBox", + "name": "HBox_3", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "i0i3s1pl", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "6njcl6qf", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "id6hkifs", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + } + ] + } + ] + }, + { + "_$id": "8khsao5q", + "_$type": "Box", + "name": "Box_3", + "x": 696, + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "u486crrt", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "5ro190qa", + "_$type": "HBox", + "name": "HBox_1", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "9zw0hgld", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "j7brxf9u", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "yz66dgt6", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "zzilytb6", + "_$type": "HBox", + "name": "HBox_2", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "zi7d2mo2", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "yc18g38n", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "gzlw3pc0", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "81qdacbw", + "_$type": "HBox", + "name": "HBox_3", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "rtkaza30", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "y5x176ft", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "1zh8kl4d", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "ic9jtcl0", + "_$type": "HBox", + "name": "HBox_2", + "y": 348, + "width": 1050, + "height": 354, + "centerX": 0, + "space": -6, + "align": "middle", + "_$child": [ + { + "_$id": "likuiaf5", + "_$type": "Box", + "name": "Box_1", + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "6uytfet4", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "15h3y6ug", + "_$type": "HBox", + "name": "HBox_1", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "8u1tgdzm", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "06fvy2fq", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "i3rz7s73", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "9ebw3k6k", + "_$type": "HBox", + "name": "HBox_2", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "dngbvgp4", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "nozct3mo", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "xvxvntc7", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "bedmfkfw", + "_$type": "HBox", + "name": "HBox_3", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "zb5dcw3r", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "n7pq4do3", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "cc6s0s1b", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + } + ] + } + ] + }, + { + "_$id": "h74vyg28", + "_$type": "Box", + "name": "Box_2", + "x": 348, + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "tzgk088z", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "skqx1vbw", + "_$type": "HBox", + "name": "HBox_1", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "65endqai", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "stxt8dut", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "nbf03kgc", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "kpjpq5dn", + "_$type": "HBox", + "name": "HBox_2", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "yl3glkks", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "18lkg3c0", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "14jus9vx", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "bt9r3gnf", + "_$type": "HBox", + "name": "HBox_3", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "c6u1yqxb", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "tfs6qaue", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "7ot5muxw", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + } + ] + } + ] + }, + { + "_$id": "cdd9nnik", + "_$type": "Box", + "name": "Box_3", + "x": 696, + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "7et4ybg4", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "m4bflmu2", + "_$type": "HBox", + "name": "HBox_1", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "mzhmfkp7", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "4f50gc8s", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "hryv5gzu", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "sf9ztyvv", + "_$type": "HBox", + "name": "HBox_2", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "897mtxmy", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "chyg0zsz", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "a2coe85x", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "moenoaf9", + "_$type": "HBox", + "name": "HBox_3", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "hkrnmrzc", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "3gzsfp8g", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "tcf7ojrj", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "sdll4y3i", + "_$type": "HBox", + "name": "HBox_3", + "y": 696, + "width": 1050, + "height": 354, + "centerX": 0, + "space": -6, + "align": "middle", + "_$child": [ + { + "_$id": "i53dk5nb", + "_$type": "Box", + "name": "Box_1", + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "apbt55bi", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "p3mzl8b2", + "_$type": "HBox", + "name": "HBox_1", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "escj540g", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "wv27gbti", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "zp61s842", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "6gj3m8id", + "_$type": "HBox", + "name": "HBox_2", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "66qesw70", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "w72xhif2", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "argvvsho", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "val96srv", + "_$type": "HBox", + "name": "HBox_3", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "f7coycu7", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "u9dj335b", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "qri9vtjp", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + } + ] + } + ] + }, + { + "_$id": "dr01ayi1", + "_$type": "Box", + "name": "Box_2", + "x": 348, + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "x1038z3o", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "7xehugdt", + "_$type": "HBox", + "name": "HBox_1", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "2gg17hxw", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "esb7rxg1", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "fat46rkp", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "e8tyutcz", + "_$type": "HBox", + "name": "HBox_2", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "va4fop7q", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "v06rf1pq", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "avsibiyp", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "ootlan5z", + "_$type": "HBox", + "name": "HBox_3", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "fijfq2pw", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "wb7n4f68", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "p11ks5s8", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + } + ] + } + ] + }, + { + "_$id": "x5i2w0og", + "_$type": "Box", + "name": "Box_3", + "x": 696, + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "y7trz730", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "4t7stzfy", + "_$type": "HBox", + "name": "HBox_1", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "0s4d7dmr", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "4xde6t9r", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "df904n39", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "bdbtph0j", + "_$type": "HBox", + "name": "HBox_2", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "gdu2o65n", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "siw7nz3w", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "0il6b7nz", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "y3cw5ybz", + "_$type": "HBox", + "name": "HBox_3", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "gqn81b7p", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "he7ideav", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "1qjcoqeb", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "7qai1jdm", + "_$type": "HBox", + "name": "buttons", + "x": 91, + "y": 1432, + "width": 898, + "height": 192, + "_mouseState": 2, + "drawCallOptimize": true, + "centerX": 0, + "centerY": 568, + "space": 38, + "align": "middle", + "_$child": [ + { + "_$id": "uug6jz7y", + "_$type": "Button", + "name": "btn_undo", + "width": 196, + "height": 192, + "_mouseState": 2, + "skin": "res://08a05164-eac8-4773-8e7d-749e477f1ee7", + "label": "", + "labelSize": 20, + "labelAlign": "center", + "labelVAlign": "middle", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": false + } + ], + "_$child": [ + { + "_$id": "at2v2bn5", + "_$type": "Image", + "name": "Image", + "x": 56, + "y": 34, + "width": 84, + "height": 84, + "centerX": 0, + "centerY": -20, + "skin": "res://8cacbf45-5b2c-4ec0-ad94-5ca671b74d72", + "color": "#ffffff" + }, + { + "_$id": "5x56vbw3", + "_$type": "Label", + "name": "label", + "x": 48, + "y": 126, + "width": 100, + "height": 40, + "centerX": 0, + "centerY": 50, + "text": "Undo", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(84, 89, 98, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ll1f1ee0", + "_$type": "Button", + "name": "btn_erase", + "x": 234, + "width": 196, + "height": 192, + "_mouseState": 2, + "skin": "res://08a05164-eac8-4773-8e7d-749e477f1ee7", + "label": "", + "labelSize": 20, + "labelAlign": "center", + "labelVAlign": "middle", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": false + } + ], + "_$child": [ + { + "_$id": "nu0r4h4m", + "_$type": "Image", + "name": "Image", + "x": 56, + "y": 34, + "width": 84, + "height": 84, + "centerX": 0, + "centerY": -20, + "skin": "res://4870f053-9781-471b-a405-ea95b5318a98", + "useSourceSize": true, + "color": "#ffffff" + }, + { + "_$id": "pc0bjn7t", + "_$type": "Label", + "name": "label", + "x": 48, + "y": 126, + "width": 100, + "height": 40, + "centerX": 0, + "centerY": 50, + "text": "Erase", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(84, 89, 98, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "umtydjve", + "_$type": "Button", + "name": "btn_note", + "x": 468, + "width": 196, + "height": 192, + "_mouseState": 2, + "skin": "res://08a05164-eac8-4773-8e7d-749e477f1ee7", + "label": "", + "labelSize": 20, + "labelAlign": "center", + "labelVAlign": "middle", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": false + } + ], + "_$child": [ + { + "_$id": "nd653uaf", + "_$type": "Box", + "name": "normal", + "x": 62, + "y": 39, + "width": 73, + "height": 74, + "centerX": 0, + "centerY": -20, + "_$child": [ + { + "_$id": "bi09jj9a", + "_$type": "Image", + "name": "Image", + "width": 73, + "height": 74, + "skin": "res://18ec8458-52a2-405b-886a-f6441ed4f785", + "color": "#ffffff", + "_$child": [ + { + "_$id": "xikibn0h", + "_$type": "Sprite", + "name": "off", + "x": 45, + "y": -26, + "width": 84, + "height": 48, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "lineWidth": 2, + "lineColor": "rgba(255, 255, 255, 1)", + "fillColor": "rgba(167, 171, 179, 1)" + } + ], + "_$child": [ + { + "_$id": "sajob6jr", + "_$type": "Label", + "name": "label", + "y": 4, + "width": 84, + "height": 48, + "centerX": 0, + "centerY": 4, + "text": "OFF", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 30, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(160, 160, 160, 1)" + } + ] + } + ] + } + ] + }, + { + "_$id": "dflp9r4d", + "_$type": "Box", + "name": "checked", + "x": 62, + "y": 39, + "width": 73, + "height": 74, + "centerX": 0, + "centerY": -20, + "_$child": [ + { + "_$id": "cwaogbaq", + "_$type": "Image", + "name": "Image", + "width": 73, + "height": 74, + "skin": "res://3d714bdf-39fd-48aa-b29d-5c179abc1981", + "color": "#ffffff", + "_$child": [ + { + "_$id": "8gny6los", + "_$type": "Sprite", + "name": "on", + "x": 45, + "y": -26, + "width": 72, + "height": 48, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "lineWidth": 2, + "lineColor": "rgba(255, 255, 255, 1)", + "fillColor": "rgba(29, 92, 220, 1)" + } + ], + "_$child": [ + { + "_$id": "houyxe6r", + "_$type": "Label", + "name": "label", + "y": 4, + "width": 72, + "height": 48, + "centerX": 0, + "centerY": 4, + "text": "ON", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 30, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(160, 160, 160, 1)" + } + ] + } + ] + } + ] + }, + { + "_$id": "cplq65uj", + "_$type": "Label", + "name": "label", + "x": 48, + "y": 126, + "width": 100, + "height": 40, + "centerX": 0, + "centerY": 50, + "text": "Notes", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(29, 92, 220, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ox4vivq3", + "_$type": "Button", + "name": "btn_hint", + "x": 702, + "width": 196, + "height": 192, + "_mouseState": 2, + "skin": "res://08a05164-eac8-4773-8e7d-749e477f1ee7", + "label": "", + "labelSize": 20, + "labelAlign": "center", + "labelVAlign": "middle", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": false + } + ], + "_$child": [ + { + "_$id": "qgd1z6lm", + "_$type": "Image", + "name": "Image", + "x": 67, + "y": 38, + "width": 63, + "height": 77, + "mouseThrough": true, + "centerX": 0, + "centerY": -20, + "skin": "res://45de1954-6e2a-45bf-a9a3-aa9a684be816", + "useSourceSize": true, + "color": "#ffffff", + "_$child": [ + { + "_$id": "9t9m3cg3", + "_$type": "Sprite", + "name": "normal", + "x": 40, + "y": -26, + "width": 48, + "height": 48, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 4, + "fillColor": "rgba(29, 108, 220, 1)" + } + ], + "_$child": [ + { + "_$id": "la5q6qsc", + "_$type": "Label", + "name": "label", + "width": 48, + "height": 48, + "centerX": 0, + "centerY": 0, + "text": "2", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 30, + "color": "rgba(245, 247, 251, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(160, 160, 160, 1)" + } + ] + }, + { + "_$id": "jgwq47et", + "_$type": "Sprite", + "name": "ad", + "x": 40, + "y": -26, + "width": 96, + "height": 48, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "lineWidth": 2, + "lineColor": "rgba(255, 255, 255, 1)", + "fillColor": "rgba(29, 92, 220, 1)" + } + ], + "_$child": [ + { + "_$id": "6mgjiuhv", + "_$type": "Sprite", + "name": "Sprite", + "x": 17, + "y": 13, + "width": 21, + "height": 22, + "_gcmds": [ + { + "_$type": "DrawPolyCmd", + "x": 0, + "y": 0, + "points": [ + 0, + 0, + 21, + 11, + 0, + 21 + ], + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + }, + { + "_$id": "bmgjjptw", + "_$type": "Label", + "name": "label", + "x": 36, + "width": 48, + "height": 48, + "centerX": 12, + "centerY": 0, + "text": "+2", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 30, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(160, 160, 160, 1)" + } + ] + } + ] + }, + { + "_$id": "h9be7h1y", + "_$type": "Label", + "name": "label", + "x": 48, + "y": 126, + "width": 100, + "height": 40, + "centerX": 0, + "centerY": 50, + "text": "Hint", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(84, 89, 98, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "2gza421u", + "_$type": "HBox", + "name": "candys", + "x": 18, + "y": 1694, + "width": 1044, + "height": 180, + "_mouseState": 2, + "drawCallOptimize": true, + "centerX": 0, + "centerY": 824, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "hkwr5zr5", + "_$type": "HBox", + "name": "HBox_1", + "width": 348, + "height": 180, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "q28wl4du", + "_$type": "Box", + "name": "Box_1", + "width": 116, + "height": 180, + "_$comp": [ + { + "_$type": "067a5d3a-4d7c-48d7-bb01-db2682fd6c01", + "scriptPath": "../src/views/Candy.ts" + } + ], + "_$child": [ + { + "_$id": "7t9urq2a", + "_$type": "Box", + "name": "offset", + "x": 58, + "y": 90, + "width": 106, + "height": 180, + "anchorX": 0.5, + "anchorY": 0.5, + "scaleX": 0.97, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "of21uf84", + "_$type": "Sprite", + "name": "shadow", + "width": 106, + "height": 180, + "alpha": 0.12, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 2, + "color": "#000" + } + ] + }, + { + "_$id": "q8azzur1", + "_$type": "Sprite", + "name": "Sprite", + "width": 106, + "height": 180, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "l45k9393", + "_$type": "Sprite", + "name": "mask", + "width": 106, + "height": 180, + "alpha": 0, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#1d5cdc" + } + ] + }, + { + "_$id": "rt71t0d8", + "_$type": "Label", + "name": "label", + "y": 18, + "width": 106, + "height": 108, + "mouseThrough": true, + "top": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 108, + "color": "rgba(37, 89, 192, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(0, 0, 0, 1)" + }, + { + "_$id": "fermwy5m", + "_$type": "Label", + "name": "label_left", + "y": 126, + "width": 106, + "height": 36, + "mouseThrough": true, + "bottom": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "ngd1my51", + "_$type": "Box", + "name": "Box_2", + "x": 116, + "width": 116, + "height": 180, + "_$comp": [ + { + "_$type": "067a5d3a-4d7c-48d7-bb01-db2682fd6c01", + "scriptPath": "../src/views/Candy.ts" + } + ], + "_$child": [ + { + "_$id": "brcoxh8u", + "_$type": "Box", + "name": "offset", + "x": 58, + "y": 90, + "width": 106, + "height": 180, + "anchorX": 0.5, + "anchorY": 0.5, + "scaleX": 0.97, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "j17uau6w", + "_$type": "Sprite", + "name": "shadow", + "width": 106, + "height": 180, + "alpha": 0.12, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 2, + "color": "#000" + } + ] + }, + { + "_$id": "cqoohqke", + "_$type": "Sprite", + "name": "Sprite", + "width": 106, + "height": 180, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "97wlds67", + "_$type": "Sprite", + "name": "mask", + "width": 106, + "height": 180, + "alpha": 0, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#1d5cdc" + } + ] + }, + { + "_$id": "v0giry6y", + "_$type": "Label", + "name": "label", + "y": 18, + "width": 106, + "height": 108, + "mouseThrough": true, + "top": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 108, + "color": "rgba(37, 89, 192, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(0, 0, 0, 1)" + }, + { + "_$id": "y621von1", + "_$type": "Label", + "name": "label_left", + "y": 126, + "width": 106, + "height": 36, + "mouseThrough": true, + "bottom": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "en09hwtx", + "_$type": "Box", + "name": "Box_3", + "x": 232, + "width": 116, + "height": 180, + "_$comp": [ + { + "_$type": "067a5d3a-4d7c-48d7-bb01-db2682fd6c01", + "scriptPath": "../src/views/Candy.ts" + } + ], + "_$child": [ + { + "_$id": "e29g2tca", + "_$type": "Box", + "name": "offset", + "x": 58, + "y": 90, + "width": 106, + "height": 180, + "anchorX": 0.5, + "anchorY": 0.5, + "scaleX": 0.97, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "wm0lvbqd", + "_$type": "Sprite", + "name": "shadow", + "width": 106, + "height": 180, + "alpha": 0.12, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 2, + "color": "#000" + } + ] + }, + { + "_$id": "ayy8gusq", + "_$type": "Sprite", + "name": "Sprite", + "width": 106, + "height": 180, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "571qj2hn", + "_$type": "Sprite", + "name": "mask", + "width": 106, + "height": 180, + "alpha": 0, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#1d5cdc" + } + ] + }, + { + "_$id": "bqevjky8", + "_$type": "Label", + "name": "label", + "y": 18, + "width": 106, + "height": 108, + "mouseThrough": true, + "top": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 108, + "color": "rgba(37, 89, 192, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(0, 0, 0, 1)" + }, + { + "_$id": "c28w1mfc", + "_$type": "Label", + "name": "label_left", + "y": 126, + "width": 106, + "height": 36, + "mouseThrough": true, + "bottom": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "0ozke0lb", + "_$type": "HBox", + "name": "HBox_2", + "x": 348, + "width": 348, + "height": 180, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "4e726jlo", + "_$type": "Box", + "name": "Box_1", + "width": 116, + "height": 180, + "_$comp": [ + { + "_$type": "067a5d3a-4d7c-48d7-bb01-db2682fd6c01", + "scriptPath": "../src/views/Candy.ts" + } + ], + "_$child": [ + { + "_$id": "pos2nnjk", + "_$type": "Box", + "name": "offset", + "x": 58, + "y": 90, + "width": 106, + "height": 180, + "anchorX": 0.5, + "anchorY": 0.5, + "scaleX": 0.97, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "hua8oxg7", + "_$type": "Sprite", + "name": "shadow", + "width": 106, + "height": 180, + "alpha": 0.12, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 2, + "color": "#000" + } + ] + }, + { + "_$id": "k8u98c5s", + "_$type": "Sprite", + "name": "Sprite", + "width": 106, + "height": 180, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "guz17aax", + "_$type": "Sprite", + "name": "mask", + "width": 106, + "height": 180, + "alpha": 0, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#1d5cdc" + } + ] + }, + { + "_$id": "uujse3rx", + "_$type": "Label", + "name": "label", + "y": 18, + "width": 106, + "height": 108, + "mouseThrough": true, + "top": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 108, + "color": "rgba(37, 89, 192, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(0, 0, 0, 1)" + }, + { + "_$id": "zj4fx0ks", + "_$type": "Label", + "name": "label_left", + "y": 126, + "width": 106, + "height": 36, + "mouseThrough": true, + "bottom": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "3l7egbmj", + "_$type": "Box", + "name": "Box_2", + "x": 116, + "width": 116, + "height": 180, + "_$comp": [ + { + "_$type": "067a5d3a-4d7c-48d7-bb01-db2682fd6c01", + "scriptPath": "../src/views/Candy.ts" + } + ], + "_$child": [ + { + "_$id": "k8v7uteh", + "_$type": "Box", + "name": "offset", + "x": 58, + "y": 90, + "width": 106, + "height": 180, + "anchorX": 0.5, + "anchorY": 0.5, + "scaleX": 0.97, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "n4ivi3xw", + "_$type": "Sprite", + "name": "shadow", + "width": 106, + "height": 180, + "alpha": 0.12, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 2, + "color": "#000" + } + ] + }, + { + "_$id": "3thaqg2e", + "_$type": "Sprite", + "name": "Sprite", + "width": 106, + "height": 180, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "yfg69j2p", + "_$type": "Sprite", + "name": "mask", + "width": 106, + "height": 180, + "alpha": 0, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#1d5cdc" + } + ] + }, + { + "_$id": "hxxdfifj", + "_$type": "Label", + "name": "label", + "y": 18, + "width": 106, + "height": 108, + "mouseThrough": true, + "top": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 108, + "color": "rgba(37, 89, 192, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(0, 0, 0, 1)" + }, + { + "_$id": "zir3l4hj", + "_$type": "Label", + "name": "label_left", + "y": 126, + "width": 106, + "height": 36, + "mouseThrough": true, + "bottom": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "p9cc93cz", + "_$type": "Box", + "name": "Box_3", + "x": 232, + "width": 116, + "height": 180, + "_$comp": [ + { + "_$type": "067a5d3a-4d7c-48d7-bb01-db2682fd6c01", + "scriptPath": "../src/views/Candy.ts" + } + ], + "_$child": [ + { + "_$id": "fjg95vko", + "_$type": "Box", + "name": "offset", + "x": 58, + "y": 90, + "width": 106, + "height": 180, + "anchorX": 0.5, + "anchorY": 0.5, + "scaleX": 0.97, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "vj27pl4m", + "_$type": "Sprite", + "name": "shadow", + "width": 106, + "height": 180, + "alpha": 0.12, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 2, + "color": "#000" + } + ] + }, + { + "_$id": "p37xigfq", + "_$type": "Sprite", + "name": "Sprite", + "width": 106, + "height": 180, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "tdoxguk1", + "_$type": "Sprite", + "name": "mask", + "width": 106, + "height": 180, + "alpha": 0, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#1d5cdc" + } + ] + }, + { + "_$id": "r0f2gs7n", + "_$type": "Label", + "name": "label", + "y": 18, + "width": 106, + "height": 108, + "mouseThrough": true, + "top": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 108, + "color": "rgba(37, 89, 192, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(0, 0, 0, 1)" + }, + { + "_$id": "qr9apsuf", + "_$type": "Label", + "name": "label_left", + "y": 126, + "width": 106, + "height": 36, + "mouseThrough": true, + "bottom": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "oin98tt4", + "_$type": "HBox", + "name": "HBox_3", + "x": 696, + "width": 348, + "height": 180, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "gbbdmuso", + "_$type": "Box", + "name": "Box_1", + "width": 116, + "height": 180, + "_$comp": [ + { + "_$type": "067a5d3a-4d7c-48d7-bb01-db2682fd6c01", + "scriptPath": "../src/views/Candy.ts" + } + ], + "_$child": [ + { + "_$id": "pneow3ya", + "_$type": "Box", + "name": "offset", + "x": 58, + "y": 90, + "width": 106, + "height": 180, + "anchorX": 0.5, + "anchorY": 0.5, + "scaleX": 0.97, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "ifs0uzd2", + "_$type": "Sprite", + "name": "shadow", + "width": 106, + "height": 180, + "alpha": 0.12, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 2, + "color": "#000" + } + ] + }, + { + "_$id": "vjdmod0m", + "_$type": "Sprite", + "name": "Sprite", + "width": 106, + "height": 180, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "lhm0pmku", + "_$type": "Sprite", + "name": "mask", + "width": 106, + "height": 180, + "alpha": 0, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#1d5cdc" + } + ] + }, + { + "_$id": "ih55fals", + "_$type": "Label", + "name": "label", + "y": 18, + "width": 106, + "height": 108, + "mouseThrough": true, + "top": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 108, + "color": "rgba(37, 89, 192, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(0, 0, 0, 1)" + }, + { + "_$id": "ficsu9x3", + "_$type": "Label", + "name": "label_left", + "y": 126, + "width": 106, + "height": 36, + "mouseThrough": true, + "bottom": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "o8jq7ewl", + "_$type": "Box", + "name": "Box_2", + "x": 116, + "width": 116, + "height": 180, + "_$comp": [ + { + "_$type": "067a5d3a-4d7c-48d7-bb01-db2682fd6c01", + "scriptPath": "../src/views/Candy.ts" + } + ], + "_$child": [ + { + "_$id": "p9i6n9r8", + "_$type": "Box", + "name": "offset", + "x": 58, + "y": 90, + "width": 106, + "height": 180, + "anchorX": 0.5, + "anchorY": 0.5, + "scaleX": 0.97, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "hnzo55w1", + "_$type": "Sprite", + "name": "shadow", + "width": 106, + "height": 180, + "alpha": 0.12, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 2, + "color": "#000" + } + ] + }, + { + "_$id": "wbwaacoq", + "_$type": "Sprite", + "name": "Sprite", + "width": 106, + "height": 180, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "4tm1i91o", + "_$type": "Sprite", + "name": "mask", + "width": 106, + "height": 180, + "alpha": 0, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#1d5cdc" + } + ] + }, + { + "_$id": "1i305duo", + "_$type": "Label", + "name": "label", + "y": 18, + "width": 106, + "height": 108, + "mouseThrough": true, + "top": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 108, + "color": "rgba(37, 89, 192, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(0, 0, 0, 1)" + }, + { + "_$id": "nkbu239a", + "_$type": "Label", + "name": "label_left", + "y": 126, + "width": 106, + "height": 36, + "mouseThrough": true, + "bottom": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "jen0410h", + "_$type": "Box", + "name": "Box_3", + "x": 232, + "width": 116, + "height": 180, + "_$comp": [ + { + "_$type": "067a5d3a-4d7c-48d7-bb01-db2682fd6c01", + "scriptPath": "../src/views/Candy.ts" + } + ], + "_$child": [ + { + "_$id": "74dlfvuq", + "_$type": "Box", + "name": "offset", + "x": 58, + "y": 90, + "width": 106, + "height": 180, + "anchorX": 0.5, + "anchorY": 0.5, + "scaleX": 0.97, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "a290qi5v", + "_$type": "Sprite", + "name": "shadow", + "width": 106, + "height": 180, + "alpha": 0.12, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 2, + "color": "#000" + } + ] + }, + { + "_$id": "ehs2890y", + "_$type": "Sprite", + "name": "Sprite", + "width": 106, + "height": 180, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "cluhx0lq", + "_$type": "Sprite", + "name": "mask", + "width": 106, + "height": 180, + "alpha": 0, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#1d5cdc" + } + ] + }, + { + "_$id": "jrwg0ptn", + "_$type": "Label", + "name": "label", + "y": 18, + "width": 106, + "height": 108, + "mouseThrough": true, + "top": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 108, + "color": "rgba(37, 89, 192, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(0, 0, 0, 1)" + }, + { + "_$id": "59ui7nxa", + "_$type": "Label", + "name": "label_left", + "y": 126, + "width": 106, + "height": 36, + "mouseThrough": true, + "bottom": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "n15hk529", + "_$type": "Box", + "name": "mask", + "width": 1080, + "height": 1920, + "visible": false, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "8214n7z0", + "_$type": "Sprite", + "name": "Sprite", + "width": 1080, + "height": 1920, + "alpha": 0.8, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(245, 247, 251, 1)" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/nginx/nginx.conf b/nginx/nginx.conf index f908d55..60824ce 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -7,7 +7,8 @@ http { # HTTP自动跳转HTTPS(可选) # return 301 https://$host$request_uri; - + client_max_body_size 200m; + location / { proxy_pass http://gitea:3000; # 3000 为 gitea 服务端口,gitea 是docker-compose服务名 proxy_set_header Host $host; diff --git a/shudu/.gitignore b/shudu/.gitignore new file mode 100644 index 0000000..e3665b9 --- /dev/null +++ b/shudu/.gitignore @@ -0,0 +1,7 @@ +.DS_Store +temp +library +local +release +node_modules +bin/js/bundles \ No newline at end of file diff --git a/shudu/.vscode/launch.json b/shudu/.vscode/launch.json new file mode 100644 index 0000000..86b4b33 --- /dev/null +++ b/shudu/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "chrome", + "request": "launch", + "name": "LayaAir Debug", + "url": "http://localhost:18090", + "webRoot": "${workspaceFolder}/bin" + } + ] +} diff --git a/shudu/.vscode/settings.json b/shudu/.vscode/settings.json new file mode 100644 index 0000000..63b15fa --- /dev/null +++ b/shudu/.vscode/settings.json @@ -0,0 +1,57 @@ +{ + "files.exclude": { + "**/.DS_Store": true, + "**/*.meta": true, + "library/": true, + "temp/": true, + "local/": true + }, + // Disable the default formatter, use eslint instead + "prettier.enable": false, + "editor.formatOnSave": false, + + // Auto fix + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit", + "source.organizeImports": "never" + }, + + // Silent the stylistic rules in you IDE, but still auto fix them + "eslint.rules.customizations": [ + { "rule": "style/*", "severity": "off", "fixable": true }, + { "rule": "format/*", "severity": "off", "fixable": true }, + { "rule": "*-indent", "severity": "off", "fixable": true }, + { "rule": "*-spacing", "severity": "off", "fixable": true }, + { "rule": "*-spaces", "severity": "off", "fixable": true }, + { "rule": "*-order", "severity": "off", "fixable": true }, + { "rule": "*-dangle", "severity": "off", "fixable": true }, + { "rule": "*-newline", "severity": "off", "fixable": true }, + { "rule": "*quotes", "severity": "off", "fixable": true }, + { "rule": "*semi", "severity": "off", "fixable": true } + ], + + // Enable eslint for all supported languages + "eslint.validate": [ + "javascript", + "javascriptreact", + "typescript", + "typescriptreact", + "vue", + "html", + "markdown", + "json", + "jsonc", + "yaml", + "toml", + "xml", + "gql", + "graphql", + "astro", + "svelte", + "css", + "less", + "scss", + "pcss", + "postcss" + ] +} diff --git a/shudu/NOTE.txt b/shudu/NOTE.txt new file mode 100644 index 0000000..1c4a79b --- /dev/null +++ b/shudu/NOTE.txt @@ -0,0 +1,6 @@ + +玩法功能问题 +无限撤回 +提示说明 + +中英文翻译 \ No newline at end of file diff --git a/shudu/README.md b/shudu/README.md new file mode 100644 index 0000000..dcef09c --- /dev/null +++ b/shudu/README.md @@ -0,0 +1,28 @@ +# **项目名称** + +> 数独 + +## **环境推荐** + +- Node.js (>= 22.x) +- npm (>= 11.x) +- LayaAir (> 3.2.x) + +## **打包构建** + +(如有特殊配置或脚本,需备注) + +## **IDE插件** + +(如有,需提供IDE插件列表) + +## **环境变量(宏)** + +(如有,需提供宏列表) + +## **其他** + +- (接口文档)[link] +- (需求文档)[link] +- (技术设计文档)[link] +- (相关资料)[link] diff --git a/shudu/assets/EaseTest.ls b/shudu/assets/EaseTest.ls new file mode 100644 index 0000000..e1411d3 --- /dev/null +++ b/shudu/assets/EaseTest.ls @@ -0,0 +1,896 @@ +{ + "_$ver": 1, + "_$id": "zjv0jmmd", + "_$type": "Scene", + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "name": "Scene2D", + "width": 1920, + "height": 1080, + "_$comp": [ + { + "_$type": "ce663753-2b15-47c1-a70f-474d0b365bdd", + "scriptPath": "../src/views/EaseTest.ts", + "title": { + "_$ref": "doldny1o" + }, + "icon": { + "_$ref": "sjw8qtvv" + }, + "obj_eases": { + "_$ref": "3opj2mm3" + } + } + ], + "_$child": [ + { + "_$id": "doldny1o", + "_$type": "Label", + "name": "Label", + "x": 460, + "y": 100, + "width": 1000, + "height": 100, + "top": 100, + "centerX": 0, + "text": "bAck", + "font": "ArialMT", + "fontSize": 100, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "align": "center", + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "sjw8qtvv", + "_$type": "Image", + "name": "Image", + "x": 400, + "y": 390, + "width": 300, + "height": 300, + "centerX": -410, + "centerY": 0, + "skin": "res://7d235ac1-6755-4409-ab86-23aaf41e1537", + "color": "#ffffff" + }, + { + "_$id": "3opj2mm3", + "_$type": "VBox", + "name": "eases", + "x": 20, + "y": 22, + "width": 200, + "height": 1036, + "left": 20, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "g1nr7or6", + "_$type": "Label", + "name": "Label(1)", + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "5p7m30az", + "_$type": "Label", + "name": "Label(2)", + "y": 28, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "7rkb42pt", + "_$type": "Label", + "name": "Label(3)", + "y": 56, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "1ge7k2jm", + "_$type": "Label", + "name": "Label(4)", + "y": 84, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "ie95obnx", + "_$type": "Label", + "name": "Label(5)", + "y": 112, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "7t65738a", + "_$type": "Label", + "name": "Label(6)", + "y": 140, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "gh7bjqmb", + "_$type": "Label", + "name": "Label(7)", + "y": 168, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "zvo83kqp", + "_$type": "Label", + "name": "Label(8)", + "y": 196, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "ci7m7k2p", + "_$type": "Label", + "name": "Label(9)", + "y": 224, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "613b52zw", + "_$type": "Label", + "name": "Label(10)", + "y": 252, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "83h1kf9q", + "_$type": "Label", + "name": "Label(11)", + "y": 280, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "wlrjp5no", + "_$type": "Label", + "name": "Label(12)", + "y": 308, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "zdz5gklm", + "_$type": "Label", + "name": "Label(13)", + "y": 336, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "tstbekgh", + "_$type": "Label", + "name": "Label(14)", + "y": 364, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "6yeknx9o", + "_$type": "Label", + "name": "Label(15)", + "y": 392, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "1c9ib9x9", + "_$type": "Label", + "name": "Label(16)", + "y": 420, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "77ll2526", + "_$type": "Label", + "name": "Label(17)", + "y": 448, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "i6nw7kk2", + "_$type": "Label", + "name": "Label(18)", + "y": 476, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "eylrhevf", + "_$type": "Label", + "name": "Label(19)", + "y": 504, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "sbosudij", + "_$type": "Label", + "name": "Label(20)", + "y": 532, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "bvnvksaf", + "_$type": "Label", + "name": "Label(21)", + "y": 560, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "59qeq7tg", + "_$type": "Label", + "name": "Label(22)", + "y": 588, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "lqu1vny9", + "_$type": "Label", + "name": "Label(23)", + "y": 616, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "y94x4q45", + "_$type": "Label", + "name": "Label(24)", + "y": 644, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "j0j3z9uj", + "_$type": "Label", + "name": "Label(25)", + "y": 672, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "ba7cywma", + "_$type": "Label", + "name": "Label(26)", + "y": 700, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "4ozny0pv", + "_$type": "Label", + "name": "Label(27)", + "y": 728, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "fte0app0", + "_$type": "Label", + "name": "Label(28)", + "y": 756, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "4tzqirau", + "_$type": "Label", + "name": "Label(29)", + "y": 784, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "rzj205ne", + "_$type": "Label", + "name": "Label(30)", + "y": 812, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "3qjmx283", + "_$type": "Label", + "name": "Label(31)", + "y": 840, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "n632d90g", + "_$type": "Label", + "name": "Label(32)", + "y": 868, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "5q7ltsmd", + "_$type": "Label", + "name": "Label(33)", + "y": 896, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "i0597f7e", + "_$type": "Label", + "name": "Label(34)", + "y": 924, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "jkirwgwh", + "_$type": "Label", + "name": "Label(35)", + "y": 952, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "umbtgony", + "_$type": "Label", + "name": "Label(36)", + "y": 980, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + }, + { + "_$id": "cpbqm0tn", + "_$type": "Label", + "name": "Label(37)", + "y": 1008, + "width": 200, + "height": 28, + "text": "bAck", + "font": "ArialMT", + "fontSize": 28, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/shudu/assets/EaseTest.ls.meta b/shudu/assets/EaseTest.ls.meta new file mode 100644 index 0000000..447b434 --- /dev/null +++ b/shudu/assets/EaseTest.ls.meta @@ -0,0 +1,3 @@ +{ + "uuid": "c3206348-0589-45a3-8dbd-4d153d5f457e" +} \ No newline at end of file diff --git a/shudu/assets/Scene.ls b/shudu/assets/Scene.ls new file mode 100644 index 0000000..4726936 --- /dev/null +++ b/shudu/assets/Scene.ls @@ -0,0 +1,93 @@ +{ + "_$ver": 1, + "_$id": "lx8mwule", + "_$type": "Scene", + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "name": "Scene2D", + "width": 1920, + "height": 1080, + "_$comp": [ + { + "_$type": "7bad1742-6eed-4d8d-81c0-501dc5bf03d6", + "scriptPath": "../src/Main.ts" + }, + { + "_$type": "cd70cd5e-b4cd-4277-ac0a-2224cfbe89ac", + "scriptPath": "../src/models/UIManager.ts", + "debug": false, + "mask": { + "_$ref": "2668mvhf" + }, + "btn_clean": { + "_$ref": "c5p596do" + } + } + ], + "_$child": [ + { + "_$id": "4rxcl2w3", + "_$type": "Panel", + "name": "UIRoot", + "width": 1920, + "height": 1080, + "_mouseState": 2, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0 + }, + { + "_$id": "2668mvhf", + "_$type": "Image", + "name": "mask", + "width": 1920, + "height": 1080, + "alpha": 0, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "skin": "res://a98f334e-ce04-4cd0-8fc5-bbdf9b048609", + "color": "#ffffff" + }, + { + "_$id": "c5p596do", + "_$type": "Box", + "name": "btn_clean", + "x": 860, + "y": 1020, + "width": 200, + "height": 60, + "bottom": 0, + "centerX": 0, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "oedhd7ds", + "_$type": "Label", + "name": "Label", + "width": 200, + "height": 60, + "centerX": 0, + "centerY": 0, + "text": "Clean", + "font": "ArialMT", + "fontSize": 60, + "color": "rgba(89, 109, 152, 1)", + "align": "center", + "valign": "middle", + "padding": "0,0,0,0" + } + ] + } + ] +} \ No newline at end of file diff --git a/shudu/assets/Scene.ls.meta b/shudu/assets/Scene.ls.meta new file mode 100644 index 0000000..97b0beb --- /dev/null +++ b/shudu/assets/Scene.ls.meta @@ -0,0 +1,3 @@ +{ + "uuid": "9b931ecf-fde9-44dd-acf3-15f8dc807965" +} \ No newline at end of file diff --git a/shudu/assets/atlas/AtlasConfig.atlascfg b/shudu/assets/atlas/AtlasConfig.atlascfg new file mode 100644 index 0000000..d5b213e --- /dev/null +++ b/shudu/assets/atlas/AtlasConfig.atlascfg @@ -0,0 +1,15 @@ +{ + "perFolder": true, + "includeSubFolders": true, + "maxWidth": 1024, + "maxHeight": 1024, + "eachMaxWidth": 512, + "eachMaxHeight": 512, + "scale": 1, + "pot": true, + "trimImage": true, + "platformDefault": { + "format": 0, + "quality": 1 + } +} \ No newline at end of file diff --git a/shudu/assets/atlas/AtlasConfig.atlascfg.meta b/shudu/assets/atlas/AtlasConfig.atlascfg.meta new file mode 100644 index 0000000..d1ea771 --- /dev/null +++ b/shudu/assets/atlas/AtlasConfig.atlascfg.meta @@ -0,0 +1,3 @@ +{ + "uuid": "796f02a6-37c1-451b-82b3-434e53a64447" +} \ No newline at end of file diff --git a/shudu/assets/atlas/comp/White.png b/shudu/assets/atlas/comp/White.png new file mode 100644 index 0000000..4cbbd6a Binary files /dev/null and b/shudu/assets/atlas/comp/White.png differ diff --git a/shudu/assets/atlas/comp/White.png.meta b/shudu/assets/atlas/comp/White.png.meta new file mode 100644 index 0000000..9f4329b --- /dev/null +++ b/shudu/assets/atlas/comp/White.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "5f574ee6-46ee-4c31-b0ec-95c5731e6102", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/atlas/comp/White_left.png b/shudu/assets/atlas/comp/White_left.png new file mode 100644 index 0000000..a04cad9 Binary files /dev/null and b/shudu/assets/atlas/comp/White_left.png differ diff --git a/shudu/assets/atlas/comp/White_left.png.meta b/shudu/assets/atlas/comp/White_left.png.meta new file mode 100644 index 0000000..9825180 --- /dev/null +++ b/shudu/assets/atlas/comp/White_left.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "f4fc5788-06e1-422c-876d-36b204a1f067", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/atlas/comp/White_right.png b/shudu/assets/atlas/comp/White_right.png new file mode 100644 index 0000000..a665396 Binary files /dev/null and b/shudu/assets/atlas/comp/White_right.png differ diff --git a/shudu/assets/atlas/comp/White_right.png.meta b/shudu/assets/atlas/comp/White_right.png.meta new file mode 100644 index 0000000..6461ddd --- /dev/null +++ b/shudu/assets/atlas/comp/White_right.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "dc59dea2-ef06-43dd-898f-01d253952f0c", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/atlas/comp/White_year.png b/shudu/assets/atlas/comp/White_year.png new file mode 100644 index 0000000..b53ee3d Binary files /dev/null and b/shudu/assets/atlas/comp/White_year.png differ diff --git a/shudu/assets/atlas/comp/White_year.png.meta b/shudu/assets/atlas/comp/White_year.png.meta new file mode 100644 index 0000000..cfeeb69 --- /dev/null +++ b/shudu/assets/atlas/comp/White_year.png.meta @@ -0,0 +1,13 @@ +{ + "uuid": "970e3101-839f-40ec-b888-894ef1981bc3", + "importer": { + "textureType": 2, + "sizeGrid": [ + 20, + 300, + 20, + 300, + 0 + ] + } +} \ No newline at end of file diff --git a/shudu/assets/atlas/comp/back.png b/shudu/assets/atlas/comp/back.png new file mode 100644 index 0000000..d5e090c Binary files /dev/null and b/shudu/assets/atlas/comp/back.png differ diff --git a/shudu/assets/atlas/comp/back.png.meta b/shudu/assets/atlas/comp/back.png.meta new file mode 100644 index 0000000..3f1bee5 --- /dev/null +++ b/shudu/assets/atlas/comp/back.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "21a7a361-2c1f-455b-9551-73a231f3efea", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/atlas/comp/badge_bg_blue.png b/shudu/assets/atlas/comp/badge_bg_blue.png new file mode 100644 index 0000000..903b930 Binary files /dev/null and b/shudu/assets/atlas/comp/badge_bg_blue.png differ diff --git a/shudu/assets/atlas/comp/badge_bg_blue.png.meta b/shudu/assets/atlas/comp/badge_bg_blue.png.meta new file mode 100644 index 0000000..4b4397c --- /dev/null +++ b/shudu/assets/atlas/comp/badge_bg_blue.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "7c87f6c5-6334-4f12-b61a-22c3af858d8f", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/atlas/comp/bg_black_white.png b/shudu/assets/atlas/comp/bg_black_white.png new file mode 100644 index 0000000..bb1adfe Binary files /dev/null and b/shudu/assets/atlas/comp/bg_black_white.png differ diff --git a/shudu/assets/atlas/comp/bg_black_white.png.meta b/shudu/assets/atlas/comp/bg_black_white.png.meta new file mode 100644 index 0000000..a59cb7b --- /dev/null +++ b/shudu/assets/atlas/comp/bg_black_white.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "a98f334e-ce04-4cd0-8fc5-bbdf9b048609", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/atlas/comp/bg_circel_selected.png b/shudu/assets/atlas/comp/bg_circel_selected.png new file mode 100644 index 0000000..b659ccb Binary files /dev/null and b/shudu/assets/atlas/comp/bg_circel_selected.png differ diff --git a/shudu/assets/atlas/comp/bg_circel_selected.png.meta b/shudu/assets/atlas/comp/bg_circel_selected.png.meta new file mode 100644 index 0000000..37a2fd3 --- /dev/null +++ b/shudu/assets/atlas/comp/bg_circel_selected.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "322fb15d-5470-4876-a8db-3051a916dde4", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/atlas/comp/bg_common_white.png b/shudu/assets/atlas/comp/bg_common_white.png new file mode 100644 index 0000000..5fa80fc Binary files /dev/null and b/shudu/assets/atlas/comp/bg_common_white.png differ diff --git a/shudu/assets/atlas/comp/bg_common_white.png.meta b/shudu/assets/atlas/comp/bg_common_white.png.meta new file mode 100644 index 0000000..61f936e --- /dev/null +++ b/shudu/assets/atlas/comp/bg_common_white.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "07b90718-84ee-4924-9098-8f0ee3663d92", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/atlas/comp/btn_back.png b/shudu/assets/atlas/comp/btn_back.png new file mode 100644 index 0000000..e818eaf Binary files /dev/null and b/shudu/assets/atlas/comp/btn_back.png differ diff --git a/shudu/assets/atlas/comp/btn_back.png.meta b/shudu/assets/atlas/comp/btn_back.png.meta new file mode 100644 index 0000000..6b67268 --- /dev/null +++ b/shudu/assets/atlas/comp/btn_back.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "06a9c4a8-d664-4f3a-9c35-25b610195ced", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/atlas/comp/btn_back_white.png b/shudu/assets/atlas/comp/btn_back_white.png new file mode 100644 index 0000000..896bbaa Binary files /dev/null and b/shudu/assets/atlas/comp/btn_back_white.png differ diff --git a/shudu/assets/atlas/comp/btn_back_white.png.meta b/shudu/assets/atlas/comp/btn_back_white.png.meta new file mode 100644 index 0000000..682ee05 --- /dev/null +++ b/shudu/assets/atlas/comp/btn_back_white.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "19283ae3-c041-4a01-8fab-3c03add31bf8", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/atlas/comp/btn_erase.png b/shudu/assets/atlas/comp/btn_erase.png new file mode 100644 index 0000000..d485ea8 Binary files /dev/null and b/shudu/assets/atlas/comp/btn_erase.png differ diff --git a/shudu/assets/atlas/comp/btn_erase.png.meta b/shudu/assets/atlas/comp/btn_erase.png.meta new file mode 100644 index 0000000..9cb2570 --- /dev/null +++ b/shudu/assets/atlas/comp/btn_erase.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "4870f053-9781-471b-a405-ea95b5318a98", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/atlas/comp/btn_hint.png b/shudu/assets/atlas/comp/btn_hint.png new file mode 100644 index 0000000..b399d24 Binary files /dev/null and b/shudu/assets/atlas/comp/btn_hint.png differ diff --git a/shudu/assets/atlas/comp/btn_hint.png.meta b/shudu/assets/atlas/comp/btn_hint.png.meta new file mode 100644 index 0000000..b88111d --- /dev/null +++ b/shudu/assets/atlas/comp/btn_hint.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "45de1954-6e2a-45bf-a9a3-aa9a684be816", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/atlas/comp/btn_item.png b/shudu/assets/atlas/comp/btn_item.png new file mode 100644 index 0000000..53219bb Binary files /dev/null and b/shudu/assets/atlas/comp/btn_item.png differ diff --git a/shudu/assets/atlas/comp/btn_item.png.meta b/shudu/assets/atlas/comp/btn_item.png.meta new file mode 100644 index 0000000..44f407c --- /dev/null +++ b/shudu/assets/atlas/comp/btn_item.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "08a05164-eac8-4773-8e7d-749e477f1ee7", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/atlas/comp/btn_item2.png b/shudu/assets/atlas/comp/btn_item2.png new file mode 100644 index 0000000..0748302 Binary files /dev/null and b/shudu/assets/atlas/comp/btn_item2.png differ diff --git a/shudu/assets/atlas/comp/btn_item2.png.meta b/shudu/assets/atlas/comp/btn_item2.png.meta new file mode 100644 index 0000000..2e6aa95 --- /dev/null +++ b/shudu/assets/atlas/comp/btn_item2.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "d8b02de6-eee7-47ea-b227-d6dbffdadae3", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/atlas/comp/btn_left.png b/shudu/assets/atlas/comp/btn_left.png new file mode 100644 index 0000000..a21ba8b Binary files /dev/null and b/shudu/assets/atlas/comp/btn_left.png differ diff --git a/shudu/assets/atlas/comp/btn_left.png.meta b/shudu/assets/atlas/comp/btn_left.png.meta new file mode 100644 index 0000000..b13885c --- /dev/null +++ b/shudu/assets/atlas/comp/btn_left.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "535f9c82-7994-4fd9-a6b5-e7d08199cd4f", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/atlas/comp/btn_note_gray.png b/shudu/assets/atlas/comp/btn_note_gray.png new file mode 100644 index 0000000..109f0bc Binary files /dev/null and b/shudu/assets/atlas/comp/btn_note_gray.png differ diff --git a/shudu/assets/atlas/comp/btn_note_gray.png.meta b/shudu/assets/atlas/comp/btn_note_gray.png.meta new file mode 100644 index 0000000..1c3e616 --- /dev/null +++ b/shudu/assets/atlas/comp/btn_note_gray.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "18ec8458-52a2-405b-886a-f6441ed4f785", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/atlas/comp/btn_note_light.png b/shudu/assets/atlas/comp/btn_note_light.png new file mode 100644 index 0000000..44898a1 Binary files /dev/null and b/shudu/assets/atlas/comp/btn_note_light.png differ diff --git a/shudu/assets/atlas/comp/btn_note_light.png.meta b/shudu/assets/atlas/comp/btn_note_light.png.meta new file mode 100644 index 0000000..43f6ad2 --- /dev/null +++ b/shudu/assets/atlas/comp/btn_note_light.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "3d714bdf-39fd-48aa-b29d-5c179abc1981", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/atlas/comp/btn_pause.png b/shudu/assets/atlas/comp/btn_pause.png new file mode 100644 index 0000000..48ded8b Binary files /dev/null and b/shudu/assets/atlas/comp/btn_pause.png differ diff --git a/shudu/assets/atlas/comp/btn_pause.png.meta b/shudu/assets/atlas/comp/btn_pause.png.meta new file mode 100644 index 0000000..40c9186 --- /dev/null +++ b/shudu/assets/atlas/comp/btn_pause.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "7d36066d-f01a-4a46-9eb7-109f58cdbc19", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/atlas/comp/btn_right.png b/shudu/assets/atlas/comp/btn_right.png new file mode 100644 index 0000000..5c90197 Binary files /dev/null and b/shudu/assets/atlas/comp/btn_right.png differ diff --git a/shudu/assets/atlas/comp/btn_right.png.meta b/shudu/assets/atlas/comp/btn_right.png.meta new file mode 100644 index 0000000..972dfae --- /dev/null +++ b/shudu/assets/atlas/comp/btn_right.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "25320e1c-b60c-45af-9122-cdc433872fa7", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/atlas/comp/btn_undo.png b/shudu/assets/atlas/comp/btn_undo.png new file mode 100644 index 0000000..603d565 Binary files /dev/null and b/shudu/assets/atlas/comp/btn_undo.png differ diff --git a/shudu/assets/atlas/comp/btn_undo.png.meta b/shudu/assets/atlas/comp/btn_undo.png.meta new file mode 100644 index 0000000..105edf1 --- /dev/null +++ b/shudu/assets/atlas/comp/btn_undo.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "8cacbf45-5b2c-4ec0-ad94-5ca671b74d72", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/atlas/comp/candy1.png b/shudu/assets/atlas/comp/candy1.png new file mode 100644 index 0000000..fc86098 Binary files /dev/null and b/shudu/assets/atlas/comp/candy1.png differ diff --git a/shudu/assets/atlas/comp/candy1.png.meta b/shudu/assets/atlas/comp/candy1.png.meta new file mode 100644 index 0000000..7329364 --- /dev/null +++ b/shudu/assets/atlas/comp/candy1.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "8642aa69-2caf-42a1-8188-3ac77f5b707f", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/atlas/comp/candy2.png b/shudu/assets/atlas/comp/candy2.png new file mode 100644 index 0000000..b0d8ec3 Binary files /dev/null and b/shudu/assets/atlas/comp/candy2.png differ diff --git a/shudu/assets/atlas/comp/candy2.png.meta b/shudu/assets/atlas/comp/candy2.png.meta new file mode 100644 index 0000000..a4305be --- /dev/null +++ b/shudu/assets/atlas/comp/candy2.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "d97d45fb-6f52-4618-a9a7-60f9de66bb48", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/atlas/comp/ic_basic_video_fill.png b/shudu/assets/atlas/comp/ic_basic_video_fill.png new file mode 100644 index 0000000..c14e302 Binary files /dev/null and b/shudu/assets/atlas/comp/ic_basic_video_fill.png differ diff --git a/shudu/assets/atlas/comp/ic_basic_video_fill.png.meta b/shudu/assets/atlas/comp/ic_basic_video_fill.png.meta new file mode 100644 index 0000000..2bd1c1d --- /dev/null +++ b/shudu/assets/atlas/comp/ic_basic_video_fill.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "d5c4d8ea-f4c9-4fcf-970c-8258e0f98410", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/atlas/comp/icon_check.png b/shudu/assets/atlas/comp/icon_check.png new file mode 100644 index 0000000..0b8fbbd Binary files /dev/null and b/shudu/assets/atlas/comp/icon_check.png differ diff --git a/shudu/assets/atlas/comp/icon_check.png.meta b/shudu/assets/atlas/comp/icon_check.png.meta new file mode 100644 index 0000000..56429e4 --- /dev/null +++ b/shudu/assets/atlas/comp/icon_check.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "6f23a1ca-70f5-467a-afc3-5b178a851423", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/atlas/comp/icon_clock.png b/shudu/assets/atlas/comp/icon_clock.png new file mode 100644 index 0000000..4f6aa65 Binary files /dev/null and b/shudu/assets/atlas/comp/icon_clock.png differ diff --git a/shudu/assets/atlas/comp/icon_clock.png.meta b/shudu/assets/atlas/comp/icon_clock.png.meta new file mode 100644 index 0000000..3540771 --- /dev/null +++ b/shudu/assets/atlas/comp/icon_clock.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "2b4d26c7-ae87-47a3-8084-29a243441634", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/atlas/comp/icon_pause.png b/shudu/assets/atlas/comp/icon_pause.png new file mode 100644 index 0000000..5c357c1 Binary files /dev/null and b/shudu/assets/atlas/comp/icon_pause.png differ diff --git a/shudu/assets/atlas/comp/icon_pause.png.meta b/shudu/assets/atlas/comp/icon_pause.png.meta new file mode 100644 index 0000000..51fd045 --- /dev/null +++ b/shudu/assets/atlas/comp/icon_pause.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "1fdb96f6-bb74-4923-8839-b44093e9d6d1", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/atlas/comp/icon_star.png b/shudu/assets/atlas/comp/icon_star.png new file mode 100644 index 0000000..2668cb6 Binary files /dev/null and b/shudu/assets/atlas/comp/icon_star.png differ diff --git a/shudu/assets/atlas/comp/icon_star.png.meta b/shudu/assets/atlas/comp/icon_star.png.meta new file mode 100644 index 0000000..7603c3a --- /dev/null +++ b/shudu/assets/atlas/comp/icon_star.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "17d69d50-f2d0-4423-b98b-965ff12806d1", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/atlas/comp/icon_trophy.png b/shudu/assets/atlas/comp/icon_trophy.png new file mode 100644 index 0000000..ae0c239 Binary files /dev/null and b/shudu/assets/atlas/comp/icon_trophy.png differ diff --git a/shudu/assets/atlas/comp/icon_trophy.png.meta b/shudu/assets/atlas/comp/icon_trophy.png.meta new file mode 100644 index 0000000..25475eb --- /dev/null +++ b/shudu/assets/atlas/comp/icon_trophy.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "4458c7de-47ff-496e-a28f-be808c0823b3", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/atlas/comp/icon_x.png b/shudu/assets/atlas/comp/icon_x.png new file mode 100644 index 0000000..2eca65e Binary files /dev/null and b/shudu/assets/atlas/comp/icon_x.png differ diff --git a/shudu/assets/atlas/comp/icon_x.png.meta b/shudu/assets/atlas/comp/icon_x.png.meta new file mode 100644 index 0000000..4041431 --- /dev/null +++ b/shudu/assets/atlas/comp/icon_x.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "f558f5db-ce87-4707-92ac-0c0f426844f0", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/effect/lottie_blossom_light/images/img_0.png b/shudu/assets/effect/lottie_blossom_light/images/img_0.png new file mode 100644 index 0000000..b843681 Binary files /dev/null and b/shudu/assets/effect/lottie_blossom_light/images/img_0.png differ diff --git a/shudu/assets/effect/lottie_blossom_light/images/img_0.png.meta b/shudu/assets/effect/lottie_blossom_light/images/img_0.png.meta new file mode 100644 index 0000000..2599232 --- /dev/null +++ b/shudu/assets/effect/lottie_blossom_light/images/img_0.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "78407bcd-d800-4d00-978d-d2f94a4f737a", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/effect/lottie_blossom_light/images/img_1.png b/shudu/assets/effect/lottie_blossom_light/images/img_1.png new file mode 100644 index 0000000..6867f6f Binary files /dev/null and b/shudu/assets/effect/lottie_blossom_light/images/img_1.png differ diff --git a/shudu/assets/effect/lottie_blossom_light/images/img_1.png.meta b/shudu/assets/effect/lottie_blossom_light/images/img_1.png.meta new file mode 100644 index 0000000..4e78ac1 --- /dev/null +++ b/shudu/assets/effect/lottie_blossom_light/images/img_1.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "c6826964-7154-4ab4-9fc4-9b5a52942e7d", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/effect/lottie_blossom_light/images/img_2.png b/shudu/assets/effect/lottie_blossom_light/images/img_2.png new file mode 100644 index 0000000..d4a306e Binary files /dev/null and b/shudu/assets/effect/lottie_blossom_light/images/img_2.png differ diff --git a/shudu/assets/effect/lottie_blossom_light/images/img_2.png.meta b/shudu/assets/effect/lottie_blossom_light/images/img_2.png.meta new file mode 100644 index 0000000..8423efa --- /dev/null +++ b/shudu/assets/effect/lottie_blossom_light/images/img_2.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "88245a5c-532a-40e2-b3af-3aed6ed58bd3", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/effect/lottie_blossom_light/lottie_blossom_light.json b/shudu/assets/effect/lottie_blossom_light/lottie_blossom_light.json new file mode 100644 index 0000000..f457e4a --- /dev/null +++ b/shudu/assets/effect/lottie_blossom_light/lottie_blossom_light.json @@ -0,0 +1 @@ +{ "v": "5.12.2", "fr": 30, "ip": 0, "op": 30, "w": 1296, "h": 1296, "nm": "lottie_blossom_light", "ddd": 0, "assets": [{ "id": "image_0", "w": 128, "h": 128, "u": "images/", "p": "img_0.png", "e": 0 }, { "id": "image_1", "w": 232, "h": 232, "u": "images/", "p": "img_1.png", "e": 0 }, { "id": "image_2", "w": 150, "h": 150, "u": "images/", "p": "img_2.png", "e": 0 }, { "id": "comp_0", "nm": "layer_get_diffuse_lights", "fr": 30, "layers": [{ "ddd": 0, "ind": 1, "ty": 2, "nm": "星星 11", "refId": "image_0", "sr": 1.3, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 2, "s": [0] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 6, "s": [100] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 15, "s": [100] }, { "t": 24, "s": [0] }], "ix": 11 }, "r": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 2, "s": [0] }, { "t": 24, "s": [-60] }], "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0, "y": 1 }, "o": { "x": 0.047, "y": 0 }, "t": 2, "s": [538.625, 526, 0], "to": [-3.604, -58, 0], "ti": [3.604, 58, 0] }, { "t": 24, "s": [517, 178, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [64, 64, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [{ "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 2, "s": [8.14, 8.14, 100] }, { "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 10, "s": [38.699, 38.699, 100] }, { "t": 24, "s": [47.699, 47.699, 100] }], "ix": 6, "l": 2 } }, "ao": 0, "ef": [{ "ty": 21, "nm": "填充", "np": 9, "mn": "ADBE Fill", "ix": 1, "en": 1, "ef": [{ "ty": 10, "nm": "填充蒙版", "mn": "ADBE Fill-0001", "ix": 1, "v": { "a": 0, "k": 0, "ix": 1 } }, { "ty": 7, "nm": "所有蒙版", "mn": "ADBE Fill-0007", "ix": 2, "v": { "a": 0, "k": 0, "ix": 2 } }, { "ty": 2, "nm": "颜色", "mn": "ADBE Fill-0002", "ix": 3, "v": { "a": 0, "k": [1, 0.77790081501, 0.34901958704, 1], "ix": 3 } }, { "ty": 7, "nm": "反转", "mn": "ADBE Fill-0006", "ix": 4, "v": { "a": 0, "k": 0, "ix": 4 } }, { "ty": 0, "nm": "水平羽化", "mn": "ADBE Fill-0003", "ix": 5, "v": { "a": 0, "k": 0, "ix": 5 } }, { "ty": 0, "nm": "垂直羽化", "mn": "ADBE Fill-0004", "ix": 6, "v": { "a": 0, "k": 0, "ix": 6 } }, { "ty": 0, "nm": "不透明度", "mn": "ADBE Fill-0005", "ix": 7, "v": { "a": 0, "k": 1, "ix": 7 } }] }], "ip": 2, "op": 24, "st": 2, "bm": 16 }, { "ddd": 0, "ind": 2, "ty": 2, "nm": "星星 13", "refId": "image_0", "sr": 1.3, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 2, "s": [0] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 6, "s": [100] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 15, "s": [100] }, { "t": 24, "s": [0] }], "ix": 11 }, "r": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 2, "s": [0] }, { "t": 24, "s": [45] }], "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0, "y": 1 }, "o": { "x": 0.047, "y": 0 }, "t": 2, "s": [556.5, 542.25, 0], "to": [42.917, 2.292, 0], "ti": [-42.917, -2.292, 0] }, { "t": 24, "s": [814, 556, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [64, 64, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [{ "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 2, "s": [8.14, 8.14, 100] }, { "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 10, "s": [38.699, 38.699, 100] }, { "t": 24, "s": [47.699, 47.699, 100] }], "ix": 6, "l": 2 } }, "ao": 0, "ef": [{ "ty": 21, "nm": "填充", "np": 9, "mn": "ADBE Fill", "ix": 1, "en": 1, "ef": [{ "ty": 10, "nm": "填充蒙版", "mn": "ADBE Fill-0001", "ix": 1, "v": { "a": 0, "k": 0, "ix": 1 } }, { "ty": 7, "nm": "所有蒙版", "mn": "ADBE Fill-0007", "ix": 2, "v": { "a": 0, "k": 0, "ix": 2 } }, { "ty": 2, "nm": "颜色", "mn": "ADBE Fill-0002", "ix": 3, "v": { "a": 0, "k": [1, 0.911833524704, 0.42352938652, 1], "ix": 3 } }, { "ty": 7, "nm": "反转", "mn": "ADBE Fill-0006", "ix": 4, "v": { "a": 0, "k": 0, "ix": 4 } }, { "ty": 0, "nm": "水平羽化", "mn": "ADBE Fill-0003", "ix": 5, "v": { "a": 0, "k": 0, "ix": 5 } }, { "ty": 0, "nm": "垂直羽化", "mn": "ADBE Fill-0004", "ix": 6, "v": { "a": 0, "k": 0, "ix": 6 } }, { "ty": 0, "nm": "不透明度", "mn": "ADBE Fill-0005", "ix": 7, "v": { "a": 0, "k": 1, "ix": 7 } }] }], "ip": 2, "op": 24, "st": 2, "bm": 16 }, { "ddd": 0, "ind": 3, "ty": 2, "nm": "星星 14", "refId": "image_0", "sr": 1.3, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 2, "s": [0] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 6, "s": [100] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 15, "s": [100] }, { "t": 24, "s": [0] }], "ix": 11 }, "r": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 2, "s": [0] }, { "t": 24, "s": [-60] }], "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0, "y": 1 }, "o": { "x": 0.047, "y": 0 }, "t": 2, "s": [528.625, 536, 0], "to": [-55.104, -13.667, 0], "ti": [55.104, 13.667, 0] }, { "t": 24, "s": [198, 454, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [64, 64, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [{ "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 2, "s": [8.14, 8.14, 100] }, { "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 11, "s": [41.699, 41.699, 100] }, { "t": 24, "s": [47.699, 47.699, 100] }], "ix": 6, "l": 2 } }, "ao": 0, "ef": [{ "ty": 21, "nm": "填充", "np": 9, "mn": "ADBE Fill", "ix": 1, "en": 1, "ef": [{ "ty": 10, "nm": "填充蒙版", "mn": "ADBE Fill-0001", "ix": 1, "v": { "a": 0, "k": 0, "ix": 1 } }, { "ty": 7, "nm": "所有蒙版", "mn": "ADBE Fill-0007", "ix": 2, "v": { "a": 0, "k": 0, "ix": 2 } }, { "ty": 2, "nm": "颜色", "mn": "ADBE Fill-0002", "ix": 3, "v": { "a": 0, "k": [1, 0.911833524704, 0.42352938652, 1], "ix": 3 } }, { "ty": 7, "nm": "反转", "mn": "ADBE Fill-0006", "ix": 4, "v": { "a": 0, "k": 0, "ix": 4 } }, { "ty": 0, "nm": "水平羽化", "mn": "ADBE Fill-0003", "ix": 5, "v": { "a": 0, "k": 0, "ix": 5 } }, { "ty": 0, "nm": "垂直羽化", "mn": "ADBE Fill-0004", "ix": 6, "v": { "a": 0, "k": 0, "ix": 6 } }, { "ty": 0, "nm": "不透明度", "mn": "ADBE Fill-0005", "ix": 7, "v": { "a": 0, "k": 1, "ix": 7 } }] }], "ip": 2, "op": 24, "st": 2, "bm": 16 }, { "ddd": 0, "ind": 4, "ty": 2, "nm": "星星 9", "refId": "image_0", "sr": 1.3, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 2, "s": [0] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 6, "s": [100] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 15, "s": [100] }, { "t": 24, "s": [0] }], "ix": 11 }, "r": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 2, "s": [0] }, { "t": 24, "s": [45] }], "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0.643, "y": 1 }, "o": { "x": 0.054, "y": 0 }, "t": 2, "s": [530.5, 530, 0], "to": [-30.297, -26.714, 0], "ti": [0.703, 0.62, 0] }, { "t": 24, "s": [347, 372, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [64, 64, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [{ "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 2, "s": [4.14, 4.14, 100] }, { "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 10, "s": [50, 50, 100] }, { "t": 24, "s": [34, 34, 100] }], "ix": 6, "l": 2 } }, "ao": 0, "ef": [{ "ty": 21, "nm": "填充", "np": 9, "mn": "ADBE Fill", "ix": 1, "en": 1, "ef": [{ "ty": 10, "nm": "填充蒙版", "mn": "ADBE Fill-0001", "ix": 1, "v": { "a": 0, "k": 0, "ix": 1 } }, { "ty": 7, "nm": "所有蒙版", "mn": "ADBE Fill-0007", "ix": 2, "v": { "a": 0, "k": 0, "ix": 2 } }, { "ty": 2, "nm": "颜色", "mn": "ADBE Fill-0002", "ix": 3, "v": { "a": 0, "k": [1, 0.994002282619, 0.960784316063, 1], "ix": 3 } }, { "ty": 7, "nm": "反转", "mn": "ADBE Fill-0006", "ix": 4, "v": { "a": 0, "k": 0, "ix": 4 } }, { "ty": 0, "nm": "水平羽化", "mn": "ADBE Fill-0003", "ix": 5, "v": { "a": 0, "k": 0, "ix": 5 } }, { "ty": 0, "nm": "垂直羽化", "mn": "ADBE Fill-0004", "ix": 6, "v": { "a": 0, "k": 0, "ix": 6 } }, { "ty": 0, "nm": "不透明度", "mn": "ADBE Fill-0005", "ix": 7, "v": { "a": 0, "k": 1, "ix": 7 } }] }], "ip": 2, "op": 24, "st": 2, "bm": 16 }, { "ddd": 0, "ind": 5, "ty": 2, "nm": "星星 10", "refId": "image_0", "sr": 1.3, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 1, "s": [0] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 5, "s": [100] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 16, "s": [100] }, { "t": 23, "s": [0] }], "ix": 11 }, "r": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 1, "s": [0] }, { "t": 23, "s": [65] }], "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0, "y": 1 }, "o": { "x": 0.047, "y": 0 }, "t": 1, "s": [552, 554.375, 0], "to": [36.5, 50.271, 0], "ti": [-36.5, -50.271, 0] }, { "t": 23, "s": [771, 856, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [64, 64, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [{ "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 1, "s": [4.14, 4.14, 100] }, { "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 9, "s": [50, 50, 100] }, { "t": 23, "s": [34, 34, 100] }], "ix": 6, "l": 2 } }, "ao": 0, "ef": [{ "ty": 21, "nm": "填充", "np": 9, "mn": "ADBE Fill", "ix": 1, "en": 1, "ef": [{ "ty": 10, "nm": "填充蒙版", "mn": "ADBE Fill-0001", "ix": 1, "v": { "a": 0, "k": 0, "ix": 1 } }, { "ty": 7, "nm": "所有蒙版", "mn": "ADBE Fill-0007", "ix": 2, "v": { "a": 0, "k": 0, "ix": 2 } }, { "ty": 2, "nm": "颜色", "mn": "ADBE Fill-0002", "ix": 3, "v": { "a": 0, "k": [1, 0.994002282619, 0.960784316063, 1], "ix": 3 } }, { "ty": 7, "nm": "反转", "mn": "ADBE Fill-0006", "ix": 4, "v": { "a": 0, "k": 0, "ix": 4 } }, { "ty": 0, "nm": "水平羽化", "mn": "ADBE Fill-0003", "ix": 5, "v": { "a": 0, "k": 0, "ix": 5 } }, { "ty": 0, "nm": "垂直羽化", "mn": "ADBE Fill-0004", "ix": 6, "v": { "a": 0, "k": 0, "ix": 6 } }, { "ty": 0, "nm": "不透明度", "mn": "ADBE Fill-0005", "ix": 7, "v": { "a": 0, "k": 1, "ix": 7 } }] }], "ip": 1, "op": 23, "st": 1, "bm": 16 }, { "ddd": 0, "ind": 6, "ty": 2, "nm": "星星 12", "refId": "image_0", "sr": 1.3, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 0, "s": [0] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 4, "s": [100] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 15, "s": [100] }, { "t": 22, "s": [0] }], "ix": 11 }, "r": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 0, "s": [0] }, { "t": 22, "s": [-144] }], "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0, "y": 1 }, "o": { "x": 0.047, "y": 0 }, "t": 0, "s": [545.875, 555.875, 0], "to": [11.854, 45.188, 0], "ti": [-11.854, -45.188, 0] }, { "t": 22, "s": [617, 827, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [64, 64, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [{ "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 0, "s": [40.699, 40.699, 100] }, { "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 8, "s": [34.699, 34.699, 100] }, { "t": 22, "s": [20, 20, 100] }], "ix": 6, "l": 2 } }, "ao": 0, "ef": [{ "ty": 21, "nm": "填充", "np": 9, "mn": "ADBE Fill", "ix": 1, "en": 1, "ef": [{ "ty": 10, "nm": "填充蒙版", "mn": "ADBE Fill-0001", "ix": 1, "v": { "a": 0, "k": 0, "ix": 1 } }, { "ty": 7, "nm": "所有蒙版", "mn": "ADBE Fill-0007", "ix": 2, "v": { "a": 0, "k": 0, "ix": 2 } }, { "ty": 2, "nm": "颜色", "mn": "ADBE Fill-0002", "ix": 3, "v": { "a": 0, "k": [1, 0.776470601559, 0.349019616842, 1], "ix": 3 } }, { "ty": 7, "nm": "反转", "mn": "ADBE Fill-0006", "ix": 4, "v": { "a": 0, "k": 0, "ix": 4 } }, { "ty": 0, "nm": "水平羽化", "mn": "ADBE Fill-0003", "ix": 5, "v": { "a": 0, "k": 0, "ix": 5 } }, { "ty": 0, "nm": "垂直羽化", "mn": "ADBE Fill-0004", "ix": 6, "v": { "a": 0, "k": 0, "ix": 6 } }, { "ty": 0, "nm": "不透明度", "mn": "ADBE Fill-0005", "ix": 7, "v": { "a": 0, "k": 1, "ix": 7 } }] }], "ip": 0, "op": 22, "st": 0, "bm": 16 }, { "ddd": 0, "ind": 7, "ty": 2, "nm": "星星 8", "refId": "image_0", "sr": 1.3, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 0, "s": [0] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 4, "s": [100] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 15, "s": [100] }, { "t": 22, "s": [0] }], "ix": 11 }, "r": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 0, "s": [0] }, { "t": 22, "s": [-144] }], "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0.655, "y": 1 }, "o": { "x": 0.05, "y": 0 }, "t": 0, "s": [525.875, 542.625, 0], "to": [-36.581, 6.762, 0], "ti": [0.21, -0.029, 0] }, { "t": 22, "s": [261, 590, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [64, 64, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [{ "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 0, "s": [10, 10, 100] }, { "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 8, "s": [19.699, 19.699, 100] }, { "t": 22, "s": [22.699, 22.699, 100] }], "ix": 6, "l": 2 } }, "ao": 0, "ef": [{ "ty": 21, "nm": "填充", "np": 9, "mn": "ADBE Fill", "ix": 1, "en": 1, "ef": [{ "ty": 10, "nm": "填充蒙版", "mn": "ADBE Fill-0001", "ix": 1, "v": { "a": 0, "k": 0, "ix": 1 } }, { "ty": 7, "nm": "所有蒙版", "mn": "ADBE Fill-0007", "ix": 2, "v": { "a": 0, "k": 0, "ix": 2 } }, { "ty": 2, "nm": "颜色", "mn": "ADBE Fill-0002", "ix": 3, "v": { "a": 0, "k": [1, 0.776470601559, 0.349019616842, 1], "ix": 3 } }, { "ty": 7, "nm": "反转", "mn": "ADBE Fill-0006", "ix": 4, "v": { "a": 0, "k": 0, "ix": 4 } }, { "ty": 0, "nm": "水平羽化", "mn": "ADBE Fill-0003", "ix": 5, "v": { "a": 0, "k": 0, "ix": 5 } }, { "ty": 0, "nm": "垂直羽化", "mn": "ADBE Fill-0004", "ix": 6, "v": { "a": 0, "k": 0, "ix": 6 } }, { "ty": 0, "nm": "不透明度", "mn": "ADBE Fill-0005", "ix": 7, "v": { "a": 0, "k": 1, "ix": 7 } }] }], "ip": 0, "op": 23, "st": 0, "bm": 16 }, { "ddd": 0, "ind": 8, "ty": 2, "nm": "星星 7", "refId": "image_0", "sr": 1.3, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 2, "s": [0] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 6, "s": [100] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 17, "s": [100] }, { "t": 24, "s": [0] }], "ix": 11 }, "r": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 2, "s": [0] }, { "t": 24, "s": [-90] }], "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0, "y": 1 }, "o": { "x": 0.047, "y": 0 }, "t": 2, "s": [531, 553, 0], "to": [-34, 41.5, 0], "ti": [34, -41.5, 0] }, { "t": 24, "s": [327, 802, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [64, 64, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [{ "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 2, "s": [8.14, 8.14, 100] }, { "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 10, "s": [60.699, 60.699, 100] }, { "t": 24, "s": [47.699, 47.699, 100] }], "ix": 6, "l": 2 } }, "ao": 0, "ef": [{ "ty": 21, "nm": "填充", "np": 9, "mn": "ADBE Fill", "ix": 1, "en": 1, "ef": [{ "ty": 10, "nm": "填充蒙版", "mn": "ADBE Fill-0001", "ix": 1, "v": { "a": 0, "k": 0, "ix": 1 } }, { "ty": 7, "nm": "所有蒙版", "mn": "ADBE Fill-0007", "ix": 2, "v": { "a": 0, "k": 0, "ix": 2 } }, { "ty": 2, "nm": "颜色", "mn": "ADBE Fill-0002", "ix": 3, "v": { "a": 0, "k": [1, 0.958615720272, 0.72941172123, 1], "ix": 3 } }, { "ty": 7, "nm": "反转", "mn": "ADBE Fill-0006", "ix": 4, "v": { "a": 0, "k": 0, "ix": 4 } }, { "ty": 0, "nm": "水平羽化", "mn": "ADBE Fill-0003", "ix": 5, "v": { "a": 0, "k": 0, "ix": 5 } }, { "ty": 0, "nm": "垂直羽化", "mn": "ADBE Fill-0004", "ix": 6, "v": { "a": 0, "k": 0, "ix": 6 } }, { "ty": 0, "nm": "不透明度", "mn": "ADBE Fill-0005", "ix": 7, "v": { "a": 0, "k": 1, "ix": 7 } }] }], "ip": 2, "op": 24, "st": 2, "bm": 16 }, { "ddd": 0, "ind": 9, "ty": 2, "nm": "星星 6", "refId": "image_0", "sr": 1.3, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 2, "s": [0] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 6, "s": [100] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 17, "s": [100] }, { "t": 24, "s": [0] }], "ix": 11 }, "r": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 2, "s": [0] }, { "t": 24, "s": [87] }], "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0, "y": 1 }, "o": { "x": 0.047, "y": 0 }, "t": 2, "s": [553.625, 529.5, 0], "to": [44.896, -38.917, 0], "ti": [-44.896, 38.917, 0] }, { "t": 24, "s": [823, 296, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [64, 64, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [{ "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 2, "s": [8.14, 8.14, 100] }, { "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 10, "s": [69.699, 69.699, 100] }, { "t": 24, "s": [47.699, 47.699, 100] }], "ix": 6, "l": 2 } }, "ao": 0, "ef": [{ "ty": 21, "nm": "填充", "np": 9, "mn": "ADBE Fill", "ix": 1, "en": 1, "ef": [{ "ty": 10, "nm": "填充蒙版", "mn": "ADBE Fill-0001", "ix": 1, "v": { "a": 0, "k": 0, "ix": 1 } }, { "ty": 7, "nm": "所有蒙版", "mn": "ADBE Fill-0007", "ix": 2, "v": { "a": 0, "k": 0, "ix": 2 } }, { "ty": 2, "nm": "颜色", "mn": "ADBE Fill-0002", "ix": 3, "v": { "a": 0, "k": [1, 0.994002282619, 0.960784316063, 1], "ix": 3 } }, { "ty": 7, "nm": "反转", "mn": "ADBE Fill-0006", "ix": 4, "v": { "a": 0, "k": 0, "ix": 4 } }, { "ty": 0, "nm": "水平羽化", "mn": "ADBE Fill-0003", "ix": 5, "v": { "a": 0, "k": 0, "ix": 5 } }, { "ty": 0, "nm": "垂直羽化", "mn": "ADBE Fill-0004", "ix": 6, "v": { "a": 0, "k": 0, "ix": 6 } }, { "ty": 0, "nm": "不透明度", "mn": "ADBE Fill-0005", "ix": 7, "v": { "a": 0, "k": 1, "ix": 7 } }] }], "ip": 2, "op": 24, "st": 2, "bm": 16 }] }], "layers": [{ "ddd": 0, "ind": 1, "ty": 0, "nm": "layer_get_diffuse_lights", "refId": "comp_0", "sr": 1, "ks": { "o": { "a": 0, "k": 100, "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 0, "k": [648, 648, 0], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [540, 540, 0], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [100, 100, 100], "ix": 6, "l": 2 } }, "ao": 0, "w": 1080, "h": 1080, "ip": 0, "op": 30, "st": 0, "bm": 0 }, { "ddd": 0, "ind": 2, "ty": 2, "nm": "5555_00000.png", "cl": "png", "refId": "image_1", "sr": 1, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.833], "y": [0.833] }, "o": { "x": [0.167], "y": [0.167] }, "t": 0, "s": [0] }, { "i": { "x": [0.833], "y": [0.833] }, "o": { "x": [0.167], "y": [0.167] }, "t": 7, "s": [71] }, { "t": 24, "s": [0] }], "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 0, "k": [648, 648, 0], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [116, 116, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [{ "i": { "x": [0.531, 0.531, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.286, 0.286, 0.333], "y": [0.758, 0.758, 0] }, "t": 0, "s": [133, 133, 100] }, { "t": 17, "s": [558.621, 558.621, 100] }], "ix": 6, "l": 2 } }, "ao": 0, "ip": 0, "op": 23, "st": -13, "bm": 16 }, { "ddd": 0, "ind": 3, "ty": 2, "nm": "glow_0.png", "cl": "png", "refId": "image_2", "sr": 1, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.167], "y": [0.167] }, "t": 0, "s": [0] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 5, "s": [96] }, { "t": 20, "s": [0] }], "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 0, "k": [636, 658, 0], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [73.5, 76.25, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [{ "i": { "x": [0.622, 0.622, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.228, 0.228, 0.333], "y": [0.456, 0.456, 0] }, "t": 0, "s": [0, 0, 100] }, { "t": 5, "s": [864, 864, 100] }], "ix": 6, "l": 2 } }, "ao": 0, "ef": [{ "ty": 21, "nm": "填充", "np": 9, "mn": "ADBE Fill", "ix": 1, "en": 1, "ef": [{ "ty": 10, "nm": "填充蒙版", "mn": "ADBE Fill-0001", "ix": 1, "v": { "a": 0, "k": 0, "ix": 1 } }, { "ty": 7, "nm": "所有蒙版", "mn": "ADBE Fill-0007", "ix": 2, "v": { "a": 0, "k": 0, "ix": 2 } }, { "ty": 2, "nm": "颜色", "mn": "ADBE Fill-0002", "ix": 3, "v": { "a": 0, "k": [1, 0.763183355331, 0.305882334709, 1], "ix": 3 } }, { "ty": 7, "nm": "反转", "mn": "ADBE Fill-0006", "ix": 4, "v": { "a": 0, "k": 0, "ix": 4 } }, { "ty": 0, "nm": "水平羽化", "mn": "ADBE Fill-0003", "ix": 5, "v": { "a": 0, "k": 0, "ix": 5 } }, { "ty": 0, "nm": "垂直羽化", "mn": "ADBE Fill-0004", "ix": 6, "v": { "a": 0, "k": 0, "ix": 6 } }, { "ty": 0, "nm": "不透明度", "mn": "ADBE Fill-0005", "ix": 7, "v": { "a": 0, "k": 1, "ix": 7 } }] }], "ip": 0, "op": 30, "st": 0, "bm": 0 }], "markers": [], "props": {} } diff --git a/shudu/assets/effect/lottie_blossom_light/lottie_blossom_light.json.meta b/shudu/assets/effect/lottie_blossom_light/lottie_blossom_light.json.meta new file mode 100644 index 0000000..e630e0a --- /dev/null +++ b/shudu/assets/effect/lottie_blossom_light/lottie_blossom_light.json.meta @@ -0,0 +1,3 @@ +{ + "uuid": "134ee11f-4de3-4127-8554-b07d0e68015f" +} \ No newline at end of file diff --git a/shudu/assets/effect/lottie_get_diffuse_lights/images/img_0.png b/shudu/assets/effect/lottie_get_diffuse_lights/images/img_0.png new file mode 100644 index 0000000..b843681 Binary files /dev/null and b/shudu/assets/effect/lottie_get_diffuse_lights/images/img_0.png differ diff --git a/shudu/assets/effect/lottie_get_diffuse_lights/images/img_0.png.meta b/shudu/assets/effect/lottie_get_diffuse_lights/images/img_0.png.meta new file mode 100644 index 0000000..8a691b2 --- /dev/null +++ b/shudu/assets/effect/lottie_get_diffuse_lights/images/img_0.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "ceb67f2b-ede2-4e40-a96d-7d0a41945749", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/effect/lottie_get_diffuse_lights/lottie_get_diffuse_lights.json b/shudu/assets/effect/lottie_get_diffuse_lights/lottie_get_diffuse_lights.json new file mode 100644 index 0000000..3be04a6 --- /dev/null +++ b/shudu/assets/effect/lottie_get_diffuse_lights/lottie_get_diffuse_lights.json @@ -0,0 +1 @@ +{ "v": "5.12.2", "fr": 30, "ip": 0, "op": 30, "w": 1080, "h": 1080, "nm": "lottie_get_diffuse_lights", "ddd": 0, "assets": [{ "id": "image_0", "w": 128, "h": 128, "u": "images/", "p": "img_0.png", "e": 0 }], "layers": [{ "ddd": 0, "ind": 1, "ty": 2, "nm": "星星 11", "refId": "image_0", "sr": 1.3, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 2, "s": [0] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 6, "s": [100] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 17, "s": [100] }, { "t": 24, "s": [0] }], "ix": 11 }, "r": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 2, "s": [0] }, { "t": 24, "s": [-60] }], "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0, "y": 1 }, "o": { "x": 0.047, "y": 0 }, "t": 2, "s": [538.625, 526, 0], "to": [-3.604, -58, 0], "ti": [3.604, 58, 0] }, { "t": 24, "s": [517, 178, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [64, 64, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [{ "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 2, "s": [40.699, 40.699, 100] }, { "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 10, "s": [38.699, 38.699, 100] }, { "t": 24, "s": [47.699, 47.699, 100] }], "ix": 6, "l": 2 } }, "ao": 0, "ef": [{ "ty": 21, "nm": "填充", "np": 9, "mn": "ADBE Fill", "ix": 1, "en": 1, "ef": [{ "ty": 10, "nm": "填充蒙版", "mn": "ADBE Fill-0001", "ix": 1, "v": { "a": 0, "k": 0, "ix": 1 } }, { "ty": 7, "nm": "所有蒙版", "mn": "ADBE Fill-0007", "ix": 2, "v": { "a": 0, "k": 0, "ix": 2 } }, { "ty": 2, "nm": "颜色", "mn": "ADBE Fill-0002", "ix": 3, "v": { "a": 0, "k": [1, 0.77790081501, 0.34901958704, 1], "ix": 3 } }, { "ty": 7, "nm": "反转", "mn": "ADBE Fill-0006", "ix": 4, "v": { "a": 0, "k": 0, "ix": 4 } }, { "ty": 0, "nm": "水平羽化", "mn": "ADBE Fill-0003", "ix": 5, "v": { "a": 0, "k": 0, "ix": 5 } }, { "ty": 0, "nm": "垂直羽化", "mn": "ADBE Fill-0004", "ix": 6, "v": { "a": 0, "k": 0, "ix": 6 } }, { "ty": 0, "nm": "不透明度", "mn": "ADBE Fill-0005", "ix": 7, "v": { "a": 0, "k": 1, "ix": 7 } }] }], "ip": 2, "op": 24, "st": 2, "bm": 16 }, { "ddd": 0, "ind": 2, "ty": 2, "nm": "星星 13", "refId": "image_0", "sr": 1.3, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 2, "s": [0] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 6, "s": [100] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 17, "s": [100] }, { "t": 24, "s": [0] }], "ix": 11 }, "r": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 2, "s": [0] }, { "t": 24, "s": [45] }], "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0, "y": 1 }, "o": { "x": 0.047, "y": 0 }, "t": 2, "s": [556.5, 542.25, 0], "to": [42.917, 2.292, 0], "ti": [-42.917, -2.292, 0] }, { "t": 24, "s": [814, 556, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [64, 64, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [{ "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 2, "s": [40.699, 40.699, 100] }, { "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 10, "s": [38.699, 38.699, 100] }, { "t": 24, "s": [47.699, 47.699, 100] }], "ix": 6, "l": 2 } }, "ao": 0, "ef": [{ "ty": 21, "nm": "填充", "np": 9, "mn": "ADBE Fill", "ix": 1, "en": 1, "ef": [{ "ty": 10, "nm": "填充蒙版", "mn": "ADBE Fill-0001", "ix": 1, "v": { "a": 0, "k": 0, "ix": 1 } }, { "ty": 7, "nm": "所有蒙版", "mn": "ADBE Fill-0007", "ix": 2, "v": { "a": 0, "k": 0, "ix": 2 } }, { "ty": 2, "nm": "颜色", "mn": "ADBE Fill-0002", "ix": 3, "v": { "a": 0, "k": [1, 0.911833524704, 0.42352938652, 1], "ix": 3 } }, { "ty": 7, "nm": "反转", "mn": "ADBE Fill-0006", "ix": 4, "v": { "a": 0, "k": 0, "ix": 4 } }, { "ty": 0, "nm": "水平羽化", "mn": "ADBE Fill-0003", "ix": 5, "v": { "a": 0, "k": 0, "ix": 5 } }, { "ty": 0, "nm": "垂直羽化", "mn": "ADBE Fill-0004", "ix": 6, "v": { "a": 0, "k": 0, "ix": 6 } }, { "ty": 0, "nm": "不透明度", "mn": "ADBE Fill-0005", "ix": 7, "v": { "a": 0, "k": 1, "ix": 7 } }] }], "ip": 2, "op": 24, "st": 2, "bm": 16 }, { "ddd": 0, "ind": 3, "ty": 2, "nm": "星星 14", "refId": "image_0", "sr": 1.3, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 2, "s": [0] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 6, "s": [100] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 17, "s": [100] }, { "t": 24, "s": [0] }], "ix": 11 }, "r": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 2, "s": [0] }, { "t": 24, "s": [-60] }], "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0, "y": 1 }, "o": { "x": 0.047, "y": 0 }, "t": 2, "s": [528.625, 536, 0], "to": [-55.104, -13.667, 0], "ti": [55.104, 13.667, 0] }, { "t": 24, "s": [198, 454, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [64, 64, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [{ "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 2, "s": [40.699, 40.699, 100] }, { "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 11, "s": [41.699, 41.699, 100] }, { "t": 24, "s": [47.699, 47.699, 100] }], "ix": 6, "l": 2 } }, "ao": 0, "ef": [{ "ty": 21, "nm": "填充", "np": 9, "mn": "ADBE Fill", "ix": 1, "en": 1, "ef": [{ "ty": 10, "nm": "填充蒙版", "mn": "ADBE Fill-0001", "ix": 1, "v": { "a": 0, "k": 0, "ix": 1 } }, { "ty": 7, "nm": "所有蒙版", "mn": "ADBE Fill-0007", "ix": 2, "v": { "a": 0, "k": 0, "ix": 2 } }, { "ty": 2, "nm": "颜色", "mn": "ADBE Fill-0002", "ix": 3, "v": { "a": 0, "k": [1, 0.911833524704, 0.42352938652, 1], "ix": 3 } }, { "ty": 7, "nm": "反转", "mn": "ADBE Fill-0006", "ix": 4, "v": { "a": 0, "k": 0, "ix": 4 } }, { "ty": 0, "nm": "水平羽化", "mn": "ADBE Fill-0003", "ix": 5, "v": { "a": 0, "k": 0, "ix": 5 } }, { "ty": 0, "nm": "垂直羽化", "mn": "ADBE Fill-0004", "ix": 6, "v": { "a": 0, "k": 0, "ix": 6 } }, { "ty": 0, "nm": "不透明度", "mn": "ADBE Fill-0005", "ix": 7, "v": { "a": 0, "k": 1, "ix": 7 } }] }], "ip": 2, "op": 24, "st": 2, "bm": 16 }, { "ddd": 0, "ind": 4, "ty": 2, "nm": "星星 9", "refId": "image_0", "sr": 1.3, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 2, "s": [0] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 6, "s": [100] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 17, "s": [100] }, { "t": 24, "s": [0] }], "ix": 11 }, "r": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 2, "s": [0] }, { "t": 24, "s": [45] }], "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0.643, "y": 1 }, "o": { "x": 0.054, "y": 0 }, "t": 2, "s": [530.5, 530, 0], "to": [-30.297, -26.714, 0], "ti": [0.703, 0.62, 0] }, { "t": 24, "s": [347, 372, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [64, 64, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [{ "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 2, "s": [20.699, 20.699, 100] }, { "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 10, "s": [50, 50, 100] }, { "t": 24, "s": [34, 34, 100] }], "ix": 6, "l": 2 } }, "ao": 0, "ef": [{ "ty": 21, "nm": "填充", "np": 9, "mn": "ADBE Fill", "ix": 1, "en": 1, "ef": [{ "ty": 10, "nm": "填充蒙版", "mn": "ADBE Fill-0001", "ix": 1, "v": { "a": 0, "k": 0, "ix": 1 } }, { "ty": 7, "nm": "所有蒙版", "mn": "ADBE Fill-0007", "ix": 2, "v": { "a": 0, "k": 0, "ix": 2 } }, { "ty": 2, "nm": "颜色", "mn": "ADBE Fill-0002", "ix": 3, "v": { "a": 0, "k": [1, 0.994002282619, 0.960784316063, 1], "ix": 3 } }, { "ty": 7, "nm": "反转", "mn": "ADBE Fill-0006", "ix": 4, "v": { "a": 0, "k": 0, "ix": 4 } }, { "ty": 0, "nm": "水平羽化", "mn": "ADBE Fill-0003", "ix": 5, "v": { "a": 0, "k": 0, "ix": 5 } }, { "ty": 0, "nm": "垂直羽化", "mn": "ADBE Fill-0004", "ix": 6, "v": { "a": 0, "k": 0, "ix": 6 } }, { "ty": 0, "nm": "不透明度", "mn": "ADBE Fill-0005", "ix": 7, "v": { "a": 0, "k": 1, "ix": 7 } }] }], "ip": 2, "op": 24, "st": 2, "bm": 16 }, { "ddd": 0, "ind": 5, "ty": 2, "nm": "星星 10", "refId": "image_0", "sr": 1.3, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 1, "s": [0] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 5, "s": [100] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 18, "s": [100] }, { "t": 23, "s": [0] }], "ix": 11 }, "r": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 1, "s": [0] }, { "t": 23, "s": [65] }], "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0, "y": 1 }, "o": { "x": 0.047, "y": 0 }, "t": 1, "s": [552, 554.375, 0], "to": [36.5, 50.271, 0], "ti": [-36.5, -50.271, 0] }, { "t": 23, "s": [771, 856, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [64, 64, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [{ "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 1, "s": [20.699, 20.699, 100] }, { "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 9, "s": [50, 50, 100] }, { "t": 23, "s": [34, 34, 100] }], "ix": 6, "l": 2 } }, "ao": 0, "ef": [{ "ty": 21, "nm": "填充", "np": 9, "mn": "ADBE Fill", "ix": 1, "en": 1, "ef": [{ "ty": 10, "nm": "填充蒙版", "mn": "ADBE Fill-0001", "ix": 1, "v": { "a": 0, "k": 0, "ix": 1 } }, { "ty": 7, "nm": "所有蒙版", "mn": "ADBE Fill-0007", "ix": 2, "v": { "a": 0, "k": 0, "ix": 2 } }, { "ty": 2, "nm": "颜色", "mn": "ADBE Fill-0002", "ix": 3, "v": { "a": 0, "k": [1, 0.994002282619, 0.960784316063, 1], "ix": 3 } }, { "ty": 7, "nm": "反转", "mn": "ADBE Fill-0006", "ix": 4, "v": { "a": 0, "k": 0, "ix": 4 } }, { "ty": 0, "nm": "水平羽化", "mn": "ADBE Fill-0003", "ix": 5, "v": { "a": 0, "k": 0, "ix": 5 } }, { "ty": 0, "nm": "垂直羽化", "mn": "ADBE Fill-0004", "ix": 6, "v": { "a": 0, "k": 0, "ix": 6 } }, { "ty": 0, "nm": "不透明度", "mn": "ADBE Fill-0005", "ix": 7, "v": { "a": 0, "k": 1, "ix": 7 } }] }], "ip": 1, "op": 23, "st": 1, "bm": 16 }, { "ddd": 0, "ind": 6, "ty": 2, "nm": "星星 12", "refId": "image_0", "sr": 1.3, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 0, "s": [0] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 4, "s": [100] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 17, "s": [100] }, { "t": 22, "s": [0] }], "ix": 11 }, "r": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 0, "s": [0] }, { "t": 22, "s": [-144] }], "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0, "y": 1 }, "o": { "x": 0.047, "y": 0 }, "t": 0, "s": [545.875, 555.875, 0], "to": [11.854, 45.188, 0], "ti": [-11.854, -45.188, 0] }, { "t": 22, "s": [617, 827, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [64, 64, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [{ "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 0, "s": [40.699, 40.699, 100] }, { "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 8, "s": [34.699, 34.699, 100] }, { "t": 22, "s": [20, 20, 100] }], "ix": 6, "l": 2 } }, "ao": 0, "ef": [{ "ty": 21, "nm": "填充", "np": 9, "mn": "ADBE Fill", "ix": 1, "en": 1, "ef": [{ "ty": 10, "nm": "填充蒙版", "mn": "ADBE Fill-0001", "ix": 1, "v": { "a": 0, "k": 0, "ix": 1 } }, { "ty": 7, "nm": "所有蒙版", "mn": "ADBE Fill-0007", "ix": 2, "v": { "a": 0, "k": 0, "ix": 2 } }, { "ty": 2, "nm": "颜色", "mn": "ADBE Fill-0002", "ix": 3, "v": { "a": 0, "k": [1, 0.776470601559, 0.349019616842, 1], "ix": 3 } }, { "ty": 7, "nm": "反转", "mn": "ADBE Fill-0006", "ix": 4, "v": { "a": 0, "k": 0, "ix": 4 } }, { "ty": 0, "nm": "水平羽化", "mn": "ADBE Fill-0003", "ix": 5, "v": { "a": 0, "k": 0, "ix": 5 } }, { "ty": 0, "nm": "垂直羽化", "mn": "ADBE Fill-0004", "ix": 6, "v": { "a": 0, "k": 0, "ix": 6 } }, { "ty": 0, "nm": "不透明度", "mn": "ADBE Fill-0005", "ix": 7, "v": { "a": 0, "k": 1, "ix": 7 } }] }], "ip": 0, "op": 22, "st": 0, "bm": 16 }, { "ddd": 0, "ind": 7, "ty": 2, "nm": "星星 8", "refId": "image_0", "sr": 1.3, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 0, "s": [0] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 4, "s": [100] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 17, "s": [100] }, { "t": 22, "s": [0] }], "ix": 11 }, "r": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 0, "s": [0] }, { "t": 22, "s": [-144] }], "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0.655, "y": 1 }, "o": { "x": 0.05, "y": 0 }, "t": 0, "s": [525.875, 542.625, 0], "to": [-36.581, 6.762, 0], "ti": [0.21, -0.029, 0] }, { "t": 22, "s": [261, 590, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [64, 64, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [{ "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 0, "s": [40.699, 40.699, 100] }, { "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 8, "s": [19.699, 19.699, 100] }, { "t": 22, "s": [22.699, 22.699, 100] }], "ix": 6, "l": 2 } }, "ao": 0, "ef": [{ "ty": 21, "nm": "填充", "np": 9, "mn": "ADBE Fill", "ix": 1, "en": 1, "ef": [{ "ty": 10, "nm": "填充蒙版", "mn": "ADBE Fill-0001", "ix": 1, "v": { "a": 0, "k": 0, "ix": 1 } }, { "ty": 7, "nm": "所有蒙版", "mn": "ADBE Fill-0007", "ix": 2, "v": { "a": 0, "k": 0, "ix": 2 } }, { "ty": 2, "nm": "颜色", "mn": "ADBE Fill-0002", "ix": 3, "v": { "a": 0, "k": [1, 0.776470601559, 0.349019616842, 1], "ix": 3 } }, { "ty": 7, "nm": "反转", "mn": "ADBE Fill-0006", "ix": 4, "v": { "a": 0, "k": 0, "ix": 4 } }, { "ty": 0, "nm": "水平羽化", "mn": "ADBE Fill-0003", "ix": 5, "v": { "a": 0, "k": 0, "ix": 5 } }, { "ty": 0, "nm": "垂直羽化", "mn": "ADBE Fill-0004", "ix": 6, "v": { "a": 0, "k": 0, "ix": 6 } }, { "ty": 0, "nm": "不透明度", "mn": "ADBE Fill-0005", "ix": 7, "v": { "a": 0, "k": 1, "ix": 7 } }] }], "ip": 0, "op": 23, "st": 0, "bm": 16 }, { "ddd": 0, "ind": 8, "ty": 2, "nm": "星星 7", "refId": "image_0", "sr": 1.3, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 2, "s": [0] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 6, "s": [100] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 19, "s": [100] }, { "t": 24, "s": [0] }], "ix": 11 }, "r": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 2, "s": [0] }, { "t": 24, "s": [-90] }], "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0, "y": 1 }, "o": { "x": 0.047, "y": 0 }, "t": 2, "s": [531, 553, 0], "to": [-34, 41.5, 0], "ti": [34, -41.5, 0] }, { "t": 24, "s": [327, 802, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [64, 64, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [{ "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 2, "s": [40.699, 40.699, 100] }, { "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 10, "s": [60.699, 60.699, 100] }, { "t": 24, "s": [47.699, 47.699, 100] }], "ix": 6, "l": 2 } }, "ao": 0, "ef": [{ "ty": 21, "nm": "填充", "np": 9, "mn": "ADBE Fill", "ix": 1, "en": 1, "ef": [{ "ty": 10, "nm": "填充蒙版", "mn": "ADBE Fill-0001", "ix": 1, "v": { "a": 0, "k": 0, "ix": 1 } }, { "ty": 7, "nm": "所有蒙版", "mn": "ADBE Fill-0007", "ix": 2, "v": { "a": 0, "k": 0, "ix": 2 } }, { "ty": 2, "nm": "颜色", "mn": "ADBE Fill-0002", "ix": 3, "v": { "a": 0, "k": [1, 0.958615720272, 0.72941172123, 1], "ix": 3 } }, { "ty": 7, "nm": "反转", "mn": "ADBE Fill-0006", "ix": 4, "v": { "a": 0, "k": 0, "ix": 4 } }, { "ty": 0, "nm": "水平羽化", "mn": "ADBE Fill-0003", "ix": 5, "v": { "a": 0, "k": 0, "ix": 5 } }, { "ty": 0, "nm": "垂直羽化", "mn": "ADBE Fill-0004", "ix": 6, "v": { "a": 0, "k": 0, "ix": 6 } }, { "ty": 0, "nm": "不透明度", "mn": "ADBE Fill-0005", "ix": 7, "v": { "a": 0, "k": 1, "ix": 7 } }] }], "ip": 2, "op": 24, "st": 2, "bm": 16 }, { "ddd": 0, "ind": 9, "ty": 2, "nm": "星星 6", "refId": "image_0", "sr": 1.3, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 2, "s": [0] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 6, "s": [100] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 19, "s": [100] }, { "t": 24, "s": [0] }], "ix": 11 }, "r": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 2, "s": [0] }, { "t": 24, "s": [87] }], "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0, "y": 1 }, "o": { "x": 0.047, "y": 0 }, "t": 2, "s": [553.625, 529.5, 0], "to": [44.896, -38.917, 0], "ti": [-44.896, 38.917, 0] }, { "t": 24, "s": [823, 296, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [64, 64, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [{ "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 2, "s": [40.699, 40.699, 100] }, { "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.333, 0.333, 0.333], "y": [0, 0, 0] }, "t": 10, "s": [69.699, 69.699, 100] }, { "t": 24, "s": [47.699, 47.699, 100] }], "ix": 6, "l": 2 } }, "ao": 0, "ef": [{ "ty": 21, "nm": "填充", "np": 9, "mn": "ADBE Fill", "ix": 1, "en": 1, "ef": [{ "ty": 10, "nm": "填充蒙版", "mn": "ADBE Fill-0001", "ix": 1, "v": { "a": 0, "k": 0, "ix": 1 } }, { "ty": 7, "nm": "所有蒙版", "mn": "ADBE Fill-0007", "ix": 2, "v": { "a": 0, "k": 0, "ix": 2 } }, { "ty": 2, "nm": "颜色", "mn": "ADBE Fill-0002", "ix": 3, "v": { "a": 0, "k": [1, 0.994002282619, 0.960784316063, 1], "ix": 3 } }, { "ty": 7, "nm": "反转", "mn": "ADBE Fill-0006", "ix": 4, "v": { "a": 0, "k": 0, "ix": 4 } }, { "ty": 0, "nm": "水平羽化", "mn": "ADBE Fill-0003", "ix": 5, "v": { "a": 0, "k": 0, "ix": 5 } }, { "ty": 0, "nm": "垂直羽化", "mn": "ADBE Fill-0004", "ix": 6, "v": { "a": 0, "k": 0, "ix": 6 } }, { "ty": 0, "nm": "不透明度", "mn": "ADBE Fill-0005", "ix": 7, "v": { "a": 0, "k": 1, "ix": 7 } }] }], "ip": 2, "op": 24, "st": 2, "bm": 16 }], "markers": [], "props": {} } diff --git a/shudu/assets/effect/lottie_get_diffuse_lights/lottie_get_diffuse_lights.json.meta b/shudu/assets/effect/lottie_get_diffuse_lights/lottie_get_diffuse_lights.json.meta new file mode 100644 index 0000000..b9c8974 --- /dev/null +++ b/shudu/assets/effect/lottie_get_diffuse_lights/lottie_get_diffuse_lights.json.meta @@ -0,0 +1,3 @@ +{ + "uuid": "26da7740-c768-4fa5-9344-a925a45d1934" +} \ No newline at end of file diff --git a/shudu/assets/effect/lottie_trophy_light/images/img_0.png b/shudu/assets/effect/lottie_trophy_light/images/img_0.png new file mode 100644 index 0000000..9ec81fb Binary files /dev/null and b/shudu/assets/effect/lottie_trophy_light/images/img_0.png differ diff --git a/shudu/assets/effect/lottie_trophy_light/images/img_0.png.meta b/shudu/assets/effect/lottie_trophy_light/images/img_0.png.meta new file mode 100644 index 0000000..5962ef9 --- /dev/null +++ b/shudu/assets/effect/lottie_trophy_light/images/img_0.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "87ec1784-846b-4ea7-a4de-6d48957f8607", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/effect/lottie_trophy_light/images/img_1.png b/shudu/assets/effect/lottie_trophy_light/images/img_1.png new file mode 100644 index 0000000..92f20a2 Binary files /dev/null and b/shudu/assets/effect/lottie_trophy_light/images/img_1.png differ diff --git a/shudu/assets/effect/lottie_trophy_light/images/img_1.png.meta b/shudu/assets/effect/lottie_trophy_light/images/img_1.png.meta new file mode 100644 index 0000000..c5224b0 --- /dev/null +++ b/shudu/assets/effect/lottie_trophy_light/images/img_1.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "75bb37d7-314e-4cfe-9999-fb9abab50f07", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/effect/lottie_trophy_light/lottie_trophy_light.json b/shudu/assets/effect/lottie_trophy_light/lottie_trophy_light.json new file mode 100644 index 0000000..776f7f5 --- /dev/null +++ b/shudu/assets/effect/lottie_trophy_light/lottie_trophy_light.json @@ -0,0 +1 @@ +{ "v": "5.12.2", "fr": 30, "ip": 0, "op": 120, "w": 960, "h": 960, "nm": "lottie_trophy_light_2x", "ddd": 0, "assets": [{ "id": "image_0", "w": 128, "h": 128, "u": "images/", "p": "img_0.png", "e": 0 }, { "id": "image_1", "w": 232, "h": 232, "u": "images/", "p": "img_1.png", "e": 0 }, { "id": "comp_0", "nm": "预合成 5", "fr": 30, "layers": [{ "ddd": 0, "ind": 1, "ty": 0, "nm": "Light_6", "refId": "comp_1", "sr": 1, "ks": { "o": { "a": 0, "k": 100, "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 0, "k": [732, 780, 0], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [48, 96, 0], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [89.792, 89.792, 100], "ix": 6, "l": 2 } }, "ao": 0, "w": 96, "h": 192, "ip": 0, "op": 47, "st": -43, "bm": 0 }, { "ddd": 0, "ind": 2, "ty": 0, "nm": "Light_6", "refId": "comp_1", "sr": 1, "ks": { "o": { "a": 0, "k": 100, "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 0, "k": [732, 780, 0], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [48, 96, 0], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [89.792, 89.792, 100], "ix": 6, "l": 2 } }, "ao": 0, "w": 96, "h": 192, "ip": 77, "op": 120, "st": 77, "bm": 0 }, { "ddd": 0, "ind": 6, "ty": 0, "nm": "Light_7", "refId": "comp_2", "sr": 1.2, "ks": { "o": { "a": 0, "k": 22, "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 0, "k": [208, 850, 0], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [48, 192, 0], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [129, 129, 100], "ix": 6, "l": 2 } }, "ao": 0, "w": 96, "h": 384, "ip": 0, "op": 54, "st": -54, "bm": 0 }, { "ddd": 0, "ind": 7, "ty": 0, "nm": "Light_7", "refId": "comp_2", "sr": 1.2, "ks": { "o": { "a": 0, "k": 22, "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 0, "k": [208, 850, 0], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [48, 192, 0], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [129, 129, 100], "ix": 6, "l": 2 } }, "ao": 0, "w": 96, "h": 384, "ip": 66, "op": 120, "st": 66, "bm": 0 }, { "ddd": 0, "ind": 8, "ty": 0, "nm": "Light_8", "refId": "comp_3", "sr": 1, "ks": { "o": { "a": 0, "k": 60, "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 0, "k": [680, 464, 0], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [48, 96, 0], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [88.792, 88.792, 100], "ix": 6, "l": 2 } }, "ao": 0, "w": 96, "h": 192, "ip": 8, "op": 98, "st": 8, "bm": 0 }, { "ddd": 0, "ind": 9, "ty": 0, "nm": "Light_8", "refId": "comp_3", "sr": 1, "ks": { "o": { "a": 0, "k": 71, "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 0, "k": [506, 334, 0], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [48, 96, 0], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [108.792, 108.792, 100], "ix": 6, "l": 2 } }, "ao": 0, "w": 96, "h": 192, "ip": 20, "op": 110, "st": 20, "bm": 0 }, { "ddd": 0, "ind": 12, "ty": 0, "nm": "Light_9", "refId": "comp_4", "sr": 1.3, "ks": { "o": { "a": 0, "k": 100, "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 0, "k": [886, 844, 0], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [48, 96, 0], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [119.792, 119.792, 100], "ix": 6, "l": 2 } }, "ao": 0, "w": 96, "h": 192, "ip": 0, "op": 14.3, "st": -89.7, "bm": 0 }, { "ddd": 0, "ind": 13, "ty": 0, "nm": "Light_9", "refId": "comp_4", "sr": 1.3, "ks": { "o": { "a": 0, "k": 100, "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 0, "k": [886, 844, 0], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [48, 96, 0], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [119.792, 119.792, 100], "ix": 6, "l": 2 } }, "ao": 0, "w": 96, "h": 192, "ip": 30, "op": 119.7, "st": 30, "bm": 0 }, { "ddd": 0, "ind": 14, "ty": 0, "nm": "Light_9", "refId": "comp_4", "sr": 1.49000000953674, "ks": { "o": { "a": 0, "k": 100, "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 0, "k": [368, 568, 0], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [48, 96, 0], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [79.792, 79.792, 100], "ix": 6, "l": 2 } }, "ao": 0, "w": 96, "h": 192, "ip": 0, "op": 119.200000762939, "st": 0, "bm": 0 }, { "ddd": 0, "ind": 16, "ty": 0, "nm": "Light_9", "refId": "comp_4", "sr": 1.27999997138977, "ks": { "o": { "a": 0, "k": 35, "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 0, "k": [436, 722, 0], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [48, 96, 0], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [107.792, 107.792, 100], "ix": 6, "l": 2 } }, "ao": 0, "w": 96, "h": 192, "ip": 0, "op": 102.399997711182, "st": 0, "bm": 0 }, { "ddd": 0, "ind": 18, "ty": 0, "nm": "Light_11", "refId": "comp_5", "sr": 1, "ks": { "o": { "a": 0, "k": 100, "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 0, "k": [598, 228, 0], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [48, 155, 0], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [70, 70, 100], "ix": 6, "l": 2 } }, "ao": 0, "w": 96, "h": 310, "ip": 63, "op": 120, "st": 63, "bm": 0 }, { "ddd": 0, "ind": 19, "ty": 0, "nm": "Light_11", "refId": "comp_5", "sr": 1, "ks": { "o": { "a": 0, "k": 100, "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 0, "k": [598, 228, 0], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [48, 155, 0], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [70, 70, 100], "ix": 6, "l": 2 } }, "ao": 0, "w": 96, "h": 310, "ip": 0, "op": 13, "st": -57, "bm": 0 }, { "ddd": 0, "ind": 20, "ty": 0, "nm": "Light_11", "refId": "comp_5", "sr": 1.6, "ks": { "o": { "a": 0, "k": 100, "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 0, "k": [450, 440, 0], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [48, 155, 0], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [69.792, 69.792, 100], "ix": 6, "l": 2 } }, "ao": 0, "w": 96, "h": 310, "ip": 0, "op": 52.8, "st": -59.2, "bm": 0 }, { "ddd": 0, "ind": 21, "ty": 0, "nm": "Light_11", "refId": "comp_5", "sr": 1.60000002384186, "ks": { "o": { "a": 0, "k": 100, "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 0, "k": [450, 440, 0], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [48, 155, 0], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [69.792, 69.792, 100], "ix": 6, "l": 2 } }, "ao": 0, "w": 96, "h": 310, "ip": 61, "op": 120.200000882149, "st": 61, "bm": 0 }, { "ddd": 0, "ind": 22, "ty": 0, "nm": "Light_11", "refId": "comp_5", "sr": 1, "ks": { "o": { "a": 0, "k": 100, "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 0, "k": [528, 676, 0], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [48, 155, 0], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [50, 50, 100], "ix": 6, "l": 2 } }, "ao": 0, "w": 96, "h": 310, "ip": 0, "op": 13, "st": -57, "bm": 0 }, { "ddd": 0, "ind": 23, "ty": 0, "nm": "Light_11", "refId": "comp_5", "sr": 1, "ks": { "o": { "a": 0, "k": 100, "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 0, "k": [528, 676, 0], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [48, 155, 0], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [50, 50, 100], "ix": 6, "l": 2 } }, "ao": 0, "w": 96, "h": 310, "ip": 63, "op": 120, "st": 63, "bm": 0 }, { "ddd": 0, "ind": 24, "ty": 0, "nm": "Light_11", "refId": "comp_5", "sr": 1, "ks": { "o": { "a": 0, "k": 40, "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 0, "k": [756, 548, 0], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [48, 155, 0], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [69.792, 69.792, 100], "ix": 6, "l": 2 } }, "ao": 0, "w": 96, "h": 310, "ip": 44, "op": 114, "st": 44, "bm": 0 }, { "ddd": 0, "ind": 25, "ty": 0, "nm": "Light_11", "refId": "comp_5", "sr": 1, "ks": { "o": { "a": 0, "k": 70, "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 0, "k": [634, 842, 0], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [48, 155, 0], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [70, 70, 100], "ix": 6, "l": 2 } }, "ao": 0, "w": 96, "h": 310, "ip": 19, "op": 89, "st": 19, "bm": 0 }, { "ddd": 0, "ind": 26, "ty": 0, "nm": "Light_11", "refId": "comp_5", "sr": 1.3, "ks": { "o": { "a": 0, "k": 50, "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 0, "k": [347, 838, 0], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [48, 155, 0], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [92, 92, 100], "ix": 6, "l": 2 } }, "ao": 0, "w": 96, "h": 310, "ip": 0, "op": 91, "st": 0, "bm": 0 }] }, { "id": "comp_1", "nm": "Light_6", "fr": 30, "layers": [{ "ddd": 0, "ind": 1, "ty": 2, "nm": "point.png", "cl": "png", "refId": "image_1", "sr": 1, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.167], "y": [0.167] }, "t": 0, "s": [0] }, { "i": { "x": [0.833], "y": [0.833] }, "o": { "x": [0.333], "y": [0] }, "t": 40, "s": [100] }, { "t": 89, "s": [0] }], "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0.667, "y": 1 }, "o": { "x": 0.433, "y": 0.661 }, "t": 0, "s": [48, 163.2, 0], "to": [0, 0, 0], "ti": [0, 0, 0] }, { "t": 89, "s": [48, 78, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [116, 116, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [{ "i": { "x": [0.569, 0.569, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.331, 0.331, 0.333], "y": [0.439, 0.439, 0] }, "t": 0, "s": [20, 20, 100] }, { "t": 89, "s": [50, 50, 100] }], "ix": 6, "l": 2 } }, "ao": 0, "ip": 0, "op": 90, "st": 0, "bm": 0 }] }, { "id": "comp_2", "nm": "Light_7", "fr": 30, "layers": [{ "ddd": 0, "ind": 1, "ty": 2, "nm": "point.png", "cl": "png", "refId": "image_1", "sr": 1, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.167], "y": [0.167] }, "t": 0, "s": [0] }, { "i": { "x": [0.833], "y": [0.833] }, "o": { "x": [0.333], "y": [0] }, "t": 40, "s": [100] }, { "t": 89, "s": [0] }], "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0.667, "y": 1 }, "o": { "x": 0.433, "y": 0.311 }, "t": 0, "s": [48, 259.2, 0], "to": [0, 0, 0], "ti": [0, 0, 0] }, { "t": 89, "s": [48, 78, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [116, 116, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [{ "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.33, 0.33, 0.333], "y": [5.91, 5.91, 0] }, "t": 0, "s": [40, 40, 100] }, { "i": { "x": [0.555, 0.555, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.33, 0.33, 0.333], "y": [0, 0, 0] }, "t": 40, "s": [40, 40, 100] }, { "t": 89, "s": [70, 70, 100] }], "ix": 6, "l": 2 } }, "ao": 0, "ip": 0, "op": 90, "st": 0, "bm": 0 }] }, { "id": "comp_3", "nm": "Light_8", "fr": 30, "layers": [{ "ddd": 0, "ind": 1, "ty": 2, "nm": "point.png", "cl": "png", "refId": "image_1", "sr": 1, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.167], "y": [0.167] }, "t": 0, "s": [0] }, { "i": { "x": [0.833], "y": [0.833] }, "o": { "x": [0.333], "y": [0] }, "t": 40, "s": [100] }, { "t": 89, "s": [0] }], "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0.797, "y": 1 }, "o": { "x": 0.156, "y": 0.441 }, "t": 0, "s": [48, 163.2, 0], "to": [0, 0, 0], "ti": [0, 0, 0] }, { "t": 89, "s": [48, 78, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [116, 116, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [{ "i": { "x": [0.548, 0.548, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.257, 0.257, 0.333], "y": [0.23, 0.23, 0] }, "t": 0, "s": [50, 50, 100] }, { "i": { "x": [0.667, 0.667, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.167, 0.167, 0.167], "y": [0, 0, 0] }, "t": 40, "s": [70, 70, 100] }, { "t": 89, "s": [50, 50, 100] }], "ix": 6, "l": 2 } }, "ao": 0, "ip": 0, "op": 90, "st": 0, "bm": 0 }] }, { "id": "comp_4", "nm": "Light_9", "fr": 30, "layers": [{ "ddd": 0, "ind": 1, "ty": 2, "nm": "point.png", "cl": "png", "refId": "image_1", "sr": 1, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.167], "y": [0.167] }, "t": 0, "s": [0] }, { "i": { "x": [0.833], "y": [0.833] }, "o": { "x": [0.333], "y": [0] }, "t": 35, "s": [100] }, { "t": 79, "s": [0] }], "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0.667, "y": 1 }, "o": { "x": 0.419, "y": 0.461 }, "t": 0, "s": [48, 163.2, 0], "to": [0, 0, 0], "ti": [0, 0, 0] }, { "t": 79, "s": [48, 20, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [116, 116, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [{ "i": { "x": [0.625, 0.625, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.329, 0.329, 0.333], "y": [0.674, 0.674, 0] }, "t": 0, "s": [20, 20, 100] }, { "t": 79, "s": [40, 40, 100] }], "ix": 6, "l": 2 } }, "ao": 0, "ip": 0, "op": 80, "st": 0, "bm": 0 }] }, { "id": "comp_5", "nm": "Light_11", "fr": 30, "layers": [{ "ddd": 0, "ind": 1, "ty": 2, "nm": "point.png", "cl": "png", "refId": "image_1", "sr": 1, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.833], "y": [0.833] }, "o": { "x": [0.167], "y": [0.167] }, "t": 0, "s": [0] }, { "i": { "x": [0.833], "y": [0.833] }, "o": { "x": [0.167], "y": [0.167] }, "t": 28, "s": [100] }, { "t": 69, "s": [0] }], "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0.667, "y": 1 }, "o": { "x": 0.456, "y": 0.377 }, "t": 0, "s": [48, 239.2, 0], "to": [0, 0, 0], "ti": [0, 0, 0] }, { "t": 69, "s": [48, 104, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [116, 116, 0], "ix": 1, "l": 2 }, "s": { "a": 1, "k": [{ "i": { "x": [0.531, 0.531, 0.667], "y": [1, 1, 1] }, "o": { "x": [0.347, 0.347, 0.333], "y": [0.803, 0.803, 0] }, "t": 0, "s": [62, 62, 100] }, { "t": 69, "s": [82, 82, 100] }], "ix": 6, "l": 2 } }, "ao": 0, "ip": 0, "op": 70, "st": 0, "bm": 0 }] }], "layers": [{ "ddd": 0, "ind": 2, "ty": 2, "nm": "085339d9lrr9lluuhpx5ll.png", "cl": "png", "refId": "image_0", "sr": 1, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.833], "y": [1] }, "o": { "x": [0.167], "y": [0] }, "t": -31, "s": [0] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 0, "s": [20] }, { "t": 32, "s": [0] }], "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0.667, "y": 1 }, "o": { "x": 0.333, "y": 0 }, "t": -31, "s": [450, 526, 0], "to": [0, -34.833, 0], "ti": [0.333, 20.167, 0] }, { "i": { "x": 0.667, "y": 1 }, "o": { "x": 0.333, "y": 0 }, "t": 32, "s": [450, 317, 0], "to": [-0.333, -20.167, 0], "ti": [0.333, -14.667, 0] }, { "t": 112, "s": [448, 405, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [64, 64, 0], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [8, 128, 100], "ix": 6, "l": 2 } }, "ao": 0, "ip": 0, "op": 32, "st": -31, "bm": 0 }, { "ddd": 0, "ind": 3, "ty": 2, "nm": "085339d9lrr9lluuhpx5ll.png", "cl": "png", "refId": "image_0", "sr": 1, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.833], "y": [1] }, "o": { "x": [0.167], "y": [0] }, "t": -31, "s": [0] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 0, "s": [20] }, { "t": 32, "s": [0] }], "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0.667, "y": 1 }, "o": { "x": 0.333, "y": 0 }, "t": -31, "s": [714, 728, 0], "to": [0, -34.833, 0], "ti": [0.333, 20.167, 0] }, { "i": { "x": 0.667, "y": 1 }, "o": { "x": 0.333, "y": 0 }, "t": 32, "s": [714, 519, 0], "to": [-0.333, -20.167, 0], "ti": [0.333, -14.667, 0] }, { "t": 112, "s": [712, 607, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [64, 64, 0], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [12, 189, 100], "ix": 6, "l": 2 } }, "ao": 0, "ip": 0, "op": 32, "st": -31, "bm": 0 }, { "ddd": 0, "ind": 4, "ty": 2, "nm": "085339d9lrr9lluuhpx5ll.png", "cl": "png", "refId": "image_0", "sr": 1, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.833], "y": [1] }, "o": { "x": [0.167], "y": [0] }, "t": -31, "s": [0] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 0, "s": [20] }, { "t": 32, "s": [0] }], "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0.667, "y": 1 }, "o": { "x": 0.333, "y": 0 }, "t": -31, "s": [244, 702, 0], "to": [0, -34.833, 0], "ti": [0.333, 20.167, 0] }, { "i": { "x": 0.667, "y": 1 }, "o": { "x": 0.333, "y": 0 }, "t": 32, "s": [244, 493, 0], "to": [-0.333, -20.167, 0], "ti": [0.333, -14.667, 0] }, { "t": 112, "s": [242, 581, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [64, 64, 0], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [8, 109, 100], "ix": 6, "l": 2 } }, "ao": 0, "ip": 0, "op": 32, "st": -31, "bm": 0 }, { "ddd": 0, "ind": 5, "ty": 2, "nm": "085339d9lrr9lluuhpx5ll.png", "cl": "png", "refId": "image_0", "sr": 1, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.833], "y": [1] }, "o": { "x": [0.167], "y": [0] }, "t": 89, "s": [0] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 120, "s": [20] }, { "t": 152, "s": [0] }], "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0.667, "y": 0.568 }, "o": { "x": 0.333, "y": 0 }, "t": 89, "s": [450, 526, 0], "to": [0, -11.797, 0], "ti": [0, 27.651, 0] }, { "i": { "x": 0.667, "y": 1 }, "o": { "x": 0.333, "y": 0.507 }, "t": 123, "s": [448, 405, 0], "to": [0, -53.993, 0], "ti": [0, 23.036, 0] }, { "t": 152, "s": [450, 317, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [64, 64, 0], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [8, 128, 100], "ix": 6, "l": 2 } }, "ao": 0, "ip": 89, "op": 123, "st": 89, "bm": 0 }, { "ddd": 0, "ind": 6, "ty": 2, "nm": "085339d9lrr9lluuhpx5ll.png", "cl": "png", "refId": "image_0", "sr": 1, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.833], "y": [1] }, "o": { "x": [0.167], "y": [0] }, "t": 89, "s": [0] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 120, "s": [20] }, { "t": 152, "s": [0] }], "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0.667, "y": 0.568 }, "o": { "x": 0.333, "y": 0 }, "t": 89, "s": [714, 728, 0], "to": [0, -11.797, 0], "ti": [0, 27.651, 0] }, { "i": { "x": 0.667, "y": 1 }, "o": { "x": 0.333, "y": 0.507 }, "t": 123, "s": [712, 607, 0], "to": [0, -53.993, 0], "ti": [0, 23.036, 0] }, { "t": 152, "s": [714, 519, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [64, 64, 0], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [12, 189, 100], "ix": 6, "l": 2 } }, "ao": 0, "ip": 89, "op": 123, "st": 89, "bm": 0 }, { "ddd": 0, "ind": 7, "ty": 2, "nm": "085339d9lrr9lluuhpx5ll.png", "cl": "png", "refId": "image_0", "sr": 1, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.833], "y": [1] }, "o": { "x": [0.167], "y": [0] }, "t": 89, "s": [0] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 120, "s": [20] }, { "t": 152, "s": [0] }], "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0.667, "y": 0.568 }, "o": { "x": 0.333, "y": 0 }, "t": 89, "s": [244, 702, 0], "to": [0, -11.797, 0], "ti": [0, 27.651, 0] }, { "i": { "x": 0.667, "y": 1 }, "o": { "x": 0.333, "y": 0.507 }, "t": 123, "s": [242, 581, 0], "to": [0, -53.993, 0], "ti": [0, 23.036, 0] }, { "t": 152, "s": [244, 493, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [64, 64, 0], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [8, 109, 100], "ix": 6, "l": 2 } }, "ao": 0, "ip": 89, "op": 123, "st": 89, "bm": 0 }, { "ddd": 0, "ind": 8, "ty": 2, "nm": "085339d9lrr9lluuhpx5ll.png", "cl": "png", "refId": "image_0", "sr": 1, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.833], "y": [1] }, "o": { "x": [0.167], "y": [0] }, "t": 24, "s": [0] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 55, "s": [54] }, { "t": 87, "s": [0] }], "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0.667, "y": 1 }, "o": { "x": 0.333, "y": 0 }, "t": 24, "s": [450, 716, 0], "to": [0, -34.833, 0], "ti": [0.333, 20.167, 0] }, { "i": { "x": 0.667, "y": 1 }, "o": { "x": 0.333, "y": 0 }, "t": 87, "s": [450, 507, 0], "to": [-0.333, -20.167, 0], "ti": [0.333, -14.667, 0] }, { "t": 112, "s": [448, 595, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [64, 64, 0], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [11, 209, 100], "ix": 6, "l": 2 } }, "ao": 0, "ip": 24, "op": 87, "st": 24, "bm": 0 }, { "ddd": 0, "ind": 9, "ty": 2, "nm": "085339d9lrr9lluuhpx5ll.png", "cl": "png", "refId": "image_0", "sr": 1, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.833], "y": [1] }, "o": { "x": [0.167], "y": [0] }, "t": 57, "s": [0] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 88, "s": [20] }, { "t": 120, "s": [0] }], "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0.667, "y": 0.638 }, "o": { "x": 0.333, "y": 0 }, "t": 57, "s": [454, 250, 0], "to": [0, -32.28, 0], "ti": [0, 45.435, 0] }, { "i": { "x": 0.667, "y": 1 }, "o": { "x": 0.333, "y": 0.06 }, "t": 112, "s": [452, 138.261, 0], "to": [0, -3.593, 0], "ti": [0, 2.553, 0] }, { "t": 120, "s": [454, 41, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [64, 64, 0], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [10, 190, 100], "ix": 6, "l": 2 } }, "ao": 0, "ip": 57, "op": 120, "st": 57, "bm": 0 }, { "ddd": 0, "ind": 10, "ty": 2, "nm": "085339d9lrr9lluuhpx5ll.png", "cl": "png", "refId": "image_0", "sr": 1, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.833], "y": [1] }, "o": { "x": [0.167], "y": [0] }, "t": 57, "s": [0] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 88, "s": [72] }, { "t": 120, "s": [0] }], "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0.667, "y": 0.638 }, "o": { "x": 0.333, "y": 0 }, "t": 57, "s": [674, 476, 0], "to": [0, -32.28, 0], "ti": [0, 45.435, 0] }, { "i": { "x": 0.667, "y": 1 }, "o": { "x": 0.333, "y": 0.06 }, "t": 112, "s": [672, 364.261, 0], "to": [0, -3.593, 0], "ti": [0, 2.553, 0] }, { "t": 120, "s": [674, 267, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [64, 64, 0], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [10, 105, 100], "ix": 6, "l": 2 } }, "ao": 0, "ip": 57, "op": 120, "st": 57, "bm": 0 }, { "ddd": 0, "ind": 11, "ty": 2, "nm": "085339d9lrr9lluuhpx5ll.png", "cl": "png", "refId": "image_0", "sr": 1, "ks": { "o": { "a": 1, "k": [{ "i": { "x": [0.833], "y": [1] }, "o": { "x": [0.167], "y": [0] }, "t": 57, "s": [0] }, { "i": { "x": [0.667], "y": [1] }, "o": { "x": [0.333], "y": [0] }, "t": 88, "s": [20] }, { "t": 120, "s": [0] }], "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 1, "k": [{ "i": { "x": 0.667, "y": 0.638 }, "o": { "x": 0.333, "y": 0 }, "t": 57, "s": [356, 624, 0], "to": [0, -32.28, 0], "ti": [0, 45.436, 0] }, { "i": { "x": 0.667, "y": 1 }, "o": { "x": 0.333, "y": 0.06 }, "t": 112, "s": [354, 512.262, 0], "to": [0, -3.594, 0], "ti": [0, 2.553, 0] }, { "t": 120, "s": [356, 415, 0] }], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [64, 64, 0], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [10, 102, 100], "ix": 6, "l": 2 } }, "ao": 0, "ip": 57, "op": 120, "st": 57, "bm": 0 }, { "ddd": 0, "ind": 12, "ty": 0, "nm": "预合成 5", "refId": "comp_0", "sr": 0.5, "ks": { "o": { "a": 0, "k": 100, "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 0, "k": [480, 480, 0], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [540, 540, 0], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [100, 100, 100], "ix": 6, "l": 2 } }, "ao": 0, "w": 1080, "h": 1080, "ip": 60, "op": 120, "st": 60, "bm": 16 }, { "ddd": 0, "ind": 13, "ty": 0, "nm": "预合成 5", "refId": "comp_0", "sr": 0.5, "ks": { "o": { "a": 0, "k": 100, "ix": 11 }, "r": { "a": 0, "k": 0, "ix": 10 }, "p": { "a": 0, "k": [480, 480, 0], "ix": 2, "l": 2 }, "a": { "a": 0, "k": [540, 540, 0], "ix": 1, "l": 2 }, "s": { "a": 0, "k": [100, 100, 100], "ix": 6, "l": 2 } }, "ao": 0, "w": 1080, "h": 1080, "ip": 0, "op": 60, "st": 0, "bm": 16 }], "markers": [], "props": {} } diff --git a/shudu/assets/effect/lottie_trophy_light/lottie_trophy_light.json.meta b/shudu/assets/effect/lottie_trophy_light/lottie_trophy_light.json.meta new file mode 100644 index 0000000..97c5cf8 --- /dev/null +++ b/shudu/assets/effect/lottie_trophy_light/lottie_trophy_light.json.meta @@ -0,0 +1,3 @@ +{ + "uuid": "8b00fa41-c559-41e3-aa6d-4007242de476" +} \ No newline at end of file diff --git a/shudu/assets/fonts/Inter-Bold-700.ttf b/shudu/assets/fonts/Inter-Bold-700.ttf new file mode 100644 index 0000000..9fcd5ac Binary files /dev/null and b/shudu/assets/fonts/Inter-Bold-700.ttf differ diff --git a/shudu/assets/fonts/Inter-Bold-700.ttf.meta b/shudu/assets/fonts/Inter-Bold-700.ttf.meta new file mode 100644 index 0000000..856b2eb --- /dev/null +++ b/shudu/assets/fonts/Inter-Bold-700.ttf.meta @@ -0,0 +1,3 @@ +{ + "uuid": "3f79306d-f490-4a54-a4f3-26cb51d56a12" +} \ No newline at end of file diff --git a/shudu/assets/fonts/Inter-Medium-500.ttf b/shudu/assets/fonts/Inter-Medium-500.ttf new file mode 100644 index 0000000..fee1b93 Binary files /dev/null and b/shudu/assets/fonts/Inter-Medium-500.ttf differ diff --git a/shudu/assets/fonts/Inter-Medium-500.ttf.meta b/shudu/assets/fonts/Inter-Medium-500.ttf.meta new file mode 100644 index 0000000..9e2cabe --- /dev/null +++ b/shudu/assets/fonts/Inter-Medium-500.ttf.meta @@ -0,0 +1,3 @@ +{ + "uuid": "83c7971a-e73f-40ba-92a8-7d6fccac0958" +} \ No newline at end of file diff --git a/shudu/assets/fonts/Inter-Regular-400.ttf b/shudu/assets/fonts/Inter-Regular-400.ttf new file mode 100644 index 0000000..d761a04 Binary files /dev/null and b/shudu/assets/fonts/Inter-Regular-400.ttf differ diff --git a/shudu/assets/fonts/Inter-Regular-400.ttf.meta b/shudu/assets/fonts/Inter-Regular-400.ttf.meta new file mode 100644 index 0000000..43d1fd3 --- /dev/null +++ b/shudu/assets/fonts/Inter-Regular-400.ttf.meta @@ -0,0 +1,3 @@ +{ + "uuid": "f015dd22-1bf2-4dff-bf92-97185a4da48b" +} \ No newline at end of file diff --git a/shudu/assets/fonts/Inter-SemiBold-600.ttf b/shudu/assets/fonts/Inter-SemiBold-600.ttf new file mode 100644 index 0000000..594683b Binary files /dev/null and b/shudu/assets/fonts/Inter-SemiBold-600.ttf differ diff --git a/shudu/assets/fonts/Inter-SemiBold-600.ttf.meta b/shudu/assets/fonts/Inter-SemiBold-600.ttf.meta new file mode 100644 index 0000000..c81dc89 --- /dev/null +++ b/shudu/assets/fonts/Inter-SemiBold-600.ttf.meta @@ -0,0 +1,3 @@ +{ + "uuid": "5f760925-14a8-4e61-b8c4-d19c523e7376" +} \ No newline at end of file diff --git a/shudu/assets/fonts/Inter1-Bold.ttf b/shudu/assets/fonts/Inter1-Bold.ttf new file mode 100644 index 0000000..9fb9b75 Binary files /dev/null and b/shudu/assets/fonts/Inter1-Bold.ttf differ diff --git a/shudu/assets/fonts/Inter1-Bold.ttf.meta b/shudu/assets/fonts/Inter1-Bold.ttf.meta new file mode 100644 index 0000000..5d69452 --- /dev/null +++ b/shudu/assets/fonts/Inter1-Bold.ttf.meta @@ -0,0 +1,3 @@ +{ + "uuid": "e4a5ff09-434b-4d65-8a4b-b351e63ecab8" +} \ No newline at end of file diff --git a/shudu/assets/images/Congratulations.png b/shudu/assets/images/Congratulations.png new file mode 100644 index 0000000..6df8ac8 Binary files /dev/null and b/shudu/assets/images/Congratulations.png differ diff --git a/shudu/assets/images/Congratulations.png.meta b/shudu/assets/images/Congratulations.png.meta new file mode 100644 index 0000000..801da75 --- /dev/null +++ b/shudu/assets/images/Congratulations.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "2c16b5f4-49d5-4203-8099-b285426e740e", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/images/bg_dc_top1.png b/shudu/assets/images/bg_dc_top1.png new file mode 100644 index 0000000..7194150 Binary files /dev/null and b/shudu/assets/images/bg_dc_top1.png differ diff --git a/shudu/assets/images/bg_dc_top1.png.meta b/shudu/assets/images/bg_dc_top1.png.meta new file mode 100644 index 0000000..92b1457 --- /dev/null +++ b/shudu/assets/images/bg_dc_top1.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "342d91e6-0434-4d52-b16c-3c536060f881", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/images/bg_dc_top2.png b/shudu/assets/images/bg_dc_top2.png new file mode 100644 index 0000000..f8cef1d Binary files /dev/null and b/shudu/assets/images/bg_dc_top2.png differ diff --git a/shudu/assets/images/bg_dc_top2.png.meta b/shudu/assets/images/bg_dc_top2.png.meta new file mode 100644 index 0000000..766cf0a --- /dev/null +++ b/shudu/assets/images/bg_dc_top2.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "3dc757bc-61c3-480f-9ee1-1b1c57cf028b", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/images/bg_done.png b/shudu/assets/images/bg_done.png new file mode 100644 index 0000000..8037101 Binary files /dev/null and b/shudu/assets/images/bg_done.png differ diff --git a/shudu/assets/images/bg_done.png.meta b/shudu/assets/images/bg_done.png.meta new file mode 100644 index 0000000..6c2f514 --- /dev/null +++ b/shudu/assets/images/bg_done.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "2b008659-862a-4155-b094-ee87ba692be1", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/images/bg_done_light.png b/shudu/assets/images/bg_done_light.png new file mode 100644 index 0000000..e9b6a5d Binary files /dev/null and b/shudu/assets/images/bg_done_light.png differ diff --git a/shudu/assets/images/bg_done_light.png.meta b/shudu/assets/images/bg_done_light.png.meta new file mode 100644 index 0000000..356560a --- /dev/null +++ b/shudu/assets/images/bg_done_light.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "ebbaa034-8dd8-4fb8-abd5-094cdd76f93a", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/images/bg_done_top.png b/shudu/assets/images/bg_done_top.png new file mode 100644 index 0000000..ae4f699 Binary files /dev/null and b/shudu/assets/images/bg_done_top.png differ diff --git a/shudu/assets/images/bg_done_top.png.meta b/shudu/assets/images/bg_done_top.png.meta new file mode 100644 index 0000000..eabcee1 --- /dev/null +++ b/shudu/assets/images/bg_done_top.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "14316514-e8bf-4d32-bf9c-ba375ea24798", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/images/img_dc_bg2.png b/shudu/assets/images/img_dc_bg2.png new file mode 100644 index 0000000..e8f13c6 Binary files /dev/null and b/shudu/assets/images/img_dc_bg2.png differ diff --git a/shudu/assets/images/img_dc_bg2.png.meta b/shudu/assets/images/img_dc_bg2.png.meta new file mode 100644 index 0000000..ae70465 --- /dev/null +++ b/shudu/assets/images/img_dc_bg2.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "3e483f58-04bc-4a60-8aaa-695dfe115668", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/images/img_dc_finished.png b/shudu/assets/images/img_dc_finished.png new file mode 100644 index 0000000..cb7be91 Binary files /dev/null and b/shudu/assets/images/img_dc_finished.png differ diff --git a/shudu/assets/images/img_dc_finished.png.meta b/shudu/assets/images/img_dc_finished.png.meta new file mode 100644 index 0000000..6376879 --- /dev/null +++ b/shudu/assets/images/img_dc_finished.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "4182ef3f-6065-44dd-83c2-70490f02e9cb", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/images/img_light_yellow.png b/shudu/assets/images/img_light_yellow.png new file mode 100644 index 0000000..f67d095 Binary files /dev/null and b/shudu/assets/images/img_light_yellow.png differ diff --git a/shudu/assets/images/img_light_yellow.png.meta b/shudu/assets/images/img_light_yellow.png.meta new file mode 100644 index 0000000..3bcd948 --- /dev/null +++ b/shudu/assets/images/img_light_yellow.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "0403c03d-0fbb-4930-8cf7-c4bf0f4d45b9", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/images/star.png b/shudu/assets/images/star.png new file mode 100644 index 0000000..8a5cd8d Binary files /dev/null and b/shudu/assets/images/star.png differ diff --git a/shudu/assets/images/star.png.meta b/shudu/assets/images/star.png.meta new file mode 100644 index 0000000..6a66970 --- /dev/null +++ b/shudu/assets/images/star.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "c5e80bd0-632f-4460-bce3-ebf9669359e3", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/images/star2.png b/shudu/assets/images/star2.png new file mode 100644 index 0000000..f8c9402 Binary files /dev/null and b/shudu/assets/images/star2.png differ diff --git a/shudu/assets/images/star2.png.meta b/shudu/assets/images/star2.png.meta new file mode 100644 index 0000000..50d0996 --- /dev/null +++ b/shudu/assets/images/star2.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "902e1f3a-6f95-4796-8449-974ae5354d72", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/resources/CommonTips.lh b/shudu/assets/resources/CommonTips.lh new file mode 100644 index 0000000..738c686 --- /dev/null +++ b/shudu/assets/resources/CommonTips.lh @@ -0,0 +1,334 @@ +{ + "_$ver": 1, + "_$id": "wjk0u6h3", + "_$type": "Box", + "name": "CommonTips", + "width": 1080, + "height": 1920, + "_mouseState": 2, + "drawCallOptimize": true, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "_$comp": [ + { + "_$type": "b0dfcf08-5aef-4078-8149-1fbd00d8038f", + "scriptPath": "../src/views/CommonTips.ts", + "label_title": { + "_$ref": "qawnoo6z" + }, + "label_content": { + "_$ref": "jjabofyx" + }, + "btn_ok": { + "_$ref": "ob8d2aj7" + }, + "btn_cancel": { + "_$ref": "ikd12rw5" + }, + "toggle": { + "_$ref": "g1zoj9qx" + }, + "check": { + "_$ref": "cofalite" + } + } + ], + "_$child": [ + { + "_$id": "h6qqt6bd", + "_$type": "Image", + "name": "Image", + "x": -100, + "y": -100, + "width": 1280, + "height": 2120, + "alpha": 0.6, + "left": -100, + "right": -100, + "top": -100, + "bottom": -100, + "skin": "res://a98f334e-ce04-4cd0-8fc5-bbdf9b048609", + "color": "#000000" + }, + { + "_$id": "r463so4u", + "_$type": "Box", + "name": "center", + "x": 540, + "y": 960, + "width": 960, + "height": 520, + "anchorX": 0.5, + "anchorY": 0.5, + "_mouseState": 2, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "wfz9ah0j", + "_$type": "Sprite", + "name": "Sprite", + "width": 960, + "height": 520, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + }, + { + "_$id": "k3fjill3", + "_$type": "HBox", + "name": "HBox", + "x": 54, + "y": 271, + "width": 852, + "height": 96, + "centerX": 0, + "space": 28, + "align": "middle", + "_$child": [ + { + "_$id": "ikd12rw5", + "_$type": "Box", + "name": "btn_cancel", + "y": -12, + "width": 412, + "height": 120, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "he6hpns9", + "_$type": "Sprite", + "name": "Sprite", + "width": 412, + "height": 120, + "alpha": 0.1, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 27, + "rt": 27, + "lb": 27, + "rb": 27, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + }, + { + "_$id": "qa4fm6cu", + "_$type": "Label", + "name": "Label", + "x": 56, + "y": 12, + "width": 300, + "height": 96, + "centerX": 0, + "centerY": 0, + "text": "Cancel", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 45, + "color": "rgba(29, 92, 220, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ob8d2aj7", + "_$type": "Box", + "name": "btn_ok", + "x": 440, + "y": -12, + "width": 412, + "height": 120, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "v4xrd22a", + "_$type": "Sprite", + "name": "Sprite_1", + "width": 412, + "height": 120, + "alpha": 0.2, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 27, + "rt": 27, + "lb": 27, + "rb": 27, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 3, + "blur": 6, + "color": "#1d5cdc" + } + ] + }, + { + "_$id": "bqp1fe7k", + "_$type": "Sprite", + "name": "Sprite", + "width": 412, + "height": 120, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 27, + "rt": 27, + "lb": 27, + "rb": 27, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + }, + { + "_$id": "q2n5i4r9", + "_$type": "Label", + "name": "Label", + "x": 56, + "y": 12, + "width": 300, + "height": 96, + "centerX": 0, + "centerY": 0, + "text": "Start", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 45, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "g1zoj9qx", + "_$type": "Box", + "name": "toggle", + "x": 320, + "y": 424, + "width": 330, + "height": 42, + "bottom": 54, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "74puwx15", + "_$type": "Sprite", + "name": "Sprite", + "width": 42, + "height": 42, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lineWidth": 2, + "fillColor": "rgba(240, 242, 247, 1)" + } + ] + }, + { + "_$id": "cofalite", + "_$type": "Image", + "name": "Image", + "width": 43, + "height": 42, + "mouseThrough": true, + "skin": "res://6f23a1ca-70f5-467a-afc3-5b178a851423", + "useSourceSize": true, + "color": "#ffffff" + }, + { + "_$id": "jf00gv80", + "_$type": "Label", + "name": "Label", + "x": 54, + "y": 2, + "width": 400, + "height": 42, + "text": "Don't ask me again", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(84, 89, 98, 1)", + "valign": "middle" + } + ] + }, + { + "_$id": "qawnoo6z", + "_$type": "Label", + "name": "label_title", + "x": 180, + "y": 54, + "width": 600, + "height": 66, + "top": 54, + "centerX": 0, + "text": "Start New Game", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 54, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(45, 49, 56, 1)" + }, + { + "_$id": "jjabofyx", + "_$type": "Label", + "name": "label_content", + "x": 130, + "y": 150, + "width": 700, + "height": 48, + "top": 150, + "centerX": 0, + "text": "Current game progress will be lost", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 40, + "color": "rgba(84, 89, 98, 1)", + "align": "center" + } + ] + } + ] +} \ No newline at end of file diff --git a/shudu/assets/resources/CommonTips.lh.meta b/shudu/assets/resources/CommonTips.lh.meta new file mode 100644 index 0000000..c14437e --- /dev/null +++ b/shudu/assets/resources/CommonTips.lh.meta @@ -0,0 +1,3 @@ +{ + "uuid": "15ce6252-3b69-42de-bf9c-6a3b32e29164" +} \ No newline at end of file diff --git a/shudu/assets/resources/Difficulty.lh b/shudu/assets/resources/Difficulty.lh new file mode 100644 index 0000000..430544c --- /dev/null +++ b/shudu/assets/resources/Difficulty.lh @@ -0,0 +1,577 @@ +{ + "_$ver": 1, + "_$id": "zala0uui", + "_$type": "Box", + "name": "Difficulty", + "width": 1080, + "height": 1920, + "_mouseState": 2, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "_$comp": [ + { + "_$type": "87bad4d3-bede-442e-914d-d7bcdc85f0d1", + "scriptPath": "../src/views/Difficulty.ts", + "obj_items": { + "_$ref": "34t1dkio" + } + } + ], + "_$child": [ + { + "_$id": "4udntov4", + "_$type": "Image", + "name": "mask", + "width": 1080, + "height": 1920, + "alpha": 0.4, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "skin": "res://a98f334e-ce04-4cd0-8fc5-bbdf9b048609", + "color": "#000000" + }, + { + "_$id": "8qh18emh", + "_$type": "Box", + "name": "bottom", + "y": 705, + "width": 1080, + "height": 1215, + "left": 0, + "right": 0, + "bottom": 0, + "_$child": [ + { + "_$id": "jzxgx41i", + "_$type": "Box", + "name": "offset", + "y": 2400, + "width": 1080, + "height": 1215, + "_mouseState": 2, + "left": 0, + "right": 0, + "bottom": -2400, + "_$child": [ + { + "_$id": "bd1s5tvm", + "_$type": "Sprite", + "name": "bg", + "width": 1080, + "height": 1215, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 48, + "rt": 48, + "lb": 0, + "rb": 0, + "lineWidth": 1, + "fillColor": "rgba(245, 247, 251, 1)" + } + ] + }, + { + "_$id": "e5l16p86", + "_$type": "Label", + "name": "Label", + "x": 90, + "y": 35, + "width": 900, + "height": 180, + "centerX": 0, + "text": "New Game", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle", + "_$child": [ + { + "_$id": "5xwrtg57", + "_$type": "Box", + "name": "Box", + "x": 410, + "y": -20, + "width": 80, + "height": 20, + "centerX": 0, + "centerY": -100, + "_$child": [ + { + "_$id": "wk9lt59j", + "_$type": "Sprite", + "name": "Sprite", + "width": 80, + "height": 12, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lineWidth": 1, + "fillColor": "rgba(211, 213, 219, 1)" + } + ] + } + ] + } + ] + }, + { + "_$id": "34t1dkio", + "_$type": "VBox", + "name": "items", + "y": 288, + "width": 1080, + "height": 840, + "_mouseState": 2, + "bottom": 87, + "centerX": 0, + "space": 30, + "align": "center", + "_$child": [ + { + "_$id": "rxv162yy", + "_$type": "Box", + "name": "Box(1)", + "x": 72, + "width": 936, + "height": 144, + "_$comp": [ + { + "_$type": "8857686b-9b2c-4e9c-af0f-0164c0994e46", + "scriptPath": "../src/views/common/CommonData.ts", + "intValue": 0, + "strValue": "" + }, + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "7bz520zl", + "_$type": "Sprite", + "name": "sdw", + "width": 936, + "height": 144, + "alpha": 0.08, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 4, + "blur": 8, + "color": "#000" + } + ] + }, + { + "_$id": "590euu2q", + "_$type": "Sprite", + "name": "Sprite", + "width": 936, + "height": 144, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + }, + { + "_$id": "36r7vd4n", + "_$type": "Label", + "name": "Label", + "width": 900, + "height": 144, + "centerX": -18, + "centerY": 0, + "text": "Easy", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 54, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0q6t2588", + "_$type": "Box", + "name": "Box(2)", + "x": 72, + "y": 174, + "width": 936, + "height": 144, + "_$comp": [ + { + "_$type": "8857686b-9b2c-4e9c-af0f-0164c0994e46", + "scriptPath": "../src/views/common/CommonData.ts", + "intValue": 0, + "strValue": "" + }, + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "gwsq87bq", + "_$type": "Sprite", + "name": "sdw", + "width": 936, + "height": 144, + "alpha": 0.08, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 4, + "blur": 8, + "color": "#000" + } + ] + }, + { + "_$id": "yjk1xq2a", + "_$type": "Sprite", + "name": "Sprite", + "width": 936, + "height": 144, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + }, + { + "_$id": "ctexrl7w", + "_$type": "Label", + "name": "Label", + "width": 900, + "height": 144, + "centerX": -18, + "centerY": 0, + "text": "Medium", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 54, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "j3ml4g8s", + "_$type": "Box", + "name": "Box(3)", + "x": 72, + "y": 348, + "width": 936, + "height": 144, + "_$comp": [ + { + "_$type": "8857686b-9b2c-4e9c-af0f-0164c0994e46", + "scriptPath": "../src/views/common/CommonData.ts", + "intValue": 0, + "strValue": "" + }, + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "tqda3z60", + "_$type": "Sprite", + "name": "sdw", + "width": 936, + "height": 144, + "alpha": 0.08, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 4, + "blur": 8, + "color": "#000" + } + ] + }, + { + "_$id": "nfk6pjgd", + "_$type": "Sprite", + "name": "Sprite", + "width": 936, + "height": 144, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + }, + { + "_$id": "yk78vemi", + "_$type": "Label", + "name": "Label", + "width": 900, + "height": 144, + "centerX": -18, + "centerY": 0, + "text": "Hard", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 54, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "e4epdrmw", + "_$type": "Box", + "name": "Box(4)", + "x": 72, + "y": 522, + "width": 936, + "height": 144, + "_$comp": [ + { + "_$type": "8857686b-9b2c-4e9c-af0f-0164c0994e46", + "scriptPath": "../src/views/common/CommonData.ts", + "intValue": 0, + "strValue": "" + }, + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "vf17vdq3", + "_$type": "Sprite", + "name": "sdw", + "width": 936, + "height": 144, + "alpha": 0.08, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 4, + "blur": 8, + "color": "#000" + } + ] + }, + { + "_$id": "nogfpbyx", + "_$type": "Sprite", + "name": "Sprite", + "width": 936, + "height": 144, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + }, + { + "_$id": "83aiwvdd", + "_$type": "Label", + "name": "Label", + "width": 900, + "height": 144, + "centerX": -18, + "centerY": 0, + "text": "Expert", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 54, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "a2kjyumo", + "_$type": "Box", + "name": "Box(5)", + "x": 72, + "y": 696, + "width": 936, + "height": 144, + "_$comp": [ + { + "_$type": "8857686b-9b2c-4e9c-af0f-0164c0994e46", + "scriptPath": "../src/views/common/CommonData.ts", + "intValue": 0, + "strValue": "" + }, + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "wzn7s0ir", + "_$type": "Sprite", + "name": "sdw", + "width": 936, + "height": 144, + "alpha": 0.08, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 4, + "blur": 8, + "color": "#000" + } + ] + }, + { + "_$id": "2unm1bxx", + "_$type": "Sprite", + "name": "Sprite", + "width": 936, + "height": 144, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + }, + { + "_$id": "p36e2q6t", + "_$type": "Label", + "name": "Label", + "width": 900, + "height": 144, + "centerX": -18, + "centerY": 0, + "text": "Extreme", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 54, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/shudu/assets/resources/Difficulty.lh.meta b/shudu/assets/resources/Difficulty.lh.meta new file mode 100644 index 0000000..47d2420 --- /dev/null +++ b/shudu/assets/resources/Difficulty.lh.meta @@ -0,0 +1,3 @@ +{ + "uuid": "942e288c-58da-4b15-83bf-7541d7ad8294" +} \ No newline at end of file diff --git a/shudu/assets/resources/GameDone_DC.lh b/shudu/assets/resources/GameDone_DC.lh new file mode 100644 index 0000000..613ff12 --- /dev/null +++ b/shudu/assets/resources/GameDone_DC.lh @@ -0,0 +1,587 @@ +{ + "_$ver": 1, + "_$id": "zgb3r3bp", + "_$type": "Box", + "name": "GameDone_DC", + "width": 1080, + "height": 1920, + "_mouseState": 2, + "drawCallOptimize": true, + "left": 0, + "right": 0, + "_$comp": [ + { + "_$type": "13e020d1-5ab8-4082-80ca-c0d208342103", + "scriptPath": "../src/views/GameDone.ts", + "bg": { + "_$ref": "ne7i0g6e" + }, + "obj_light": { + "_$ref": "fmyff6zc" + }, + "obj_top": { + "_$ref": "rvuzq3il" + }, + "obj_panel": { + "_$ref": "9ijholxi" + }, + "star1": { + "_$ref": "fxmo764l" + }, + "star2": { + "_$ref": "c94zj9eo" + }, + "star3": { + "_$ref": "lusyix89" + }, + "star4": { + "_$ref": "kn1x3k7e" + }, + "img_title": { + "_$ref": "zu1c4o9d" + }, + "label_diffucuty": { + "_$ref": "sli8jsxk" + }, + "label_time": { + "_$ref": "dow6r2on" + }, + "label_score": { + "_$ref": "rby8odj3" + }, + "btn_new": { + "_$ref": "cx166wex" + }, + "btn_home": { + "_$ref": "nx1uwslc" + }, + "btn_continue": { + "_$ref": "lcg77a5s" + } + } + ], + "_$child": [ + { + "_$id": "ne7i0g6e", + "_$type": "Image", + "name": "bg_done", + "width": 1080, + "height": 1920, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "skin": "res://07b90718-84ee-4924-9098-8f0ee3663d92", + "color": "#ffffff" + }, + { + "_$id": "9ijholxi", + "_$type": "Box", + "name": "top", + "x": 48, + "y": 490, + "width": 984, + "height": 846, + "centerX": 0, + "_$child": [ + { + "_$id": "fmyff6zc", + "_$type": "Image", + "name": "light", + "x": 492, + "y": 78, + "width": 924, + "height": 924, + "anchorX": 0.5, + "anchorY": 0.5, + "scaleX": 3, + "scaleY": 3, + "alpha": 0.2, + "centerX": 0, + "skin": "res://ebbaa034-8dd8-4fb8-abd5-094cdd76f93a", + "color": "#ffffff", + "_$comp": [ + { + "_$type": "b4f67ca3-86fe-409d-a439-63a715243fb7", + "scriptPath": "../src/views/common/AutoRotate.ts", + "speed": 0.2 + } + ] + }, + { + "_$id": "rvuzq3il", + "_$type": "Image", + "name": "bg", + "width": 984, + "height": 180, + "skin": "res://14316514-e8bf-4d32-bf9c-ba375ea24798", + "color": "#ffffff", + "_$child": [ + { + "_$id": "b1tcc49x", + "_$type": "Sprite", + "name": "Sprite", + "y": 180, + "width": 984, + "height": 666, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 0, + "rt": 0, + "lb": 48, + "rb": 48, + "lineWidth": 1, + "fillColor": "rgba(250, 251, 253, 1)" + } + ] + }, + { + "_$id": "fw45yyc2", + "_$type": "Sprite", + "name": "Sprite(1)", + "x": 44, + "y": 400, + "width": 888, + "height": 372, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 48, + "rt": 48, + "lb": 48, + "rb": 48, + "lineWidth": 1, + "fillColor": "rgba(245, 247, 251, 1)" + } + ] + } + ] + }, + { + "_$id": "9r1ij2bs", + "_$type": "Box", + "name": "stars", + "y": -168, + "width": 984, + "height": 300, + "visible": false, + "centerX": 0, + "_$child": [ + { + "_$id": "fxmo764l", + "_$type": "Image", + "name": "check(1)", + "x": 69, + "y": 19, + "width": 306, + "height": 307, + "skin": "res://902e1f3a-6f95-4796-8449-974ae5354d72", + "useSourceSize": true, + "color": "#ffffff" + }, + { + "_$id": "c94zj9eo", + "_$type": "Image", + "name": "check(2)", + "x": 339, + "width": 306, + "height": 307, + "centerX": 0, + "skin": "res://902e1f3a-6f95-4796-8449-974ae5354d72", + "useSourceSize": true, + "color": "#ffffff" + }, + { + "_$id": "lusyix89", + "_$type": "Image", + "name": "check(3)", + "x": 696, + "y": -35, + "width": 306, + "height": 307, + "rotation": 26, + "skin": "res://902e1f3a-6f95-4796-8449-974ae5354d72", + "useSourceSize": true, + "color": "#ffffff" + } + ] + }, + { + "_$id": "kn1x3k7e", + "_$type": "Image", + "name": "star", + "x": 330, + "y": -160, + "width": 324, + "height": 324, + "centerX": 0, + "skin": "res://c5e80bd0-632f-4460-bce3-ebf9669359e3", + "color": "#ffffff" + }, + { + "_$id": "zu1c4o9d", + "_$type": "Image", + "name": "Congratulations!", + "y": 168, + "width": 984, + "height": 198, + "skin": "res://2c16b5f4-49d5-4203-8099-b285426e740e", + "useSourceSize": true, + "color": "#ffffff" + }, + { + "_$id": "n4jhcwy7", + "_$type": "VBox", + "name": "summary", + "x": 92, + "y": 436, + "width": 800, + "height": 300, + "centerX": 0, + "space": 0, + "_$child": [ + { + "_$id": "5v1rewp1", + "_$type": "Box", + "name": "Box(1)", + "width": 800, + "height": 100, + "_$child": [ + { + "_$id": "n0405r5h", + "_$type": "Label", + "name": "Label", + "width": 400, + "height": 100, + "text": "Difficulty ", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 42, + "color": "rgba(123, 129, 140, 1)", + "valign": "middle" + }, + { + "_$id": "sli8jsxk", + "_$type": "Label", + "name": "label_difficulty", + "x": 400, + "width": 400, + "height": 100, + "text": "Medium", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(45, 49, 56, 1)", + "align": "right", + "valign": "middle" + } + ] + }, + { + "_$id": "hl0nuqjf", + "_$type": "Box", + "name": "Box(2)", + "y": 100, + "width": 800, + "height": 100, + "_$child": [ + { + "_$id": "3uexs4fv", + "_$type": "Label", + "name": "Label", + "width": 400, + "height": 100, + "text": "Time", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 42, + "color": "rgba(123, 129, 140, 1)", + "valign": "middle" + }, + { + "_$id": "dow6r2on", + "_$type": "Label", + "name": "label_time", + "x": 400, + "width": 400, + "height": 100, + "text": "Medium", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(45, 49, 56, 1)", + "align": "right", + "valign": "middle" + } + ] + }, + { + "_$id": "gah5zxck", + "_$type": "Box", + "name": "Box(3)", + "y": 200, + "width": 800, + "height": 100, + "_$child": [ + { + "_$id": "pcgpep0a", + "_$type": "Label", + "name": "Label", + "width": 400, + "height": 100, + "text": "Score", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 42, + "color": "rgba(123, 129, 140, 1)", + "valign": "middle" + }, + { + "_$id": "rby8odj3", + "_$type": "Label", + "name": "label_score", + "x": 400, + "width": 400, + "height": 100, + "text": "Medium", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(45, 49, 56, 1)", + "align": "right", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "sgdupfi6", + "_$type": "Box", + "name": "bottom", + "y": 1408, + "width": 1080, + "height": 492, + "left": 0, + "right": 0, + "bottom": 20, + "_$child": [ + { + "_$id": "cx166wex", + "_$type": "Box", + "name": "btn_new", + "x": 144, + "y": 48, + "width": 792, + "height": 156, + "visible": false, + "bottom": 288, + "centerX": 0, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "1u08wblh", + "_$type": "Sprite", + "name": "sdw", + "width": 792, + "height": 156, + "alpha": 0.2, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 4, + "blur": 8, + "color": "#1d5cdc" + } + ] + }, + { + "_$id": "ptmwi7hz", + "_$type": "Sprite", + "name": "Sprite", + "width": 792, + "height": 156, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + }, + { + "_$id": "i3nbedy8", + "_$type": "Label", + "name": "Label", + "width": 792, + "height": 156, + "centerX": 0, + "centerY": 0, + "text": "New Game", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 60, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "nx1uwslc", + "_$type": "Box", + "name": "btn_home", + "x": 144, + "y": 240, + "width": 792, + "height": 156, + "visible": false, + "bottom": 96, + "centerX": 0, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "3w8f77oi", + "_$type": "Sprite", + "name": "Sprite", + "width": 792, + "height": 156, + "alpha": 0.1, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + }, + { + "_$id": "fa1b8iws", + "_$type": "Label", + "name": "Label", + "width": 792, + "height": 156, + "centerX": 0, + "centerY": 0, + "text": "Home", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 60, + "color": "rgba(29, 92, 220, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "lcg77a5s", + "_$type": "Box", + "name": "btn_continue", + "x": 144, + "y": 240, + "width": 792, + "height": 156, + "bottom": 96, + "centerX": 0, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "xp9pckyf", + "_$type": "Sprite", + "name": "sdw", + "width": 792, + "height": 156, + "alpha": 0.2, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 4, + "blur": 8, + "color": "#1d5cdc" + } + ] + }, + { + "_$id": "y3odek2w", + "_$type": "Sprite", + "name": "Sprite", + "width": 792, + "height": 156, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + }, + { + "_$id": "9pg31c52", + "_$type": "Label", + "name": "Label", + "width": 792, + "height": 156, + "centerX": 0, + "centerY": 0, + "text": "Continue", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 60, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/shudu/assets/resources/GameDone_DC.lh.meta b/shudu/assets/resources/GameDone_DC.lh.meta new file mode 100644 index 0000000..629f124 --- /dev/null +++ b/shudu/assets/resources/GameDone_DC.lh.meta @@ -0,0 +1,3 @@ +{ + "uuid": "18363839-8852-491c-b2d9-c5d38f30e1b3" +} \ No newline at end of file diff --git a/shudu/assets/resources/GameDone_DC_H.lh b/shudu/assets/resources/GameDone_DC_H.lh new file mode 100644 index 0000000..2bde6fd --- /dev/null +++ b/shudu/assets/resources/GameDone_DC_H.lh @@ -0,0 +1,582 @@ +{ + "_$ver": 1, + "_$id": "fxmpuoug", + "_$type": "Box", + "name": "GameDone_DC_H", + "width": 1080, + "height": 1920, + "_mouseState": 2, + "drawCallOptimize": true, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "_$comp": [ + { + "_$type": "13e020d1-5ab8-4082-80ca-c0d208342103", + "scriptPath": "../src/views/GameDone.ts", + "bg": { + "_$ref": "qsfvdnby" + }, + "obj_light": { + "_$ref": "21h6okrs" + }, + "obj_top": { + "_$ref": "qckc4n2a" + }, + "obj_panel": { + "_$ref": "5u982vt1" + }, + "star1": { + "_$ref": "drl27n5v" + }, + "star2": { + "_$ref": "92i5b9b6" + }, + "star3": { + "_$ref": "qq8zxqnu" + }, + "star4": { + "_$ref": "r3vdvcfa" + }, + "label_diffucuty": { + "_$ref": "t56jxo0a" + }, + "label_time": { + "_$ref": "v0a6pgjh" + }, + "label_score": { + "_$ref": "sjgiel5s" + }, + "btn_new": { + "_$ref": "pezhhu4s" + }, + "btn_home": { + "_$ref": "b4zctay8" + }, + "btn_continue": { + "_$ref": "txe3oxe8" + } + } + ], + "_$child": [ + { + "_$id": "qsfvdnby", + "_$type": "Image", + "name": "bg_done", + "width": 1080, + "height": 1920, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "skin": "res://07b90718-84ee-4924-9098-8f0ee3663d92", + "color": "#ffffff" + }, + { + "_$id": "ksvwr0iw", + "_$type": "Box", + "name": "center", + "x": -420, + "y": 420, + "width": 1920, + "height": 1080, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "5u982vt1", + "_$type": "Box", + "name": "left", + "x": 618, + "y": 523, + "width": 948, + "height": 786, + "anchorX": 0.5, + "anchorY": 0.5, + "left": 144, + "top": 130, + "_$child": [ + { + "_$id": "21h6okrs", + "_$type": "Image", + "name": "light", + "x": 474, + "y": 143, + "width": 924, + "height": 924, + "anchorX": 0.5, + "anchorY": 0.5, + "scaleX": 3, + "scaleY": 3, + "alpha": 0.2, + "centerX": 0, + "skin": "res://ebbaa034-8dd8-4fb8-abd5-094cdd76f93a", + "color": "#ffffff", + "_$comp": [ + { + "_$type": "b4f67ca3-86fe-409d-a439-63a715243fb7", + "scriptPath": "../src/views/common/AutoRotate.ts", + "speed": 0.2 + } + ] + }, + { + "_$id": "qckc4n2a", + "_$type": "Image", + "name": "bg", + "y": 152, + "width": 948, + "height": 135, + "top": 152, + "skin": "res://14316514-e8bf-4d32-bf9c-ba375ea24798", + "color": "#ffffff", + "_$child": [ + { + "_$id": "oq7zp44e", + "_$type": "Sprite", + "name": "Sprite", + "y": 135, + "width": 948, + "height": 498, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 0, + "rt": 0, + "lb": 54, + "rb": 54, + "lineWidth": 1, + "fillColor": "rgba(250, 251, 253, 1)" + } + ] + }, + { + "_$id": "mspovqw2", + "_$type": "Sprite", + "name": "Sprite(1)", + "x": 36, + "y": 298, + "width": 876, + "height": 280, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(245, 247, 251, 1)" + } + ] + } + ] + }, + { + "_$id": "3u4pa40h", + "_$type": "Box", + "name": "stars", + "y": 28, + "width": 948, + "height": 300, + "visible": false, + "centerX": 0, + "_$child": [ + { + "_$id": "drl27n5v", + "_$type": "Image", + "name": "check(1)", + "x": 190, + "y": 33, + "width": 190, + "height": 190, + "skin": "res://902e1f3a-6f95-4796-8449-974ae5354d72", + "color": "#ffffff" + }, + { + "_$id": "92i5b9b6", + "_$type": "Image", + "name": "check(2)", + "x": 361, + "width": 226, + "height": 226, + "centerX": 0, + "skin": "res://902e1f3a-6f95-4796-8449-974ae5354d72", + "color": "#ffffff" + }, + { + "_$id": "qq8zxqnu", + "_$type": "Image", + "name": "check(3)", + "x": 630, + "y": -8, + "width": 190, + "height": 190, + "rotation": 28, + "skin": "res://902e1f3a-6f95-4796-8449-974ae5354d72", + "color": "#ffffff" + } + ] + }, + { + "_$id": "r3vdvcfa", + "_$type": "Image", + "name": "star", + "x": 354, + "y": 20, + "width": 240, + "height": 240, + "centerX": 0, + "skin": "res://c5e80bd0-632f-4460-bce3-ebf9669359e3", + "color": "#ffffff" + }, + { + "_$id": "a71gwu9f", + "_$type": "Label", + "name": "Label", + "y": 288, + "width": 948, + "height": 150, + "centerX": 0, + "centerY": -30, + "text": "Congratulations!", + "font": "res://3f79306d-f490-4a54-a4f3-26cb51d56a12", + "fontSize": 64, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "b4jktp33", + "_$type": "VBox", + "name": "summary", + "x": 36, + "y": 475, + "width": 876, + "height": 280, + "centerX": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "u71p7b61", + "_$type": "Box", + "name": "Box(1)", + "width": 876, + "height": 80, + "_$child": [ + { + "_$id": "nfqfex9l", + "_$type": "Label", + "name": "Label", + "x": 100, + "width": 400, + "height": 80, + "text": "Difficulty ", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(123, 129, 140, 1)", + "valign": "middle" + }, + { + "_$id": "t56jxo0a", + "_$type": "Label", + "name": "label_difficulty", + "x": 376, + "width": 400, + "height": 80, + "right": 100, + "text": "Medium", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 36, + "color": "rgba(45, 49, 56, 1)", + "align": "right", + "valign": "middle" + } + ] + }, + { + "_$id": "smnoyskq", + "_$type": "Box", + "name": "Box(2)", + "y": 80, + "width": 876, + "height": 80, + "_$child": [ + { + "_$id": "utszg27d", + "_$type": "Label", + "name": "Label", + "x": 100, + "width": 400, + "height": 80, + "text": "Time", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(123, 129, 140, 1)", + "valign": "middle" + }, + { + "_$id": "v0a6pgjh", + "_$type": "Label", + "name": "label_time", + "x": 376, + "width": 400, + "height": 80, + "right": 100, + "text": "Medium", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 36, + "color": "rgba(45, 49, 56, 1)", + "align": "right", + "valign": "middle" + } + ] + }, + { + "_$id": "yfk8zxhb", + "_$type": "Box", + "name": "Box(3)", + "y": 160, + "width": 876, + "height": 80, + "_$child": [ + { + "_$id": "nwe3p9mt", + "_$type": "Label", + "name": "Label", + "x": 100, + "width": 400, + "height": 80, + "text": "Score", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(123, 129, 140, 1)", + "valign": "middle" + }, + { + "_$id": "sjgiel5s", + "_$type": "Label", + "name": "label_score", + "x": 376, + "width": 400, + "height": 80, + "right": 100, + "text": "Medium", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 36, + "color": "rgba(45, 49, 56, 1)", + "align": "right", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "4zdn7245", + "_$type": "Box", + "name": "bottom", + "x": 1236, + "width": 540, + "height": 1080, + "right": 144, + "top": 0, + "bottom": 0, + "_$child": [ + { + "_$id": "pezhhu4s", + "_$type": "Box", + "name": "btn_new", + "y": 510, + "width": 540, + "height": 156, + "visible": false, + "top": 510, + "centerX": 0, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "z6im7ids", + "_$type": "Sprite", + "name": "Sprite", + "width": 540, + "height": 156, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + }, + { + "_$id": "ikcrof2c", + "_$type": "Label", + "name": "Label", + "width": 540, + "height": 156, + "centerX": 0, + "centerY": 0, + "text": "New Game", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 60, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "b4zctay8", + "_$type": "Box", + "name": "btn_home", + "y": 558, + "width": 540, + "height": 156, + "visible": false, + "top": 558, + "centerX": 0, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "sn58intc", + "_$type": "Sprite", + "name": "Sprite", + "width": 540, + "height": 156, + "alpha": 0.1, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + }, + { + "_$id": "sfasmed5", + "_$type": "Label", + "name": "Label", + "width": 540, + "height": 156, + "centerX": 0, + "centerY": 0, + "text": "Home", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 60, + "color": "rgba(29, 92, 220, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "txe3oxe8", + "_$type": "Box", + "name": "btn_continue", + "y": 510, + "width": 540, + "height": 156, + "top": 510, + "centerX": 0, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "ha0bnnw3", + "_$type": "Sprite", + "name": "sdw", + "width": 540, + "height": 156, + "alpha": 0.2, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 4, + "blur": 8, + "color": "#1d5cdc" + } + ] + }, + { + "_$id": "usa1t482", + "_$type": "Sprite", + "name": "Sprite", + "width": 540, + "height": 156, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + }, + { + "_$id": "x8cbcheh", + "_$type": "Label", + "name": "Label", + "width": 540, + "height": 156, + "centerX": 0, + "centerY": 0, + "text": "Continue", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 60, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/shudu/assets/resources/GameDone_DC_H.lh.meta b/shudu/assets/resources/GameDone_DC_H.lh.meta new file mode 100644 index 0000000..335a767 --- /dev/null +++ b/shudu/assets/resources/GameDone_DC_H.lh.meta @@ -0,0 +1,3 @@ +{ + "uuid": "50026521-d7d6-4a86-b282-21e9ee3b2a04" +} \ No newline at end of file diff --git a/shudu/assets/resources/GameDone_Normal.lh b/shudu/assets/resources/GameDone_Normal.lh new file mode 100644 index 0000000..d25000d --- /dev/null +++ b/shudu/assets/resources/GameDone_Normal.lh @@ -0,0 +1,592 @@ +{ + "_$ver": 1, + "_$id": "hoxxnmyk", + "_$type": "Box", + "name": "GameDone_Normal", + "width": 1080, + "height": 1920, + "_mouseState": 2, + "drawCallOptimize": true, + "left": 0, + "right": 0, + "_$comp": [ + { + "_$type": "13e020d1-5ab8-4082-80ca-c0d208342103", + "scriptPath": "../src/views/GameDone.ts", + "bg": { + "_$ref": "9omycrdv" + }, + "obj_light": { + "_$ref": "8sgjzety" + }, + "obj_top": { + "_$ref": "hm9tgyxm" + }, + "obj_panel": { + "_$ref": "kpsallku" + }, + "star1": { + "_$ref": "c911dc1t" + }, + "star2": { + "_$ref": "7m6pwbe2" + }, + "star3": { + "_$ref": "svxs9o8h" + }, + "star4": { + "_$ref": "08ict2h8" + }, + "img_title": { + "_$ref": "v49hsu2v" + }, + "label_diffucuty": { + "_$ref": "mdvetv8w" + }, + "label_time": { + "_$ref": "m58npz18" + }, + "label_score": { + "_$ref": "ehpkcr9o" + }, + "btn_new": { + "_$ref": "iamtc0bw" + }, + "btn_home": { + "_$ref": "v0482f5q" + }, + "btn_continue": { + "_$ref": "qg9k7yph" + } + } + ], + "_$child": [ + { + "_$id": "9omycrdv", + "_$type": "Image", + "name": "bg_done", + "width": 1080, + "height": 1920, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "skin": "res://2b008659-862a-4155-b094-ee87ba692be1", + "color": "#ffffff" + }, + { + "_$id": "kpsallku", + "_$type": "Box", + "name": "top", + "x": 48, + "y": 390, + "width": 984, + "height": 846, + "centerX": 0, + "_$child": [ + { + "_$id": "8sgjzety", + "_$type": "Image", + "name": "light", + "x": 492, + "y": 78, + "width": 924, + "height": 924, + "anchorX": 0.5, + "anchorY": 0.5, + "scaleX": 3, + "scaleY": 3, + "alpha": 0.2, + "centerX": 0, + "skin": "res://ebbaa034-8dd8-4fb8-abd5-094cdd76f93a", + "color": "#ffffff", + "_$comp": [ + { + "_$type": "b4f67ca3-86fe-409d-a439-63a715243fb7", + "scriptPath": "../src/views/common/AutoRotate.ts", + "speed": 0.2 + } + ] + }, + { + "_$id": "hm9tgyxm", + "_$type": "Image", + "name": "bg", + "width": 984, + "height": 180, + "skin": "res://14316514-e8bf-4d32-bf9c-ba375ea24798", + "color": "#ffffff", + "_$child": [ + { + "_$id": "jn1frxzv", + "_$type": "Sprite", + "name": "Sprite", + "y": 180, + "width": 984, + "height": 666, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 0, + "rt": 0, + "lb": 48, + "rb": 48, + "lineWidth": 1, + "fillColor": "rgba(250, 251, 253, 1)" + } + ] + }, + { + "_$id": "wtf5sc1b", + "_$type": "Sprite", + "name": "Sprite(1)", + "x": 44, + "y": 400, + "width": 888, + "height": 372, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 48, + "rt": 48, + "lb": 48, + "rb": 48, + "lineWidth": 1, + "fillColor": "rgba(245, 247, 251, 1)" + } + ] + } + ] + }, + { + "_$id": "c0d4puxi", + "_$type": "Box", + "name": "stars", + "y": -142, + "width": 984, + "height": 300, + "centerX": 0, + "_$child": [ + { + "_$id": "c911dc1t", + "_$type": "Image", + "name": "check(1)", + "x": 217, + "y": 188, + "width": 252, + "height": 252, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -15, + "skin": "res://902e1f3a-6f95-4796-8449-974ae5354d72", + "color": "#ffffff" + }, + { + "_$id": "7m6pwbe2", + "_$type": "Image", + "name": "check(2)", + "x": 339, + "width": 306, + "height": 307, + "centerX": 0, + "skin": "res://902e1f3a-6f95-4796-8449-974ae5354d72", + "useSourceSize": true, + "color": "#ffffff" + }, + { + "_$id": "svxs9o8h", + "_$type": "Image", + "name": "check(3)", + "x": 759, + "y": 189, + "width": 252, + "height": 252, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": 15, + "skin": "res://902e1f3a-6f95-4796-8449-974ae5354d72", + "color": "#ffffff" + } + ] + }, + { + "_$id": "08ict2h8", + "_$type": "Image", + "name": "star", + "x": 330, + "y": -160, + "width": 108, + "height": 108, + "scaleX": 3, + "scaleY": 3, + "visible": false, + "centerX": 0, + "skin": "res://c5e80bd0-632f-4460-bce3-ebf9669359e3", + "color": "#ffffff" + }, + { + "_$id": "v49hsu2v", + "_$type": "Image", + "name": "Congratulations!", + "y": 166, + "width": 984, + "height": 198, + "skin": "res://2c16b5f4-49d5-4203-8099-b285426e740e", + "useSourceSize": true, + "color": "#ffffff" + }, + { + "_$id": "b4ajczjh", + "_$type": "VBox", + "name": "summary", + "x": 92, + "y": 436, + "width": 800, + "height": 300, + "centerX": 0, + "space": 0, + "_$child": [ + { + "_$id": "3qkj5yqe", + "_$type": "Box", + "name": "Box(1)", + "width": 800, + "height": 100, + "_$child": [ + { + "_$id": "710awfoj", + "_$type": "Label", + "name": "Label", + "width": 400, + "height": 100, + "text": "Difficulty ", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 42, + "color": "rgba(123, 129, 140, 1)", + "valign": "middle" + }, + { + "_$id": "mdvetv8w", + "_$type": "Label", + "name": "label_difficulty", + "x": 400, + "width": 400, + "height": 100, + "text": "Medium", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(45, 49, 56, 1)", + "align": "right", + "valign": "middle" + } + ] + }, + { + "_$id": "1uy3yxmb", + "_$type": "Box", + "name": "Box(2)", + "y": 100, + "width": 800, + "height": 100, + "_$child": [ + { + "_$id": "1elmylvy", + "_$type": "Label", + "name": "Label", + "width": 400, + "height": 100, + "text": "Time", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 42, + "color": "rgba(123, 129, 140, 1)", + "valign": "middle" + }, + { + "_$id": "m58npz18", + "_$type": "Label", + "name": "label_time", + "x": 400, + "width": 400, + "height": 100, + "text": "Medium", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(45, 49, 56, 1)", + "align": "right", + "valign": "middle" + } + ] + }, + { + "_$id": "0uq4p6hn", + "_$type": "Box", + "name": "Box(3)", + "y": 200, + "width": 800, + "height": 100, + "_$child": [ + { + "_$id": "wxyzvkry", + "_$type": "Label", + "name": "Label", + "width": 400, + "height": 100, + "text": "Score", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 42, + "color": "rgba(123, 129, 140, 1)", + "valign": "middle" + }, + { + "_$id": "ehpkcr9o", + "_$type": "Label", + "name": "label_score", + "x": 400, + "width": 400, + "height": 100, + "text": "Medium", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(45, 49, 56, 1)", + "align": "right", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "xuh25cg6", + "_$type": "Box", + "name": "bottom", + "y": 1408, + "width": 1080, + "height": 492, + "left": 0, + "right": 0, + "bottom": 20, + "_$child": [ + { + "_$id": "iamtc0bw", + "_$type": "Box", + "name": "btn_new", + "x": 144, + "y": 240, + "width": 792, + "height": 156, + "bottom": 96, + "centerX": 0, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "cjz57pl8", + "_$type": "Sprite", + "name": "sdw", + "width": 792, + "height": 156, + "alpha": 0.2, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 4, + "blur": 8, + "color": "#1d5cdc" + } + ] + }, + { + "_$id": "9sx9tjpd", + "_$type": "Sprite", + "name": "Sprite", + "width": 792, + "height": 156, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + }, + { + "_$id": "ja6hq7t3", + "_$type": "Label", + "name": "Label", + "width": 792, + "height": 156, + "centerX": 0, + "centerY": 0, + "text": "New Game", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 60, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "v0482f5q", + "_$type": "Box", + "name": "btn_home", + "x": 144, + "y": 240, + "width": 792, + "height": 156, + "visible": false, + "bottom": 96, + "centerX": 0, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "kq8dx0a5", + "_$type": "Sprite", + "name": "Sprite", + "width": 792, + "height": 156, + "alpha": 0.1, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + }, + { + "_$id": "udsrjywv", + "_$type": "Label", + "name": "Label", + "width": 792, + "height": 156, + "centerX": 0, + "centerY": 0, + "text": "Home", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 60, + "color": "rgba(29, 92, 220, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qg9k7yph", + "_$type": "Box", + "name": "btn_continue", + "x": 144, + "y": 240, + "width": 792, + "height": 156, + "visible": false, + "bottom": 96, + "centerX": 0, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "hx99e87i", + "_$type": "Sprite", + "name": "sdw", + "width": 792, + "height": 156, + "alpha": 0.2, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 4, + "blur": 8, + "color": "#1d5cdc" + } + ] + }, + { + "_$id": "rad99t4v", + "_$type": "Sprite", + "name": "Sprite", + "width": 792, + "height": 156, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + }, + { + "_$id": "ts6fsnbx", + "_$type": "Label", + "name": "Label", + "width": 792, + "height": 156, + "centerX": 0, + "centerY": 0, + "text": "Continue", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 60, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/shudu/assets/resources/GameDone_Normal.lh.meta b/shudu/assets/resources/GameDone_Normal.lh.meta new file mode 100644 index 0000000..54399ac --- /dev/null +++ b/shudu/assets/resources/GameDone_Normal.lh.meta @@ -0,0 +1,3 @@ +{ + "uuid": "55e1fe3f-9916-4b74-9952-7bede46b21ba" +} \ No newline at end of file diff --git a/shudu/assets/resources/GameDone_Normal_H.lh b/shudu/assets/resources/GameDone_Normal_H.lh new file mode 100644 index 0000000..4fee260 --- /dev/null +++ b/shudu/assets/resources/GameDone_Normal_H.lh @@ -0,0 +1,590 @@ +{ + "_$ver": 1, + "_$id": "mydj8ynl", + "_$type": "Box", + "name": "GameDone_Normal_H", + "width": 1080, + "height": 1920, + "_mouseState": 2, + "drawCallOptimize": true, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "_$comp": [ + { + "_$type": "13e020d1-5ab8-4082-80ca-c0d208342103", + "scriptPath": "../src/views/GameDone.ts", + "bg": { + "_$ref": "cofbpy83" + }, + "obj_light": { + "_$ref": "3t9mq776" + }, + "obj_top": { + "_$ref": "bj4g8sfa" + }, + "obj_panel": { + "_$ref": "80l6yqgl" + }, + "star1": { + "_$ref": "dy7essc0" + }, + "star2": { + "_$ref": "zyknbizk" + }, + "star3": { + "_$ref": "51j0ljjv" + }, + "star4": { + "_$ref": "0g7sbrhd" + }, + "label_diffucuty": { + "_$ref": "291hwgvn" + }, + "label_time": { + "_$ref": "656grx7b" + }, + "label_score": { + "_$ref": "6upkkpwf" + }, + "btn_new": { + "_$ref": "hgpxx02g" + }, + "btn_home": { + "_$ref": "it1c7c3x" + }, + "btn_continue": { + "_$ref": "wnp5was8" + } + } + ], + "_$child": [ + { + "_$id": "cofbpy83", + "_$type": "Image", + "name": "bg_done", + "width": 1080, + "height": 1920, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "skin": "res://2b008659-862a-4155-b094-ee87ba692be1", + "color": "#ffffff" + }, + { + "_$id": "bhko8e4w", + "_$type": "Box", + "name": "center", + "x": -420, + "y": 420, + "width": 1920, + "height": 1080, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "80l6yqgl", + "_$type": "Box", + "name": "left", + "x": 618, + "y": 523, + "width": 948, + "height": 786, + "anchorX": 0.5, + "anchorY": 0.5, + "left": 144, + "top": 130, + "_$child": [ + { + "_$id": "3t9mq776", + "_$type": "Image", + "name": "light", + "x": 474, + "y": 143, + "width": 924, + "height": 924, + "anchorX": 0.5, + "anchorY": 0.5, + "scaleX": 3, + "scaleY": 3, + "alpha": 0.2, + "centerX": 0, + "skin": "res://ebbaa034-8dd8-4fb8-abd5-094cdd76f93a", + "color": "#ffffff", + "_$comp": [ + { + "_$type": "b4f67ca3-86fe-409d-a439-63a715243fb7", + "scriptPath": "../src/views/common/AutoRotate.ts", + "speed": 0.2 + } + ] + }, + { + "_$id": "bj4g8sfa", + "_$type": "Image", + "name": "bg", + "y": 152, + "width": 948, + "height": 135, + "top": 152, + "skin": "res://14316514-e8bf-4d32-bf9c-ba375ea24798", + "color": "#ffffff", + "_$child": [ + { + "_$id": "icjk9zm3", + "_$type": "Sprite", + "name": "Sprite", + "y": 135, + "width": 948, + "height": 498, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 0, + "rt": 0, + "lb": 54, + "rb": 54, + "lineWidth": 1, + "fillColor": "rgba(250, 251, 253, 1)" + } + ] + }, + { + "_$id": "nsr1mvtb", + "_$type": "Sprite", + "name": "Sprite(1)", + "x": 36, + "y": 298, + "width": 876, + "height": 280, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(245, 247, 251, 1)" + } + ] + } + ] + }, + { + "_$id": "yt8pnsra", + "_$type": "Box", + "name": "stars", + "x": 154, + "y": 25, + "width": 640, + "height": 260, + "centerX": 0, + "_$child": [ + { + "_$id": "dy7essc0", + "_$type": "Image", + "name": "check(1)", + "x": 108, + "y": 152, + "width": 190, + "height": 190, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -15, + "skin": "res://902e1f3a-6f95-4796-8449-974ae5354d72", + "color": "#ffffff" + }, + { + "_$id": "zyknbizk", + "_$type": "Image", + "name": "check(2)", + "x": 206, + "y": 14, + "width": 228, + "height": 228, + "centerX": 0, + "skin": "res://902e1f3a-6f95-4796-8449-974ae5354d72", + "color": "#ffffff" + }, + { + "_$id": "51j0ljjv", + "_$type": "Image", + "name": "check(3)", + "x": 529, + "y": 157, + "width": 190, + "height": 190, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": 15, + "skin": "res://902e1f3a-6f95-4796-8449-974ae5354d72", + "color": "#ffffff" + } + ] + }, + { + "_$id": "0g7sbrhd", + "_$type": "Image", + "name": "star", + "x": 312, + "y": -160, + "width": 108, + "height": 108, + "scaleX": 3, + "scaleY": 3, + "visible": false, + "centerX": 0, + "skin": "res://c5e80bd0-632f-4460-bce3-ebf9669359e3", + "color": "#ffffff" + }, + { + "_$id": "t4lo6wcj", + "_$type": "Label", + "name": "Label", + "y": 288, + "width": 948, + "height": 150, + "centerX": 0, + "centerY": -30, + "text": "Congratulations!", + "font": "res://3f79306d-f490-4a54-a4f3-26cb51d56a12", + "fontSize": 64, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "nv7eszk1", + "_$type": "VBox", + "name": "summary", + "x": 36, + "y": 475, + "width": 876, + "height": 280, + "centerX": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "7oa0nz8y", + "_$type": "Box", + "name": "Box(1)", + "width": 876, + "height": 80, + "_$child": [ + { + "_$id": "phpj9rno", + "_$type": "Label", + "name": "Label", + "x": 100, + "width": 400, + "height": 80, + "text": "Difficulty ", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(123, 129, 140, 1)", + "valign": "middle" + }, + { + "_$id": "291hwgvn", + "_$type": "Label", + "name": "label_difficulty", + "x": 376, + "width": 400, + "height": 80, + "right": 100, + "text": "Medium", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 36, + "color": "rgba(45, 49, 56, 1)", + "align": "right", + "valign": "middle" + } + ] + }, + { + "_$id": "e6aitv6a", + "_$type": "Box", + "name": "Box(2)", + "y": 80, + "width": 876, + "height": 80, + "_$child": [ + { + "_$id": "xmjk7stg", + "_$type": "Label", + "name": "Label", + "x": 100, + "width": 400, + "height": 80, + "text": "Time", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(123, 129, 140, 1)", + "valign": "middle" + }, + { + "_$id": "656grx7b", + "_$type": "Label", + "name": "label_time", + "x": 376, + "width": 400, + "height": 80, + "right": 100, + "text": "Medium", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 36, + "color": "rgba(45, 49, 56, 1)", + "align": "right", + "valign": "middle" + } + ] + }, + { + "_$id": "iwttmqpl", + "_$type": "Box", + "name": "Box(3)", + "y": 160, + "width": 876, + "height": 80, + "_$child": [ + { + "_$id": "zy5w77m2", + "_$type": "Label", + "name": "Label", + "x": 100, + "width": 400, + "height": 80, + "text": "Score", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(123, 129, 140, 1)", + "valign": "middle" + }, + { + "_$id": "6upkkpwf", + "_$type": "Label", + "name": "label_score", + "x": 376, + "width": 400, + "height": 80, + "right": 100, + "text": "Medium", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 36, + "color": "rgba(45, 49, 56, 1)", + "align": "right", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "a83hr2ln", + "_$type": "Box", + "name": "bottom", + "x": 1236, + "width": 540, + "height": 1080, + "right": 144, + "top": 0, + "bottom": 0, + "_$child": [ + { + "_$id": "hgpxx02g", + "_$type": "Box", + "name": "btn_new", + "y": 510, + "width": 540, + "height": 156, + "top": 510, + "centerX": 0, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "htuedfhr", + "_$type": "Sprite", + "name": "Sprite_1", + "width": 540, + "height": 156, + "alpha": 0.2, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 4, + "blur": 8, + "color": "#1d5cdc" + } + ] + }, + { + "_$id": "n7fabj30", + "_$type": "Sprite", + "name": "Sprite", + "width": 540, + "height": 156, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + }, + { + "_$id": "ju3t57bd", + "_$type": "Label", + "name": "Label", + "width": 540, + "height": 156, + "centerX": 0, + "centerY": 0, + "text": "New Game", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 60, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "it1c7c3x", + "_$type": "Box", + "name": "btn_home", + "y": 510, + "width": 540, + "height": 156, + "visible": false, + "top": 510, + "centerX": 0, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "s93f5gz9", + "_$type": "Sprite", + "name": "Sprite", + "width": 540, + "height": 156, + "alpha": 0.1, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + }, + { + "_$id": "rgqm7pit", + "_$type": "Label", + "name": "Label", + "width": 540, + "height": 156, + "centerX": 0, + "centerY": 0, + "text": "Home", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 60, + "color": "rgba(29, 92, 220, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "wnp5was8", + "_$type": "Box", + "name": "btn_continue", + "y": 264, + "width": 540, + "height": 156, + "visible": false, + "centerX": 0, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "fftedkj5", + "_$type": "Sprite", + "name": "Sprite", + "width": 540, + "height": 156, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + }, + { + "_$id": "je1bffa3", + "_$type": "Label", + "name": "Label", + "width": 540, + "height": 156, + "centerX": 0, + "centerY": 0, + "text": "Continue", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 60, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/shudu/assets/resources/GameDone_Normal_H.lh.meta b/shudu/assets/resources/GameDone_Normal_H.lh.meta new file mode 100644 index 0000000..61b71db --- /dev/null +++ b/shudu/assets/resources/GameDone_Normal_H.lh.meta @@ -0,0 +1,3 @@ +{ + "uuid": "96cc1c81-4971-407b-9911-f89670bf1598" +} \ No newline at end of file diff --git a/shudu/assets/resources/GameOver.lh b/shudu/assets/resources/GameOver.lh new file mode 100644 index 0000000..0277391 --- /dev/null +++ b/shudu/assets/resources/GameOver.lh @@ -0,0 +1,379 @@ +{ + "_$ver": 1, + "_$id": "w805s9t9", + "_$type": "Box", + "name": "GameOver", + "width": 1080, + "height": 1920, + "_mouseState": 2, + "drawCallOptimize": true, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "_$comp": [ + { + "_$type": "72a5ccd3-8177-451c-b2ce-cf1b42f7e6d4", + "scriptPath": "../src/views/GameOver.ts", + "btn_second": { + "_$ref": "xxbk8zbl" + }, + "btn_restart": { + "_$ref": "g47r0en7" + }, + "btn_newOrClose": { + "_$ref": "umnahawk" + }, + "label_newOrClose": { + "_$ref": "2r6iotpo" + } + } + ], + "_$child": [ + { + "_$id": "unwnutvo", + "_$type": "Image", + "name": "Image", + "x": -100, + "y": -100, + "width": 1280, + "height": 2120, + "alpha": 0.6, + "left": -100, + "right": -100, + "top": -100, + "bottom": -100, + "skin": "res://a98f334e-ce04-4cd0-8fc5-bbdf9b048609", + "color": "#000000" + }, + { + "_$id": "0a0ovv4z", + "_$type": "Box", + "name": "center", + "x": 540, + "y": 960, + "width": 888, + "height": 1080, + "anchorX": 0.5, + "anchorY": 0.5, + "_mouseState": 2, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "xs71kk61", + "_$type": "Sprite", + "name": "Sprite", + "width": 888, + "height": 1080, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 48, + "rt": 48, + "lb": 48, + "rb": 48, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + }, + { + "_$id": "xz2d429f", + "_$type": "VBox", + "name": "buttons", + "x": 72, + "y": 456, + "width": 744, + "height": 600, + "centerX": 0, + "centerY": 216, + "space": 40, + "align": "center", + "_$child": [ + { + "_$id": "xxbk8zbl", + "_$type": "Box", + "name": "btn_second", + "width": 744, + "height": 156, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "8j8gwvte", + "_$type": "Sprite", + "name": "sdw", + "width": 744, + "height": 156, + "alpha": 0.2, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 4, + "blur": 8, + "color": "#1d5cdc" + } + ] + }, + { + "_$id": "0w6x8zzw", + "_$type": "Sprite", + "name": "Sprite", + "width": 744, + "height": 156, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + }, + { + "_$id": "phyezjdt", + "_$type": "HBox", + "name": "HBox", + "x": 100, + "y": 48, + "width": 544, + "height": 60, + "centerX": 0, + "centerY": 0, + "space": 16, + "align": "middle", + "_$child": [ + { + "_$id": "23po992p", + "_$type": "Sprite", + "name": "Sprite", + "y": 3, + "width": 60, + "height": 54, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 10, + "rt": 10, + "lb": 10, + "rb": 10, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ], + "_$child": [ + { + "_$id": "7i8eqgi1", + "_$type": "Sprite", + "name": "Sprite", + "x": 16, + "y": 13, + "width": 28, + "height": 28, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawPolyCmd", + "x": 0, + "y": 0, + "points": [ + 0, + 0, + 28, + 14, + 0, + 28 + ], + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "4fv9wmfi", + "_$type": "Label", + "name": "Label", + "x": 76, + "width": 468, + "height": 60, + "text": "Second Chance", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 60, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "g47r0en7", + "_$type": "Box", + "name": "btn_restart", + "y": 196, + "width": 744, + "height": 156, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "y7aniaui", + "_$type": "Sprite", + "name": "Sprite", + "width": 744, + "height": 156, + "alpha": 0.1, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + }, + { + "_$id": "o6codx3p", + "_$type": "Label", + "name": "Label", + "width": 744, + "height": 156, + "centerX": 0, + "centerY": 0, + "text": "Restart", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 60, + "color": "rgba(29, 92, 220, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "umnahawk", + "_$type": "Box", + "name": "btn_newOrClose", + "y": 392, + "width": 744, + "height": 156, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "eepsaznr", + "_$type": "Sprite", + "name": "Sprite", + "width": 744, + "height": 156, + "alpha": 0.1, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + }, + { + "_$id": "2r6iotpo", + "_$type": "Label", + "name": "Label", + "width": 744, + "height": 156, + "centerX": 0, + "centerY": 0, + "text": "New Game", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 60, + "color": "rgba(29, 92, 220, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "jkqju6ok", + "_$type": "Label", + "name": "Label", + "x": 76, + "y": 100, + "width": 736, + "height": 100, + "top": 100, + "centerX": 0, + "text": "Game Over", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 72, + "color": "rgba(0, 0, 0, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "39t7ygbe", + "_$type": "Label", + "name": "Label(1)", + "x": 90, + "y": 235, + "width": 709, + "height": 300, + "top": 235, + "centerX": 0, + "text": "You lost the game because you made 3 mistakes", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 54, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "wordWrap": true + } + ] + } + ] +} \ No newline at end of file diff --git a/shudu/assets/resources/GameOver.lh.meta b/shudu/assets/resources/GameOver.lh.meta new file mode 100644 index 0000000..f0dff33 --- /dev/null +++ b/shudu/assets/resources/GameOver.lh.meta @@ -0,0 +1,3 @@ +{ + "uuid": "c14a4460-1569-45a3-9ce7-f268a939cc66" +} \ No newline at end of file diff --git a/shudu/assets/resources/GameOver_H.lh b/shudu/assets/resources/GameOver_H.lh new file mode 100644 index 0000000..3150dbd --- /dev/null +++ b/shudu/assets/resources/GameOver_H.lh @@ -0,0 +1,343 @@ +{ + "_$ver": 1, + "_$id": "74k3rws3", + "_$type": "Box", + "name": "GameOver_H", + "width": 1080, + "height": 1920, + "_mouseState": 2, + "drawCallOptimize": true, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "_$comp": [ + { + "_$type": "72a5ccd3-8177-451c-b2ce-cf1b42f7e6d4", + "scriptPath": "../src/views/GameOver.ts", + "btn_second": { + "_$ref": "0mzw96e9" + }, + "btn_restart": { + "_$ref": "lceajjw5" + }, + "btn_newOrClose": { + "_$ref": "s45ffbjo" + }, + "label_newOrClose": { + "_$ref": "b03vjzma" + } + } + ], + "_$child": [ + { + "_$id": "yh6139ss", + "_$type": "Image", + "name": "Image", + "x": -100, + "y": -100, + "width": 1280, + "height": 2120, + "alpha": 0.6, + "left": -100, + "right": -100, + "top": -100, + "bottom": -100, + "skin": "res://a98f334e-ce04-4cd0-8fc5-bbdf9b048609", + "color": "#000000" + }, + { + "_$id": "ak02a9xq", + "_$type": "Box", + "name": "center", + "x": 540, + "y": 960, + "width": 960, + "height": 630, + "anchorX": 0.5, + "anchorY": 0.5, + "_mouseState": 2, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "kaqpo7v4", + "_$type": "Sprite", + "name": "Sprite", + "width": 960, + "height": 630, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + }, + { + "_$id": "gcpm74vt", + "_$type": "VBox", + "name": "buttons", + "x": 54, + "y": 304, + "width": 852, + "height": 350, + "bottom": -24, + "centerX": 0, + "space": 27, + "align": "center", + "_$child": [ + { + "_$id": "0mzw96e9", + "_$type": "Box", + "name": "btn_second", + "width": 852, + "height": 120, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "t0bs0x1y", + "_$type": "Sprite", + "name": "sdw", + "width": 852, + "height": 120, + "alpha": 0.2, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 27, + "rt": 27, + "lb": 27, + "rb": 27, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 4, + "blur": 8, + "color": "#1d5cdc" + } + ] + }, + { + "_$id": "szb9ucan", + "_$type": "Sprite", + "name": "Sprite", + "width": 852, + "height": 120, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 27, + "rt": 27, + "lb": 27, + "rb": 27, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + }, + { + "_$id": "h2i1t1ye", + "_$type": "Image", + "name": "Image", + "x": 223, + "y": 24, + "width": 72, + "height": 72, + "centerY": 0, + "skin": "res://d5c4d8ea-f4c9-4fcf-970c-8258e0f98410", + "useSourceSize": true, + "color": "#ffffff" + }, + { + "_$id": "xemd8gdj", + "_$type": "Label", + "name": "Label", + "x": 304, + "y": 36, + "width": 356, + "height": 54, + "centerY": 3, + "text": "Second Chance", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 45, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2g3rpaw7", + "_$type": "HBox", + "name": "HBox", + "y": 147, + "width": 852, + "height": 120, + "space": 28, + "align": "middle", + "_$child": [ + { + "_$id": "lceajjw5", + "_$type": "Box", + "name": "btn_restart", + "width": 412, + "height": 120, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "vhabgf62", + "_$type": "Sprite", + "name": "Sprite", + "width": 412, + "height": 120, + "alpha": 0.1, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 27, + "rt": 27, + "lb": 27, + "rb": 27, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + }, + { + "_$id": "km7828dd", + "_$type": "Label", + "name": "Label", + "x": -92, + "width": 612, + "height": 120, + "centerX": 8, + "centerY": 0, + "text": "Restart", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 45, + "color": "rgba(29, 92, 220, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "s45ffbjo", + "_$type": "Box", + "name": "btn_newOrClose", + "x": 440, + "width": 412, + "height": 120, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "qkqudbcq", + "_$type": "Sprite", + "name": "Sprite", + "width": 412, + "height": 120, + "alpha": 0.1, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 27, + "rt": 27, + "lb": 27, + "rb": 27, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + }, + { + "_$id": "b03vjzma", + "_$type": "Label", + "name": "Label", + "x": -100, + "width": 612, + "height": 120, + "centerX": 0, + "centerY": 0, + "text": "New Game", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 45, + "color": "rgba(29, 92, 220, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "jqc2ijwf", + "_$type": "Label", + "name": "Label", + "x": 180, + "y": 54, + "width": 600, + "height": 66, + "top": 54, + "centerX": 0, + "text": "Game Over", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 54, + "color": "rgba(0, 0, 0, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "oioxcne0", + "_$type": "Label", + "name": "Label(1)", + "x": 54, + "y": 150, + "width": 852, + "height": 96, + "top": 150, + "centerX": 0, + "text": "You lost the game because you made 3 mistakes", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 40, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "wordWrap": true + } + ] + } + ] +} \ No newline at end of file diff --git a/shudu/assets/resources/GameOver_H.lh.meta b/shudu/assets/resources/GameOver_H.lh.meta new file mode 100644 index 0000000..33cbfff --- /dev/null +++ b/shudu/assets/resources/GameOver_H.lh.meta @@ -0,0 +1,3 @@ +{ + "uuid": "e72b468b-983b-49d1-a4bb-3474063e26d2" +} \ No newline at end of file diff --git a/shudu/assets/resources/GamePause.lh b/shudu/assets/resources/GamePause.lh new file mode 100644 index 0000000..c39313d --- /dev/null +++ b/shudu/assets/resources/GamePause.lh @@ -0,0 +1,336 @@ +{ + "_$ver": 1, + "_$id": "2c04twx2", + "_$type": "Box", + "name": "GamePause", + "width": 1080, + "height": 1920, + "_mouseState": 2, + "drawCallOptimize": true, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "_$comp": [ + { + "_$type": "c8bf81c2-c8fd-4f25-b120-4ad620ff7b88", + "scriptPath": "../src/views/GamePause.ts", + "label_time": { + "_$ref": "lvemgoo4" + }, + "label_diffucuty": { + "_$ref": "ztc8yofh" + }, + "btn_continue": { + "_$ref": "eg30duhu" + }, + "btn_restart": { + "_$ref": "hzogezgn" + } + } + ], + "_$child": [ + { + "_$id": "vqp0nqaw", + "_$type": "Image", + "name": "Image", + "x": -100, + "y": -100, + "width": 1280, + "height": 2120, + "alpha": 0.6, + "left": -100, + "right": -100, + "top": -100, + "bottom": -100, + "skin": "res://a98f334e-ce04-4cd0-8fc5-bbdf9b048609", + "color": "#000000" + }, + { + "_$id": "cy0qcxu0", + "_$type": "Box", + "name": "center", + "x": 540, + "y": 960, + "width": 888, + "height": 906, + "anchorX": 0.5, + "anchorY": 0.5, + "_mouseState": 2, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "ybaxa7q2", + "_$type": "Sprite", + "name": "Sprite", + "width": 888, + "height": 906, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 48, + "rt": 48, + "lb": 48, + "rb": 48, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + }, + { + "_$id": "gpjobt41", + "_$type": "VBox", + "name": "buttons", + "x": 72, + "y": 478, + "width": 744, + "height": 600, + "centerX": 0, + "centerY": 325, + "space": 40, + "align": "center", + "_$child": [ + { + "_$id": "eg30duhu", + "_$type": "Box", + "name": "btn_continue", + "width": 744, + "height": 156, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "85k7b5ed", + "_$type": "Sprite", + "name": "sdw", + "width": 744, + "height": 156, + "alpha": 0.2, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 4, + "blur": 8, + "color": "#1d5cdc" + } + ] + }, + { + "_$id": "ugz9ejd0", + "_$type": "Sprite", + "name": "Sprite", + "width": 744, + "height": 156, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + }, + { + "_$id": "8v40s793", + "_$type": "Label", + "name": "Label", + "width": 744, + "height": 156, + "centerX": 0, + "centerY": 0, + "text": "Continue", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 60, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hzogezgn", + "_$type": "Box", + "name": "btn_restart", + "y": 196, + "width": 744, + "height": 156, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "lkzndo0i", + "_$type": "Sprite", + "name": "Sprite", + "width": 744, + "height": 156, + "alpha": 0.1, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + }, + { + "_$id": "urss0raj", + "_$type": "Label", + "name": "Label", + "width": 744, + "height": 156, + "centerX": 0, + "centerY": 0, + "text": "Restart", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 60, + "color": "rgba(29, 92, 220, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "hk8la5r2", + "_$type": "Label", + "name": "Label", + "x": 76, + "y": 103, + "width": 736, + "height": 100, + "centerX": 0, + "centerY": -300, + "text": "Pause", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "va1fgpv1", + "_$type": "HBox", + "name": "summary", + "x": 84, + "y": 250, + "width": 720, + "height": 140, + "centerX": 0, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "4ur3tdna", + "_$type": "Box", + "name": "Box(1)", + "y": 3, + "width": 360, + "height": 135, + "_$child": [ + { + "_$id": "10mi9wxu", + "_$type": "Label", + "name": "Label", + "width": 360, + "height": 60, + "text": "Time", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 42, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "lvemgoo4", + "_$type": "Label", + "name": "label_time", + "y": 70, + "width": 360, + "height": 72, + "text": "Medium", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 60, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "26zqj788", + "_$type": "Box", + "name": "Box(2)", + "x": 360, + "y": 3, + "width": 360, + "height": 135, + "_$child": [ + { + "_$id": "nu9nfub9", + "_$type": "Label", + "name": "Label", + "width": 360, + "height": 60, + "text": "Difficulty ", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 42, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "ztc8yofh", + "_$type": "Label", + "name": "label_difficulty", + "y": 70, + "width": 360, + "height": 72, + "text": "Medium", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 60, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/shudu/assets/resources/GamePause.lh.meta b/shudu/assets/resources/GamePause.lh.meta new file mode 100644 index 0000000..21bf240 --- /dev/null +++ b/shudu/assets/resources/GamePause.lh.meta @@ -0,0 +1,3 @@ +{ + "uuid": "b6e5dbcc-bac5-45ae-98d6-48ff60f88a29" +} \ No newline at end of file diff --git a/shudu/assets/resources/GamePause_H.lh b/shudu/assets/resources/GamePause_H.lh new file mode 100644 index 0000000..0c7e53c --- /dev/null +++ b/shudu/assets/resources/GamePause_H.lh @@ -0,0 +1,347 @@ +{ + "_$ver": 1, + "_$id": "51qgrknl", + "_$type": "Box", + "name": "GamePause_H", + "width": 1080, + "height": 1920, + "_mouseState": 2, + "drawCallOptimize": true, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "_$comp": [ + { + "_$type": "c8bf81c2-c8fd-4f25-b120-4ad620ff7b88", + "scriptPath": "../src/views/GamePause.ts", + "label_time": { + "_$ref": "2oo94fn6" + }, + "label_diffucuty": { + "_$ref": "x0g211ix" + }, + "btn_continue": { + "_$ref": "xa5cbi60" + }, + "btn_restart": { + "_$ref": "1bdygkhu" + } + } + ], + "_$child": [ + { + "_$id": "jk2cgfyw", + "_$type": "Image", + "name": "Image", + "x": -100, + "y": -100, + "width": 1280, + "height": 2120, + "alpha": 0.6, + "left": -100, + "right": -100, + "top": -100, + "bottom": -100, + "skin": "res://a98f334e-ce04-4cd0-8fc5-bbdf9b048609", + "color": "#000000" + }, + { + "_$id": "2oq6bad5", + "_$type": "Box", + "name": "center", + "x": 540, + "y": 960, + "width": 960, + "height": 522, + "anchorX": 0.5, + "anchorY": 0.5, + "_mouseState": 2, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "1lql105a", + "_$type": "Sprite", + "name": "Sprite", + "width": 960, + "height": 522, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + }, + { + "_$id": "xu85tc1o", + "_$type": "HBox", + "name": "buttons", + "x": 54, + "y": 302, + "width": 852, + "height": 210, + "bottom": 10, + "centerX": 0, + "space": 28, + "align": "middle", + "_$child": [ + { + "_$id": "1bdygkhu", + "_$type": "Box", + "name": "btn_restart", + "y": 45, + "width": 412, + "height": 120, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "i67pxiat", + "_$type": "Sprite", + "name": "Sprte", + "width": 412, + "height": 120, + "alpha": 0.1, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 27, + "rt": 27, + "lb": 27, + "rb": 27, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + }, + { + "_$id": "julmw9iu", + "_$type": "Label", + "name": "Label", + "width": 412, + "height": 120, + "centerX": 0, + "centerY": 0, + "text": "Restart", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 45, + "color": "rgba(29, 92, 220, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xa5cbi60", + "_$type": "Box", + "name": "btn_continue", + "x": 440, + "y": 45, + "width": 412, + "height": 120, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "fwoau2s3", + "_$type": "Sprite", + "name": "sdw", + "width": 412, + "height": 120, + "alpha": 0.2, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 27, + "rt": 27, + "lb": 27, + "rb": 27, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 3, + "blur": 6, + "color": "#1d5cdc" + } + ] + }, + { + "_$id": "h0pbxs4g", + "_$type": "Sprite", + "name": "Sprite", + "width": 412, + "height": 120, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 27, + "rt": 27, + "lb": 27, + "rb": 27, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + }, + { + "_$id": "64brcggk", + "_$type": "Label", + "name": "Label", + "width": 412, + "height": 120, + "centerX": 0, + "centerY": 0, + "text": "Continue", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 45, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "hjmgztax", + "_$type": "Label", + "name": "Label", + "x": 180, + "y": 54, + "width": 600, + "height": 60, + "top": 54, + "centerX": 0, + "text": "Pause", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 54, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "q0nefmnf", + "_$type": "HBox", + "name": "summary", + "x": 53, + "y": 156, + "width": 854, + "height": 150, + "top": 156, + "centerX": 0, + "space": 18, + "align": "middle", + "_$child": [ + { + "_$id": "xfwuob5k", + "_$type": "Box", + "name": "Box(1)", + "y": 8, + "width": 418, + "height": 135, + "_$child": [ + { + "_$id": "o1clptre", + "_$type": "Label", + "name": "Label", + "x": 29, + "width": 360, + "height": 60, + "centerX": 0, + "text": "Time", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "2oo94fn6", + "_$type": "Label", + "name": "label_time", + "x": 29, + "y": 52, + "width": 360, + "height": 72, + "centerX": 0, + "text": "Medium", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 45, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "juv58eq7", + "_$type": "Box", + "name": "Box(2)", + "x": 436, + "y": 8, + "width": 418, + "height": 135, + "_$child": [ + { + "_$id": "y3cucgc5", + "_$type": "Label", + "name": "Label", + "x": 29, + "width": 360, + "height": 60, + "centerX": 0, + "text": "Difficulty ", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "x0g211ix", + "_$type": "Label", + "name": "label_diffculty", + "x": 29, + "y": 52, + "width": 360, + "height": 72, + "centerX": 0, + "text": "Medium", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 45, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/shudu/assets/resources/GamePause_H.lh.meta b/shudu/assets/resources/GamePause_H.lh.meta new file mode 100644 index 0000000..f6a99dc --- /dev/null +++ b/shudu/assets/resources/GamePause_H.lh.meta @@ -0,0 +1,3 @@ +{ + "uuid": "fbb965c3-2e15-4b83-b484-0f2b1112163b" +} \ No newline at end of file diff --git a/shudu/assets/resources/Home.lh b/shudu/assets/resources/Home.lh new file mode 100644 index 0000000..b75fb19 --- /dev/null +++ b/shudu/assets/resources/Home.lh @@ -0,0 +1,703 @@ +{ + "_$ver": 1, + "_$id": "5uv9hvq0", + "_$type": "Box", + "name": "Home", + "width": 1080, + "height": 1920, + "_mouseState": 2, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "_$comp": [ + { + "_$type": "f2970e4d-7a09-4a9b-aef3-45d330c86f4f", + "scriptPath": "../src/views/Home.ts", + "bg_dc": { + "_$ref": "7270vjom" + }, + "icon_dc": { + "_$ref": "h6dakob0" + }, + "label_dc_title": { + "_$ref": "5ubzcrtp" + }, + "label_dc_date": { + "_$ref": "zbppj6k0" + }, + "btn_play": { + "_$ref": "lhrgg9o8" + }, + "btn_continue": { + "_$ref": "cjibqmuv" + }, + "btn_more": { + "_$ref": "7rz2zjd7" + }, + "btn_new_blue": { + "_$ref": "6irhm6t7" + }, + "btn_go": { + "_$ref": "9rcb0wtp" + }, + "btn_new_white": { + "_$ref": "n4ggvqc0" + } + } + ], + "_$child": [ + { + "_$id": "pnoy48ek", + "_$type": "Box", + "name": "dc", + "x": 72, + "y": 150, + "width": 936, + "height": 468, + "top": 150, + "centerX": 0, + "_$child": [ + { + "_$id": "4gdjhw3f", + "_$type": "Sprite", + "name": "sdw", + "width": 936, + "height": 468, + "alpha": 0.08, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 4, + "blur": 8, + "color": "#1d5cdc" + } + ] + }, + { + "_$id": "7270vjom", + "_$type": "Image", + "name": "bg", + "width": 936, + "height": 468, + "skin": "res://342d91e6-0434-4d52-b16c-3c536060f881", + "color": "#ffffff" + }, + { + "_$id": "5ubzcrtp", + "_$type": "Label", + "name": "label_title", + "x": 69, + "y": 12, + "width": 767, + "height": 100, + "alpha": 0.6, + "centerX": -16, + "centerY": -172, + "text": "Daily Challenge", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 36, + "color": "rgba(45, 49, 56, 1)", + "valign": "middle" + }, + { + "_$id": "zbppj6k0", + "_$type": "Label", + "name": "label_date", + "x": 69, + "y": 80, + "width": 767, + "height": 100, + "centerX": -16, + "centerY": -104, + "text": "Mar 12", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 60, + "color": "rgba(45, 49, 56, 1)", + "valign": "middle" + }, + { + "_$id": "h6dakob0", + "_$type": "Image", + "name": "trophy", + "x": 468, + "width": 468, + "height": 468, + "right": 0, + "skin": "res://07b90718-84ee-4924-9098-8f0ee3663d92", + "color": "#ffffff" + }, + { + "_$id": "lhrgg9o8", + "_$type": "Box", + "name": "btn_play", + "x": 56, + "y": 318, + "width": 195, + "height": 96, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "jz7snz28", + "_$type": "Sprite", + "name": "sdw", + "width": 195, + "height": 96, + "alpha": 0.08, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "lineWidth": 1, + "fillColor": "#000000" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 4, + "blur": 8, + "color": "#000000" + } + ] + }, + { + "_$id": "ttv6dk1v", + "_$type": "Sprite", + "name": "Sprite", + "width": 195, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + }, + { + "_$id": "8s2b3obv", + "_$type": "Label", + "name": "Label", + "width": 195, + "height": 96, + "centerX": 0, + "centerY": 0, + "text": "Play", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 48, + "color": "rgba(29, 92, 220, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "cjibqmuv", + "_$type": "Box", + "name": "btn_continue", + "x": 56, + "y": 318, + "width": 309, + "height": 96, + "visible": false, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "ldvu1z8n", + "_$type": "Sprite", + "name": "sdw", + "width": 309, + "height": 96, + "alpha": 0.08, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "lineWidth": 1, + "fillColor": "#000000" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 4, + "blur": 8, + "color": "#000000" + } + ] + }, + { + "_$id": "mmkr2ncz", + "_$type": "Sprite", + "name": "Sprite", + "width": 309, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + }, + { + "_$id": "2ou1bw71", + "_$type": "Label", + "name": "Label", + "width": 309, + "height": 96, + "centerX": 0, + "centerY": 0, + "text": "Continue", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 48, + "color": "rgba(29, 92, 220, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7rz2zjd7", + "_$type": "Box", + "name": "btn_more", + "x": 56, + "y": 318, + "width": 216, + "height": 96, + "visible": false, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "ttvlua8e", + "_$type": "Sprite", + "name": "sdw", + "width": 216, + "height": 96, + "alpha": 0.08, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "lineWidth": 1, + "fillColor": "#000000" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 4, + "blur": 8, + "color": "#000000" + } + ] + }, + { + "_$id": "qz81llea", + "_$type": "Sprite", + "name": "Sprite", + "width": 216, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + }, + { + "_$id": "w132wbbv", + "_$type": "Label", + "name": "Label", + "width": 216, + "height": 96, + "centerX": 0, + "centerY": 0, + "text": "More", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 48, + "color": "rgba(29, 92, 220, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "scaq3jc6", + "_$type": "Box", + "name": "bottom", + "y": 1920, + "width": 1080, + "height": 0, + "bottom": 0, + "centerX": 0, + "_$child": [ + { + "_$id": "6irhm6t7", + "_$type": "Box", + "name": "btn_new_blue", + "x": 144, + "y": -388, + "width": 792, + "height": 168, + "visible": false, + "centerX": 0, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "ni87w8pc", + "_$type": "Sprite", + "name": "sdw", + "width": 792, + "height": 168, + "alpha": 0.2, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 4, + "blur": 8, + "color": "#1d5cdc" + } + ] + }, + { + "_$id": "ry13plzy", + "_$type": "Sprite", + "name": "Sprite", + "width": 792, + "height": 168, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + }, + { + "_$id": "la3qcz7o", + "_$type": "Label", + "name": "Label", + "width": 792, + "height": 168, + "centerX": 0, + "centerY": 0, + "text": "New Game", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 60, + "color": "#FFFFFF", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "9rcb0wtp", + "_$type": "Box", + "name": "btn_go", + "x": 144, + "y": -492, + "width": 792, + "height": 168, + "centerX": 0, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "l73frxpq", + "_$type": "Sprite", + "name": "sdw", + "width": 0, + "height": 168, + "alpha": 0.2, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 4, + "blur": 8, + "color": "#1d5cdc" + } + ] + }, + { + "_$id": "vfod7fmk", + "_$type": "Sprite", + "name": "Sprite", + "width": 792, + "height": 168, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + }, + { + "_$id": "f8ylua31", + "_$type": "Label", + "name": "Label", + "y": -32, + "width": 792, + "height": 168, + "centerX": 0, + "centerY": -32, + "text": "Continue", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 60, + "color": "#FFFFFF", + "align": "center", + "valign": "middle" + }, + { + "_$id": "8gztmoqm", + "_$type": "HBox", + "name": "HBox", + "x": 269, + "y": 106, + "width": 254, + "height": 36, + "centerX": 0, + "centerY": 40, + "space": 16, + "align": "middle", + "_$child": [ + { + "_$id": "pr17wcli", + "_$type": "Image", + "name": "time", + "width": 36, + "height": 36, + "skin": "res://2b4d26c7-ae87-47a3-8084-29a243441634", + "color": "#ffffff" + }, + { + "_$id": "mx9od6cw", + "_$type": "Text", + "name": "label_time", + "x": 52, + "width": 203, + "height": 36, + "alpha": 0.6, + "text": "00:00-Hard", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 36, + "color": "#ffffff", + "leading": 2 + } + ] + } + ] + }, + { + "_$id": "n4ggvqc0", + "_$type": "Box", + "name": "btn_new_white", + "x": 144, + "y": -278, + "width": 792, + "height": 168, + "centerX": 0, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "0t9pwkdo", + "_$type": "Sprite", + "name": "sdw", + "width": 792, + "height": 168, + "alpha": 0.08, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 4, + "blur": 8, + "color": "#000000" + } + ] + }, + { + "_$id": "sez4l9sx", + "_$type": "Sprite", + "name": "Sprite", + "width": 792, + "height": 168, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(255, 255, 255, 1)" + } + ] + }, + { + "_$id": "ihe7vkr1", + "_$type": "Label", + "name": "Label", + "width": 792, + "height": 168, + "centerX": 0, + "centerY": 0, + "text": "New Game", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 60, + "color": "rgba(29, 92, 220, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "vxgd702p", + "_$type": "Label", + "name": "Label", + "x": 144, + "y": 872, + "width": 792, + "height": 400, + "centerX": 0, + "centerY": 112, + "text": "Classic\nSudoku", + "font": "res://3f79306d-f490-4a54-a4f3-26cb51d56a12", + "fontSize": 96, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + } + ] +} \ No newline at end of file diff --git a/shudu/assets/resources/Home.lh.meta b/shudu/assets/resources/Home.lh.meta new file mode 100644 index 0000000..30e41a9 --- /dev/null +++ b/shudu/assets/resources/Home.lh.meta @@ -0,0 +1,3 @@ +{ + "uuid": "f9d05a0a-e0b6-4980-99ad-e809399f6099" +} \ No newline at end of file diff --git a/shudu/assets/resources/ScoreAdd.lh b/shudu/assets/resources/ScoreAdd.lh new file mode 100644 index 0000000..3cf23eb --- /dev/null +++ b/shudu/assets/resources/ScoreAdd.lh @@ -0,0 +1,99 @@ +{ + "_$ver": 1, + "_$id": "qp8p7kt2", + "_$type": "Panel", + "name": "ScoreAdd", + "x": 340, + "y": 760, + "width": 400, + "height": 400, + "centerX": 0, + "centerY": 0, + "_$comp": [ + { + "_$type": "bdb0e671-99fa-47a5-9101-7ec008b1d25d", + "scriptPath": "../src/views/common/AutoDestroy.ts", + "lifeTime": 1 + }, + { + "_$type": "c910a064-d127-442e-a884-b5289c488647", + "scriptPath": "../src/views/ScoreAdd.ts", + "shadow": { + "_$ref": "jbc42ybp" + }, + "label": { + "_$ref": "84q009kl" + } + } + ], + "_$child": [ + { + "_$id": "m50hoany", + "_$type": "Box", + "name": "offset", + "x": 142, + "y": 142, + "width": 116, + "height": 116, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "jbc42ybp", + "_$type": "Label", + "name": "shadow", + "x": 55, + "y": -42, + "width": 200, + "height": 60, + "anchorX": 0.5, + "anchorY": 0.5, + "alpha": 0.18, + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 6, + "blur": 18, + "color": "rgba(0, 0, 0, 1)" + } + ], + "centerX": -3, + "text": "+150", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 60, + "color": "rgba(29, 92, 220, 1)", + "align": "center", + "valign": "middle", + "padding": "0,0,0,0", + "underlineColor": "rgba(255, 255, 255, 1)", + "stroke": 16, + "strokeColor": "rgba(255, 255, 255, 1)" + }, + { + "_$id": "84q009kl", + "_$type": "Label", + "name": "label", + "x": 55, + "y": -42, + "width": 200, + "height": 60, + "anchorX": 0.5, + "anchorY": 0.5, + "_filters": [], + "centerX": -3, + "text": "+150", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 60, + "color": "rgba(29, 92, 220, 1)", + "align": "center", + "valign": "middle", + "padding": "0,0,0,0", + "underlineColor": "rgba(255, 255, 255, 1)", + "stroke": 16, + "strokeColor": "rgba(255, 255, 255, 1)" + } + ] + } + ] +} \ No newline at end of file diff --git a/shudu/assets/resources/ScoreAdd.lh.meta b/shudu/assets/resources/ScoreAdd.lh.meta new file mode 100644 index 0000000..7a42cba --- /dev/null +++ b/shudu/assets/resources/ScoreAdd.lh.meta @@ -0,0 +1,3 @@ +{ + "uuid": "a6888ac8-9ecc-4be9-8083-88d536e334df" +} \ No newline at end of file diff --git a/shudu/assets/resources/ScoreAdd_H.lh b/shudu/assets/resources/ScoreAdd_H.lh new file mode 100644 index 0000000..e378c50 --- /dev/null +++ b/shudu/assets/resources/ScoreAdd_H.lh @@ -0,0 +1,97 @@ +{ + "_$ver": 1, + "_$id": "92hrkiys", + "_$type": "Panel", + "name": "ScoreAdd_H", + "x": 340, + "y": 760, + "width": 400, + "height": 400, + "centerX": 0, + "centerY": 0, + "_$comp": [ + { + "_$type": "c910a064-d127-442e-a884-b5289c488647", + "scriptPath": "../src/views/ScoreAdd.ts", + "shadow": { + "_$ref": "3o1c6tto" + }, + "label": { + "_$ref": "lyvq5xfn" + } + }, + { + "_$type": "bdb0e671-99fa-47a5-9101-7ec008b1d25d", + "scriptPath": "../src/views/common/AutoDestroy.ts", + "lifeTime": 1 + } + ], + "_$child": [ + { + "_$id": "4yn55zcj", + "_$type": "Box", + "name": "offset", + "x": 155, + "y": 155, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "3o1c6tto", + "_$type": "Label", + "name": "shadow", + "x": 45, + "y": -42, + "width": 200, + "height": 45, + "anchorX": 0.5, + "anchorY": 0.5, + "alpha": 0.18, + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 6, + "blur": 18, + "color": "rgba(0, 0, 0, 1)" + } + ], + "centerX": 0, + "text": "+150", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 45, + "color": "rgba(29, 92, 220, 1)", + "align": "center", + "valign": "middle", + "padding": "0,0,0,0", + "stroke": 16, + "strokeColor": "rgba(255, 255, 255, 1)" + }, + { + "_$id": "lyvq5xfn", + "_$type": "Label", + "name": "label", + "x": 45, + "y": -42, + "width": 200, + "height": 45, + "anchorX": 0.5, + "anchorY": 0.5, + "_filters": [], + "centerX": 0, + "text": "+150", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 45, + "color": "rgba(29, 92, 220, 1)", + "align": "center", + "valign": "middle", + "padding": "0,0,0,0", + "stroke": 16, + "strokeColor": "rgba(255, 255, 255, 1)" + } + ] + } + ] +} \ No newline at end of file diff --git a/shudu/assets/resources/ScoreAdd_H.lh.meta b/shudu/assets/resources/ScoreAdd_H.lh.meta new file mode 100644 index 0000000..04f4fe7 --- /dev/null +++ b/shudu/assets/resources/ScoreAdd_H.lh.meta @@ -0,0 +1,3 @@ +{ + "uuid": "44b37e5b-1d00-4f14-8362-1921afd5fce8" +} \ No newline at end of file diff --git a/shudu/assets/resources/Stage.lh b/shudu/assets/resources/Stage.lh new file mode 100644 index 0000000..79a2f03 --- /dev/null +++ b/shudu/assets/resources/Stage.lh @@ -0,0 +1,41957 @@ +{ + "_$ver": 1, + "_$id": "wqmu50ko", + "_$type": "Box", + "name": "Stage", + "width": 1080, + "height": 1920, + "_mouseState": 2, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "_$comp": [ + { + "_$type": "692a672b-2457-456c-8093-321ea7a10e1b", + "scriptPath": "../src/views/Stage.ts", + "btn_back": { + "_$ref": "pg501bsr" + }, + "btn_new": null, + "btn_pause": { + "_$ref": "m2fmtqrc" + }, + "obj_mask": { + "_$ref": "n15hk529" + }, + "label_score": { + "_$ref": "zgzyqyoc" + }, + "label_mistake": { + "_$ref": "azfx9pw2" + }, + "label_name": { + "_$ref": "qxei5ih3" + }, + "label_time": { + "_$ref": "m5cdq70n" + }, + "obj_blocks": { + "_$ref": "rco09ofg" + }, + "obj_pos": { + "_$ref": "rebw0lhh" + }, + "obj_candys": { + "_$ref": "2gza421u" + }, + "btn_undo": { + "_$ref": "uug6jz7y" + }, + "btn_erase": { + "_$ref": "ll1f1ee0" + }, + "btn_note": { + "_$ref": "umtydjve" + }, + "btn_hint": { + "_$ref": "ox4vivq3" + } + } + ], + "_$child": [ + { + "_$id": "xllpjjqz", + "_$type": "Box", + "name": "top", + "y": 60, + "width": 1080, + "height": 64, + "_mouseState": 2, + "centerX": 0, + "centerY": -868, + "_$child": [ + { + "_$id": "pg501bsr", + "_$type": "Box", + "name": "btn_back", + "x": 15, + "width": 69, + "height": 48, + "_mouseState": 2, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "ij5lctcm", + "_$type": "Image", + "name": "Image", + "width": 69, + "height": 48, + "mouseThrough": true, + "skin": "res://06a9c4a8-d664-4f3a-9c35-25b610195ced", + "useSourceSize": true, + "color": "#ffffff" + } + ] + }, + { + "_$id": "m2fmtqrc", + "_$type": "Box", + "name": "btn_pause", + "x": 990, + "width": 200, + "height": 200, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "5uhu17g4", + "_$type": "Image", + "name": "Image", + "width": 84, + "height": 84, + "mouseThrough": true, + "skin": "res://7d36066d-f01a-4a46-9eb7-109f58cdbc19", + "useSourceSize": true, + "color": "#ffffff" + } + ] + } + ] + }, + { + "_$id": "jtbep2gl", + "_$type": "Box", + "name": "Center", + "x": 15, + "y": 317, + "width": 1050, + "height": 1050, + "_mouseState": 2, + "centerX": 0, + "centerY": -118, + "_$child": [ + { + "_$id": "zgzyqyoc", + "_$type": "Label", + "name": "label_score", + "x": 375, + "y": -113, + "width": 300, + "height": 48, + "centerX": 0, + "centerY": -614, + "text": "Score:999", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(29, 92, 220, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "azfx9pw2", + "_$type": "Label", + "name": "label_mistake", + "y": -65, + "width": 300, + "height": 60, + "left": 0, + "centerY": -560, + "text": "mistake:3/3", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "valign": "middle" + }, + { + "_$id": "qxei5ih3", + "_$type": "Label", + "name": "label_name", + "x": 375, + "y": -65, + "width": 300, + "height": 60, + "centerX": 0, + "centerY": -560, + "text": "Hard", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "m5cdq70n", + "_$type": "Label", + "name": "label_time", + "x": 750, + "y": -65, + "width": 300, + "height": 60, + "right": 0, + "centerY": -560, + "text": "00:00:00", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "align": "right", + "valign": "middle" + }, + { + "_$id": "rco09ofg", + "_$type": "VBox", + "name": "blocks", + "width": 1050, + "height": 1050, + "space": -6, + "align": "center", + "_$child": [ + { + "_$id": "ji19nsfr", + "_$type": "HBox", + "name": "HBox(1)", + "width": 1050, + "height": 354, + "centerX": 0, + "space": -6, + "align": "middle", + "_$child": [ + { + "_$id": "ifbdhqpm", + "_$type": "Box", + "name": "Box(1)", + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "cg0dtpgy", + "_$type": "Sprite", + "name": "Sprite", + "width": 354, + "height": 354, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(123, 129, 140, 1)" + } + ] + }, + { + "_$id": "6ktbemg2", + "_$type": "Sprite", + "name": "Sprite", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(182, 186, 194, 1)" + } + ] + }, + { + "_$id": "0p7etajd", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "kncsl5nr", + "_$type": "HBox", + "name": "HBox(1)", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "nxwcvt47", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "9s02to7g", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "w4rp0icw", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "a2g39gn1", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "24klo4db", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ulb3mb22", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "dl8z88tm", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jv7fxeji", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "tddtrbzj", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2aksyyom", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2yvu9ody", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "wp173k1z", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "tuj01o0n", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "m9zgwhyn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "of4sihmd", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "1eeersok", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ab5gq4nj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zfpcf7w9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5fg81r36", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "0078se1y", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "atx1gjyd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "q54vof6z", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "51sb4lrl", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sob7gb57", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "1akyxdrq", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "uv85b48g", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "3y58nzu1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ira2z674", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "t5qnczud", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "oob9qbdu", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5xazl22z", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "mni2ciqc", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4xy40sp6", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "k8x2ikv2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "3lof345x", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xsxaynwa", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "x60qarjd", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "snzt1p47", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "eerzscvr", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "biu90d91", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "8mmm2ue7", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2mih5kh1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4nbwsip1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "88sb61br", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "vbqrwzm0", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "lan84jq1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xadotek1", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "xq4u6fap", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "anttl9u2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "oqfkhn4e", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "u0cws9sc", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "mm660zdm", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "swrhtfx8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "w6ip4pp9", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "c2vx50y1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6keqshpw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "gctkk2xk", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "fah20s7h", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "et0kswxm", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "f4yaprdr", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "w1knzrkz", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "s2tx7poj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "urnxe486", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "mafx4t6q", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "qcxumqg0", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xgdbzqm8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ut27kq6a", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "l8c2b6rq", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "o7hsrgw6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "7px440gs", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ubx0acvm", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "jbzmjc5n", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "15t73whj", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ptks0uiy", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "e33e8z46", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "bna5p5q6", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "69tg3dnd", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ydmg3rml", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bij5vi19", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "0v9eognt", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sh4u0ms2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "lkjqzmyj", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ufnco1de", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0u53cyuf", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "znzro225", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "5xptghmc", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4c3ynpjy", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zkmibcwu", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "mkfhe23j", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5c1b5r1k", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "smw478a7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "prdienon", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4pia3vkv", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "9c8sbs3v", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "rta9zbix", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "38qgl4bb", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "dxpommf1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hostecon", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hypxshbh", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4xsh4jzw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "u5sk9mib", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "029biyuj", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "z8hxoel7", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "en3hpe5v", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "hncv7axt", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "at0hkgtb", + "_$type": "HBox", + "name": "HBox(2)", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "k5l5a7eh", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "ft0hnmsq", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "uo8wppy5", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "t5p82klg", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "d3rzii0f", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ih6gh0n1", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "te0xdqs4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ghqukcp6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "fp8tvnne", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5wpzynwn", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hqm0fi6i", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "l7q8jevv", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "q5pamcf5", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5qvlzqm2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "nfvwtl7u", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "soshd436", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2m4snqr7", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "29h2766x", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "9k56b6en", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4zi2l85n", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3ar27rd4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "fqgoq68j", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "99kgvxcw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6wuu0c8b", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "4r2hx1a2", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "4q6y2k2q", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "jk1rt7cd", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "444wznl0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2ntftn5v", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "50alo9a9", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "lf6c5d7h", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "g6f6jgew", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ht6ku7xb", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "pt05qnz9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "9kmmuu8z", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "um83lpob", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "0ekqdyin", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "vzyxcuqn", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "e5eeos8w", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "7bz24m65", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "z9fi6n0e", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "g57y4mw4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "o4lqngdq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "utd99l6l", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "exaep1x9", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3lv3d6ul", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0wkudb0u", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "yhag9c2v", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "tg9doi0g", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "f909jkjq", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "fv9n4ck1", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "beekw1fr", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xcj5h6tv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "jn5uqa3h", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1pajzwbk", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "na9enh91", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "fs27gc3g", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "edppeq8g", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "u6t302hf", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "7jlw8xtg", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "5792jntg", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9b1da1rb", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "mfay08mz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qvweab9x", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "jux2chcb", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3qe0x7nw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "quk299vw", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "w0mrmmmy", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ped1710z", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "zq23qr8u", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "esr7yz5t", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "d9mzdcjg", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "p5bz9e6i", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ynydr9k6", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "25rhphjf", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "nv7k1u09", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "30s4hgxk", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vj18ya8e", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "zdhojrde", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2s3m5v1n", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "03pcw965", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "8i2r9bxx", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "nkzvtmo3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hqyluj9u", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "kypwgfem", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "1o2af2r8", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "wj3a96i0", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "69o8iiel", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "tbc3m7ko", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "rk8xrfx4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "crcp0nqh", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5xhlx4gf", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "3ztmbgvc", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0s3afxyi", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "6w5gzn6m", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ot0yo2h9", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "z3fyg0o8", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8sgm0ucw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "kzdqe202", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1e1ekgo7", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5qj8zq42", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "v7rb5bfb", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "6zz85vqh", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "yr8rrmq9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "ny4loivz", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "psq5afwv", + "_$type": "HBox", + "name": "HBox(3)", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "9cm6wsrs", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "fblvxxki", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "8sttwamm", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ene8jpxz", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "jkaq5c29", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "oiutd6se", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ugenyc32", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "eedf6bw9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "yohslz31", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "kpn4etab", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "94oipot0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bc4znuqr", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "qqbw3bu1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "lrfxltw2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "qqtjpxbh", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "5e6k3d10", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "6lk2ul7w", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7zl57qn4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "v2efsu61", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "d5qixwc1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gotv0cmm", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "e4cl8kh5", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ps0f7prx", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fioe498q", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "cwacmrx4", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "lraju7uk", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "mk2uduqj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kn3ndw0n", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "j9rltjf4", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "6z86g2kf", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "l8e2jtrk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "uk4z9b8d", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "o75oprzx", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bq96txsw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "ny1m1ia6", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "77x4zluo", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "l6b0lysp", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ecs1s0ly", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "97fh3u3x", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "ofgkblzc", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "uv9s5kq7", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "fl1jtiiq", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "owuyxehh", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dwk7vz4h", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "uex81l6r", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "h0m0ose5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "cz2vbh4s", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "h6ou1tou", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "9fbjrnin", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "vc2bv5dl", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "mm79kxid", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "r2d1oqrs", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "i1l5pj5b", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "tqbug068", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "06lha8hd", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0kffwc84", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "z2x8kb4x", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "oaubawkf", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "iikhru0q", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "twzq1qg0", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "1ymlz4nh", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "knqaex5e", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "egm6tz9y", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "4y04mzs1", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "k53i7n2m", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3bxby7kl", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "mijdqoim", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "z7xci9jr", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0ezgpe7p", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "6lt4s43f", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "79faejyf", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "o0kdqmsk", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ko0zrlpf", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "v84qgtky", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "f8tp2ixr", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "em1txmjd", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "hsigzlhp", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hrrovqd9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "fnowrtis", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "rj9bunal", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "n358nnok", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "mwl0ezt1", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "y9dd0dcb", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "w1ebxey8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "c7xvffci", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "trel3taq", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ox1l0jyz", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3io0iazl", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ylmukv6h", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "7yzqf301", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2xq346ue", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1uhr6lok", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "wlvj7hf3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "v0axe69b", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "vacolvdo", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "vojfusze", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1wc1aoai", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3vzox4vo", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6n3bdt7g", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "130jp9e2", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "o9lp2qjm", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "t21h9pgz", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ycvoyjio", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "iz4q59x4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "hlwumvut", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "k535eiso", + "_$type": "Box", + "name": "Box(2)", + "x": 348, + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "bhrs3a5d", + "_$type": "Sprite", + "name": "Sprite", + "width": 354, + "height": 354, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(123, 129, 140, 1)" + } + ] + }, + { + "_$id": "iv9lj2h9", + "_$type": "Sprite", + "name": "Sprite", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(182, 186, 194, 1)" + } + ] + }, + { + "_$id": "m5anshiw", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "x0n3f6lu", + "_$type": "HBox", + "name": "HBox(1)", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "32s4yex4", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "8jid1ah0", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "45q58gyf", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "pxl7r8rh", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "s1gcvfj4", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "yoiszvp8", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "0hx0s4m7", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fy6znuic", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "sv994fzm", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "aq6r849p", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bqs9gawb", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vi5ii0pw", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1o3awhga", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "88un5gvh", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "1idl0b9o", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "26l0p4vj", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "0zftlfqu", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "m31a475t", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "f6q2g88b", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "yq6yu788", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0jf4y4gz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "8k8kqo11", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "v0diybq2", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "y1c3yrm3", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "hg21o9df", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "81troy71", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "nn8usoxa", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "a2nxd17p", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "m0cdcl6e", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "94cjzlz5", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5g6d3ixa", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "58oa0l7s", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "xfrz933h", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vh64x3by", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "fi4rptz7", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "sbfcoxnh", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "ib4ak8hd", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ctvathgn", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "006kvttr", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "b5beio97", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "sb1p5xjo", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "votf1utr", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "g7gke5mn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7lf0ki4l", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "c74k1u5n", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nq0sj57j", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "3bl2z629", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "iof9x3m8", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "881siu8s", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "95qp0kdy", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "fxccrvjt", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "85lwumml", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "z23qwtrk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hbi3y99m", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "qn2bpb2y", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dxcixn4s", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "yv8zirif", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ojtcytrt", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "n45ccke3", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "wz8qybjc", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "c9wu1r3e", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "my7ziu79", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ywifivn5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "sbsnb3lg", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "3i4vbdzp", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4vleh6m6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vw67mt6c", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "bup7us59", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "c0rs9da0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "8khs477u", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6pgy7g5r", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "ouoyw5yg", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "5hig4b69", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "xxb1upjl", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "m67hz75b", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "yivwy4x1", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "aklit1tl", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "yoivwzdv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7eo5eewi", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "mvc88c4k", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "95s7ig06", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5ya5aq7w", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ct1hmoiw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kevcwa4c", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "hly4nx43", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "l8ca4y0n", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "sjez8u84", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1oypp1w9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "c66lileh", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "02r5yzc4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "62dx8rnc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "4mfqtcv2", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "blyahn7k", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ivmczuja", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "2scikl3p", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "tdfyxu4d", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "tqi8bf8r", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rlm95jiz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6puvulcd", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ikz91ajj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "udsxzuwq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "renny67a", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "0nrt4fav", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8ux0nnaq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "eg3evvb2", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "1fzpwvtd", + "_$type": "HBox", + "name": "HBox(2)", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "0usy4oqe", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "owv394hw", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "szee00yl", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "0kzggk13", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "wwdkqj4h", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "w37x78gh", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "c0rtni9i", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0nf5zt3j", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "78x5ekga", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "gx6k9hw8", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2n5kbu20", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "87pkyqy8", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "cyxrxugi", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "elezy4gy", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "yhdpe2em", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "7zbd5ccb", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "dr9fiemh", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nf2attda", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "sqf5ijjd", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "c9v9m5p1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bo7j6teu", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hzhycpwd", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ol0q6xfw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "no2zuw4f", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "9jwh9s9q", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "65t7m6fc", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "t5k9dhis", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "84xx9fsp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "yrdsxh1k", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "3ju4p5va", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dd2e9iaz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xd138tbh", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "f4qgl3p3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kuuj51f3", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "62s2mopy", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "nte8mjb6", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "qkas2edv", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "5szgpuuo", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "hy6h9mx6", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "8vegrmtv", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "efgdh7ac", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "a6xcwv15", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2oslwpsy", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "v3hj21ab", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "994ikmfp", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "t7ccw9zf", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hjxgeegj", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "bgv1mlan", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "l8j3ifco", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "7gs8q1pp", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "fqemska9", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "7dws53n4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "swtzkbht", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7w9uyjdw", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ih6dpvyq", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "n3kosmkm", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "263bhi4n", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "t419spa2", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "erb4odg3", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "m4k4gitn", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "z9q27ew3", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "wg0etici", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "z7b4qpu1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "luxz3eo5", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5zy9ca7b", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fkq6c1mw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "y5g6buqk", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "z6scrtdx", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ca6sjcro", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "n4g315h9", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xjlh8lqy", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "3bvi3z28", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "qicloi3b", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "01mf2tgr", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "yhy92ydv", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "vtr48sfo", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "mcx0qtdc", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7aclhwxk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vw3l2wbr", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "e5g06iwk", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gyw77u62", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "kod7gqwg", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "p8w9q45d", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "uauyjf1r", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "mx5uvevi", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "i9e3p0ta", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "cabzwnqh", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "leytmgd8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hp6l1h3p", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5uppja5e", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jkj4ojh1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1x49di6v", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "jcwraq9t", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hy8suauk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "su5faxks", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "5upud96d", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "gxvblwx5", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hxepywhn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1z15ksiv", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "92jo02g9", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "j3g416a0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vs9uc1rb", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "lsvi9jg3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kdfx39pt", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "k8xbf09g", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "i8egyfh3", + "_$type": "HBox", + "name": "HBox(3)", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "qw156jr5", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "o6vw8ojl", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "w4gxd6fs", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "5fq6gkcu", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "jjqphoxp", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ljqiqdqo", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "dwcz555u", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "mlhjzv9n", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "i5epc3fl", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "c0k5i9a4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "70f2wd9x", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "tw3sgjyo", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "pua2wugj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "unrzy1x2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "nud53ik7", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "1znnki0j", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9qzpulej", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dujik84o", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1p2tjq01", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "8jwv0sfe", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7n2hbpn2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "864t19sw", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "7nml5dkl", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "31n7ezej", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "lye8t3rh", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "7uncyggd", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "u1ref0g4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3qfp1hn2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "iiusfo1s", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "62j3x4jl", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zkejxwr4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "mlxjdvnq", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "t54o6ys6", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vkagseb3", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "mzqivads", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "zyd3ab5n", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "xsass6r7", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "l3nunfoc", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "pg4ma2dm", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "u8zt7kxb", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "e3isz75n", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2htvt2cb", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "z7io01wh", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "el86hf5s", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "7tm55hz3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ico2pph5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "yi5ab90i", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "srgvz8vr", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "9jljytk6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "c9shbhzu", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "buqtm7gu", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5wj29om7", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xeka7y77", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "p5m20b7b", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1na1cf7h", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "r0w7u7y4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "two6ue9d", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "jrkbyt0g", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "uwge64cb", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "wstaqnlx", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "rxid6d6s", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "o3hv96hh", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3mfyi7no", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hriszqny", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "tlfswvub", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "al73bsj7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ubitajd9", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "rhyhx0al", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "axsmmevp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "d2q1gabq", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "lxebza9f", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "fj6f0784", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ywxl8vi8", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "7qbitkxr", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "v61o2fjc", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "j1h0wyvv", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "tn5inz84", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qmd7hvct", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "cswo8f5m", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "mafrmty9", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rcv8bpd8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "j9hsnslj", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1o6hq77b", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kkpycpwt", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "08mmlfhe", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "s0f7tb10", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "py5s7txw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ptptma5z", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "mw5fgo60", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "85lkbbvj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "q3704lts", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "t6854srs", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "b70hy2nq", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "s1lzgdsb", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "mopc16bl", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "1wk2xgj1", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ooz76nj7", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "toqo9fg7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "8a0h8tjt", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "3n1i9ysf", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "48hxgduf", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "p6f2mdsn", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "l52optxr", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6tubvr4i", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "izm45p21", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "n5cfl7fy", + "_$type": "Box", + "name": "Box(3)", + "x": 696, + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "0svn001y", + "_$type": "Sprite", + "name": "Sprite", + "width": 354, + "height": 354, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(123, 129, 140, 1)" + } + ] + }, + { + "_$id": "xzsqyzrm", + "_$type": "Sprite", + "name": "Sprite", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(182, 186, 194, 1)" + } + ] + }, + { + "_$id": "p3haeau5", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "k98303v2", + "_$type": "HBox", + "name": "HBox(1)", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "vxtni2w4", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "i57cj52a", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "qdyg6708", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "0y1fbi64", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "lc0kfiqg", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "vu9qkirk", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9cutc12h", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "h9l1bmw8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "cnrk5swo", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "7hk4f4s4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wlnwod82", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5tlhvv60", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "vw50sfm5", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "tqvbv59z", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "vu5u6m2j", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "fxar52fq", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "gh6ln8de", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "s1xtn2i7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "pn8csz8a", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "gq84x1rp", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "d0vsk340", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "kw3dmflz", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "7n6m9nls", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kfz9zrhu", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "4tu2l55s", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "evdqnv4a", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2o12fj5j", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "h9f4xavw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2h7hgt62", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9z7iyzyz", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "x5rzzud0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "kdl5pkta", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "h4e27r1b", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kvoh6mdi", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "pq0leybp", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "x8rg51qp", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "ghu6ra8n", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "i7bdogx9", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "dbkx8q8z", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "wvzfsspd", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "llhxkru5", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "e8h055zt", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nxmx19s4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "nvt0ly6g", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "8ns7cirv", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rpzsk1b5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "rekbvx17", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "suo4inta", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "u8eh6i9p", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "d6knfim3", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ymb7ouzj", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "emqgctrq", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xp5lafsd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "wwonj887", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "65jd5iq7", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "npq0fftw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "svfd1j5s", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "203oc5n5", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6zm2u6y6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "i3d8t1h5", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "qn9ft47x", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ns677css", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "m61xxm3f", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "yg63uvyw", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "7ngw7dok", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ge3hxdvj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "b16frdlv", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "oddfxyjs", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bc4wr2hz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "419ny1os", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "shsqv5bk", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "okmeavwu", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "omtyys7r", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "uo290sls", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "08yu1ev6", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "bztwmd9l", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "o1gokrww", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "pt2pumof", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "jzvdjahd", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "e95e8if8", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3dpmmgfg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0kdtdovw", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "vwiqeapj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0m7f5ig7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "we5zg4xu", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "na9fyzzy", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ap9eye1t", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "d2fbadri", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "zks6gbn8", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "w445w2g2", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7bputa0q", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0147ax2f", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "v72lwqoa", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "h6jvn9qd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "6qpoa45i", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "e70u3jqh", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "td038vme", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7fd907wv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ie1mpcwv", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "7le8p4lj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qoo88l1t", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5849db3y", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "wd9ki5e8", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ojjdz6go", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "cy81g3hw", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "ishmaxu4", + "_$type": "HBox", + "name": "HBox(2)", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "5xckxp3a", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "kyftg1w3", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "q9oz1kh5", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "l981uhkd", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "jjzsjpgf", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "sohppcqi", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "zqo6dsf9", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zeaao1zm", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "w9yt62bd", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1totbnsj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "uu7f1afh", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "yg7quhwe", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "cpouvtyd", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "huawemfo", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "diysy3ln", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "9zu0clta", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "yflxpch0", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ljqclumt", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "i8oa2yde", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "bl981itd", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "f5cdfsv7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "nbffs6j3", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "8bhm0kwn", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wy72azdv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "31455k4c", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ozc8tzvc", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "m5ewgqwo", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0nmsm3cs", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6qbcyr1l", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "mt4q9nkw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xnyga32k", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "s6vohmnp", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2c6oh1cc", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "s0rm3mmp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "pmybfvnx", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5hksz6wk", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "d504gmne", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "8hvnop9y", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "xv59oizx", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "eiaz7r7k", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "dji0gkux", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "xac8uh52", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "opownsz9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "uecqbbeu", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "gj2s8pxj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2687svw6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "19ghm29i", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "6kprbphq", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0e8zhgjp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "lgrde9rr", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "mjsooxqj", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9pqyxwsa", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1aashu0r", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vw2oaixh", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "m7deahqz", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "pn5cy5le", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "mv1mkunk", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "st82i976", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ysn3zsqa", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "pqiqtx4x", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "mxs8htzf", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ce57v7hf", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5bli8im2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "e1yg13ku", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "w4c6t4l6", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "c4f93avu", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "39mmdhtx", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2kol3jos", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "oqtghka1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "r674kp2i", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "z2huikyj", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "fpyahw3e", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "1svuqx87", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "qi6oj9si", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "parqmz1f", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "l5cp0pab", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "tnw4xy32", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jxygobl0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ey2sk259", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "rx134mj3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bum08jrw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7c9ohcqj", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "sooup3kf", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "by7chfxt", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "jcg38eo7", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "eop21awl", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "kbsscp24", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "d7oheemy", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6lq3oipl", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "rylymi0j", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "tkouu536", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "o1ixcx6e", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "6att8juk", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xhs612xc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "33ygq0os", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "mhra145d", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "fewlcs4k", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gynmkf6b", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "lixzggdn", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "x4vmolha", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jftarnqm", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "frvxmqmw", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "b7mywvey", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "e4e9rik5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "exoshy55", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "mdk34tnr", + "_$type": "HBox", + "name": "HBox(3)", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "2x3erxba", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "ci7bs90v", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "6y9jrn77", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "9irucaig", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "goo1x9cv", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "gbx1w0eo", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "aronrh0x", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "e9qkmh59", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "au7f7ocb", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "b0iw2qk0", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "61w1zh5i", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "034zq9vj", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "mbkow8q3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "c9pvgh4z", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "a75nyvlo", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "onswfk2i", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "fcziybrp", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jul2mvwg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "tqg71ydj", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "s1vby8va", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sjm3zw7s", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "54jdmfcf", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ngzb31ka", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5e0h90zj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "x07k8i9n", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "cdk2urfe", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "c96fr8uk", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7t6a5p1f", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ilccl10u", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "zwjqyzii", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "y7rla5it", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "uwbkzo1p", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "8j6sbzlo", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ymqmlba4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "anht6vq6", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "4208v348", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "6ikrxi2j", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "yyuytyy0", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "zzrte8tk", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "xzjgkoih", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "rpsm38wi", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "v8j6b75p", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bjp2k0hk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "iltwarw2", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "esev56t1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8f9y24gj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qi701m78", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "cndsos76", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1esnb16g", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "edc013z5", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "vr7xr5t8", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "qv3nuepr", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "t9pmg8ej", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "d7yi6z6g", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "epxn088q", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "lgomt6e6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "09ddz1vi", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "x6q6ccwr", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4ubd7k2v", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "bk0tl3a5", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "f47yhbb1", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "o5c5fpap", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "beowhed7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "covi93tx", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "957fbbz6", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "cvrhlofb", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "n2oaykzn", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "yc3jthul", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "i8n0g9sf", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "rj1rgqc5", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hk7entvg", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "pknc3rha", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "8m6626i3", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ytt2xnyl", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "ho996bdd", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "qa9qa46q", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "3gpsocbv", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "redj3740", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bxch25xy", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9o99jk44", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "d75hjxsk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "yklsmvpr", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "wdjnz5j2", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "v35mtvd1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "b1em3ab3", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "b8u6yhju", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2s9ts0zu", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "iku32p2x", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "b4w73v5n", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "60erxy9x", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vnpyso0b", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xbsvudna", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "jy40vn32", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "413pg7dc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "tpqkczvn", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "jan34d9s", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "qps6xatx", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7y6uti9q", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "t5dsdmid", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "zwz136qj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4yltxyo9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "4q12pkhp", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "20xyimrv", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "m72all0c", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "ylb9bxjv", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "ibaygrjk", + "_$type": "HBox", + "name": "HBox(2)", + "y": 348, + "width": 1050, + "height": 354, + "centerX": 0, + "space": -6, + "align": "middle", + "_$child": [ + { + "_$id": "yib4t4qh", + "_$type": "Box", + "name": "Box(1)", + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "ln27doid", + "_$type": "Sprite", + "name": "Sprite", + "width": 354, + "height": 354, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(123, 129, 140, 1)" + } + ] + }, + { + "_$id": "t9v49gvf", + "_$type": "Sprite", + "name": "Sprite", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(182, 186, 194, 1)" + } + ] + }, + { + "_$id": "nn5tfjkk", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "wuzjq7rb", + "_$type": "HBox", + "name": "HBox(1)", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "rr5az3u7", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "fscu9hcy", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "5xow067j", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "jaksnft7", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "a7hvz6ij", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "zh3gj4ti", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "uqdnau4d", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hb4btkd4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1a2awhtk", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "3ndduyu2", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "owc5kqqr", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "z67f57p4", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "0b28p4lj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "f52dqlih", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "6flj198d", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ypsi90vh", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "pcnrag3r", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "t3xdfo4i", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ggc5vkzb", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "suwrms0i", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "e2s1eb1q", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5255q799", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1c9nphv5", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bifei2a9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "lvyw35oh", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "s93wtenm", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "di0cn2b1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0h74ps27", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "lmxn5da9", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ep7s6133", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hblb0ut4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xu47bozi", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5l6kpc30", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "15hnccyj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "myabqn84", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "pxs0da46", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "tu0nq8er", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ne1y0j8v", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "3stlz2vi", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "5whzn8xf", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "fyz83wvm", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "gfdjhgu2", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7v7xhxv5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "s0dsnstf", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "72uwufmy", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ri2a7d8v", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6p2ygvw6", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "u05cqm6s", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "r909snr9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "5j9q1wgl", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "juwwqlw9", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "erzvo9kf", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "b1m5f2t0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "zmbw0g1j", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "vorpqaiu", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "in2upr9w", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "l7vg6wty", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "fwwyekx1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2qy3gj5i", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "hl00qakl", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "n3sf393v", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ab298keg", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4eafbgbe", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1viyadiz", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "8vla86ru", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "joickdv5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "b79388zn", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "y3b6dpfy", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xir0ik5j", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "vpv030gm", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "8byemxdm", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "5hks5wj6", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "u9khuzkl", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "r5c91dim", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "rt1kufym", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "6xweu66i", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ywsfzbam", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gxkltypk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "d6mbsd46", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "llv3w7bh", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6ym1pgpt", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "okq1kzxs", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5eymh28j", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sf66yytj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "fhyipo3b", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ctyg8jn4", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2ql2rxuk", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sll3bm5q", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2sygd63d", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "nmot2o3b", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "l0gc08lq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "pm8amlc0", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "iqwj2x8p", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "pz5ba7jn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "8qfb52j6", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "jmnm639v", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9ce73di2", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "b5y1mw7w", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "16720a7x", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "jbxhrtdk", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8hgm984y", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "tcygauk3", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "91j7blcv", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4ffw58vj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "frmpcr5s", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "x87wkvt1", + "_$type": "HBox", + "name": "HBox(2)", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "qa9zryou", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "p9lbhnyk", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "92jtqtxl", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "4xmpj42u", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "emriiklr", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "w86m4xs2", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "e4uzok5u", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5v9k7o5e", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "g2cmukhz", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "0est5v8d", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1o9cimue", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "tu2lyy3w", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "o0bn7fjv", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jqqfhqp1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "dgn86hhp", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "fx3bj3l8", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "wpricgw8", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "pfwplhdg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "e55f43t3", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "88bhupu3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "n2u7kn1w", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "4r6o4d46", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "u4db7u2h", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0sazley2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "i3h0v4ja", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "g9olx26b", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "crhl1z5m", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "136610n4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "pl467sui", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "3ekfr014", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fb6bfca5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bbdifceh", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "0f3zhc5o", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dt4omqj2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "omzv25js", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "wimnzwui", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "itp0ruud", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "nyac3kwx", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "w7batm9v", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "s4uvbivp", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "5enkdy8s", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "qsk33vbn", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "424fps2i", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "767b5p78", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "az3ot6d5", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sgoqbo90", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ed2sz4bu", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "q96jvqx1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gpuc50rw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "kks1k4ed", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "2ypq5cbp", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "nlirc32v", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "c0tqulxl", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "juti0w37", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9p20rs2k", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "umswngdk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qplh2kye", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2utc1grm", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bjqiugbs", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "yjpa4xzk", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "hu8w9g8k", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "0koxl5oo", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "blbe9yon", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "37oznfs4", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "158kxnsd", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wuy6h1le", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "adtevgf0", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "6bggel0e", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "n2qz2255", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "02b6tmlb", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ri21yse1", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "glb33on4", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ao1usw2l", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "rolj7hoo", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "nki99y9z", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "rsa6wbf6", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "0ctfh5wp", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7ns45y8v", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "m6mwnj7g", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "m4ahxgby", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "oica2ih0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "9zb121k2", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "yhxzxiub", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ym0w97zi", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "b94cf6if", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "wibxuv47", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "nmhsxp7s", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "og51q1wn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "jjb7nlbi", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "eo9acmrc", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vxbw39by", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "c9hajvwl", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "oqul39b8", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2l4nvh1z", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "q4wd87uv", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "yhed1ug8", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "23vj7rfx", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xcxkzkzn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dyfsb7ln", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "glrfadfx", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8po83qiw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "l6cenm05", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "x682pjo1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jchqmzan", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "4lm0jhuz", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "thc7khbh", + "_$type": "HBox", + "name": "HBox(3)", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "yqmzzsyn", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "8s1ctev4", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "xif1i49o", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "20b57nme", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "eimutfk7", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "9fkoj7e0", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "vm8opkkx", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wl61dz2k", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7cwu8tc4", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "18s9pdmb", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qzvk2k6v", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "g2ihjlku", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "103i9ylr", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "9n5hqdku", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "9igec086", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "wmtp600a", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "yactnx1b", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "d17gptyv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "o7k6tkjq", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ckvercyl", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8zpip9ol", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "s69axshz", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "50kvoj2y", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xjqadx0m", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "hpmkee4b", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "73w7b2cw", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5xqisie6", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fufp88tt", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7az5gg8y", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "m8k0shb7", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jpjfhzdu", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "gy4slpa6", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "avz68gml", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6topwj7t", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "8kwryw58", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "krf13oxa", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "9qtyw23c", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "5y15m0ip", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "f3ztpuos", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "14mpt1e3", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "adbsn6u2", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "0xnw8215", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3ynd3ic8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6hfmd2s6", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "6xo9nuia", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "31bhekzx", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "p39zyqrd", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "xa96cx2r", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "33x9gnkj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "94tf66wr", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "81k1z3wu", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "7vrn7sas", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sv2n97pf", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "zq8d614m", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "afq9jeny", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6ag2lxu7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "wqp92wd7", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "xt608pwr", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dcjxa3f3", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "kisxriwy", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "j9fvixi6", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "xcg8w2tu", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "j3byq9t0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vo275pzu", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "r3r3vi6c", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rxxqo5qg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6el8vmpu", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1dmqpjcf", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7k12jamp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "itt0acr7", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "gpjho2ib", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "eux07j4d", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "xj68ei8j", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "38n1zhx6", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "n8lqdedi", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "fzsj4ek5", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "k563h6es", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1wbystbh", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "kdh6xla4", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "pkryqqjx", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1w47ie9v", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "tsa33842", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "k2nvili4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hcdouafq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "911x1a2s", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "lyma37uv", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "fyu1l9ei", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qcku63w1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qmnwatta", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "dfauawt3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "br2fq93x", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "mgnnj6vg", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "epz8w2yk", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ookuf2gg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "x4ge15uk", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "vwd1jarp", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "u13q9tnu", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "alzz7k01", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "9tmj6s1y", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "87l0wmfw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "igj7pdbk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "oiwqq6gb", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ldhkr1io", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "uyzdbadk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "f9w7eof9", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "0irq6abe", + "_$type": "Box", + "name": "Box(2)", + "x": 348, + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "im9e5azt", + "_$type": "Sprite", + "name": "Sprite", + "width": 354, + "height": 354, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(123, 129, 140, 1)" + } + ] + }, + { + "_$id": "x3ztvr8q", + "_$type": "Sprite", + "name": "Sprite", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(182, 186, 194, 1)" + } + ] + }, + { + "_$id": "k3t30l1y", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "m70euvc1", + "_$type": "HBox", + "name": "HBox(1)", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "mpely3ux", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "l96uesi0", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "4aacpnnd", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "x82h4b3d", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "u0inggg4", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "awd49qvf", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "iagazu6e", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1z32budr", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vay9uicp", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "gbsownge", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fzx6towu", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "uca6wcx2", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1x8yplak", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rrxzo1mz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "f9pj2vjp", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ue7rjcmb", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4y1djztr", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2urzqwds", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1re8ju45", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "om6uirbu", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ixayq0ta", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "cv4z87pc", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "u7rfpqff", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0b1p5owp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "mhc65lcr", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "frg2p1ou", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "xyyx56nt", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rqnphp4g", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0dowhd0y", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "c9ety15o", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ys2ipxy9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1jug42dl", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4co457vu", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4fco8pek", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "55yf2fwh", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bfdrdcts", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "9xxitvc5", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "m5ljp3xe", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "b3yvwf4r", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "z4l1w13m", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "x0unnbz6", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "n79d916v", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "df23e6nd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "maad0z7e", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "r8oqh0i4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "grit3zqt", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xxvf346i", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "0vlo9qi1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7mbz055f", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "c8bma05o", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "n0fqk0ep", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "8zmfk968", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "62qgetwo", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "n5x9yp89", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "6vztpfw9", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "y5dhq1uo", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bd8onxbo", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "di2yc4e2", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dgim8v1e", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "m1q5w552", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "w8acyza9", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9lbvjpul", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "46zvdozc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ld09m7i7", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1k8pz70j", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "uvd3hshw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "n0ns0qx6", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "gmoc4a7w", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "t62x49om", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "f1nckk58", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0wb0xbna", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "7wsm2ftu", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "fpfyrmvg", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "nc0l2smy", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "m04bh6at", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "j1eaubv5", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "onmd2j9k", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kpzgx48c", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "e26neiec", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "muj15t0b", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gplsz0xs", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "76scirr9", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9vmm9o32", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "b478ebnh", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "sps4y4jf", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ppwoviz8", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "mvu1ea4f", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "m149feuv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "l9ojy46n", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "6gpuefpq", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ljooco8m", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "914xddn8", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "wc93c844", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4j4m8hsd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "yvbkakjq", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "59zjky2q", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "7fq64wim", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "e38sdqwt", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "evxv59lq", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "qfp1etpf", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "d2gv8k5a", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "n5hc0ym1", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "p91enr0p", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "i1kwm3lr", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "07jyoi4w", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "qjavhdqf", + "_$type": "HBox", + "name": "HBox(2)", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "r3uf4851", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "45eh0rac", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "almtm9rc", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "t0mgo06t", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "44nomaa3", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ngwiw8we", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ldp5uioq", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4iiyre6u", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "aoosahoi", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9l97cs14", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5pgo390i", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "4ijnepib", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "q5sh9npg", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dv104ukl", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "i4abutio", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "92swhx0a", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "fnvtur02", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sq7p4nhl", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "3ydst0qi", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "aqps6ntl", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "d9g3r93u", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "p3l59pc5", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "n7kqey2w", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "tukt1q58", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "cikr8qfp", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "g6flrhpt", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "y3ttpogt", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ssaupkfb", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ofjd3dzb", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "yuptmy1k", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ab70kzci", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1gm7k977", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5nw2o112", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "q0mstz2v", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "37r6m67j", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "a2shgolg", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "hbypo1rh", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ghfwy7qe", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "kio634bb", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "eajl9azh", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "9thgup4d", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2i2nekw1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fesp0bzr", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "th07v09y", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "au476vg0", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "g2u284ry", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6z0qxdbv", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "o9go2nz1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7i13443q", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "uk89r6oi", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "98qkk0vz", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ty9nrei2", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "f8iz9qy9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "itgo92aj", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "3vbjp3aa", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "z75qvjhh", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "4jdevscj", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "55sitq84", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3a8uusrb", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "r6hrvtqy", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "hc36pnat", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9cxhepgr", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "9u5rse76", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "tazo2ao4", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "z15t5qfm", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4ybk2ah7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vn5hbspi", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "k95tzoc4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "unuegbx8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "0orct1o5", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "4rf28oh0", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "nwl2bg5u", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "gkuwzm7z", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "xxvnwebv", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "iiz7ev5q", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "csfwvqde", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ig5hk27f", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ujxs2grg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "lxiq162i", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "jhddur51", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "aswu3eww", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "h9nxg149", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "in41qydn", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "tbbfcbkd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "av4lplgh", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "5g9bkciq", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "xq2hepcb", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hn059pvh", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "k0k6pd64", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "wyj32u9a", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nhnrhmqp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "jjzrpkn9", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "apy7ewyy", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "x1xzl38v", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "cq3cvmnc", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "2mz8i447", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "hflmg7qj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bm70el0h", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "zekqh6z6", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "roqpg0z1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fz6sgpoi", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "gitd7g01", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "f85tj281", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "264vl59c", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "iak9nbla", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "segl4d9e", + "_$type": "HBox", + "name": "HBox(3)", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "jfvuwg9i", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "4uz6f9kw", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "71hm1o2c", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "mw1hp1la", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "umv1shit", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "mhkcfzsq", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "tw8tgj22", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vaft6sfs", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "97woyn5o", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "62wabatb", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4asi9bbf", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qkwi25lf", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "8xy5bvqy", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dc7wtzwq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "4lm9oq1g", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "lvhj5g04", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "hdq5w7ni", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "c03uqq4r", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1zcvw2h4", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4tiz754l", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "urhug8ac", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ajam1zz9", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "mi7bjyu9", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1s91bzq8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "h63nza2x", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "5gy100t5", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "kz0gqseq", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nzq2mpyj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "fiw1zrji", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "25n9j749", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8a3edzzg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "mtr72iwc", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "x6c6n37o", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "orb20x4z", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "wqlf0986", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6tgcwyra", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "d8gef9l8", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "vy9rrd0j", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "0mybno7m", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "f5a8i3z4", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "1xg5rkox", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "lhpt92eu", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nf4afb3j", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6n43xz8l", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "roasthfj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zvfzdeyn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hr792jjv", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "go1nax1d", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "arw9ow1l", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "kui2hjsd", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "1tk4l50m", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "efu4w6fi", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "th5q6oyo", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5xxu9ors", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "yuau430m", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nab61485", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "pvozo490", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "j4xznsu8", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qxbucpzd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "dhnqjg1q", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "q3eqgrah", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "xab4jn3h", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fyirl228", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ezucj8py", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "148eyudt", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "s1konvkh", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "zcfpyvk5", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "gxqwbju4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0yr7eex9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "98llgswk", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hqh9ikce", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "45q5emuq", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "76c3bw2e", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "dr04ys1s", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "pg61ebh4", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "l5tobbv9", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "hdf3s0dj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "p1xsad5c", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "c7qp8dja", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "lbwmaoh4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vvv7wks9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "mqcaufjj", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "znjpz5bk", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ogtdpsku", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "4qt9nbni", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "rp6ian2w", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "vao50ksj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "n29w0qhe", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "yj0klzff", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "md9oueow", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "s3zcd76j", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "15oos9tq", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "v37ij8y6", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4fw8dmk5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "0xpnpdeg", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "qaufbv2p", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "hjdqkryg", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hh7wxjnp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "jjmtbdjm", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "f5l85ueb", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wbg5caix", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "umnbsosz", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "fkcung7r", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "tcy3g5oa", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "882hmtlz", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "ahf5szkm", + "_$type": "Box", + "name": "Box(3)", + "x": 696, + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "06j9mkgh", + "_$type": "Sprite", + "name": "Sprite", + "width": 354, + "height": 354, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(123, 129, 140, 1)" + } + ] + }, + { + "_$id": "7boezlqk", + "_$type": "Sprite", + "name": "Sprite", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(182, 186, 194, 1)" + } + ] + }, + { + "_$id": "j3hgd1gw", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "k0fffh18", + "_$type": "HBox", + "name": "HBox(1)", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "5zr9ze2l", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "1sr1han1", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "jtf3nqqf", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "n9sgn4oy", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "uni5j627", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "e9e4brng", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "m68spdt9", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8iouh6ab", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "3b7hspbe", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "kqxc828q", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ik2a0433", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2ydvmpnh", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "h4b51r46", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gmqzdpyr", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "k234vuon", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "pcwn4msq", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "as6vm0y9", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "tcg02urm", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2w2a6bb3", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "pgfp4w45", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6m9ipv8t", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7ejy3n0g", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "96z1bpyw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "38r2n6k1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "zit274fh", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "13p9z4j4", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "lxtus8fz", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4bl1a8q0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "975vbjo4", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "r5jtkb6m", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "r1xzp8lx", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5q0qkij6", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ckzqn3ly", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nxlx2qgk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "q5o2t8qq", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ssrzwip0", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "j1r35cqb", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "q0jy10u4", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "s3otjabv", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "lp6lecss", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "8lvqw3jj", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "umvh173x", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "h5u7h82m", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "47x4a7uq", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ta6xhcng", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7fog4pj7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0hn7yipe", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "h3f6dx5v", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bi8s6csj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "gxs0wxss", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "40ndmzd0", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "w6k48a12", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "uu23oj01", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "olw3qmg4", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "78s82i8z", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "znnv4xat", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "er7o3qqf", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ay6esrxn", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "goko23qc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "4abc70l4", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "tsu0jfv7", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "6lg2tyln", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "p7pv7qzz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "guqj8wne", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "do8ndlmx", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6r1iaz6r", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "38e47iul", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "g1todqwm", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "krcbf8wr", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "l7w5t93e", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "fhh9viyc", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "93fdzocw", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "a20k2glg", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "r60rrgh7", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "o7xm326t", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "1zse8088", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "sz31kno3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0tso1lgt", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "h05jt065", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "zmgpnmm5", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5yxqimnt", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hp1ynl9u", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "fgyu112m", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sp7b2h2z", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "caogt9hh", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "hxx7d09t", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5qnb8bg0", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1vkslut0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "yrk2sfmq", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "0yuehod6", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3shexep6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "or5l96g4", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "w8o6wekd", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5ctbm3yg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "ankz5thi", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "448mg0pr", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "tltzm9a4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "mq5vuxrc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "f4eunih3", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "dw3e88bg", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "lkwkd2s8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "w29aazl1", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ti9fo6pr", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "it0xjq3l", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "ei27k9s2", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "lrjl4rta", + "_$type": "HBox", + "name": "HBox(2)", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "2xs0wml4", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "ba3rlr95", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "6uhzxf70", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "p6okm1w1", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "vk8c20kg", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "wj3tv9rm", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4bfqv7yd", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "880dqdsg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6fsaiixw", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "hp3gvurq", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "z25b3zxv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "3iebkruo", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "qhdks38k", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4hra2y3b", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "jsm4gpqn", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "45nn749r", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "cvz6eqip", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zunm3rxy", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "r7kz28ww", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "h24fsq6e", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "e2hcdx29", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "3jg0it3b", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "8ffwsz5t", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qdy88mej", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "mexlli3c", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ln6kvpie", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "6witfbrk", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2nfdskzs", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xhqh51y9", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "pxp4ih2x", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ey6dxytc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "i3uj2y0j", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "lgrw4koy", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "enflk5fl", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "mwtpct3q", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "56fg5vbc", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "fnnf2qgz", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "u3yc00nf", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "sfkhnda7", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "i5egq212", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "z2exic1u", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2kgwgch8", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "utah7cp5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "o9rl0oe6", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "fpxfh14f", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4i2i2f66", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "a5h91as6", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "bqehb5xw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "o5zxh1so", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "n7yafimq", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "msja5a7d", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "z5bnatgf", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6jch39go", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1sh8aa5r", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "rxxqosli", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5ee5e71w", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "27s13qk8", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "3glbgaz8", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "l9b7bgy5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "s0ajr0vl", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "kqoqa3a5", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "hw7nqerw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1c6naznp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "otddmrnv", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "khnae2yi", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jqmy36p9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "r58wgdej", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "h76a1bv4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "lrfmnu20", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "4vq8u32i", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6to8jw0l", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "s7cne56q", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "s2zradng", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "2omx5mas", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "2exiydrm", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "mhsjhnrw", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "my47on6l", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sffs77kw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5rp71l74", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1yrw459z", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vfec83zk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "kjdogsc1", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4ngi94yt", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fv0xl635", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "cnfqcz4g", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "jf5jhd1v", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "r9qtffo3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "s5yfnggi", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "fs9omrfa", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "keetg5vs", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gbtefkhx", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vob0gse1", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1wg1ydr4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "51zgpmag", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "1eb8u4w0", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "mfnb3ax0", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "rtzkoku8", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wpxfpuys", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ikhzcxjv", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4jnkbicz", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nxy6rbu6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xzy81j73", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "wlcttv9h", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7mawmch5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "bhnbqfsv", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "va639q59", + "_$type": "HBox", + "name": "HBox(3)", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "q38n6ycr", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "girkkp25", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "gfh3yqtl", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "sebfsqlj", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "tpu7lpw4", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "wuf51we9", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "qqme9egb", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ttxi0dwa", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qq07xh19", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "zbtmexws", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "pu2nc70w", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "klo8b42r", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "kc4did8e", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "y0asjgnj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "ntl0jqs4", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "qrmrynav", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "fjq8kd9h", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ggyqtjqh", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "rhk7vpdi", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "xkn59mew", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "koxq26wl", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ihffptbo", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "mlphej7c", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "pplnbt01", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "dsa8kq7k", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "oq4gyw1i", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "smjr7r0d", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qmmmvwp6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "oevt3uot", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "fkvotvfz", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "you0q888", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "93zmy27x", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5311vloz", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "52osx428", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "wvrorsfy", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "t8mngf81", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "p8v03hrt", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ef0hio9c", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "xwedtg7p", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "2dev4wwl", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "lpf95378", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "l7a1e1zx", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qzkeckwc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qrnhf9k6", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5re6iw0x", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "oubblicy", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7nsfq5xj", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "3wtdivks", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "53eitmqf", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "seufze2f", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "62sbchlx", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "gisloc18", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "io4zx1eu", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "wleygfsh", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "hw002q8n", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "htm0ujoo", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "50k30yi2", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "8sbinymr", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rs8ik5nj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "hpdnut8i", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "dhtr9um0", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "tl325q3x", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "spqcg701", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hng0qxdq", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "rei0f1lj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6d376sqj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dytfjux7", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "49qcuvs7", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "m8ambw8a", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "39j7nt8k", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "kytcy3ig", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "rd4t9b63", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "dwgi4uva", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "hi50sg61", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "m6smcsxy", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "v7h192uy", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "uii8umhs", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "e3tvmyyj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "gs8z4xv7", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "k1cn9g4m", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "pizcend6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "l6ssefkr", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1w8i422e", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "w8snpluq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "tbmwelr0", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "zh08v3zp", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "vi8ud60g", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7cdvyz56", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "rxy6vcnl", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "lm1bgkfd", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hjmoh0h9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "znbheym3", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "sg07mnj6", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "q1xoinel", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "4yh0im2t", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "88a5z3wi", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ig7jrl9v", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rtdhdk1q", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dj9b9wip", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "mziwvbyo", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4qhz5k03", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "gf3pyb5c", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "3f8m7bdp", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xo2i5oxe", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "62w706yr", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "vxbt2deu", + "_$type": "HBox", + "name": "HBox(3)", + "y": 696, + "width": 1050, + "height": 354, + "centerX": 0, + "space": -6, + "align": "middle", + "_$child": [ + { + "_$id": "okud56l7", + "_$type": "Box", + "name": "Box(1)", + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "o7lvw3jw", + "_$type": "Sprite", + "name": "Sprite", + "width": 354, + "height": 354, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(123, 129, 140, 1)" + } + ] + }, + { + "_$id": "yyeeq7sx", + "_$type": "Sprite", + "name": "Sprite", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(182, 186, 194, 1)" + } + ] + }, + { + "_$id": "z6c6lnu8", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "uggsnkgr", + "_$type": "HBox", + "name": "HBox(1)", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "x0gspicz", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "6mr7j3z1", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "2gwmds5f", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "1iwtmzpf", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "v5t5vq26", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "3gia62v1", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "lrbvzhid", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5ggm0mh9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2glhuk9f", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "haruma0s", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sg6u17bt", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "t6bp26dk", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "n69c4mdw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "mam405fu", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "70nnzcju", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "795o2nfp", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "xkh814g3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ppj1t328", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "c4sorjsl", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "nk8fnop6", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ni1cvjdc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "e06ra9cq", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "vv624oqi", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ha9dgwqd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "x5zynct0", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "zwe0zpxo", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "pgmsxua5", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "n5738fxq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "j6yc21lm", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "c9k0cyls", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "etal169x", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0znozvsp", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "z2kc7icj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "w3dgn204", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "hyrcodbx", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "cupkg0j7", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "wuym2wcl", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ymplpscf", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "cf1bxeii", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "f2tnf5jp", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "8da9h26l", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "zftgzq96", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "womv4xpa", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "h4z630oz", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "529w4xnx", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "k4fhro25", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bh5ydt8u", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "zqneddex", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "lkb0wcz5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "g3g8t7dc", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "e5jhj18j", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9n8b7zfl", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "e2imiupk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "sms4w2vp", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "os3b3vd7", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vgu2q9g0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0y2qdi79", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "nm30fj4p", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2yp2a09k", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "xv93nxa1", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "h4hs82w5", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "dgmg6oio", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "whrkruz4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "fai590w3", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "vurpd63m", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "y2h1oezd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "s0o4mtnj", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "lotmwlmv", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7wi5lp5x", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "lvvutl6y", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "zk0rnkb8", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "g2q87rao", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "5ccteekr", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "fr9dz6ir", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "cj758w2q", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "cag3bheq", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "c47wv6ae", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0z82lepk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "8h3d69wq", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "t576xx1s", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xhhn4q4q", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "appksqhl", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "0zq4ifcq", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4642g350", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "tjdf2jck", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "g8fqit9o", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5za39phy", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "oysgsoh9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "gutcddht", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "lds61t27", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fzft5z2e", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "j5x5rysf", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2jzlg5ri", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kybyjqro", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "di3731zq", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "svdeielm", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "n90xayat", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "954p8lvw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "jl15jnzc", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "u8ebcjye", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "f6vpt3in", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "quf33jju", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "26zw5k2f", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "uz26fd42", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "oytmvhke", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "dl543hac", + "_$type": "HBox", + "name": "HBox(2)", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "g2gbhfm8", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "a97zkhkj", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "aicitmtv", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "3ivui83c", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "vioilmme", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "jnxxoffk", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "thykci8w", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vftgmgs7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ixp6xn7x", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "elcd2ebh", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "55rd4vec", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "93ij5wqt", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "7eym48sf", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7etg3psd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "t8rpezgj", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ufd3g4sw", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "adnkf5h1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6nv84a20", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "yaqsuomq", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "54raa9jw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6ptezy62", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "h51v61jf", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "cznh1gn8", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "pqnwd1ke", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "l8ds50he", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "w8opbvqu", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "8qgatjsx", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0t3mqtke", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "i2e0446y", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "upulbxk4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vpzmfyk3", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "a9da72p5", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "aay1vdnd", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vfzo3q48", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "rtf1pod0", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "tkjxywtz", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "f40zxc2h", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "2zv7ij68", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "4h1itp08", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "oppkne4c", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ummkc26g", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "nw5s9pue", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "doqinkgo", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5w8xmg3r", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9rfa81er", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "avg6ax5m", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "8zn2q3do", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "za2syay0", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "we4yzekn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "xfbxani1", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "6dngz7ar", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "0tay4jvm", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "mosn2v4a", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ne092tff", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "cjqkpx4z", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "djwzwkt1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6y2cq9vw", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "q3zupxxl", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "uwl47n5v", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "gsqk9wpr", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "2sxnatmg", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "aixm3nus", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gz28yqkf", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ruhpv34a", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "rc6wlzuf", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "51ie5lsw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "l265z3ij", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "r04deise", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zkjhiu2a", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "nrffhyrh", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "3zkippzs", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "6ah7qamy", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "7adr16s0", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "nnynj4gs", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "24wt73ow", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "1kwl9l54", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ryin3g9z", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "epk1dt9i", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "p08glf33", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "080oyzhs", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "y032y597", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "4ctkh6h9", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "685hcros", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "yi4787wg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "tecvl9qf", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "cgjwl394", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "qvxqmj8p", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "w1k4hdwn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dd0jrtv0", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "x3z4ep1e", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "casgdsxm", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vfek8fea", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "nfru6x1b", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "yt51am05", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "43yynkon", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "z5nzqajj", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "c67d0wop", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "436xa84k", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "27lcxeke", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "tr7y4arg", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "uqdnuyta", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "3yczl8m5", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "70h7tgko", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "itosvw38", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "bfcxgq7d", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "7f6xrhwi", + "_$type": "HBox", + "name": "HBox(3)", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "m94scm9y", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "t9hq74ox", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "v4tsreew", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "z7oo42id", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "pp1whvnt", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "07aialay", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "yv5dzgbh", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jsx0cnge", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2903lg7r", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "m4onx6wv", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wyyskse0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "mdi47hvq", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "rwyo3yu5", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "56ckkdaz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "yry3yn1x", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "wenq6ot0", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2zsljt0t", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zrkczkxj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vrj10rmi", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "tszkby2k", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "9idhxtyo", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "8l4n91j8", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "3pes9p9s", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "y698xhno", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "muws0xas", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "1beelee1", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2ck17vur", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vnj2noq1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "a27nzj6y", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "8wnivt4u", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "t1ze12ni", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "4bypnxng", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "6ign7nl9", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gnix4mcx", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "6x46s36l", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "psme7ifm", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "f4g442l3", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "s9nzqn58", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "qmq7vtto", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "d2gj3la4", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "fp3llajz", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "y3xevn13", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nk5b811z", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "klels4s7", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "aqmnui28", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "j39fmz1h", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "b9c2s3zg", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "gvmu7pu7", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fm98a22o", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "e7zj7jxc", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "cxq4up82", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "pxhflx8z", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "r9zhxqip", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "macgvcme", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "qu9e2ez9", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "e4ctd7ua", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "pb64tqj2", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "n70dsnql", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "90so4rmv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "v4nyjctr", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "g4nh2cvv", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "jj122d6w", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vyd6tfb9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "p4ag3iud", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1q7zx3y6", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vbk2ip43", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7kcpzj6q", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "wd4bujn3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "cf31imyd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "n2b4go65", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2gdmnsf3", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "w7u4978x", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "dbzpf4bt", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "hnt6r0me", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "tqpirx9k", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "xredllj6", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "kzobangh", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1gy03ci6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0qziyt4l", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "mi7053ph", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xgxkgs75", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xemaej2g", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "7qhy5gyw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "47oj4r86", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "bzvjlotx", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "jpfdbr2w", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "huxlvfp3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "iaqxtuyl", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xf251t5g", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "k84ebbai", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "iv2mv3g8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "yrdgi0jo", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "346o2c17", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4ll849wk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "tg4ehkj8", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "wjjdcrbq", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "lwr5n7zt", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2qdpe5o9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "9icwe4rm", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "17xjsyai", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "svjw45ko", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "l1z75pul", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "hlzw84ip", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qy9a8jdn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "2vfgmtzf", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "kxxzovss", + "_$type": "Box", + "name": "Box(2)", + "x": 348, + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "n9fxq1wd", + "_$type": "Sprite", + "name": "Sprite", + "width": 354, + "height": 354, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(123, 129, 140, 1)" + } + ] + }, + { + "_$id": "5n8w4fkr", + "_$type": "Sprite", + "name": "Sprite", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(182, 186, 194, 1)" + } + ] + }, + { + "_$id": "tokaguhm", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "xfwahlkg", + "_$type": "HBox", + "name": "HBox(1)", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "dr9d1fwr", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "xz0un1mz", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "xpjs0jio", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "lt2zf60m", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "ko8oiexd", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "9fp96nyu", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "wc2wm1pj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "r4oox4cy", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "3fn201ev", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "aooqjmuh", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "875tn1m5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "t5b24pv3", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ynlveugw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "cc2pq34d", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "jx7whfzx", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "dpswicw7", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "d129oxvp", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "y2u1exjn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2r28jcpa", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ixz9bud2", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fl8yz6jd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2cm6xftp", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "z9ytloaf", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "mhrj1e79", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "pf24x09j", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "qnn83z3n", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1fwukwjg", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "m791q1gx", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "mqbj62j1", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "wtsym4jo", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bxbv2upe", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "d14xdgzc", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ybiionp1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "txtkswcz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "a9vt3ns2", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0zbhs5i9", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "rzqyl9it", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ny23uudy", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "nw9j0t3o", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "at00i9id", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "8qpkr596", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "cjoh5my5", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bodckx51", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "lij6ym07", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4nqjkfmy", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "a4w64z6o", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "wj5zbuia", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "igxbqihg", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "lcmhdpr9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "nmr7ukzw", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "75d7ry6r", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5pogss0u", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "odj9jzq9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "kl3rol49", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "6y9g4jrc", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "v8rlcjle", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vgv9snmp", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "a2sg75ik", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dsi5ekor", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "7a1w0kfc", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "0m9dz9gh", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9xhwr4dz", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "25nq5qdx", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "cmjyx2nx", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "sqis4e19", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "mpubmz5f", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vxpvxazo", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "j1mm5vv3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3qgyi7zv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "024os0tm", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ypey2ep3", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "nhxtct9e", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "5bcihvnn", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "q4p9dho0", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "qeorm7ma", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "38v33rol", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ixys9wu9", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5ifiuutk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1judnl4x", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "r14fi0v3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "b30zhd1o", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "wblsrjrc", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "z0ye2ojq", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ky5vzisn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "j9cbsf51", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "gnzm6pvu", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "p7ertmg4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "oz4adx4r", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7bhbnbyx", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "r7uhrapy", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0x4p1u13", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2lxff3s1", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "8m3bz2b6", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "klh8ydgc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "cj4ptc79", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "wdm6bsax", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "jrwdvr58", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vg9zzl31", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "l54xjk8g", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "apa1eji0", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4sayf05h", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ok3zj6yb", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "c0g1vter", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "knis2lw9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "xe2ajujw", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "t3a7m914", + "_$type": "HBox", + "name": "HBox(2)", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "8c5mx5iw", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "6flzc868", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ejhflt0v", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "gsiyubhw", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "arwjxare", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "nkqekil3", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "fyyjpq86", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qhoave6t", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "u9vdm42a", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "extqm4g6", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5gc1koai", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "f0swbqj8", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "g1iv2zpc", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "e64egnvi", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "ogr1ug3g", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "09zrqbbp", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "aaq0wp5l", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "n10rhkhc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "y12mkhtm", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9n9lq23o", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zlqbwyqz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bj2iipnc", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2zvxjb2g", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "tjwuu6bq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "2z8u6v5o", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "6pg6aa09", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "am8xn92c", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dla6hold", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "i4jf01x9", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "s3q3fkrj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "w0vzzg5f", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "9e5zt0i8", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ffdp7d6h", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4z6t50g7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "9izztwce", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "tlu0wodq", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "pa1i24br", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "m9o9enfe", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "l15527vy", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "uxgvhu45", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "87ezguto", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "xx6j9hfk", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "yk0m0uuv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bidvlr91", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9irc2cq9", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2vqed5n1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bm7wxvc8", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "offlmp2p", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ooho505n", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "s77ez37n", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "8linqvsm", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "84wbbwhh", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ztos0tl5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "3p138sn5", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "eipif1k4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "f22c1dqe", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "fybwnp1s", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "py8ng6qu", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kwtstx7d", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "5lqqdl0d", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ulbj7cbr", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "bz2mhsji", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jsjt9ur4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bkdtn7ma", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "7h4dv4im", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "re4m8d6u", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dwkwhmx9", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "w22dedsn", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "egh3zfam", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "h1mnmitv", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "09ipgcqs", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "l35p71o0", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "7fhp5mai", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "e6h2xb3f", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "buadw0ci", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "u6jg6z3g", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "s1kffys2", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nyirg7ru", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2bj6kfcd", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "2032x3zt", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8qz39ada", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dzbyf3em", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "jz7rpgai", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "y2n5p5jh", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "na74dv5z", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "b450ie77", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ltxohodv", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "euf7wx0f", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bu7ayvfk", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "xo1fujbp", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ck90c3l9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5tebmjau", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ff46lxd6", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "41ejd2wv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "jn7np5md", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "opcaebc2", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5vabb76f", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dtssx1h2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dgukcclp", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5k2yf6dx", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jiyzn452", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "43m68eof", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "b42em8b1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qxehpl9d", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "hx84o2x2", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "wf0thok8", + "_$type": "HBox", + "name": "HBox(3)", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "pt30bqco", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "skjji8if", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "divtqurx", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "7khflhjt", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "kbu3yco5", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "0z954ui6", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "uepclb4c", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "thk335ek", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bkeuxur2", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5keh5njb", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "yhy31evy", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "huk5msje", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "uhchoxu8", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "k0yklrrr", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "hsdjf35a", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "2v4gjdjg", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "tqa0iyls", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gqarqyo6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ohff116w", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4u28vbyi", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8gxspa5z", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bz0retdt", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "6b9xjhz8", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2zoqd5r2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "cw5s3qe0", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "wq22h4ok", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "nmfe9tbx", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "94is7cm6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "9r8m3jen", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "n47ps1dt", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3fth40a1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6zkbw0ft", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "kfpwd5zg", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ovivuvmk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "hugu7lh1", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "aut6g2uu", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "ztxe3u7r", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "r4st0i18", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "qphv0kpk", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "wnwtfy6j", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "2m5fnk5r", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "o3s16ndb", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5z043lql", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "wua0q6xb", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "r3u37tof", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dpfs781t", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "tcsphz4i", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "u8bfvs5x", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ybi8p4r5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "fx82ck0f", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ol0toa5o", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "87qlrjnc", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0vo8gw4f", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "r9ikaekn", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5u1hih9m", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jck1pj4k", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ow8wh8kb", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ahkbzkty", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zyo305em", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "g9t1xh9v", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "5x0ihvc4", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "u5clx62o", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "b5uxlzpf", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ufno71wa", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "d4m9hwmi", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4upbi6xe", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "rj2uonso", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4nmn28p0", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "v8rsu222", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "k8oaxixn", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "l99qatf7", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "p98l41zt", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "fdve4w90", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "3r7p85ru", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "i6ct3ffd", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "aexmsp0p", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "c70ei922", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "a812a9c1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "emcxhfm7", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ga1dhbis", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "g8xv5yqg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2xkdwxvt", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1ivicpjb", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ed8naa8r", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "lijhh9xo", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "3klfmguu", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "blfw5gs8", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kza3sefp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "e75r1qoj", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "g1rsw0pn", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "yiskbooc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "nnflpj94", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5ueefs0o", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rj4lmjni", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "3xe0tm6j", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "zv4a8gp5", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "0oqqtxa1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wh5jdbqa", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hivf3zdp", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "y0aokqpe", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "pog0qki7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "x7muvqdx", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "pyupue93", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rvnr7r7m", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "y9liolka", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "nzlkn5qe", + "_$type": "Box", + "name": "Box(3)", + "x": 696, + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "aysubxmd", + "_$type": "Sprite", + "name": "Sprite", + "width": 354, + "height": 354, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(123, 129, 140, 1)" + } + ] + }, + { + "_$id": "8agogq0n", + "_$type": "Sprite", + "name": "Sprite", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(182, 186, 194, 1)" + } + ] + }, + { + "_$id": "4xo7vdle", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "yfru91v0", + "_$type": "HBox", + "name": "HBox(1)", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "18jz023s", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "mg94xesr", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "7yo5awpj", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "0sb1zwvp", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "ycamvg69", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "oobn63s1", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9ybb91my", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "eiy13g87", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "kwqgiulq", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "jovi70os", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ctkv83na", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "15bqlhh7", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "kos067ho", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qfcque9f", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "9ka70zh3", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "zu0mxetc", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "yalhh15b", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6of5vakz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "68cakhni", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ztfvw600", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "icohvdfo", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "n9ttkr5z", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "kgpxp3go", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1z93b2cj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "zrm54lpf", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "45lbm85n", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5se72ojw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "awvs7zkk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7dmcf2c7", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "vy5830r7", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "aayv4li8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "r3dgxo2s", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "uhfmvdfj", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sr65uz9w", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "14beazgz", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "3g5iws1k", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "0z6r7lgm", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "fyqoiw87", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "q19sxyc4", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "s5gwer8q", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "c7m9s2jr", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "yxls0ydd", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "mfp0cnwk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dik8ajbc", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "18sdxrui", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xlkodswn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1qfn1g55", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "y94cim2o", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "c9vr7ojq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "ncvojtzt", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "rky8e8un", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "s8qkb00r", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4l6w35ao", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "l95dy3eb", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "zvs5igno", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nrs8p85a", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "rz1579l8", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4fsb7jcu", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nwth52zy", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "cq3t7ahv", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "oqunjm56", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ux1tvo3e", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ceoozhsq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7cbq4bb5", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "5vy381zf", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "yqzp8ln9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1a73bsnd", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "xs4v0979", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1rceyl30", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "1e136xh7", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6rnduazv", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "hgazc0g4", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "h8pn71g0", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "f8psm90u", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "064byind", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "j26mhpt6", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "9khyo3wb", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vmux9ogr", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "u02i95lo", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "r99pl3el", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "h5fuvx3k", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "p7qnptzb", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "pn2hg0ap", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zkzpgk2a", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "56x1wo9t", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "jq39py9t", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4rvokdsi", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2ihk8r6s", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vhz05hql", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "i9m7cfj7", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "p8d8ap4o", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "jn7fz4ml", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "zj4h711i", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ppfkwe9v", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "doqa89l2", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "7449p6vg", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "c3zxqj1e", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "k1hb61aj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "keqqhqer", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ydn81ub3", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "243arfej", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "eljh3ywr", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "jq4607yr", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "flsxeuyq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "9ccymmhg", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "jbps6px5", + "_$type": "HBox", + "name": "HBox(2)", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "yybqilz2", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "ftnwcgb0", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "3r4r24hq", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "lgz8dhoq", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "3lh6ezgf", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "gsfdr2h1", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "f3t8phf4", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hz060mb3", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "z9y1z66v", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "6l9w4rwy", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dr8tactx", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "wifx5g6u", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "hldtn0j0", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6dlub1lw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "geb1ml3j", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "5kg9bmkk", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "18xd6h9p", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6xc8ugp4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6x55zflo", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "yriqimbv", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8uef6gme", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "n6e5z8o7", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "t0w7o1tf", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "l9arntxk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "p08ghtio", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "vzpcx1t7", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "56gnh7w9", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dvp7paw5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qfoef4y9", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "zn4a4lrp", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "myvi62zx", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "4j9ym7s5", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "nspdbdxq", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "46z2wc8a", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "yr57d3xk", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "crp3c1h7", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "2s95s21z", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "msy16co2", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "uerkfr1r", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "qoxzhebe", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "sji5nmlj", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1aw21rle", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rski4re2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "amzxe5s1", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1v6xmq07", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jhxd9eln", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "riblbynf", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "kombq6fy", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "b37tx81o", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "lle3ozt8", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "gg4umpf7", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "8vjvtq05", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8y67niiz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "v93zwslw", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "b6zbnnal", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8viersyy", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "jp4xfoaw", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "rlkt4ysd", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "tod4qh5y", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "nle359zj", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "48fsj1yh", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "t2l9zo5c", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "amxltylf", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "26nmgh2p", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "i0jc73b1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vxqwwchp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "tbnagxjl", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "oirct4ys", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "r7qxs85g", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "v78rcz88", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "9h1jw0dh", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "pqs7ya1m", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "zh6pwhnq", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "chx0zvf7", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "tvj8o7ur", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "to3m4ken", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "mgbu0orp", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "cv8vwuy5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0kpu0at4", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "l4pwcr6k", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "9boi0jxk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "axq31blf", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "vjb3p17l", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sb7vkszg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "ysan08uk", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "6nat26m0", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "g7zl2u65", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "cltm8iqs", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5lxhepxz", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ufysoluf", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "z4ci369o", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "r60fp4m1", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "i45phs0a", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "maears96", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "bdik0pbr", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "m9e6xfeb", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "in508tqd", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1wczfdgn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "q1aafl6g", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "xniql0mw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gsc2prbi", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dargq5ww", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "lrqldjpt", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "n1f1r7oq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "mproru49", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "7shkzgql", + "_$type": "HBox", + "name": "HBox(3)", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "gwofn919", + "_$type": "Box", + "name": "Box(1)", + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "hob6zbr1", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "6jxjfoe4", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "d3d1zenj", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "k6q9gl87", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "08uyjwlk", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "dedv0at7", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wctx2xz3", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "zifz6hbv", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "soag1057", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "c12cn9o4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "51jyi3fm", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "yl5868c2", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "h2cd3kqc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "y9zgd477", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "hm7s42q0", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "a0fqa05g", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jvzupqpn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2ltsm5ci", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "fwy8uh5p", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xi37tukq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xzxkbbyw", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ko6f13gw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wb8hwlp8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "k2fji8f9", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "3o5l7iut", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "zu0wcun5", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "w1gtpq02", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "al9r7p6n", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "cms6odce", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wm7jop8x", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0ooccsri", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "847d4m1d", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bwzsexvc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "dxccds40", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ustff639", + "_$type": "Box", + "name": "Box(2)", + "x": 115, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "2zi5fq2l", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "9yueo6d4", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "erpjuu98", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "rx3ce71e", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ysoxb4av", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "b77wvun0", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "38tfjzks", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "tus8h4v7", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "fm7uq5gm", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "pod86g1p", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "n9mslqm3", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "3rdahkhu", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "92vtd8wx", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "9i0wgma6", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ejepsfmg", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "hq2iurgi", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "x28clgeg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "9buk4thl", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "c1wa0aqw", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "d5al7w5c", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "top0r4cn", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "luwqr7uk", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6rjo8o23", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "noe31wz6", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "bxn4sthe", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "zudy1i2n", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "l3pizbx8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "lh7cs8wy", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "gfymqg63", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3dw3b5js", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "20tp7kcq", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "ae8cci82", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "w081ge8s", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "81lpvp35", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "boxohgx8", + "_$type": "Box", + "name": "Box(3)", + "x": 230, + "width": 112, + "height": 112, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "lkyhal9u", + "_$type": "Sprite", + "name": "bg", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "13sob2qq", + "_$type": "Sprite", + "name": "Sprite", + "width": 112, + "height": 112, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "u7ddq4qd", + "_$type": "VBox", + "name": "notes", + "x": 1, + "y": 1, + "width": 111, + "height": 111, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "jic9euzy", + "_$type": "HBox", + "name": "HBox(1)", + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "6573hh3m", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "jmj6the9", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "oxregu1v", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "q4e8bnev", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "1h4auceq", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "teqy3uuc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "sdzflsw9", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "lvejx5lk", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5qampec4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "liw2g4mk", + "_$type": "HBox", + "name": "HBox(2)", + "y": 37, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "xi0wgo6w", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "l3vcbay1", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "uybv27oy", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "treyd4vy", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "x7spyi0y", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wvm3pvxs", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "t0opop7v", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "lvhyc6sk", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zkls1h3g", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "mbn8dj5w", + "_$type": "HBox", + "name": "HBox(3)", + "y": 74, + "width": 111, + "height": 37, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "kr2mheui", + "_$type": "Box", + "name": "Box(1)", + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "4n5pbbt6", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zxaoiy34", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "k443q162", + "_$type": "Box", + "name": "Box(2)", + "x": 37, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "kbfaxisz", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "v6g0l0ce", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qv75oe0t", + "_$type": "Box", + "name": "Box(3)", + "x": 74, + "width": 37, + "height": 37, + "_$child": [ + { + "_$id": "a180tvay", + "_$type": "Sprite", + "name": "Sprite", + "width": 37, + "height": 37, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8ayc46nv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 37, + "height": 37, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "vym622cf", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 112, + "height": 112, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 96, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "rebw0lhh", + "_$type": "VBox", + "name": "pos", + "width": 1050, + "height": 1050, + "centerX": 0, + "centerY": 0, + "space": -6, + "align": "center", + "_$child": [ + { + "_$id": "t0p1akmn", + "_$type": "HBox", + "name": "HBox_1", + "width": 1050, + "height": 354, + "centerX": 0, + "space": -6, + "align": "middle", + "_$child": [ + { + "_$id": "gsrm6y57", + "_$type": "Box", + "name": "Box_1", + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "7ht41we1", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "65snbk3n", + "_$type": "HBox", + "name": "HBox_1", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "7xnlh90u", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "rn0bv96n", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "2o468ctg", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "7k140axf", + "_$type": "HBox", + "name": "HBox_2", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "qs9af6d3", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "hsqa11je", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "tjocmug8", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "mhu4hbj1", + "_$type": "HBox", + "name": "HBox_3", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "7xxgcd1s", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "qqy5yv77", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "uayqfi0l", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + } + ] + } + ] + }, + { + "_$id": "fmzn6rcj", + "_$type": "Box", + "name": "Box_2", + "x": 348, + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "mt2hgf7c", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "itfcdiev", + "_$type": "HBox", + "name": "HBox_1", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "0aga5k45", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "1tvj6v8q", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "mdxyb4e2", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "0dgfg5k9", + "_$type": "HBox", + "name": "HBox_2", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "jxr84775", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "j78tt0c1", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "vz2bvo32", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "wnkstwc6", + "_$type": "HBox", + "name": "HBox_3", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "i0i3s1pl", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "6njcl6qf", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "id6hkifs", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + } + ] + } + ] + }, + { + "_$id": "8khsao5q", + "_$type": "Box", + "name": "Box_3", + "x": 696, + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "u486crrt", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "5ro190qa", + "_$type": "HBox", + "name": "HBox_1", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "9zw0hgld", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "j7brxf9u", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "yz66dgt6", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "zzilytb6", + "_$type": "HBox", + "name": "HBox_2", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "zi7d2mo2", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "yc18g38n", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "gzlw3pc0", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "81qdacbw", + "_$type": "HBox", + "name": "HBox_3", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "rtkaza30", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "y5x176ft", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "1zh8kl4d", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "ic9jtcl0", + "_$type": "HBox", + "name": "HBox_2", + "y": 348, + "width": 1050, + "height": 354, + "centerX": 0, + "space": -6, + "align": "middle", + "_$child": [ + { + "_$id": "likuiaf5", + "_$type": "Box", + "name": "Box_1", + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "6uytfet4", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "15h3y6ug", + "_$type": "HBox", + "name": "HBox_1", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "8u1tgdzm", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "06fvy2fq", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "i3rz7s73", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "9ebw3k6k", + "_$type": "HBox", + "name": "HBox_2", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "dngbvgp4", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "nozct3mo", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "xvxvntc7", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "bedmfkfw", + "_$type": "HBox", + "name": "HBox_3", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "zb5dcw3r", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "n7pq4do3", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "cc6s0s1b", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + } + ] + } + ] + }, + { + "_$id": "h74vyg28", + "_$type": "Box", + "name": "Box_2", + "x": 348, + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "tzgk088z", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "skqx1vbw", + "_$type": "HBox", + "name": "HBox_1", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "65endqai", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "stxt8dut", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "nbf03kgc", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "kpjpq5dn", + "_$type": "HBox", + "name": "HBox_2", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "yl3glkks", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "18lkg3c0", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "14jus9vx", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "bt9r3gnf", + "_$type": "HBox", + "name": "HBox_3", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "c6u1yqxb", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "tfs6qaue", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "7ot5muxw", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + } + ] + } + ] + }, + { + "_$id": "cdd9nnik", + "_$type": "Box", + "name": "Box_3", + "x": 696, + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "7et4ybg4", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "m4bflmu2", + "_$type": "HBox", + "name": "HBox_1", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "mzhmfkp7", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "4f50gc8s", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "hryv5gzu", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "sf9ztyvv", + "_$type": "HBox", + "name": "HBox_2", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "897mtxmy", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "chyg0zsz", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "a2coe85x", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "moenoaf9", + "_$type": "HBox", + "name": "HBox_3", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "hkrnmrzc", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "3gzsfp8g", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "tcf7ojrj", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "sdll4y3i", + "_$type": "HBox", + "name": "HBox_3", + "y": 696, + "width": 1050, + "height": 354, + "centerX": 0, + "space": -6, + "align": "middle", + "_$child": [ + { + "_$id": "i53dk5nb", + "_$type": "Box", + "name": "Box_1", + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "apbt55bi", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "p3mzl8b2", + "_$type": "HBox", + "name": "HBox_1", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "escj540g", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "wv27gbti", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "zp61s842", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "6gj3m8id", + "_$type": "HBox", + "name": "HBox_2", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "66qesw70", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "w72xhif2", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "argvvsho", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "val96srv", + "_$type": "HBox", + "name": "HBox_3", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "f7coycu7", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "u9dj335b", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "qri9vtjp", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + } + ] + } + ] + }, + { + "_$id": "dr01ayi1", + "_$type": "Box", + "name": "Box_2", + "x": 348, + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "x1038z3o", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "7xehugdt", + "_$type": "HBox", + "name": "HBox_1", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "2gg17hxw", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "esb7rxg1", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "fat46rkp", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "e8tyutcz", + "_$type": "HBox", + "name": "HBox_2", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "va4fop7q", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "v06rf1pq", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "avsibiyp", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "ootlan5z", + "_$type": "HBox", + "name": "HBox_3", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "fijfq2pw", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "wb7n4f68", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "p11ks5s8", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + } + ] + } + ] + }, + { + "_$id": "x5i2w0og", + "_$type": "Box", + "name": "Box_3", + "x": 696, + "width": 354, + "height": 354, + "_$child": [ + { + "_$id": "y7trz730", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 342, + "height": 342, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "4t7stzfy", + "_$type": "HBox", + "name": "HBox_1", + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "0s4d7dmr", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "4xde6t9r", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "df904n39", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "bdbtph0j", + "_$type": "HBox", + "name": "HBox_2", + "y": 115, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "gdu2o65n", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "siw7nz3w", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "0il6b7nz", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + }, + { + "_$id": "y3cw5ybz", + "_$type": "HBox", + "name": "HBox_3", + "y": 230, + "width": 342, + "height": 112, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "gqn81b7p", + "_$type": "Box", + "name": "Box_1", + "width": 112, + "height": 112 + }, + { + "_$id": "he7ideav", + "_$type": "Box", + "name": "Box_2", + "x": 115, + "width": 112, + "height": 112 + }, + { + "_$id": "1qjcoqeb", + "_$type": "Box", + "name": "Box_3", + "x": 230, + "width": 112, + "height": 112 + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "7qai1jdm", + "_$type": "HBox", + "name": "buttons", + "x": 91, + "y": 1432, + "width": 898, + "height": 192, + "_mouseState": 2, + "drawCallOptimize": true, + "centerX": 0, + "centerY": 568, + "space": 38, + "align": "middle", + "_$child": [ + { + "_$id": "uug6jz7y", + "_$type": "Button", + "name": "btn_undo", + "width": 196, + "height": 192, + "_mouseState": 2, + "skin": "res://08a05164-eac8-4773-8e7d-749e477f1ee7", + "label": "", + "labelSize": 20, + "labelAlign": "center", + "labelVAlign": "middle", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": false + } + ], + "_$child": [ + { + "_$id": "at2v2bn5", + "_$type": "Image", + "name": "Image", + "x": 56, + "y": 34, + "width": 84, + "height": 84, + "centerX": 0, + "centerY": -20, + "skin": "res://8cacbf45-5b2c-4ec0-ad94-5ca671b74d72", + "color": "#ffffff" + }, + { + "_$id": "5x56vbw3", + "_$type": "Label", + "name": "label", + "x": 48, + "y": 126, + "width": 100, + "height": 40, + "centerX": 0, + "centerY": 50, + "text": "Undo", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(84, 89, 98, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ll1f1ee0", + "_$type": "Button", + "name": "btn_erase", + "x": 234, + "width": 196, + "height": 192, + "_mouseState": 2, + "skin": "res://08a05164-eac8-4773-8e7d-749e477f1ee7", + "label": "", + "labelSize": 20, + "labelAlign": "center", + "labelVAlign": "middle", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": false + } + ], + "_$child": [ + { + "_$id": "nu0r4h4m", + "_$type": "Image", + "name": "Image", + "x": 56, + "y": 34, + "width": 84, + "height": 84, + "centerX": 0, + "centerY": -20, + "skin": "res://4870f053-9781-471b-a405-ea95b5318a98", + "useSourceSize": true, + "color": "#ffffff" + }, + { + "_$id": "pc0bjn7t", + "_$type": "Label", + "name": "label", + "x": 48, + "y": 126, + "width": 100, + "height": 40, + "centerX": 0, + "centerY": 50, + "text": "Erase", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(84, 89, 98, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "umtydjve", + "_$type": "Button", + "name": "btn_note", + "x": 468, + "width": 196, + "height": 192, + "_mouseState": 2, + "skin": "res://08a05164-eac8-4773-8e7d-749e477f1ee7", + "label": "", + "labelSize": 20, + "labelAlign": "center", + "labelVAlign": "middle", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": false + } + ], + "_$child": [ + { + "_$id": "nd653uaf", + "_$type": "Box", + "name": "normal", + "x": 62, + "y": 39, + "width": 73, + "height": 74, + "centerX": 0, + "centerY": -20, + "_$child": [ + { + "_$id": "bi09jj9a", + "_$type": "Image", + "name": "Image", + "width": 73, + "height": 74, + "skin": "res://18ec8458-52a2-405b-886a-f6441ed4f785", + "color": "#ffffff", + "_$child": [ + { + "_$id": "xikibn0h", + "_$type": "Sprite", + "name": "off", + "x": 45, + "y": -26, + "width": 84, + "height": 48, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "lineWidth": 2, + "lineColor": "rgba(255, 255, 255, 1)", + "fillColor": "rgba(167, 171, 179, 1)" + } + ], + "_$child": [ + { + "_$id": "sajob6jr", + "_$type": "Label", + "name": "label", + "y": 4, + "width": 84, + "height": 48, + "centerX": 0, + "centerY": 4, + "text": "OFF", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 30, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(160, 160, 160, 1)" + } + ] + } + ] + } + ] + }, + { + "_$id": "dflp9r4d", + "_$type": "Box", + "name": "checked", + "x": 62, + "y": 39, + "width": 73, + "height": 74, + "centerX": 0, + "centerY": -20, + "_$child": [ + { + "_$id": "cwaogbaq", + "_$type": "Image", + "name": "Image", + "width": 73, + "height": 74, + "skin": "res://3d714bdf-39fd-48aa-b29d-5c179abc1981", + "color": "#ffffff", + "_$child": [ + { + "_$id": "8gny6los", + "_$type": "Sprite", + "name": "on", + "x": 45, + "y": -26, + "width": 72, + "height": 48, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "lineWidth": 2, + "lineColor": "rgba(255, 255, 255, 1)", + "fillColor": "rgba(29, 92, 220, 1)" + } + ], + "_$child": [ + { + "_$id": "houyxe6r", + "_$type": "Label", + "name": "label", + "y": 4, + "width": 72, + "height": 48, + "centerX": 0, + "centerY": 4, + "text": "ON", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 30, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(160, 160, 160, 1)" + } + ] + } + ] + } + ] + }, + { + "_$id": "cplq65uj", + "_$type": "Label", + "name": "label", + "x": 48, + "y": 126, + "width": 100, + "height": 40, + "centerX": 0, + "centerY": 50, + "text": "Notes", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(29, 92, 220, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ox4vivq3", + "_$type": "Button", + "name": "btn_hint", + "x": 702, + "width": 196, + "height": 192, + "_mouseState": 2, + "skin": "res://08a05164-eac8-4773-8e7d-749e477f1ee7", + "label": "", + "labelSize": 20, + "labelAlign": "center", + "labelVAlign": "middle", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": false + } + ], + "_$child": [ + { + "_$id": "qgd1z6lm", + "_$type": "Image", + "name": "Image", + "x": 67, + "y": 38, + "width": 63, + "height": 77, + "mouseThrough": true, + "centerX": 0, + "centerY": -20, + "skin": "res://45de1954-6e2a-45bf-a9a3-aa9a684be816", + "useSourceSize": true, + "color": "#ffffff", + "_$child": [ + { + "_$id": "9t9m3cg3", + "_$type": "Sprite", + "name": "normal", + "x": 40, + "y": -26, + "width": 48, + "height": 48, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 4, + "fillColor": "rgba(29, 108, 220, 1)" + } + ], + "_$child": [ + { + "_$id": "la5q6qsc", + "_$type": "Label", + "name": "label", + "width": 48, + "height": 48, + "centerX": 0, + "centerY": 0, + "text": "2", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 30, + "color": "rgba(245, 247, 251, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(160, 160, 160, 1)" + } + ] + }, + { + "_$id": "jgwq47et", + "_$type": "Sprite", + "name": "ad", + "x": 40, + "y": -26, + "width": 96, + "height": 48, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "lineWidth": 2, + "lineColor": "rgba(255, 255, 255, 1)", + "fillColor": "rgba(29, 92, 220, 1)" + } + ], + "_$child": [ + { + "_$id": "6mgjiuhv", + "_$type": "Sprite", + "name": "Sprite", + "x": 17, + "y": 13, + "width": 21, + "height": 22, + "_gcmds": [ + { + "_$type": "DrawPolyCmd", + "x": 0, + "y": 0, + "points": [ + 0, + 0, + 21, + 11, + 0, + 21 + ], + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + }, + { + "_$id": "bmgjjptw", + "_$type": "Label", + "name": "label", + "x": 36, + "width": 48, + "height": 48, + "centerX": 12, + "centerY": 0, + "text": "+2", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 30, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(160, 160, 160, 1)" + } + ] + } + ] + }, + { + "_$id": "h9be7h1y", + "_$type": "Label", + "name": "label", + "x": 48, + "y": 126, + "width": 100, + "height": 40, + "centerX": 0, + "centerY": 50, + "text": "Hint", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(84, 89, 98, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "2gza421u", + "_$type": "HBox", + "name": "candys", + "x": 18, + "y": 1694, + "width": 1044, + "height": 180, + "_mouseState": 2, + "drawCallOptimize": true, + "centerX": 0, + "centerY": 824, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "hkwr5zr5", + "_$type": "HBox", + "name": "HBox_1", + "width": 348, + "height": 180, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "q28wl4du", + "_$type": "Box", + "name": "Box_1", + "width": 116, + "height": 180, + "_$comp": [ + { + "_$type": "067a5d3a-4d7c-48d7-bb01-db2682fd6c01", + "scriptPath": "../src/views/Candy.ts" + } + ], + "_$child": [ + { + "_$id": "7t9urq2a", + "_$type": "Box", + "name": "offset", + "x": 58, + "y": 90, + "width": 106, + "height": 180, + "anchorX": 0.5, + "anchorY": 0.5, + "scaleX": 0.97, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "of21uf84", + "_$type": "Sprite", + "name": "shadow", + "width": 106, + "height": 180, + "alpha": 0.12, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 2, + "color": "#000" + } + ] + }, + { + "_$id": "q8azzur1", + "_$type": "Sprite", + "name": "Sprite", + "width": 106, + "height": 180, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "l45k9393", + "_$type": "Sprite", + "name": "mask", + "width": 106, + "height": 180, + "alpha": 0, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#1d5cdc" + } + ] + }, + { + "_$id": "rt71t0d8", + "_$type": "Label", + "name": "label", + "y": 18, + "width": 106, + "height": 108, + "mouseThrough": true, + "top": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 108, + "color": "rgba(37, 89, 192, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(0, 0, 0, 1)" + }, + { + "_$id": "fermwy5m", + "_$type": "Label", + "name": "label_left", + "y": 126, + "width": 106, + "height": 36, + "mouseThrough": true, + "bottom": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "ngd1my51", + "_$type": "Box", + "name": "Box_2", + "x": 116, + "width": 116, + "height": 180, + "_$comp": [ + { + "_$type": "067a5d3a-4d7c-48d7-bb01-db2682fd6c01", + "scriptPath": "../src/views/Candy.ts" + } + ], + "_$child": [ + { + "_$id": "brcoxh8u", + "_$type": "Box", + "name": "offset", + "x": 58, + "y": 90, + "width": 106, + "height": 180, + "anchorX": 0.5, + "anchorY": 0.5, + "scaleX": 0.97, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "j17uau6w", + "_$type": "Sprite", + "name": "shadow", + "width": 106, + "height": 180, + "alpha": 0.12, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 2, + "color": "#000" + } + ] + }, + { + "_$id": "cqoohqke", + "_$type": "Sprite", + "name": "Sprite", + "width": 106, + "height": 180, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "97wlds67", + "_$type": "Sprite", + "name": "mask", + "width": 106, + "height": 180, + "alpha": 0, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#1d5cdc" + } + ] + }, + { + "_$id": "v0giry6y", + "_$type": "Label", + "name": "label", + "y": 18, + "width": 106, + "height": 108, + "mouseThrough": true, + "top": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 108, + "color": "rgba(37, 89, 192, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(0, 0, 0, 1)" + }, + { + "_$id": "y621von1", + "_$type": "Label", + "name": "label_left", + "y": 126, + "width": 106, + "height": 36, + "mouseThrough": true, + "bottom": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "en09hwtx", + "_$type": "Box", + "name": "Box_3", + "x": 232, + "width": 116, + "height": 180, + "_$comp": [ + { + "_$type": "067a5d3a-4d7c-48d7-bb01-db2682fd6c01", + "scriptPath": "../src/views/Candy.ts" + } + ], + "_$child": [ + { + "_$id": "e29g2tca", + "_$type": "Box", + "name": "offset", + "x": 58, + "y": 90, + "width": 106, + "height": 180, + "anchorX": 0.5, + "anchorY": 0.5, + "scaleX": 0.97, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "wm0lvbqd", + "_$type": "Sprite", + "name": "shadow", + "width": 106, + "height": 180, + "alpha": 0.12, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 2, + "color": "#000" + } + ] + }, + { + "_$id": "ayy8gusq", + "_$type": "Sprite", + "name": "Sprite", + "width": 106, + "height": 180, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "571qj2hn", + "_$type": "Sprite", + "name": "mask", + "width": 106, + "height": 180, + "alpha": 0, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#1d5cdc" + } + ] + }, + { + "_$id": "bqevjky8", + "_$type": "Label", + "name": "label", + "y": 18, + "width": 106, + "height": 108, + "mouseThrough": true, + "top": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 108, + "color": "rgba(37, 89, 192, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(0, 0, 0, 1)" + }, + { + "_$id": "c28w1mfc", + "_$type": "Label", + "name": "label_left", + "y": 126, + "width": 106, + "height": 36, + "mouseThrough": true, + "bottom": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "0ozke0lb", + "_$type": "HBox", + "name": "HBox_2", + "x": 348, + "width": 348, + "height": 180, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "4e726jlo", + "_$type": "Box", + "name": "Box_1", + "width": 116, + "height": 180, + "_$comp": [ + { + "_$type": "067a5d3a-4d7c-48d7-bb01-db2682fd6c01", + "scriptPath": "../src/views/Candy.ts" + } + ], + "_$child": [ + { + "_$id": "pos2nnjk", + "_$type": "Box", + "name": "offset", + "x": 58, + "y": 90, + "width": 106, + "height": 180, + "anchorX": 0.5, + "anchorY": 0.5, + "scaleX": 0.97, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "hua8oxg7", + "_$type": "Sprite", + "name": "shadow", + "width": 106, + "height": 180, + "alpha": 0.12, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 2, + "color": "#000" + } + ] + }, + { + "_$id": "k8u98c5s", + "_$type": "Sprite", + "name": "Sprite", + "width": 106, + "height": 180, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "guz17aax", + "_$type": "Sprite", + "name": "mask", + "width": 106, + "height": 180, + "alpha": 0, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#1d5cdc" + } + ] + }, + { + "_$id": "uujse3rx", + "_$type": "Label", + "name": "label", + "y": 18, + "width": 106, + "height": 108, + "mouseThrough": true, + "top": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 108, + "color": "rgba(37, 89, 192, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(0, 0, 0, 1)" + }, + { + "_$id": "zj4fx0ks", + "_$type": "Label", + "name": "label_left", + "y": 126, + "width": 106, + "height": 36, + "mouseThrough": true, + "bottom": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "3l7egbmj", + "_$type": "Box", + "name": "Box_2", + "x": 116, + "width": 116, + "height": 180, + "_$comp": [ + { + "_$type": "067a5d3a-4d7c-48d7-bb01-db2682fd6c01", + "scriptPath": "../src/views/Candy.ts" + } + ], + "_$child": [ + { + "_$id": "k8v7uteh", + "_$type": "Box", + "name": "offset", + "x": 58, + "y": 90, + "width": 106, + "height": 180, + "anchorX": 0.5, + "anchorY": 0.5, + "scaleX": 0.97, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "n4ivi3xw", + "_$type": "Sprite", + "name": "shadow", + "width": 106, + "height": 180, + "alpha": 0.12, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 2, + "color": "#000" + } + ] + }, + { + "_$id": "3thaqg2e", + "_$type": "Sprite", + "name": "Sprite", + "width": 106, + "height": 180, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "yfg69j2p", + "_$type": "Sprite", + "name": "mask", + "width": 106, + "height": 180, + "alpha": 0, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#1d5cdc" + } + ] + }, + { + "_$id": "hxxdfifj", + "_$type": "Label", + "name": "label", + "y": 18, + "width": 106, + "height": 108, + "mouseThrough": true, + "top": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 108, + "color": "rgba(37, 89, 192, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(0, 0, 0, 1)" + }, + { + "_$id": "zir3l4hj", + "_$type": "Label", + "name": "label_left", + "y": 126, + "width": 106, + "height": 36, + "mouseThrough": true, + "bottom": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "p9cc93cz", + "_$type": "Box", + "name": "Box_3", + "x": 232, + "width": 116, + "height": 180, + "_$comp": [ + { + "_$type": "067a5d3a-4d7c-48d7-bb01-db2682fd6c01", + "scriptPath": "../src/views/Candy.ts" + } + ], + "_$child": [ + { + "_$id": "fjg95vko", + "_$type": "Box", + "name": "offset", + "x": 58, + "y": 90, + "width": 106, + "height": 180, + "anchorX": 0.5, + "anchorY": 0.5, + "scaleX": 0.97, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "vj27pl4m", + "_$type": "Sprite", + "name": "shadow", + "width": 106, + "height": 180, + "alpha": 0.12, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 2, + "color": "#000" + } + ] + }, + { + "_$id": "p37xigfq", + "_$type": "Sprite", + "name": "Sprite", + "width": 106, + "height": 180, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "tdoxguk1", + "_$type": "Sprite", + "name": "mask", + "width": 106, + "height": 180, + "alpha": 0, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#1d5cdc" + } + ] + }, + { + "_$id": "r0f2gs7n", + "_$type": "Label", + "name": "label", + "y": 18, + "width": 106, + "height": 108, + "mouseThrough": true, + "top": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 108, + "color": "rgba(37, 89, 192, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(0, 0, 0, 1)" + }, + { + "_$id": "qr9apsuf", + "_$type": "Label", + "name": "label_left", + "y": 126, + "width": 106, + "height": 36, + "mouseThrough": true, + "bottom": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "oin98tt4", + "_$type": "HBox", + "name": "HBox_3", + "x": 696, + "width": 348, + "height": 180, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "gbbdmuso", + "_$type": "Box", + "name": "Box_1", + "width": 116, + "height": 180, + "_$comp": [ + { + "_$type": "067a5d3a-4d7c-48d7-bb01-db2682fd6c01", + "scriptPath": "../src/views/Candy.ts" + } + ], + "_$child": [ + { + "_$id": "pneow3ya", + "_$type": "Box", + "name": "offset", + "x": 58, + "y": 90, + "width": 106, + "height": 180, + "anchorX": 0.5, + "anchorY": 0.5, + "scaleX": 0.97, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "ifs0uzd2", + "_$type": "Sprite", + "name": "shadow", + "width": 106, + "height": 180, + "alpha": 0.12, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 2, + "color": "#000" + } + ] + }, + { + "_$id": "vjdmod0m", + "_$type": "Sprite", + "name": "Sprite", + "width": 106, + "height": 180, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "lhm0pmku", + "_$type": "Sprite", + "name": "mask", + "width": 106, + "height": 180, + "alpha": 0, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#1d5cdc" + } + ] + }, + { + "_$id": "ih55fals", + "_$type": "Label", + "name": "label", + "y": 18, + "width": 106, + "height": 108, + "mouseThrough": true, + "top": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 108, + "color": "rgba(37, 89, 192, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(0, 0, 0, 1)" + }, + { + "_$id": "ficsu9x3", + "_$type": "Label", + "name": "label_left", + "y": 126, + "width": 106, + "height": 36, + "mouseThrough": true, + "bottom": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "o8jq7ewl", + "_$type": "Box", + "name": "Box_2", + "x": 116, + "width": 116, + "height": 180, + "_$comp": [ + { + "_$type": "067a5d3a-4d7c-48d7-bb01-db2682fd6c01", + "scriptPath": "../src/views/Candy.ts" + } + ], + "_$child": [ + { + "_$id": "p9i6n9r8", + "_$type": "Box", + "name": "offset", + "x": 58, + "y": 90, + "width": 106, + "height": 180, + "anchorX": 0.5, + "anchorY": 0.5, + "scaleX": 0.97, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "hnzo55w1", + "_$type": "Sprite", + "name": "shadow", + "width": 106, + "height": 180, + "alpha": 0.12, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 2, + "color": "#000" + } + ] + }, + { + "_$id": "wbwaacoq", + "_$type": "Sprite", + "name": "Sprite", + "width": 106, + "height": 180, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "4tm1i91o", + "_$type": "Sprite", + "name": "mask", + "width": 106, + "height": 180, + "alpha": 0, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#1d5cdc" + } + ] + }, + { + "_$id": "1i305duo", + "_$type": "Label", + "name": "label", + "y": 18, + "width": 106, + "height": 108, + "mouseThrough": true, + "top": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 108, + "color": "rgba(37, 89, 192, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(0, 0, 0, 1)" + }, + { + "_$id": "nkbu239a", + "_$type": "Label", + "name": "label_left", + "y": 126, + "width": 106, + "height": 36, + "mouseThrough": true, + "bottom": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "jen0410h", + "_$type": "Box", + "name": "Box_3", + "x": 232, + "width": 116, + "height": 180, + "_$comp": [ + { + "_$type": "067a5d3a-4d7c-48d7-bb01-db2682fd6c01", + "scriptPath": "../src/views/Candy.ts" + } + ], + "_$child": [ + { + "_$id": "74dlfvuq", + "_$type": "Box", + "name": "offset", + "x": 58, + "y": 90, + "width": 106, + "height": 180, + "anchorX": 0.5, + "anchorY": 0.5, + "scaleX": 0.97, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "a290qi5v", + "_$type": "Sprite", + "name": "shadow", + "width": 106, + "height": 180, + "alpha": 0.12, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 2, + "color": "#000" + } + ] + }, + { + "_$id": "ehs2890y", + "_$type": "Sprite", + "name": "Sprite", + "width": 106, + "height": 180, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "cluhx0lq", + "_$type": "Sprite", + "name": "mask", + "width": 106, + "height": 180, + "alpha": 0, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#1d5cdc" + } + ] + }, + { + "_$id": "jrwg0ptn", + "_$type": "Label", + "name": "label", + "y": 18, + "width": 106, + "height": 108, + "mouseThrough": true, + "top": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 108, + "color": "rgba(37, 89, 192, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(0, 0, 0, 1)" + }, + { + "_$id": "59ui7nxa", + "_$type": "Label", + "name": "label_left", + "y": 126, + "width": 106, + "height": 36, + "mouseThrough": true, + "bottom": 18, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "n15hk529", + "_$type": "Box", + "name": "mask", + "width": 1080, + "height": 1920, + "visible": false, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "8214n7z0", + "_$type": "Sprite", + "name": "Sprite", + "width": 1080, + "height": 1920, + "alpha": 0.8, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(245, 247, 251, 1)" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/shudu/assets/resources/Stage.lh.meta b/shudu/assets/resources/Stage.lh.meta new file mode 100644 index 0000000..0f4fec9 --- /dev/null +++ b/shudu/assets/resources/Stage.lh.meta @@ -0,0 +1,3 @@ +{ + "uuid": "bae98974-374e-4392-be0f-9ac62ea2fec7" +} \ No newline at end of file diff --git a/shudu/assets/resources/Stage_H.lh b/shudu/assets/resources/Stage_H.lh new file mode 100644 index 0000000..07e8e13 --- /dev/null +++ b/shudu/assets/resources/Stage_H.lh @@ -0,0 +1,41884 @@ +{ + "_$ver": 1, + "_$id": "lc9zir3f", + "_$type": "Box", + "name": "Stage_H", + "y": 120, + "width": 1920, + "height": 960, + "_mouseState": 2, + "top": 120, + "centerX": 0, + "_$comp": [ + { + "_$type": "692a672b-2457-456c-8093-321ea7a10e1b", + "scriptPath": "../src/views/Stage.ts", + "btn_back": { + "_$ref": "qegjy7c7" + }, + "btn_new": { + "_$ref": "zz4k3kw6" + }, + "btn_pause": { + "_$ref": "xl8gtdmx" + }, + "obj_mask": { + "_$ref": "9y0dq6th" + }, + "label_score": { + "_$ref": "dtn5odr9" + }, + "label_mistake": { + "_$ref": "h1knlkx4" + }, + "label_name": { + "_$ref": "94567dc2" + }, + "label_time": { + "_$ref": "luw2dbbj" + }, + "obj_blocks": { + "_$ref": "8sg7r0h4" + }, + "obj_pos": { + "_$ref": "xtilafge" + }, + "obj_candys": { + "_$ref": "fmnkhvuy" + }, + "btn_undo": { + "_$ref": "5tjil58p" + }, + "btn_erase": { + "_$ref": "1no6qk11" + }, + "btn_note": { + "_$ref": "yypi883c" + }, + "btn_hint": { + "_$ref": "d5ez89m6" + } + } + ], + "_$child": [ + { + "_$id": "m33oplxr", + "_$type": "Box", + "name": "left", + "x": 48, + "y": 30, + "width": 852, + "height": 852, + "_mouseState": 2, + "left": 48, + "top": 30, + "_$child": [ + { + "_$id": "8sg7r0h4", + "_$type": "VBox", + "name": "blocks", + "width": 852, + "height": 852, + "drawCallOptimize": true, + "space": -6, + "align": "center", + "_$child": [ + { + "_$id": "yfwdy6td", + "_$type": "HBox", + "name": "HBox(1)", + "width": 852, + "height": 288, + "centerX": 0, + "space": -6, + "align": "middle", + "_$child": [ + { + "_$id": "tf9s77k8", + "_$type": "Box", + "name": "Box(1)", + "width": 288, + "height": 288, + "_$child": [ + { + "_$id": "z4pr3k04", + "_$type": "Sprite", + "name": "Sprite", + "width": 288, + "height": 288, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(123, 129, 140, 1)" + } + ] + }, + { + "_$id": "th1a5x09", + "_$type": "Sprite", + "name": "Sprite", + "x": 6, + "y": 6, + "width": 276, + "height": 276, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(182, 186, 194, 1)" + } + ] + }, + { + "_$id": "axt7uas1", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 276, + "height": 276, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "0u4e5cnb", + "_$type": "HBox", + "name": "HBox(1)", + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "vsyln5mn", + "_$type": "Box", + "name": "Box(1)", + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "12rfote9", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "x6z9ktl3", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ds52ss48", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "4t03imdc", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "yw406v9u", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "17erqkcr", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1coa8d76", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7ir8vd56", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "8hss09xq", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "84o48q8w", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5zdmqgos", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "jcmn06mq", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xic1c83l", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "ghw26syf", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "4sx1n37t", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ydijg0iu", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wkkx509v", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "gb4iprps", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "fnvtuf9e", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1ly75gmc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "gp0q2zo3", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "pxw7vwoh", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "73wtoy0y", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "srk806iw", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "w2gt7rgz", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "lt3o0bz5", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "m0lbwhw0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "k8ckdwmo", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "n4g1s9s9", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "802lbofa", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "su3pg6az", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "r0fchrn1", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "md5214pj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "dpqw6pgr", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hb3eqs1d", + "_$type": "Box", + "name": "Box(2)", + "x": 93, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "wts1lpvo", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "q2rubyhr", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "movnb09o", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "qmgio688", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "kb2sofhe", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "0la8iw0g", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sbwvnhm9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vr65id9s", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ruk64t5j", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "j2y2ck43", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "g39aybpr", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "h99o8g7e", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "70pbpa1g", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "nrb8wckm", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "v3abf33f", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ybj3d9gz", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ek73761e", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "jhlpe7ve", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "cm8qvezt", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kvvefgyo", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "f67npeq2", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "98migdwd", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kz69xbdi", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "qrjvqb2a", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "scfm1rlv", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "smkesva4", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ycij1ofp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "d6snyl5z", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "bxicwtu3", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5h6dr9w5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2h16c6wq", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "k9yz5dcj", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "k9xq2ibo", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "3hyl0n3u", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ked0bbbo", + "_$type": "Box", + "name": "Box(3)", + "x": 186, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "th9s6s6u", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "kgrnpg60", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "zrtg9mbn", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "fh6fd1ch", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "apzgorks", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "rz8yqd87", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "umsag7vh", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5lo97sjj", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "wnq5pmvz", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "przcyt0w", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "kvxz94gl", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "qy3fjvss", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wppqv4ff", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "if5zimqt", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "qqri38ix", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "n8odwjsh", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "410cvoyv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xivmzsqm", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "apz7qnjs", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "t7zxgh5k", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "lqd2nyh3", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "4bv3wsnp", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "iqru5lmv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "3cdlrf10", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "7xn708wb", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "a3dmer0g", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3s7rza7z", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qltsyc3y", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "mqr31g8g", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "s4a9z834", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "gdu2vet8", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "0rinkpr4", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "a2nwqls0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "g60ttqh1", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "c1scdvz8", + "_$type": "HBox", + "name": "HBox(2)", + "y": 93, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "79yx4h4p", + "_$type": "Box", + "name": "Box(1)", + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "p07z34sr", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "p2kxacb1", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "hr7k43cc", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "jbppacxl", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "9zw0d919", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "f21rphnd", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hn7a425p", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "mueh6znp", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "5t2v2664", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "l2yo2ly4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "gughpeoy", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "xkucpwng", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6p59l4m9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "zbw3akih", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "1dp7jv4k", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "b2q204m4", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4imcm5ze", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "q4ctjdam", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "17z6y2a9", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jnqcgicn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "mp821of2", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "wlkhr5cd", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "z1nh4rb6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "4vldt62v", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "478muoa0", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "f9yu6qwe", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "z0qw3mvw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "yrx5m6hs", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "3vmyxyfv", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8y2ytkks", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5g6mg1vf", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "v94c76kb", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "lt21ij4g", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "336x7fyh", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7xn7e85w", + "_$type": "Box", + "name": "Box(2)", + "x": 93, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "f502noko", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "d52h1iip", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "vf48b7t8", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "6oess95x", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "idp20vqf", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "v6eyvpfd", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "a4u66732", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "jhku22p9", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "tqh5zpwl", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "a4b9y4k6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hxnhcvmi", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "45az26fp", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qe42j0sg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "tw00xat5", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "4fpii46m", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "mvujd2pg", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0vssx1bz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dkvcvvcj", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "crnxocw9", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rmxrmgvc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "z33uxlo6", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "mcqa09sw", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "yf6zi9yy", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "x34blb0n", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "txveop4t", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "p3nq7umy", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "g7vfe9jw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1u625cge", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "i4z9j455", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "lqq0j7ip", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "iobx93o8", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "5xzonz1r", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nrl17h3m", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "elefb5yb", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "s5y25juj", + "_$type": "Box", + "name": "Box(3)", + "x": 186, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "p8au5hb7", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "xjwxh4xj", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "krrtntmu", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "n5e4vkdv", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "d4364als", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ob7c0iki", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "naa0fr82", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "y9wmtiky", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "d3oz67aj", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "28w7the4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "e5mx6hnf", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "si9gq7wy", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "b7do8q8g", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "1vxx5r7j", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "iqdbetgn", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "g1fnymfc", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vfmtmazp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xhdjid01", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "4b3uzs3s", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ciub9ryo", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "66s4fss9", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "4hhzhssj", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "75ikdjnw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "esicq30g", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "8epu3aaq", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "k5m5y772", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rfzl4gox", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "pqbmscdw", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "nxjfvudl", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wxrnl6k6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5sbhf0ah", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "577iplhv", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "pengo4vp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "19oshlt6", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "7ctmjonr", + "_$type": "HBox", + "name": "HBox(3)", + "y": 186, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "96wrvknu", + "_$type": "Box", + "name": "Box(1)", + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "tqa7ut85", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "u1nkgu1d", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ypvf43w1", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "nd7dprm7", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "2spxbkff", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "etjf429d", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0burtc5u", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "751p61zo", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "3guj7f4r", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "cxsnb7lt", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "wphkv549", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "anfsmixu", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5amwixxt", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "ydmee4kd", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "rre3ew44", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "14gh39v1", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7vopgxuk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ua5qrpc7", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "88kp4a2g", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "cnyn6zab", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "k2cnzoh9", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "xb10pyzx", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bh9osm8s", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "iw5gqrwy", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "u25cd95s", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "5opser6d", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "oya138j8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "18abdrit", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "vshvn65q", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ekvii8kk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "s9emdqgf", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "akiyjzw7", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1hqn7g01", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "qyngh7r2", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "8f6drfae", + "_$type": "Box", + "name": "Box(2)", + "x": 93, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "v3yw9mtx", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "vrnezjsz", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "3qzzial3", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "l9vytsev", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "yu320plt", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "dzc6rpov", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kvnz2ukl", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0degiiex", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "nona0oz5", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xu28b61c", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "8lsno7wj", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "c3564nu2", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "w7q2vveq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "mosfdk1p", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "mtjqek3j", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "aqssdykh", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dnd2mdwt", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6f312co4", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "84efu587", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sespq04s", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "tmemqqfv", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "qvzgwwon", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jepu083w", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "kje55067", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "q05ixjvf", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "c4opke5x", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qh1jb5kt", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6cv07mhk", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ln4xpmjj", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xd3b6wa5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "oho0ejjn", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "pku2i2zh", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ob36b3ji", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "7897as9n", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "nwbaoq33", + "_$type": "Box", + "name": "Box(3)", + "x": 186, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "hw6dllq0", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "9q6v4p49", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "qzlq4lqk", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "rbr7yd69", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "b6k2xzdq", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "kkwuzlm4", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dyjdel4e", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xy1mefr0", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "swgiull8", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6p0cfua6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0r33hlpw", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "seiw2khk", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "w37cph7e", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "aa4pktqq", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "v35isrux", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "31en1x52", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "mvnro1zx", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ga8h4enu", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "msqag57c", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ppvkfwxl", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "10yqp02n", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "c7i6vwxu", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "9k6gfmkh", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "gx8tcbaf", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "baqf8f7e", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "h7awfhib", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wibxnrms", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "y6wvcf3s", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "t5480dte", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "uh1m8n1a", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xlgbyfnc", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "fjld90yi", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "krnazjkz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "inyznle7", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "7zilxaj5", + "_$type": "Box", + "name": "Box(2)", + "x": 282, + "width": 288, + "height": 288, + "_$child": [ + { + "_$id": "p68mgbjd", + "_$type": "Sprite", + "name": "Sprite", + "width": 288, + "height": 288, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(123, 129, 140, 1)" + } + ] + }, + { + "_$id": "kehruedb", + "_$type": "Sprite", + "name": "Sprite", + "x": 6, + "y": 6, + "width": 276, + "height": 276, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(182, 186, 194, 1)" + } + ] + }, + { + "_$id": "svpxznre", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 276, + "height": 276, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "g5eux7rv", + "_$type": "HBox", + "name": "HBox(1)", + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "pbta8h5u", + "_$type": "Box", + "name": "Box(1)", + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "cbsl3o54", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "bfxg55e4", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "0wi87ftv", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "n1b5v4gx", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "0vid693n", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "k4ds7eib", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "a2pimix4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "e1gzb8ru", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "po71ix4u", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zy7vjb2h", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "16kw5ug1", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "pjkmxcau", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dqs1dnj5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "fd279ott", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "77hbsr4w", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "qkc4qt4j", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "y4pcru9e", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "95uc05oo", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "r428dxtn", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5lptjqnu", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "nsp1q277", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "y1q3vjw5", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "lbadxozv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "dr2be2x3", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "lto5esxh", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "j0v59cjx", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7cqtjg7b", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "utcne70p", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "9qii9fll", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2mu7h08i", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1hxcpx9n", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "gjnduydv", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ygdgczp4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "3zg553yp", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "4wj00bcw", + "_$type": "Box", + "name": "Box(2)", + "x": 93, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "0ze0lkxb", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "f006sosk", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "onl5ykjg", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "7zh14e6e", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "iorrseze", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "jkwon8ux", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "j2h4hgzk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5h7exwhd", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "hx1m3ed4", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "9zcdu4dy", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "rm3uffbs", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "t3o4fp2u", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4yxpdw53", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "k5i5zjii", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "wsqk6zso", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "7dn4tw2a", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "raqlhdfu", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "pdp7fqd9", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "oexeqnxz", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rdyfexbv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "nh6g975i", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "k6s00ij1", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "iz922vlj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "mlf8mtci", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ojbwvjhw", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "yaelkzzq", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1wpxve4w", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "nycurw2p", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "xqph0u0x", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2x119ss7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "r3e9scat", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "e8gk7znr", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0ouf0vs6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "4p8pqmhp", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "66s9ghax", + "_$type": "Box", + "name": "Box(3)", + "x": 186, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "ef322ym5", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "dxk7f82t", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "27uyz4ur", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "4hs7tx0h", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "v3jjyfad", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "m7kj7wq4", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "w7ckmjla", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ef3vovyx", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "bk3ncy9e", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gbuk7owk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5lfq9d46", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "e5g27yqt", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2vfnznid", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "p74s1prr", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "p1fvojpr", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "y010hh3w", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vq98r1rb", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "wlqo3iak", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "uphwhd36", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "cunxe5m2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "maw0pyig", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "oz9ozlbl", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "uwxbeu9z", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "lnwch2ui", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "j2qa3wrt", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "xe1xuxzu", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "s4cjdcnx", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "itkqkt6g", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "wcsz2dco", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "i8brnxu1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ckh5f0rp", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "uxd7r1o0", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "k1joasyp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "uz3hq0k9", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "1rmvnwah", + "_$type": "HBox", + "name": "HBox(2)", + "y": 93, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "rpjr83h7", + "_$type": "Box", + "name": "Box(1)", + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "d4pnj5po", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "1fi83z2z", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "vm1xpaj0", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "25flrfxj", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "t5yp68i1", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "9i3udnfu", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "cnl9dpaw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "4v1y49rc", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "gwfhm67m", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xeaxqayb", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "z86jmshv", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "s54hsxnz", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0il6zn3m", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "pgf5964k", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "46gttayt", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ju6ll0aj", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "255a0csy", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "01pdh9c4", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ujjsydb2", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "iplneq19", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "v4wkxsws", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "oplj1ptn", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hqkbsqlj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "n7ikvejb", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "tzv7shxs", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "xtc64qkx", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ny953cro", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "v5ju9vnn", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "93m6wslt", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bvmx4yqx", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "x55gq27l", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "w01r250o", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "z2kfel4u", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "qyro87cc", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0ra4tgkw", + "_$type": "Box", + "name": "Box(2)", + "x": 93, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "syjbtj5u", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "dl2qjati", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "x6i9nx8d", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "m3u69jqs", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "6ogl4g35", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "4jmv5blg", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "980p988g", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "uwdspzcm", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "9akccfgb", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "56m5s2h2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "iop7lbsj", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "0ihrsb1x", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3m63quoa", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "se0uhlo8", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "jmbw4fek", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "sjsgz6j2", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "uvzq76z1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hj9s37gy", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "x0h66x50", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "g2crbdvv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "x7hf5vfc", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "tsgiliev", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vbvxhohv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "chytfl7h", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "9uwx8jn9", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "t564mhui", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "pmr57csc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bd33xv5u", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "glx345ig", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "72ven5ni", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "8hk7uqoz", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "pk0e7450", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "f2q1axm5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "5unyjfxn", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7c2jcmss", + "_$type": "Box", + "name": "Box(3)", + "x": 186, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "s62rq0s7", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "njeh53em", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "5adiouog", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "gebqc9h3", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "8xjq7gm2", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "m2dm86tx", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "f5jcaplo", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "pkeugj9n", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "x49lsxxp", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "82lqnqsr", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qjkn9kog", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ozhts1bb", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "e0g8a1a7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "hnd6usph", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "oq9gu3fd", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "60jzaz1z", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "iknplb4v", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "z4s43mas", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "nuaxy77c", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wsr1nxq7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0nnordzt", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ywv7vl8a", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "c5fzjrya", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "cglch1cx", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "v2vwqa4d", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "kdve0a5h", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fq3h4sjh", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "rhpuwc0y", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "reug00n8", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "knlt1hnw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qlrcrk7g", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "e2f6ft4d", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "f0z2zghq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "9vvuqo2b", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "lft79twy", + "_$type": "HBox", + "name": "HBox(3)", + "y": 186, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "1woram3s", + "_$type": "Box", + "name": "Box(1)", + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "0953yylt", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "a2c12umf", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "2k58ixz3", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "vejlfriw", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "st2xlmof", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "gqy0teeh", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "n9p3n88g", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "twpwe7o1", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "t4tf2yqp", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ejw59sr1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bp7j1539", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "9nsh035h", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6qdaxev6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "1fplour3", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "b3ob14in", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "zl387dst", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "itgbj10i", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7srghmq9", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "m376cvrm", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hwa0yi0e", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hdzq2xlu", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "m8x1tj2r", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "j40gsm1t", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "78iuvjt1", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ur4t80p4", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "8rvxe2s3", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8h49wkgu", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "w2mptk3d", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "nn34txzc", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ha2aow9k", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7jvr24qn", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "q33wcht1", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "uxghcznm", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "l4yy3zf7", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "4xe73a8i", + "_$type": "Box", + "name": "Box(2)", + "x": 93, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "k5rqlg7j", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "f9viccdv", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "o7f9bs8d", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "s4gnfpq4", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "h0uhwibw", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "wlnul5si", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "mbt0oalj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ggs0g4yi", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "tvxsrdzl", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2qmgwt6h", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "9j77heel", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "chttlrr8", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wtp1805n", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "0gxh6966", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "38ioworr", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "yn0w47gv", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "eiji4mdw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "b3jfyxck", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "2z16g90n", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ozqzjzib", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "fyddi7uj", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "havjyua5", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "19q5x29n", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "wmvw6avg", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "8tfajj8p", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "agx8mhld", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "no6sa60n", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xlbdturx", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "uxscsihz", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5m0kd56h", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ez55dqft", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "4appa9uq", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vab7m9m4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "jrxu4gh7", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "zl443y8a", + "_$type": "Box", + "name": "Box(3)", + "x": 186, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "0ec0j15g", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "9lg1t5aq", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "1ko41e1d", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "kqw49e1j", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ta80r5jt", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ghgzsy4m", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "96ckgt72", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "txnzwfla", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ku2nrxse", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ewacew9q", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ag5wieau", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "4gpfdkmh", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "g0vwqzh6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "w7eljtxn", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "b8uzljjm", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "vgq39bw7", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hodv6di0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0ovourov", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "us9m1z9o", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "w5ejyrxj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qkjhlqhn", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "cqsbmdj3", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "44jb037n", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "kfhv0bzz", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "xo1zvbxi", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "l62xjtae", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "q6m2ebdk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "8lba0t3p", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "9xuabogt", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "lumpgoom", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hn5mz1h2", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "5yc85fve", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4lxsj5g9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "e50qsqpg", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "lo90b1pw", + "_$type": "Box", + "name": "Box(3)", + "x": 564, + "width": 288, + "height": 288, + "_$child": [ + { + "_$id": "xyynpd3w", + "_$type": "Sprite", + "name": "Sprite", + "width": 288, + "height": 288, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(123, 129, 140, 1)" + } + ] + }, + { + "_$id": "yvuy45ze", + "_$type": "Sprite", + "name": "Sprite", + "x": 6, + "y": 6, + "width": 276, + "height": 276, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(182, 186, 194, 1)" + } + ] + }, + { + "_$id": "9levzdwa", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 276, + "height": 276, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "yu00jjdc", + "_$type": "HBox", + "name": "HBox(1)", + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "yqqlj5or", + "_$type": "Box", + "name": "Box(1)", + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "ozdm223u", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "wt62u5r5", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "3r44zuce", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "m6xonlk1", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "i8rbz9be", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ncj4mko2", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8n1w9bk5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "c1fui1x8", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "77d6vs4y", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "n9swfiia", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bd07scq0", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "vhhwkzjq", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "d1l72zbr", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "343x4i4f", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ma0qynbj", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "8jjpwi53", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vwrk0wjo", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "nihgfdc9", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "mu20ov0r", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0htjn83g", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "htestzut", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "yiid089r", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "js1wutw6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "cbni40ad", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "nn7oisj0", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "h7o76i65", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5ph1bivi", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "v1frabss", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "e2z23rad", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vowin3dw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "b11j47q6", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "1ivktmj1", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0qgi1tou", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "wy7j0bjq", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "pnx8lktw", + "_$type": "Box", + "name": "Box(2)", + "x": 93, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "7xuzft58", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ta5qd8ms", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "u12ijblo", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "5jsse832", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "dg4lzx7s", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "welvkveg", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4t8is0h1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "sosyhupv", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "dbd5p261", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "m7333cec", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "rl6cwzwd", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ezk3pg6p", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "c5deofqp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "p4u1drhi", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "2ncxvn7w", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "wigfxy9u", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vnbkjh32", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "uwpkhvi0", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "w62f97q8", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8yi4w5tv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hb6itu40", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "kf8erugr", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "d28oc47g", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "lannzify", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "zrcgn0ym", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "4vfkya0s", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "tio7tsyj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "cs6c2lci", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "3qf8bcnx", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zbtasxnc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vc3du0rt", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "gm0z6df2", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1qsh70a2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "ftgs30ek", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "uiyw8pdr", + "_$type": "Box", + "name": "Box(3)", + "x": 186, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "pwrjzxxq", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "lhj2pq15", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "8q22uskh", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "b1tw05fs", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "hyij4ygd", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "q5fkvf5y", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sdnnyq2t", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "jwz0n6bt", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "r5yfluc7", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "88rb982e", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "jjwlmk65", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ml8a3cb6", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "oj68ndvo", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "zqvtel8r", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "iqlytouz", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "dggqehw0", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "n241rqd5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "nns6jtj1", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "45jhxks4", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "34ec7d9b", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1t36hdey", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "50kzd0gz", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sn6tjf9h", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "77obmg17", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "cmog2gkv", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "lhiqgx0e", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7morwlrg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2f38aemy", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "qeey6fig", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fdd93qs6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "h8vcv31o", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "axeb665v", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hr3ko3pq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "9zlom7au", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "0lyz4hcq", + "_$type": "HBox", + "name": "HBox(2)", + "y": 93, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "f2r69zpo", + "_$type": "Box", + "name": "Box(1)", + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "uxiuzt1w", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "5nyrm5zz", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "iab878m2", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "ki1umfqv", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "7ypvzbn5", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "hxknsnco", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xlghpsms", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "jfgsfqug", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "vm47puj4", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4varkley", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "n3rq63by", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "mqs0uhwu", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "z1nhd6lt", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "bw75v8qq", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "pfulblwq", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "otnjr26w", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ki47tahe", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qx94i7sj", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "wpoxxfrj", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ce4xqe4s", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "44kwhs53", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "whlqfbdl", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8sgbmi9x", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "9ramb228", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "3s4txjym", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "det5zoeq", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4u3n82tl", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hb71bkpv", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "rqzws02c", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "b5wuefyq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "iwvhqfei", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "8z9j0p3h", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "aaa9oi2k", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "x9csamsx", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "u3ox4i7m", + "_$type": "Box", + "name": "Box(2)", + "x": 93, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "iw1q2djm", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "q7rpztz8", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "49gabjur", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "csy9myp9", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "e5lt35jm", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "tuo78g55", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "h0mwk5rl", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "lc1a64nw", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "j3zkh5fy", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "l272g9b3", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ej2k8no2", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "co2bvuov", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "oo354nsz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "jnhim90a", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ozladc50", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "n2aocmk1", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "a99bl456", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ldurjxtu", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "phmw3w1x", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "tidyggvb", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ficwwyx9", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "2bnj4ww8", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "v865uack", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "rageo9y4", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "6edsoqrw", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "mq5zdph2", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "f3behnre", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "z19fdu0i", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "t1wphqih", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5kzdnvg0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6k3ijg7w", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "m6q0gpi5", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "to7s4d6m", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "muh1928o", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "zv1ylqz6", + "_$type": "Box", + "name": "Box(3)", + "x": 186, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "6gz8u38s", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "tc7lzc1n", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "4q9qmcs6", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "axav7rcg", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "dpifn9y6", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "dvdti2wn", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "t4te851s", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "q1rtufr8", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "owxhhrte", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "tozccsgj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "h5lu0s2u", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "j2hy35nv", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hussmyi9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "t8z9wobw", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "zhhvr6bl", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "3cjk9rsq", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dh6n4zj6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "iav2g2u3", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "206apyhi", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vd1l3kdg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1ubt09os", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "mou00kwb", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ymsnxj5k", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "cfy3eaka", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "y80abwmg", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "wxzqr1k0", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "469v8t28", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vb15k3p3", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "oq0qsawb", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8sa9v59w", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "47mb9gqi", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "uuxuj4rp", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "blqgf0yf", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "k6kkk7f8", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "x5vabepx", + "_$type": "HBox", + "name": "HBox(3)", + "y": 186, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "069whsaq", + "_$type": "Box", + "name": "Box(1)", + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "42jd2uc4", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "no8fzzbb", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "iufhzq6u", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "cweioobe", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "875gh6fc", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "pl2mvgkq", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wvkmspkn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "u2n2q4d1", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ih83h01y", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fp9skjnv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dqz7tlit", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "2u9z5l3a", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5amyps4e", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "87mju6iq", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "7zp23rs8", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "zedtfx06", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ixwagvmb", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "zlnnsnvu", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "1vkt4imb", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qopf6bh2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dl7ueddc", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "s89xoezp", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "786ckm29", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "zvaaxqd3", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "o3j22crz", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "uftq40xn", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6d577dr9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "4f01ddk4", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "kp1zmzve", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2b0anbpj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "183amyht", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "us39tpfd", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4lobpxib", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "i1cuii9y", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hjl5rvzy", + "_$type": "Box", + "name": "Box(2)", + "x": 93, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "dtw84hv7", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "cvcmwemt", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "cou0je7g", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "ozxkpwwo", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "0olpgrnp", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "93aurzs2", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "aeamatk8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "kre3spbf", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "119zerst", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vi1pj4ps", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "txw91i4y", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "g2p2311v", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "a3dqlbhb", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "fxznvxxm", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "i7zu8acl", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "zgpnlrvv", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "pmtee870", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "armfhx07", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "zccx7zg4", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "28xjpvin", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "psv2ubjk", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "8hfb84aj", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "r4ip4x83", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "5kpqm9gd", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "m47p3kvv", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "2pc7g68t", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gufrlasf", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "14vap49m", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "sxul6lz4", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5eps4k7n", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "gokab2w4", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "n4wql797", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "tpen9jvu", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "adkvmsno", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "uw1s3jnc", + "_$type": "Box", + "name": "Box(3)", + "x": 186, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "f7ddy95a", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "npxzix4b", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ch65a1pt", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "xg1b121z", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "mdsnrt6b", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "2yvi9ozm", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "r54p0li4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "uv44yw92", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "quy684oi", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qpcp795m", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "liwhuw20", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "f1jvoamj", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kpf0x1b4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "bakj9ab2", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "otsm9rl6", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "15no0szk", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3xhzmx7m", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "gjg374t7", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "bt3vyh8w", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "cyejxw3a", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "nqna2jt9", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "2e9upako", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nkqyur1d", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "5qvrmmq3", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "nvhsay0g", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "qajqiglw", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "487ho21i", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "joiraxnl", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "c1v8xt00", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6wxrjb0m", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "71dlefpt", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "xf5fi2kz", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "w71clr7a", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "z1loiqjj", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "5gxy8hie", + "_$type": "HBox", + "name": "HBox(2)", + "y": 282, + "width": 852, + "height": 288, + "centerX": 0, + "space": -6, + "align": "middle", + "_$child": [ + { + "_$id": "un0kbrhg", + "_$type": "Box", + "name": "Box(1)", + "width": 288, + "height": 288, + "_$child": [ + { + "_$id": "7nc8mm4h", + "_$type": "Sprite", + "name": "Sprite", + "width": 288, + "height": 288, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(123, 129, 140, 1)" + } + ] + }, + { + "_$id": "ivo1gieu", + "_$type": "Sprite", + "name": "Sprite", + "x": 6, + "y": 6, + "width": 276, + "height": 276, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(182, 186, 194, 1)" + } + ] + }, + { + "_$id": "0vg48wft", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 276, + "height": 276, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "khsr9kwc", + "_$type": "HBox", + "name": "HBox(1)", + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "h2q0y9wu", + "_$type": "Box", + "name": "Box(1)", + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "g06rfbc4", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "8pjkmt5x", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "aol8yz03", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "nx68g4fb", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "1z1b3niy", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "22xfwhn7", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "yoroj8bv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5gvq51w3", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "zoa1lzii", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "9kz3jvcb", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "uoql2y6u", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "5bzmckwa", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "d46pugsg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "szvxxqa6", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "pxxorl23", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "vy54pl6v", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xg67px98", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "te2myhvv", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "e42d5gbs", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "y5nxvesp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ygow5nz4", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "212yuq4q", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1orzcvaa", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "sr1finzm", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "t03a2d2v", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "bchmsuca", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "mf0fxlrm", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "frxokwtl", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "4n4qt13o", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ch436pe8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "f43fk7l3", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "p1391i9q", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "l859yy5j", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "ta88c9sv", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "du5359kq", + "_$type": "Box", + "name": "Box(2)", + "x": 93, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "lo98b4uq", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "m3lo65lq", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "e9lq5h2b", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "rs0dvdpi", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "t7r0nf98", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "nboaakoc", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4wjlh4is", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "uu3bamgr", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "01q8wrrk", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "9wq0e3ne", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0vf8msdu", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "7u9m9ihl", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "o9k0i2kv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "lxg7f2v3", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "7lx7y3rj", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "j86we8xa", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "d63n9uxs", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vw6dhyvs", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "equszdl2", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "v4o53azq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "yj2kq3mb", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ey5kcpf5", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "swwlwlo0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "7xxikioh", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "d4nt910y", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "mw4x4ijv", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7w7rlng5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "rctib2oa", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "8wz8m7nl", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dxuwaozd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "f3l00q7r", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "3h3mrgfw", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "a8vote2p", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "44efe8mx", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "d5nyh8mo", + "_$type": "Box", + "name": "Box(3)", + "x": 186, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "6gupo9yl", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "oad7fghx", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "klvganzs", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "uv06p1n5", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "3zy3r0yy", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "4fi773ue", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vmv14vet", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "m8mmi8nn", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "dr6916cs", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "e4n96705", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "kmu8f7mr", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "zxaqsd02", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "yzpjpkn4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "c01lr9ss", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "eu25w3p7", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "osh42ah9", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8meplba3", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "m9lynqzv", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "bg5lobaj", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "x81l3gsr", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dss49o5z", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "getegba2", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jzqvuvpr", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "embegegz", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "npatw54k", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "2wry3rg4", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "au1uh6jl", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "9c373cz8", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ex1u6pnc", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "w643mcrs", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "50m7hw2n", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "kd4dh131", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "k2gi5io3", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "ah0eopyn", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "tg4wh89p", + "_$type": "HBox", + "name": "HBox(2)", + "y": 93, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "otapbd7n", + "_$type": "Box", + "name": "Box(1)", + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "c29vsfy1", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "x2ljrttu", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "skcndayt", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "cg77lcys", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ypy4o825", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "na2vdili", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "668j7wic", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "kmkhc1pi", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "21zgg975", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1rep5iyb", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "n41sosb1", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "xuf6xexx", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6b2fpip2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "bwxkoix0", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "8e6l3ju6", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "mxam4eh9", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ewqilqr3", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "idtu3nrl", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "fgylz1be", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "mchajewu", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ey6wi6u2", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "9uab4lve", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fc6i6wfh", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "h2io0ta8", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "yfx29qke", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "her31a3i", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "w13jchyv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "anqe8q5l", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "x46sqoi9", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "td42wnfy", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5sz02d9v", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "m1qk737w", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "u4xovznp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "fhgv9097", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2h98bx85", + "_$type": "Box", + "name": "Box(2)", + "x": 93, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "w006wld8", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "mz479qhs", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "wgpya1dv", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "yzij861a", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "bk4v9b2c", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "n0nuws6e", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "18gd4epn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "9cv3sxvz", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "r1uzjse3", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xwijavps", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1lwxbfko", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "zidhb8ej", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "23j2wh95", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "u5qec992", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "gbhno40a", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "jbzlbbaq", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "m0osfp2s", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "j0bnmj3g", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "qdiokunc", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "68qolx50", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xrx482c7", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "6e58lzfq", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "lvrm4hei", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "dkevd5w2", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "sey5snfh", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "hd10byem", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "lbkebqbp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "cr677t17", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "b4lrhvxh", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1fyqpfpd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ggpmd71t", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "jifkf5o2", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fvwb14uu", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "ojx55xbt", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "t9ja5krt", + "_$type": "Box", + "name": "Box(3)", + "x": 186, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "uf907s2x", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "h6ooapir", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "z4oosh1f", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "0tpdv0vl", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "7nn97ppw", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "cszku5hu", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ozlglc0p", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1p8h9nqy", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ax1kplad", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5rptqy7g", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7m5m8jg4", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "9ao4yryd", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "i02z8lml", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "4ill4ky5", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "me4wtbws", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "kivv7m7g", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kb83rbb4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "iqogaegy", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ld7si9ze", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fdv1r6mz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "u71dgt4h", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "1a5c7uei", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "pso92ygi", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "kguki9o9", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "33c4gokb", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "n3vegi1h", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "845cz5pw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "oloq0qer", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "4av8am8l", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "o5a8col6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "c9nf4cig", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "2frety94", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nnbr0k7j", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "p6oai8v5", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "fbejou7p", + "_$type": "HBox", + "name": "HBox(3)", + "y": 186, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "4c4f6m41", + "_$type": "Box", + "name": "Box(1)", + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "cnexa2s1", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ae5wd8gr", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "4cmzsel1", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "1qm33vfu", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "158qyl6k", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "acslr5qj", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gb00asqd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "g2xlad9j", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "x9bi1hep", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zctz902v", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "q72v46lh", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "5tzozdx0", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "x2k3qq4x", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "zq0xktmn", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "45nxn3cr", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "c636a9h6", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "d84zff6e", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "pij4a9ct", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "wy1zmeo0", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "goq9dgld", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "crd1etgj", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "fhymilvw", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ey3plj7b", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "n4a5ru7z", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "wm56z5tc", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "dds819ev", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "f6tpo8jw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "3cfaojev", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "k540g21q", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0bi9qr4v", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "h5ffn4q0", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "n73uedpl", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zb7f37ld", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "j37u5ftw", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "b3y9jjxd", + "_$type": "Box", + "name": "Box(2)", + "x": 93, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "7x4wosgh", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ve9c9rm4", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "crpc7bdo", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "6217zj3h", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "d4mubnlo", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "n5s06hf1", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8xf5kcc2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "x9ovnjqm", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "2nj0oeat", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rad4qtwa", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bmrjzspl", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "7ho1jcsw", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2ve27kqe", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "2t5jveaq", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "39hjpq52", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "w75ejghv", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hjqwlc35", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "h3ulpzzm", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "c2pf7e5b", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "lgpl6t6r", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "a4kpx0fe", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "5akudapt", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "pq0p6cpe", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "yejscnh7", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "c5ws5q91", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "olstl0bv", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "36ahbkoj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ao08z31l", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "or2n1xc7", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "lo43129n", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hdozddjg", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "6j8mcv0u", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8q2rwhbw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "72b3zbcp", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0qk8z9qp", + "_$type": "Box", + "name": "Box(3)", + "x": 186, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "xm9l0w4k", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "jrckeu9x", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "f4x82wtq", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "20xuamvd", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "5abvgjzm", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "jyd96dbi", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3a2e56o5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "9hp28djn", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "oeuwctc0", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2wcmylzu", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vsl3ovzg", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "cyatafc8", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0jddq6ao", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "z3iv43ss", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "iyirxnzg", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "jv6e1l8w", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rqg2uu4x", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "o9e2uo6n", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "3ci7hhko", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "030je1jy", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "z6uxuooy", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "d4w5uxno", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ck5e1f1l", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "ra7e0rc7", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "c4226mx3", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "l89tswkf", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2obwvuex", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "a95bnkif", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "hoqnfltr", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "c6852cq5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ib0s0y37", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ow3zqzxk", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xl8jdkml", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "s4a3w4a6", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "zjggxolf", + "_$type": "Box", + "name": "Box(2)", + "x": 282, + "width": 288, + "height": 288, + "_$child": [ + { + "_$id": "kqc1jy2x", + "_$type": "Sprite", + "name": "Sprite", + "width": 288, + "height": 288, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(123, 129, 140, 1)" + } + ] + }, + { + "_$id": "5a6e9hhl", + "_$type": "Sprite", + "name": "Sprite", + "x": 6, + "y": 6, + "width": 276, + "height": 276, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(182, 186, 194, 1)" + } + ] + }, + { + "_$id": "5gp25kyc", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 276, + "height": 276, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "sfkwndem", + "_$type": "HBox", + "name": "HBox(1)", + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "q6s9thl1", + "_$type": "Box", + "name": "Box(1)", + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "o3eezwm7", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "fc9fn96e", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "1udu0ynh", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "lns14zww", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "89k3hj9m", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "0dggyzkp", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "yai3572x", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dlyyhic4", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "e8nijh5k", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "pjbl10o9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xhi9xgjq", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "d3dkbhrh", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "pqddwn6l", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "o9c116ax", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "4txmsyxx", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "rpx5aobc", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "igrbo500", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "n9wz9dva", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "5ddp3ve2", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zvgi884r", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "c0dftmj3", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "151320kp", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "u1r0pg2c", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "reaen1la", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "8elzxk9a", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "a29ibv7k", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2bievih9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ufyr2g9x", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ibx4j1n4", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7cj6dppb", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "zg2wosfe", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "oziojbk7", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xkyuquug", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "67ogbdmp", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "zhbxjbtg", + "_$type": "Box", + "name": "Box(2)", + "x": 93, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "tg6vh9ei", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "fnbod0zx", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "tlo3i0gw", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "ztzjhtut", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "wz6jpuv4", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "p0y74cse", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0uxhurug", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7zfh46y4", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "gw44oips", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ksuyq694", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "fb9c2y1v", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "gj6la20i", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "9valex1d", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "8eoe5sdq", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "iwprb3ax", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "0gwf37q5", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dplvik1f", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2wxexkt9", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "9jjhz4f1", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "a43ck5fl", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xza0ceim", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "h8606zr0", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "h4cpac71", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "wgvbc3ef", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "1ef4bs0w", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "2sj8yyjk", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vj5xxwtm", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "r4e5bxg7", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "goiepl19", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "mhn6xp7e", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bamjvgav", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "upn7f3ba", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "y4vk1f5i", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "ufhzze58", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "8gwqon3c", + "_$type": "Box", + "name": "Box(3)", + "x": 186, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "7u61gk3j", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "p1l5oa8k", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "tbanlhtq", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "u0ggu72b", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "m5m40d66", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "qoq54hlo", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dtjn9rck", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "jppu4fhw", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "dpkvv9fr", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rtdpt5d0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ng39nqjs", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "hj5nyr0n", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kscaji68", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "kwbsg0yz", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "1avimxob", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "97qk9ppd", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kl1gm9xi", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6hdgzx7u", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "9svpeh1b", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nv8qs4ti", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "r3cm13zg", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "2ei1ea5g", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "m40bby4y", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "wbxotjkk", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "q5t50xlf", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "td3ps0ea", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wpi6e65x", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "e2hm69h7", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "gv7zw8l9", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "crspp6t9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "rcmc4uxx", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "31p8943p", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "o0txsycg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "ahs4658s", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "nqux8zic", + "_$type": "HBox", + "name": "HBox(2)", + "y": 93, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "y4jibpmq", + "_$type": "Box", + "name": "Box(1)", + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "u2u8gnn6", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "okrdf0hi", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "w355polp", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "880p4glg", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "xzdq3h9j", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "xybkykqe", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bmpu3tiw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "o9b5lkny", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "k9ghgogk", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nv539a1i", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hsefql7f", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "minr8uql", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "y320p0cy", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "pw5u41zx", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "30dzmnj3", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "8zdosli0", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fq8g90ma", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "r5tqyxgg", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "xj3v1sen", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kkwsxoq3", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "tebxuimh", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "if9s26zz", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "lgqbizka", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "mikr7ck9", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "lfvb6bcv", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "9flta1oo", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "z5g9oqv8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hl0rf3tj", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "h2j72qho", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rvhtulhj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "obowemmt", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "sp8jaa2x", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0011ecj1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "jitjqh70", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qfao9tmt", + "_$type": "Box", + "name": "Box(2)", + "x": 93, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "zmml37qr", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "2xlele1o", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "g95blekj", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "9h452k64", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "fqr8ey3t", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "j6xezu68", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "909lhv3k", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6hm8vv51", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "06cpwa9n", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "v5lrbgr0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dcyccwst", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "wcwzih1i", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "j3k02uvc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "0dzliul2", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "wg3d0sjm", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "64ko3kzn", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "yytlyb70", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "9wwceddb", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "urx77i27", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1rrsjfym", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ybqmk65u", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "s4ept6c1", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qbv0q00l", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "l1mxe9m5", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "g3pthkxl", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "betbuyqc", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zxmhnj12", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qav0xodm", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "exvudwox", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "n7j885aa", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0mfgt93h", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "j7yewa6b", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "99ne68da", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "ftf0j8pm", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "npxjensp", + "_$type": "Box", + "name": "Box(3)", + "x": 186, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "7tl5jz3v", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "qq731my8", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "gd7flc5j", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "vsdznx4n", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ilqg9qq3", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ji6jd7g9", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "v03mw09z", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5hz2l41e", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "gjmjtuqy", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wb0227ic", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "86c2zdjy", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "fdf67vqo", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ysdtujbo", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "g6rdbfcb", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ewnbc7jv", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "fkolu39d", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hfo8zokz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "riprp7xc", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "9r2c2cx1", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fn0x0sak", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "yeaen4s9", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ed3up4fs", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "c9gywuvd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "dr9qyyem", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "q70lxisi", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "2dfgtbuo", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "onaj286j", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "q3kr9kqq", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "sql4lgcm", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "yk41ixue", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6hwwijuj", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "5412m0et", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gnomdrwu", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "u9vhqoxs", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "nz5pzygz", + "_$type": "HBox", + "name": "HBox(3)", + "y": 186, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "tx36m9rx", + "_$type": "Box", + "name": "Box(1)", + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "28llvdq5", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "d1hzq3pw", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "euu1o6d0", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "bitellbb", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "sgjf2erb", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "3q6gxzt4", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4gvypdhe", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qoky82zc", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "rpd4vwwp", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "r6jd36u6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "c97p2a77", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "xput1pgs", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "e5ram2ep", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "x6yjwg1t", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "jjrje8qv", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "a2v2zy4f", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "9uhhqwxe", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "pu18l4ub", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "hhinr8h5", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1yi08yyj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "n64yf7c4", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "kniq8qqm", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "f8vyzue8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "ceahtuiv", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "aioq3c92", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "m7kwugc0", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5b5ehkbh", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "twaosa8j", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "cah7cz9o", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7vltm75o", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "gx7zcgel", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "nl3xa311", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7carbj8z", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "4gl0i1zs", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "m41rouel", + "_$type": "Box", + "name": "Box(2)", + "x": 93, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "kn02uznu", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "icuejgqt", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "g0xt1jqx", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "obcjoar6", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "c5z5a9ev", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "feiqibks", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qtlckq1o", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "t0i8330v", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "izv77dw9", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "mw531sz7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "42souv2z", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "t2q1hzze", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ejgc1zi8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "xgqyqi0c", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "by73nj8h", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "jh4d9suf", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ap9kepjn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "mr53a70x", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "1veazhmz", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3oyfgths", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "wcx7lfo3", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "6d3l98kb", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "5iudvtas", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "hc50sufj", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "3653ybjz", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "uv504ton", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "02xkb6ck", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "cktjw6hs", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "pufsb2ab", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "co9gwey2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "kjew4xo6", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "y3lm7w8p", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "42z8s11c", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "f13hm4u8", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "n1e3b4py", + "_$type": "Box", + "name": "Box(3)", + "x": 186, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "gwogomd1", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "33hhqx2j", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "dclgzdqd", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "0wx4vgwt", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "0i78441u", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "3e1r1drm", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "uwoddlnj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ulg73h9b", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "8s9vgzcg", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sxo0897x", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vlj7l9fz", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "k3t18mzh", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "9rcxvxof", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "db5d6d5m", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "2yquiz0o", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "jxyvd4pb", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fah14114", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "20nmdgrt", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "dw9iic3m", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dlgf36lj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "29256ipl", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "7iklqcfa", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "l4ug46za", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "p560682q", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ffzvmctg", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "f35d0kyu", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kj0h2qfx", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "mncc0xwg", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "os1ek7rg", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8ydhcbge", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ec3yhrbs", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "0tllrnxw", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "eyegkasm", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "jzozyrav", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "2fade7ki", + "_$type": "Box", + "name": "Box(3)", + "x": 564, + "width": 288, + "height": 288, + "_$child": [ + { + "_$id": "cncbacwr", + "_$type": "Sprite", + "name": "Sprite", + "width": 288, + "height": 288, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(123, 129, 140, 1)" + } + ] + }, + { + "_$id": "if9vf4jy", + "_$type": "Sprite", + "name": "Sprite", + "x": 6, + "y": 6, + "width": 276, + "height": 276, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(182, 186, 194, 1)" + } + ] + }, + { + "_$id": "lk2u3jge", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 276, + "height": 276, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "00gkvyb1", + "_$type": "HBox", + "name": "HBox(1)", + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "hkpydouf", + "_$type": "Box", + "name": "Box(1)", + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "38gtzyea", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "s19xq8jf", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "buzg6uum", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "p3k5wlja", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "kbhgd26d", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "pq4yfhqj", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "abzb3e1n", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "skv18bnn", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "gs1c5w5z", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "z75s4ojw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dqu8a0g1", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "uedrzla1", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "u2ml8xo8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "skcuypu8", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "mfaj8046", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "l8zngoyv", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "9o9yq7a6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0c8k2irq", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "tfczv671", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "cg3vwdua", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "3c548jkq", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "h5emgjui", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "h3w371hr", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "n8hsosg4", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "1ut1xqyj", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "mn23jvfj", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ofcwt5kk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1u9wj9wp", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ymwloz55", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1jab4026", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "eg5685vt", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "gt3z26v5", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bgdrx0wg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "tv7ajlcv", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vtvbzfvd", + "_$type": "Box", + "name": "Box(2)", + "x": 93, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "9ctquyey", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "89tfgrgp", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "tyxtdwfu", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "iht8robu", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "uyro4mre", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "6hche4al", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8hns7akn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hl2uzlz0", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "kxnhplqc", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qarl6g24", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "9ov6y2ds", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "5p11d1v0", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0f7nd9oj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "q24il1gq", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "i9hljaqf", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "fu15c7xm", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "si2q7dcg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "jieyy3db", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "5pvk2sx9", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1hv5oyum", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "66viutn6", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ux7jeorf", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "046671ck", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "khy9rqtu", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "9cc5iqd7", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "zr5b3joq", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "mih2gtgj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "nncmk1am", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "s6qftn9r", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qhf7j844", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "gxkfmcw1", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "amdpnpgn", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wgi424k6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "uc7cv3af", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "a4iyd8sa", + "_$type": "Box", + "name": "Box(3)", + "x": 186, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "8e9xwesi", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "4rxsj86p", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "njurfchk", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "hde7gtjr", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "zg99156t", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "lmkodgqo", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "coawo9xd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "zdhf22yb", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "2d7ugpr8", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bpnn7x0a", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dyuc0nry", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "l7ikvbuq", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "afd2fsav", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "f00uchfi", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "cravkmsm", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "47rjgfr3", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "mvb2j187", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "i60hatxb", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "m1tu9kjt", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bjawq44o", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "jbynuyie", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "bd14vvrr", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "oej7tb0d", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "hs6miz7d", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "smeohqmc", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "j7vdvrrv", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ujziqj13", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "h16pfk4m", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "gwjvrdnl", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qcmsbbn9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "s2qzkpfu", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "vegemgd5", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2g9a9jt1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "rovstnrl", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "btozliv4", + "_$type": "HBox", + "name": "HBox(2)", + "y": 93, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "pe0gurf6", + "_$type": "Box", + "name": "Box(1)", + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "rbxr11kg", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "g6up5m6l", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "sz2xa4kd", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "zoph2dbj", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "1ksthuu8", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "1m4e7857", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zrmhqa46", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "thj8nonm", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ild5za8b", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wpgp10ki", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "gzl65w25", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "fu4c4619", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "x84052f5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "gvrsdrsd", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "eif8wx9g", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "3233hp19", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wh25rm2k", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "a0042wbb", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "m12jgxpb", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6uw3el2l", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dlmg5i5b", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "2bh5995z", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ci7yd13b", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "jmpx4tn7", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "5lpa87fs", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "acb6iqk1", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "s13oldyc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "4b4e6lwt", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "steujwjy", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "46bncfex", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ugv7iqg8", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "px55a1nd", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "44zcjgrs", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "hewrj60c", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hnf5y7g3", + "_$type": "Box", + "name": "Box(2)", + "x": 93, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "73eio7da", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "3abz11kd", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "9ugzwq6q", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "6fu0hgew", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ngjo5400", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "vsal9gww", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "enh09w99", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1apnnv2j", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "9sqh9xzq", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "p7s5uu1h", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "b0xa9xwq", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "rl9hg394", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nl456wle", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "c227ae8m", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "wdtrev4c", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "372a8r83", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ranhxkse", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "nkz7ht45", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "4s1y42d8", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "m5e5c1is", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "r2rga4ns", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ozd66kqj", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "o1wnsbuj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "i5yj5pfo", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "6syrvjzh", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "678f66re", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jo3du9rf", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "85g099me", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "52j7rsyj", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xkxbulgl", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "p5umi3bo", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "trqjhmbo", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rppch2pb", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "fw8f3epr", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "q5s0fpxs", + "_$type": "Box", + "name": "Box(3)", + "x": 186, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "azygt1a1", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "a82jkpkf", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "gbxo9kg4", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "8onhj79q", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "utw8txsq", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "2tfn9jkx", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bzgo60yo", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0bawynrm", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "31q14kbp", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "yvo61vk0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "sqpcjtv1", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "s1dlas1z", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "z4mmab8x", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "bkjkf9yk", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "t7317a6n", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "brnuz4qa", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "pu1k809j", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ftcedfa0", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "qspk26kq", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "tu3iopmm", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "owienle6", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "2j9k1t90", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ybq51p2o", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "s7yodww6", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "xyjdwufe", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "89te1xig", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "x58y5ctx", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "gm6f5jxn", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "wc6v5rfc", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rlbu6d5f", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qw5e8rpk", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "r5wh38ml", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ocldajdi", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "9cj1vlym", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "kz5frzmk", + "_$type": "HBox", + "name": "HBox(3)", + "y": 186, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "3axpyz0i", + "_$type": "Box", + "name": "Box(1)", + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "8dqew7sn", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "dabpd4qh", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "wwwg2rfr", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "w2els0og", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "oepgwhrp", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "sve9d4uu", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "p9y26yfq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5db9gr4q", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "td1vcv1n", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "67c4g9dh", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "kkqw61sd", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "xklituht", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "yduxello", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "lx7oapn1", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "4aosj3tf", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "hp1bwnfi", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "o4o4gb1q", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7oq1z457", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "vpsr77wt", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "17vul5ts", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "k60vzv8p", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "jzxeaxvj", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "v01bu9mg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "s2217fw0", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "w8o8wf1v", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "heobezo6", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6o96gks6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xibvjspc", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "nft77y0y", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vvw6iwtu", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "813xbucl", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "2c82xapu", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "j0fvo80i", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "iaeb2u0x", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "89jd2vxd", + "_$type": "Box", + "name": "Box(2)", + "x": 93, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "cgupaku8", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "3al46ps4", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "pgqf4scw", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "mcs5x566", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "muk4knne", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "1qcelmsc", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "p3d1ttru", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5vinbawc", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "2ls0kh8x", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8jtk8196", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "d8zkicqg", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "4orounv3", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "9w08c0g9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "kej0vqgo", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "9h9tqff2", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "qj8vgo0i", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "plqw9ony", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "rgz6szqd", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ndplf8j2", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8b80rmys", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xp2og3fu", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "asdqx5p4", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nhfs506x", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "0zlrfqnt", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "vek6p1pl", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "rbq65vz1", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "iuf5fjb1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "11z1fjgc", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "2ywz3rz5", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "yz00t1cm", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "zexvuz69", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "eigq6amu", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4jmwojju", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "keuxgqri", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "iwzyo0ss", + "_$type": "Box", + "name": "Box(3)", + "x": 186, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "ub4l8r1f", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "c5h1rk27", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ovlox172", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "sl5ncnlt", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "2nln0frl", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "qh7xna14", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2araa4j7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "cwcvpbhc", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "sk9ccv59", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4hjbko3e", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "rrxvij7m", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "8y1jwel4", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "n64bku5c", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "69zbs2xz", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ceueqj29", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "d70lzirz", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ereow2wb", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "kqzirt4f", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "sqv5a5bf", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bkyut6sg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "c36b7zj6", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "o8w7yi3l", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dc3g25z2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "1djk301w", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "bj04cukj", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ek108erl", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fay16j1t", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "057sal9i", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "fn3j42qf", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "f2zi2m88", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1u5xrh3s", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "yyh5saw4", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "lq1rulwd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "w0q8c9y7", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "n2boto0i", + "_$type": "HBox", + "name": "HBox(3)", + "y": 564, + "width": 852, + "height": 288, + "centerX": 0, + "space": -6, + "align": "middle", + "_$child": [ + { + "_$id": "y80nh383", + "_$type": "Box", + "name": "Box(1)", + "width": 288, + "height": 288, + "_$child": [ + { + "_$id": "vi7xr1kq", + "_$type": "Sprite", + "name": "Sprite", + "width": 288, + "height": 288, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(123, 129, 140, 1)" + } + ] + }, + { + "_$id": "xsmcdiun", + "_$type": "Sprite", + "name": "Sprite", + "x": 6, + "y": 6, + "width": 276, + "height": 276, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(182, 186, 194, 1)" + } + ] + }, + { + "_$id": "iywlzyc0", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 276, + "height": 276, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "9mhaw8f1", + "_$type": "HBox", + "name": "HBox(1)", + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "2ymyjxsm", + "_$type": "Box", + "name": "Box(1)", + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "wv4p21qg", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "o5ht6k18", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "4sj1fjyl", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "kx2p3ogc", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "1es2fit4", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "mnhpfyix", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "udpj2sb7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2q1ufixt", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ccl3xbs7", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xviafh0z", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "a63junc2", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "mzd3uj4r", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qup1i8u2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "aash07u0", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "u3mxbc9m", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "96hn35ry", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rg1cousn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "q4i91v13", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "s30wprm2", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vufnelro", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5733ehw4", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "p6q2o0zi", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "i71l0u0j", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "sqaqrwzn", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "8pmrroov", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "v75wnflr", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "etvg84al", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "87z9tvz8", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "hrk3kn74", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "q0ityk8a", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "d4lookfj", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "uhm6cpj9", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "e6pafqu9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "t8sgi1ko", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "so5q4fxn", + "_$type": "Box", + "name": "Box(2)", + "x": 93, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "nkfrjca7", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "xivv7hd1", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "xwzgsnyp", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "6iyhne5f", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "0yu6pww1", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "tlg5f22z", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xfy5ytk0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "l1bqyeeg", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "9yfjslps", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "72x4jc6x", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "pwuxlnxv", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "3hycdqdn", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ppyuke2p", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "8opbl55i", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "mj5kyg0p", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "nw1jyi3l", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "mysmmvfe", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "gs1agvk0", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "96un7j1u", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "36i3uih2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "k88a2qw3", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "tcr0dg4z", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "lc6ewdqb", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "u71w0i06", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "6od7nmze", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "gv01iugr", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "9pbeyhgk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "c8mdrukb", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "zebkfrx7", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ofcbwxvi", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "i7kwlxcf", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "n6rnxt6m", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "54e49mdt", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "5cyfbj6z", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "4z4w2i7x", + "_$type": "Box", + "name": "Box(3)", + "x": 186, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "bghch4oq", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "f388p8h1", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "rv0325fn", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "jd0ps4mm", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "o1y7t80z", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "5v2dkvmm", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "c1x7jz94", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "17i5eozz", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "fthqi6w5", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bc8f2iae", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "85j8qbqk", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "8aobvumn", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "a9j8gacb", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "rn8vylqf", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "8d5qjcm8", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "vgj05t0d", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wlppy7i8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "8g195jwj", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "e93wk1vh", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "p4mst63g", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "upvcqhdj", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "p989gybr", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3y32zv1n", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "qzbwx65j", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "7d2mqgfn", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ojw1ujtg", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "w6tfnc62", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "mwa5o3sx", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "lx777vv8", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7e2u9lt2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5k67vtpz", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "1bb14u8j", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0uf6n0ja", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "164uwrnx", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "yujvrgz7", + "_$type": "HBox", + "name": "HBox(2)", + "y": 93, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "ijso5vln", + "_$type": "Box", + "name": "Box(1)", + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "4p6fsjcw", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "243j0x6u", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "t4wjt6hy", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "g2jdnqx5", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "iu7f11m3", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "afv473dh", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ybo7rdgg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "zrxqwgxw", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "6tqoqcen", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qan4xkh8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5go0ntil", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "wzr31sdy", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ow6eb4xu", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "1yys5nxi", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "pl4bdqmq", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "gwgrphdp", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "grs5liv0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7z3lyyc9", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "wetnbl1d", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "cm0lvrrt", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "gccesmr1", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "7wlbyybp", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "z0vwf6x7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "yuzmxv3l", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "4kv0l83m", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "n2of9waf", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nq8furvp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "my6yeh7m", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "bhtvuw4k", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ayl9vte4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "yqtttvu4", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "5l0sm39z", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "lagigg54", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "szgegpjx", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "q9za4dqa", + "_$type": "Box", + "name": "Box(2)", + "x": 93, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "23s8bb36", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "nc5vrn87", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "m5tx33rg", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "8e7ek9k4", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "nye1xkpa", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ooi0fo9q", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fbs8f5l0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7nwa6w28", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "4ci7ge77", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "l3o0z5pm", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0dcvzd79", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "4v7wn55z", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "9ci475ik", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "1ocf85mj", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "c2oju2hf", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "fgoc4fd1", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dhgez4uv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "u8j7ghim", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "7kz759lx", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "09dw2ae9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "syhytdmb", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "gt58cpws", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "atpq7eh1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "ghqxndi9", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "1e5g6nv7", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "x7c351z3", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "law0kkts", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "shwatzy2", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "oeijqmu5", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jsgzds7d", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "st63lsib", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "l59hg8a3", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "71o7e9c2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "oux068m6", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "znre8g72", + "_$type": "Box", + "name": "Box(3)", + "x": 186, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "tfq1xf54", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "z229il7u", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "semroftq", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "dj1d4fzw", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "wn3bnjiv", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "yxw2by2b", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "f8ag5sdh", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qpsaahnk", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "etyck4ac", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "aoy0lqnd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "gfwiamxi", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "hleqabv6", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zencd8cf", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "4do46yl9", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ymbfx1yn", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "1vc0l5vn", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "75yz4cp0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hz8tv948", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "wwy3yxk8", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ezuxll4o", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "fss4o7c0", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "2anye24o", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "84012pqv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "95anmjy1", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "bqutirpw", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "nokdtssx", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rm3391pe", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "pt8gwg69", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "vtixmz2z", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6zupx7zs", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "plzvrywg", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "xaasnrqm", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "znhq2rwr", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "c7zhu557", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "9l1xfkyh", + "_$type": "HBox", + "name": "HBox(3)", + "y": 186, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "8c1g3htp", + "_$type": "Box", + "name": "Box(1)", + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "h38t8sdn", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "h3ttcow4", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "033jwelx", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "pd0co16e", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "toxtsxw8", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ylo1kajf", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ewqs16pj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ccn2ok82", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "tne6pdz1", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "9pccu60j", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "91xh1ymd", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "8cnzlws4", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "cm7dpel6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "7vljnyd5", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "p66ytc4l", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "so7l2hel", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jecbzoxs", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "t9wuj2rp", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "fz2ug4sr", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nplsi6z8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "kqete3ib", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "sb40d6es", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "e8dvf5cb", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "d03p0qvx", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "qmsgagsb", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "e3aeeh1m", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "usib9yy7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "jj1thhso", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "utcylxg4", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dpgl4rg0", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "j0q20wr6", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "2fmjdg1p", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "u0vlf03w", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "f2m2hjl1", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1dk51suh", + "_$type": "Box", + "name": "Box(2)", + "x": 93, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "86s4idox", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "dkaqc4c8", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "xkxjt1d1", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "k1uunxoe", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "f4izmx6d", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "6l34qpc7", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "61fd3787", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "q5nkelrb", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "961or7u8", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6f7sal0s", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qu3q5bgk", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "bnz9hlrt", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "u7sowd2n", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "zl2c9ozv", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "542znhog", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ml822o4c", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jiyu4fwl", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "3x5dka18", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "lccx1c5i", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "h2daezou", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "w0029o9s", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "m836lw8n", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1lp9uoty", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "al7wf3mn", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "naobcjqs", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "bjxakd9w", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "x1p5r1xa", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "b4vuy2xs", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "g6orhdus", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ab12eg74", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0xxzfv8n", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "6g69b6bs", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1ify10jj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "nb1ujsio", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "m40hnquo", + "_$type": "Box", + "name": "Box(3)", + "x": 186, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "w47ht0ti", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "tnvegrr5", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "0m1nvqgg", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "ebfz6va8", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ndt59ziu", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "4aua9e3d", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sypt0bcy", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "b8u1nr4c", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "0tps8hha", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gxhesxqq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "uu2v6zwl", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "gu8flw15", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "lkn37qcg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "c2af0zjz", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "pdtlhtb5", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ir83om1v", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2xoj7u8d", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vn8whnz0", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ekmcc6m1", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "i8jt75dm", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "oen59n4o", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "3k8yieyh", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1n3dcovs", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "jz2gicls", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "me971rb9", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "y32gkhja", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1gc1dy8v", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "n2qflyhf", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "fjq61imm", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6v5nozni", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "gtppq1sb", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "bkp60a18", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "q4rtgxnz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "5lyzmyua", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "cfnhul55", + "_$type": "Box", + "name": "Box(2)", + "x": 282, + "width": 288, + "height": 288, + "_$child": [ + { + "_$id": "2b8dvj5v", + "_$type": "Sprite", + "name": "Sprite", + "width": 288, + "height": 288, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(123, 129, 140, 1)" + } + ] + }, + { + "_$id": "z4vkwizi", + "_$type": "Sprite", + "name": "Sprite", + "x": 6, + "y": 6, + "width": 276, + "height": 276, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(182, 186, 194, 1)" + } + ] + }, + { + "_$id": "5l19xnl2", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 276, + "height": 276, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "sh24ko2z", + "_$type": "HBox", + "name": "HBox(1)", + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "x24tsq6o", + "_$type": "Box", + "name": "Box(1)", + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "zcphkxxe", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "i3og667i", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "z0fq621g", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "89cmosj6", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "kxxrxd5f", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "8bo1hfg7", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hj4ng8tv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vdf4kry9", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "e67brm7j", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qi1h97e6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "52ksxxsb", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "5vziwrja", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "c9q89pob", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "krp77p6r", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ncb8le6u", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "sg9mh0oq", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fi515jj4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6rp9g0b0", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "psbtz5db", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "9qwb7688", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "iofiw5u5", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "dt20w5o5", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hc00rah1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "m4tylnzr", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "qzmoedji", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "j0rjsroq", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "g8dlihnj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "eyg37sa3", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "zerhuu7c", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nrl7e1b7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "wbj257ry", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "su11cvbn", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "x72fl629", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "pjyssedd", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "cymgwilj", + "_$type": "Box", + "name": "Box(2)", + "x": 93, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "mccre7tv", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "hbryki1t", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "dro5qhd8", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "ve5lwvda", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "5gbirjwt", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "s8yfyecf", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "s29h640l", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1eqxt0b7", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "qg2qnsc8", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nplad5li", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "w0tg8vd3", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "0pvutjf6", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7029utij", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "wppq2wy8", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ykvr5fx3", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "7my8y1pi", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "mai452wn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "gebh65u8", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "sue3m0c6", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "57pxqff7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1ajda0vp", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "b2yl00ds", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "nigwmg5j", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "s2yd6h7q", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "hci63wyp", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "xdii9z04", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zbiklm28", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ekxk6i5a", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "oj5cxplw", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "f0x9pz52", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "4icw2f1r", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "qwrbtjco", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2prtaaum", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "115cip8c", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "zn0pnqc0", + "_$type": "Box", + "name": "Box(3)", + "x": 186, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "feb4rmv3", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "d07bj7qc", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "kznwoyrh", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "1ibiazdb", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "9pvstr5r", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "edk2u7zg", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ks03l81f", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "u224chxe", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "d4aqes8n", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "yvnmrn26", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ihkukp6i", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "pxwfnmlh", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "p11mcnaa", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "p2r4ooid", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "tzos6qvf", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ukh0l402", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "yd4vfef6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "s7l18df0", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "osgox43l", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "az7zqks9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2rcpyxmp", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "4za8v9n4", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xxk08j93", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "ky3qiytr", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "3cdxe5sk", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "q62snhl2", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bwmgy3t6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "d554ict1", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "qm6sjkm4", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "64lp8snu", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xlkh4y4b", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "8ohnv7q8", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "l49et1cw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "vcuavg5o", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "az85z5vs", + "_$type": "HBox", + "name": "HBox(2)", + "y": 93, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "dqxbiksw", + "_$type": "Box", + "name": "Box(1)", + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "ejwpo6i8", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "cvtrwyn1", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "6pwokktt", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "tmtm78k2", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ayjod56i", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "gsebeb5q", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rpzbxuyr", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "iwvr5u4n", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "oym0e71i", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ghrlpfcd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "8l4p6wjf", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "78pixo61", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "68wiobv9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "hbol3kzd", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "uyn7cqgf", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "4wj17khv", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "yxn2x4ie", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "rlkyugra", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "h764bwri", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kqh4p1qj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "sdjt1dvo", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "lbsxrui6", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "tspoydjx", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "f78nic7u", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "tknfa5j0", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "qr9hlbfl", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ojrme94u", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "oigadncc", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "bg7bp1il", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6v77bkoa", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "u0byo7ag", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "cpf9ifjn", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4l0bb86p", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "takyhgih", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "msm3y168", + "_$type": "Box", + "name": "Box(2)", + "x": 93, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "lmr4xokp", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "i6grhzac", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "kscdnqed", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "gtgdw6uo", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "xj67k1ww", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "5vgszw6l", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ip56zk6m", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "or8a1udv", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "sn2g6th9", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rwawrltb", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "f3juwst2", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "6vpe9fhq", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "40j6qxm1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "mvio7irg", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "we2jyyqw", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "9idx4tbg", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "c68vtpoe", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dio0i94f", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "s20m8kda", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hy4xrler", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "z7wpzo64", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "pxtlaqjj", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "315fx2d9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "9i5l6pwd", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "dodu0pau", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "sfy0joo3", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "c0a3kv50", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "rn8q7s1y", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "u9rdr7bn", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "o0zobq5x", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ud1ka8v1", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "l4qd6j4t", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "guvzhpzc", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "7qsdtmy9", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vndxb11c", + "_$type": "Box", + "name": "Box(3)", + "x": 186, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "a9rj1fb9", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "qib7ay88", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "tngrqrgp", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "zycnhxkz", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "8hbgcjge", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "fd9qyneb", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xcuql0wu", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xnv3y4ux", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "0dk9p2gg", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "4vks96oj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "82h4ljx7", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "essl4bkf", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ind2i1qb", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "xzyrw6g7", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ngecq3xq", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ijdwlbli", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "uhc21f7k", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "zj6qg435", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "iksnchsh", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wrko9c2s", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "piexfc2r", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "yuoqftxx", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "uzojdl6s", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "gpuog1um", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ih6tdgqz", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "mnkcpvpp", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "aa4gz9kx", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qaxq8bo7", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "nea5rbv1", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "r54bc6in", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "sctt6qhn", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "h6h89aea", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hrrc3k7r", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "kdsspo5r", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "6m5h7x60", + "_$type": "HBox", + "name": "HBox(3)", + "y": 186, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "vbl8sp0f", + "_$type": "Box", + "name": "Box(1)", + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "ajg6584s", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "u46vyvch", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ewuheuio", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "avnjjyvt", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ku3pm9wu", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "vbpfytxa", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3rytm2gj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qvc4175k", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "wfny2tda", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "brs96be5", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ijb3wip5", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "t0y2kfh8", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vjg34z6w", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "8fgyqzsg", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "dbxzn56s", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "coyt1enf", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "jl62h4n3", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "cu6ybmq6", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "pglshesi", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "yk6sn12j", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "b6ctyzmg", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "4lz5xik6", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hty2l1v4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "r0gnimla", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "qitu1e9b", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "rdgaf3ti", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "uq4kkkh6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "9uapv1z2", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "kh40zeb6", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "44cuw4c7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2hj5d3ca", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "zg09skkw", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "mek5eoag", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "ma75cdd3", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "e8qq0e09", + "_$type": "Box", + "name": "Box(2)", + "x": 93, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "v8i04zrr", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "5to9vmn2", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ex9bl15k", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "y906mz5p", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "m09t4uti", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "qvugn3ig", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "j8y1c9s9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "lhsl6cep", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "hdfp9yz0", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ozmgy6h7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "p6a0n8la", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "6b9bwb90", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0bmwie0p", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "u7wgfzua", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "61j4lq19", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "51who1ii", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "95ackcyo", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2cgwwkdl", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "j447419b", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "cwib085k", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "k89lnjoa", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "s8yjt9i1", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "pz22pbsg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "ww0otn6o", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "cultb49h", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "meab3wpo", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "yko8ty5c", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "3bukqr65", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "dyg8cbhg", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2m1qeu3l", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "n2jx190x", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "cd0c4sdt", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "b03piaxg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "x5bvm04d", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "9ts0xpcl", + "_$type": "Box", + "name": "Box(3)", + "x": 186, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "02i7htf7", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "skigilup", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "tts3q573", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "lrwuxutu", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "k0x8invo", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "e99m3la7", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "iunrrnug", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "x59hikcc", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "19u73196", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "eemvgi4q", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "n1zrm1mu", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "bd2t8h5h", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7rfdg65y", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "emg9k2nn", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "7bkbo4bk", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "dnff61h5", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "aefyulip", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "crb1vn9b", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "0tqn3lrb", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hsfozsvx", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5g72i6ka", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "6g951w2l", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "38zk7cus", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "w2sfwwo8", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "05benglu", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "y4y1vkcr", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "g2v42mt9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "51slc5t5", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "6zzs1vj8", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ln1acf87", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "zp66c1n4", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "fl7fpf22", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "j0ekizac", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "1ob3o621", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "lo0axwii", + "_$type": "Box", + "name": "Box(3)", + "x": 564, + "width": 288, + "height": 288, + "_$child": [ + { + "_$id": "i0e6bb8y", + "_$type": "Sprite", + "name": "Sprite", + "width": 288, + "height": 288, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(123, 129, 140, 1)" + } + ] + }, + { + "_$id": "skxypn7d", + "_$type": "Sprite", + "name": "Sprite", + "x": 6, + "y": 6, + "width": 276, + "height": 276, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(182, 186, 194, 1)" + } + ] + }, + { + "_$id": "4llk7vd2", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 276, + "height": 276, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "bix801lb", + "_$type": "HBox", + "name": "HBox(1)", + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "70hcsiu3", + "_$type": "Box", + "name": "Box(1)", + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "iijcswe4", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "9srkajjd", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "eqpzy531", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "uuaypjb7", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "e5puoo2i", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "0lsivol1", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "58wzysmu", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "phnitym3", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "h2n3i829", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "qk29n3tq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "cd1r5mpn", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "3moogjx2", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gmh56wyj", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "ojq2vavd", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "fsgsrect", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "r1m17wna", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "hl4uv6aq", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "16v83hy5", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "5m03lakc", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "v4ykvso2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "q50kblu7", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ppjeohtz", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "n93vebcp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "9vi43yxk", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "7krw0ik2", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "u9bj2wie", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "70m36jo2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "pkmt37jd", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "6vdnos5r", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "b4tucahz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "3z1ggeue", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "y770hrhy", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "ozqxl6v9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "0ifmrqsz", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ofofksb1", + "_$type": "Box", + "name": "Box(2)", + "x": 93, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "4ufnaylh", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "asjki419", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "aeqrgljx", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "wt3f7hkz", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ztmdkac6", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "s39yoe3v", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "exm1nz0y", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qp9wl8pa", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "xejb90h2", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3edpana3", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6slvg631", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "6esqmade", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "51pl9u3w", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "lq4gpcrx", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "s79c0oj0", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "v1xomich", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "c1sgtgbl", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "60ujpxjk", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "1z2iv7ra", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "dhwp4d4y", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dxekefdh", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "boy2xphe", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "69sv7iim", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "ru5hqzyy", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "0gv5opax", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "9flcybqf", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gk6iundt", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "yzexhp85", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "0fhbs0it", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "epami8fa", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ecqz05cx", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "nv4lhg8e", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "95ng37d8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "2ww09iqv", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "owl5ge8e", + "_$type": "Box", + "name": "Box(3)", + "x": 186, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "uqovh2lf", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "wsblphjl", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "81sz5fyu", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "7ttp8o42", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ft0t0s6k", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "lscge348", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "l277dvk3", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "frzga7dx", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "i0248gqn", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "isl6nq03", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "kfibkrbg", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "frjus7zj", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "o5c5bu28", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "512wltgb", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "uxjxkegh", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "yzbiehvq", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3ebo72ze", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "rc8t1vis", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "g1mehevy", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "maemuj6k", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "e2qt81sk", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "22vs01hc", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "80tkg8iv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "teyc7b2w", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "dwdf4z1g", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "5546wuj2", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "d2j1o9li", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ha8i0hmg", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "7vk22ey0", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "sdxycm38", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ufy0tvho", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "btyi7dps", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "v9sme9hu", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "9y9t3hc4", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "pahh0fd2", + "_$type": "HBox", + "name": "HBox(2)", + "y": 93, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "784aw8q6", + "_$type": "Box", + "name": "Box(1)", + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "7b8quuxq", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "vvq7x7ix", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "lnmvtnza", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "i3qlxvfu", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "s5u8ce65", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "emksgwax", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8alh0gb7", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dnitnx24", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "o4m7y6u6", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3t88io38", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ljxx3qqs", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "6d9woxx7", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "s38uwy4v", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "7ixswzh2", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "7h6ladp0", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "4bub6xt2", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "fvfqpr5m", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "f4y81xnf", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "61d7m0fh", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "wfzpxw4l", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ttx2jobg", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "kwljmz86", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vcy40ob3", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "4wv09n3c", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "67dt7w48", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "pp6exdum", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xcbplf46", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2kx08bna", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "h269mh4z", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rgj3n1oo", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "zuz9r3n1", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "chfzblni", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gd6fig5h", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "eymickc6", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "kgle2p5r", + "_$type": "Box", + "name": "Box(2)", + "x": 93, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "zq59ytnz", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "hrc5tayy", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "zc3uda9n", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "bb0ypdy7", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "nw20fian", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "b0xm3fhm", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "51e1ikx4", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "weyn6hp3", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "1m1ysrvj", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "44tnmwpt", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xbq2edc6", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "j46105ps", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "h71kwp42", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "h6ktn3jq", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "cg11si54", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "qrb7cm7k", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kk5n4nsz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "020f7a06", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "hp9vd1cf", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6ldtgxn9", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "r73cli98", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "6t8sbcu7", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bo2vvugi", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "6isbpk8g", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "hhb2j176", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "aium3scq", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "bit4x77i", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2q2qefzz", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "t6dphyom", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "7ntz8uyn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "crgp2b9z", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "j9e6j062", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zasrg664", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "e4k0daku", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "mo5advvj", + "_$type": "Box", + "name": "Box(3)", + "x": 186, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "qqlcmtfe", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "7q6iswpl", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "p7pr40ev", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "vyqfbwx2", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "kgui7pg6", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "xw0846w7", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "3lahm52p", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2w0lo0mq", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "gftj6qyt", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xf75rt4p", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "e6xa1qdm", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "xsjgkump", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "oaar0300", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "wgw6ag02", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "vhr9tlhg", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "na2615lm", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "6kc6xhya", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "cmadquzb", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "7il72cl0", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "xg66yfu1", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "tiflfb7k", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "azc2zmc0", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8qzag0hp", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "0z36jur3", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "6j4ge92g", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "sglahfgo", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2xq7d6c2", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "x9kic5z0", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "qg0ij1pb", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "il9hgsiz", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dj8iusri", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "laft3ayp", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "z8z40ei6", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "vcyge97n", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "240l5v5m", + "_$type": "HBox", + "name": "HBox(3)", + "y": 186, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "un32pnzj", + "_$type": "Box", + "name": "Box(1)", + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "720dw0jn", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "3e31hkl9", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "6y8x7jfo", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "0wd8r0em", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "vx1clycn", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "30emp5tl", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "aabcaix3", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "i294na7p", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "nubb482o", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "86na12cw", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "j1ix24cd", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "fs27j35o", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "iav86qc3", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "sozphhz0", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ig3exbc3", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "yvx8mzfz", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "zswjluqg", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6r22cxij", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ndo0mcp9", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "chhp7znx", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hfvoh7e1", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "943wdvb1", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "2xfo2w4l", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "33x23rjw", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "w8wc50ot", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "vy7o3kxs", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vlnl6eih", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "2su3n7i2", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "kiriic90", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "s2sj4qlv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dj87ty6s", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "tjaogq0c", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "gac2ok68", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "pkvg9d6v", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0aw0czxd", + "_$type": "Box", + "name": "Box(2)", + "x": 93, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "z4a24kcm", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "901es0r0", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "qqw7zkz4", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "vqj9l5rh", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "3r6aprf6", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "abajy4lv", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "04lsxhwv", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "t64jj7iv", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "9wqze08q", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "t32x1kr3", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "3ta4ce6o", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "y6t5zgk4", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8zrp123x", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "cpeo58ic", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "mi4yiz7s", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "0m91zpil", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "kbmsg7pm", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "gvxdsvf8", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "pozr211s", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "1ue3w8ir", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "a55kl6uj", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "y5tpnj86", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "59ez4zkd", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "ti1g5sxj", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "45ka4knm", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "ofdf6yt8", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "a3vu8s1f", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "m4oot8hh", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "srcgaoou", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "408obw5h", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "77wduqdp", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "685vpco5", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "mqhvg5d8", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "rdiqmpu8", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "leha44rb", + "_$type": "Box", + "name": "Box(3)", + "x": 186, + "width": 90, + "height": 90, + "_$comp": [ + { + "_$type": "abc6b60b-980b-4853-baa5-ac8506e00c4a", + "scriptPath": "../src/views/Block.ts", + "XIndex": 0, + "YIndex": 0, + "XGroup": 0, + "YGroup": 0, + "obj_pos": null + } + ], + "_$child": [ + { + "_$id": "eg3y3uss", + "_$type": "Sprite", + "name": "bg", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "xjn4s1hv", + "_$type": "Sprite", + "name": "Sprite", + "width": 90, + "height": 90, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "q6imx29v", + "_$type": "VBox", + "name": "notes", + "width": 90, + "height": 90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "ynh9djje", + "_$type": "HBox", + "name": "HBox(1)", + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "gmj1ld49", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "et6864ut", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "rf8un5mk", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "pcy6jk2x", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "j44cidnr", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8rr334yb", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "o5r5u9lt", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "xrqjbapi", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "lx6oox0v", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "1v8e696e", + "_$type": "HBox", + "name": "HBox(2)", + "y": 30, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "vylcmm7m", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "io9jytqd", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "vqshjeyn", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "w6hta5wm", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "4088m7zl", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "0xxgrd1e", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "d3q0l5o9", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "3tupm6s9", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "77a1q5ek", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "rxrkpab8", + "_$type": "HBox", + "name": "HBox(3)", + "y": 60, + "width": 90, + "height": 30, + "mouseThrough": true, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "xomqxbi2", + "_$type": "Box", + "name": "Box(1)", + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "4wl76bgm", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "n7n4hf67", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "yrue7l1o", + "_$type": "Box", + "name": "Box(2)", + "x": 30, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "gos6mhy6", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "8s50zqp3", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ghr1gieu", + "_$type": "Box", + "name": "Box(3)", + "x": 60, + "width": 30, + "height": 30, + "_$child": [ + { + "_$id": "1b5cxw7m", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(89, 120, 188, 1)" + } + ] + }, + { + "_$id": "86qi6k24", + "_$type": "Label", + "name": "Label", + "y": 1, + "width": 30, + "height": 30, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 22, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "daqb3oq1", + "_$type": "Label", + "name": "label_show", + "y": 6, + "width": 90, + "height": 90, + "centerX": 0, + "centerY": 6, + "text": "8", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "xtilafge", + "_$type": "VBox", + "name": "pos", + "width": 852, + "height": 852, + "centerX": 0, + "centerY": 0, + "space": -6, + "align": "center", + "_$child": [ + { + "_$id": "o5mgijxh", + "_$type": "HBox", + "name": "HBox_1", + "width": 852, + "height": 288, + "centerX": 0, + "space": -6, + "align": "middle", + "_$child": [ + { + "_$id": "1l68zehn", + "_$type": "Box", + "name": "Box_1", + "width": 288, + "height": 288, + "_$child": [ + { + "_$id": "nz52ct8l", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 276, + "height": 276, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "mvwg8bqk", + "_$type": "HBox", + "name": "HBox_1", + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "i1ki1ask", + "_$type": "Box", + "name": "Box_1", + "width": 90, + "height": 90 + }, + { + "_$id": "754igh46", + "_$type": "Box", + "name": "Box_2", + "x": 93, + "width": 90, + "height": 90 + }, + { + "_$id": "xnj0mtqa", + "_$type": "Box", + "name": "Box_3", + "x": 186, + "width": 90, + "height": 90 + } + ] + }, + { + "_$id": "198uivb3", + "_$type": "HBox", + "name": "HBox_2", + "y": 93, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "y3xmpbqn", + "_$type": "Box", + "name": "Box_1", + "width": 90, + "height": 90 + }, + { + "_$id": "e2y6ym8a", + "_$type": "Box", + "name": "Box_2", + "x": 93, + "width": 90, + "height": 90 + }, + { + "_$id": "kj6ot9tq", + "_$type": "Box", + "name": "Box_3", + "x": 186, + "width": 90, + "height": 90 + } + ] + }, + { + "_$id": "iqdpo8bw", + "_$type": "HBox", + "name": "HBox_3", + "y": 186, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "gw5otfr0", + "_$type": "Box", + "name": "Box_1", + "width": 90, + "height": 90 + }, + { + "_$id": "9h8nzfwh", + "_$type": "Box", + "name": "Box_2", + "x": 93, + "width": 90, + "height": 90 + }, + { + "_$id": "xcpenvsk", + "_$type": "Box", + "name": "Box_3", + "x": 186, + "width": 90, + "height": 90 + } + ] + } + ] + } + ] + }, + { + "_$id": "hf31wzcs", + "_$type": "Box", + "name": "Box_2", + "x": 282, + "width": 288, + "height": 288, + "_$child": [ + { + "_$id": "9rz2rubh", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 276, + "height": 276, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "owdevg29", + "_$type": "HBox", + "name": "HBox_1", + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "fm91z3tc", + "_$type": "Box", + "name": "Box_1", + "width": 90, + "height": 90 + }, + { + "_$id": "jj6pmdwd", + "_$type": "Box", + "name": "Box_2", + "x": 93, + "width": 90, + "height": 90 + }, + { + "_$id": "tkjj54qb", + "_$type": "Box", + "name": "Box_3", + "x": 186, + "width": 90, + "height": 90 + } + ] + }, + { + "_$id": "d2pybfny", + "_$type": "HBox", + "name": "HBox_2", + "y": 93, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "u95cqrx9", + "_$type": "Box", + "name": "Box_1", + "width": 90, + "height": 90 + }, + { + "_$id": "w7pswxhr", + "_$type": "Box", + "name": "Box_2", + "x": 93, + "width": 90, + "height": 90 + }, + { + "_$id": "f228g31e", + "_$type": "Box", + "name": "Box_3", + "x": 186, + "width": 90, + "height": 90 + } + ] + }, + { + "_$id": "s5uymsq5", + "_$type": "HBox", + "name": "HBox_3", + "y": 186, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "714cmr79", + "_$type": "Box", + "name": "Box_1", + "width": 90, + "height": 90 + }, + { + "_$id": "j5gwhkn5", + "_$type": "Box", + "name": "Box_2", + "x": 93, + "width": 90, + "height": 90 + }, + { + "_$id": "dbcakrrk", + "_$type": "Box", + "name": "Box_3", + "x": 186, + "width": 90, + "height": 90 + } + ] + } + ] + } + ] + }, + { + "_$id": "7go9vyvj", + "_$type": "Box", + "name": "Box_3", + "x": 564, + "width": 288, + "height": 288, + "_$child": [ + { + "_$id": "pydxo0l6", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 276, + "height": 276, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "qvrls7es", + "_$type": "HBox", + "name": "HBox_1", + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "pxtywqk5", + "_$type": "Box", + "name": "Box_1", + "width": 90, + "height": 90 + }, + { + "_$id": "o8q3t66g", + "_$type": "Box", + "name": "Box_2", + "x": 93, + "width": 90, + "height": 90 + }, + { + "_$id": "utpeqm73", + "_$type": "Box", + "name": "Box_3", + "x": 186, + "width": 90, + "height": 90 + } + ] + }, + { + "_$id": "uk4nmn0m", + "_$type": "HBox", + "name": "HBox_2", + "y": 93, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "638jt42m", + "_$type": "Box", + "name": "Box_1", + "width": 90, + "height": 90 + }, + { + "_$id": "8w6ddrkn", + "_$type": "Box", + "name": "Box_2", + "x": 93, + "width": 90, + "height": 90 + }, + { + "_$id": "oow6y4y6", + "_$type": "Box", + "name": "Box_3", + "x": 186, + "width": 90, + "height": 90 + } + ] + }, + { + "_$id": "5brosrha", + "_$type": "HBox", + "name": "HBox_3", + "y": 186, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "vhjwm3wp", + "_$type": "Box", + "name": "Box_1", + "width": 90, + "height": 90 + }, + { + "_$id": "co301gon", + "_$type": "Box", + "name": "Box_2", + "x": 93, + "width": 90, + "height": 90 + }, + { + "_$id": "v9zcclyn", + "_$type": "Box", + "name": "Box_3", + "x": 186, + "width": 90, + "height": 90 + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "atrtqaqu", + "_$type": "HBox", + "name": "HBox_2", + "y": 282, + "width": 852, + "height": 288, + "centerX": 0, + "space": -6, + "align": "middle", + "_$child": [ + { + "_$id": "6fdt2kbt", + "_$type": "Box", + "name": "Box_1", + "width": 288, + "height": 288, + "_$child": [ + { + "_$id": "u43g4bd2", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 276, + "height": 276, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "vri6vx7d", + "_$type": "HBox", + "name": "HBox_1", + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "b29w8nen", + "_$type": "Box", + "name": "Box_1", + "width": 90, + "height": 90 + }, + { + "_$id": "7oqn6l0g", + "_$type": "Box", + "name": "Box_2", + "x": 93, + "width": 90, + "height": 90 + }, + { + "_$id": "j7fusx3e", + "_$type": "Box", + "name": "Box_3", + "x": 186, + "width": 90, + "height": 90 + } + ] + }, + { + "_$id": "94hc1cpl", + "_$type": "HBox", + "name": "HBox_2", + "y": 93, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "v89on145", + "_$type": "Box", + "name": "Box_1", + "width": 90, + "height": 90 + }, + { + "_$id": "hthoj301", + "_$type": "Box", + "name": "Box_2", + "x": 93, + "width": 90, + "height": 90 + }, + { + "_$id": "8xy927bx", + "_$type": "Box", + "name": "Box_3", + "x": 186, + "width": 90, + "height": 90 + } + ] + }, + { + "_$id": "5si2umwl", + "_$type": "HBox", + "name": "HBox_3", + "y": 186, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "9cvfjy56", + "_$type": "Box", + "name": "Box_1", + "width": 90, + "height": 90 + }, + { + "_$id": "7jw1yjog", + "_$type": "Box", + "name": "Box_2", + "x": 93, + "width": 90, + "height": 90 + }, + { + "_$id": "0gr82xam", + "_$type": "Box", + "name": "Box_3", + "x": 186, + "width": 90, + "height": 90 + } + ] + } + ] + } + ] + }, + { + "_$id": "7ewltwgw", + "_$type": "Box", + "name": "Box_2", + "x": 282, + "width": 288, + "height": 288, + "_$child": [ + { + "_$id": "pl8j15xn", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 276, + "height": 276, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "jwcinyz0", + "_$type": "HBox", + "name": "HBox_1", + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "0mhvwtap", + "_$type": "Box", + "name": "Box_1", + "width": 90, + "height": 90 + }, + { + "_$id": "h8sh5cqh", + "_$type": "Box", + "name": "Box_2", + "x": 93, + "width": 90, + "height": 90 + }, + { + "_$id": "9b7sr9e4", + "_$type": "Box", + "name": "Box_3", + "x": 186, + "width": 90, + "height": 90 + } + ] + }, + { + "_$id": "71h7glv1", + "_$type": "HBox", + "name": "HBox_2", + "y": 93, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "1w7vcrft", + "_$type": "Box", + "name": "Box_1", + "width": 90, + "height": 90 + }, + { + "_$id": "05ky0vv2", + "_$type": "Box", + "name": "Box_2", + "x": 93, + "width": 90, + "height": 90 + }, + { + "_$id": "op33075k", + "_$type": "Box", + "name": "Box_3", + "x": 186, + "width": 90, + "height": 90 + } + ] + }, + { + "_$id": "5nwonyq8", + "_$type": "HBox", + "name": "HBox_3", + "y": 186, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "vzepkudz", + "_$type": "Box", + "name": "Box_1", + "width": 90, + "height": 90 + }, + { + "_$id": "lv854svs", + "_$type": "Box", + "name": "Box_2", + "x": 93, + "width": 90, + "height": 90 + }, + { + "_$id": "uitt08p9", + "_$type": "Box", + "name": "Box_3", + "x": 186, + "width": 90, + "height": 90 + } + ] + } + ] + } + ] + }, + { + "_$id": "vp1brahk", + "_$type": "Box", + "name": "Box_3", + "x": 564, + "width": 288, + "height": 288, + "_$child": [ + { + "_$id": "2rtdrba0", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 276, + "height": 276, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "51vviv50", + "_$type": "HBox", + "name": "HBox_1", + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "5m3qd2mm", + "_$type": "Box", + "name": "Box_1", + "width": 90, + "height": 90 + }, + { + "_$id": "wzv427ec", + "_$type": "Box", + "name": "Box_2", + "x": 93, + "width": 90, + "height": 90 + }, + { + "_$id": "c8okt6hi", + "_$type": "Box", + "name": "Box_3", + "x": 186, + "width": 90, + "height": 90 + } + ] + }, + { + "_$id": "rlychkwa", + "_$type": "HBox", + "name": "HBox_2", + "y": 93, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "vscfs1bt", + "_$type": "Box", + "name": "Box_1", + "width": 90, + "height": 90 + }, + { + "_$id": "1pm1gdlj", + "_$type": "Box", + "name": "Box_2", + "x": 93, + "width": 90, + "height": 90 + }, + { + "_$id": "acig57ga", + "_$type": "Box", + "name": "Box_3", + "x": 186, + "width": 90, + "height": 90 + } + ] + }, + { + "_$id": "vsav3rrt", + "_$type": "HBox", + "name": "HBox_3", + "y": 186, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "2e4pdk6i", + "_$type": "Box", + "name": "Box_1", + "width": 90, + "height": 90 + }, + { + "_$id": "fwjhyh0h", + "_$type": "Box", + "name": "Box_2", + "x": 93, + "width": 90, + "height": 90 + }, + { + "_$id": "obduhxki", + "_$type": "Box", + "name": "Box_3", + "x": 186, + "width": 90, + "height": 90 + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "6ftvdfh1", + "_$type": "HBox", + "name": "HBox_3", + "y": 564, + "width": 852, + "height": 288, + "centerX": 0, + "space": -6, + "align": "middle", + "_$child": [ + { + "_$id": "xkv3yl9a", + "_$type": "Box", + "name": "Box_1", + "width": 288, + "height": 288, + "_$child": [ + { + "_$id": "p4kxakz9", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 276, + "height": 276, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "j9auuof3", + "_$type": "HBox", + "name": "HBox_1", + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "avhl04tp", + "_$type": "Box", + "name": "Box_1", + "width": 90, + "height": 90 + }, + { + "_$id": "7gdmfy5q", + "_$type": "Box", + "name": "Box_2", + "x": 93, + "width": 90, + "height": 90 + }, + { + "_$id": "gn1j9bl9", + "_$type": "Box", + "name": "Box_3", + "x": 186, + "width": 90, + "height": 90 + } + ] + }, + { + "_$id": "rzgbizhr", + "_$type": "HBox", + "name": "HBox_2", + "y": 93, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "ajf1l5bl", + "_$type": "Box", + "name": "Box_1", + "width": 90, + "height": 90 + }, + { + "_$id": "ozja0y2f", + "_$type": "Box", + "name": "Box_2", + "x": 93, + "width": 90, + "height": 90 + }, + { + "_$id": "hhzf7ngn", + "_$type": "Box", + "name": "Box_3", + "x": 186, + "width": 90, + "height": 90 + } + ] + }, + { + "_$id": "3nq1l438", + "_$type": "HBox", + "name": "HBox_3", + "y": 186, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "o5osc840", + "_$type": "Box", + "name": "Box_1", + "width": 90, + "height": 90 + }, + { + "_$id": "3tik42ib", + "_$type": "Box", + "name": "Box_2", + "x": 93, + "width": 90, + "height": 90 + }, + { + "_$id": "keosqgpj", + "_$type": "Box", + "name": "Box_3", + "x": 186, + "width": 90, + "height": 90 + } + ] + } + ] + } + ] + }, + { + "_$id": "jy7svn8t", + "_$type": "Box", + "name": "Box_2", + "x": 282, + "width": 288, + "height": 288, + "_$child": [ + { + "_$id": "ot47azhq", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 276, + "height": 276, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "hdq1qhqi", + "_$type": "HBox", + "name": "HBox_1", + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "4xqzspt4", + "_$type": "Box", + "name": "Box_1", + "width": 90, + "height": 90 + }, + { + "_$id": "gm6w9r68", + "_$type": "Box", + "name": "Box_2", + "x": 93, + "width": 90, + "height": 90 + }, + { + "_$id": "etrvuepk", + "_$type": "Box", + "name": "Box_3", + "x": 186, + "width": 90, + "height": 90 + } + ] + }, + { + "_$id": "awrcgxf6", + "_$type": "HBox", + "name": "HBox_2", + "y": 93, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "n30wtfu3", + "_$type": "Box", + "name": "Box_1", + "width": 90, + "height": 90 + }, + { + "_$id": "onoyzecp", + "_$type": "Box", + "name": "Box_2", + "x": 93, + "width": 90, + "height": 90 + }, + { + "_$id": "jh25qe42", + "_$type": "Box", + "name": "Box_3", + "x": 186, + "width": 90, + "height": 90 + } + ] + }, + { + "_$id": "tljwnhqr", + "_$type": "HBox", + "name": "HBox_3", + "y": 186, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "z408d0b1", + "_$type": "Box", + "name": "Box_1", + "width": 90, + "height": 90 + }, + { + "_$id": "mjwzaiz1", + "_$type": "Box", + "name": "Box_2", + "x": 93, + "width": 90, + "height": 90 + }, + { + "_$id": "a19jes85", + "_$type": "Box", + "name": "Box_3", + "x": 186, + "width": 90, + "height": 90 + } + ] + } + ] + } + ] + }, + { + "_$id": "75gf5iqw", + "_$type": "Box", + "name": "Box_3", + "x": 564, + "width": 288, + "height": 288, + "_$child": [ + { + "_$id": "5sf7ents", + "_$type": "VBox", + "name": "VBox", + "x": 6, + "y": 6, + "width": 276, + "height": 276, + "centerX": 0, + "centerY": 0, + "space": 3, + "align": "center", + "_$child": [ + { + "_$id": "fyji66wq", + "_$type": "HBox", + "name": "HBox_1", + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "qtv6mb4e", + "_$type": "Box", + "name": "Box_1", + "width": 90, + "height": 90 + }, + { + "_$id": "rxaubds9", + "_$type": "Box", + "name": "Box_2", + "x": 93, + "width": 90, + "height": 90 + }, + { + "_$id": "0v1bq2yt", + "_$type": "Box", + "name": "Box_3", + "x": 186, + "width": 90, + "height": 90 + } + ] + }, + { + "_$id": "vh4lah18", + "_$type": "HBox", + "name": "HBox_2", + "y": 93, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "pu1ylqz6", + "_$type": "Box", + "name": "Box_1", + "width": 90, + "height": 90 + }, + { + "_$id": "l7nx07fh", + "_$type": "Box", + "name": "Box_2", + "x": 93, + "width": 90, + "height": 90 + }, + { + "_$id": "233xhh6g", + "_$type": "Box", + "name": "Box_3", + "x": 186, + "width": 90, + "height": 90 + } + ] + }, + { + "_$id": "8e5h8rpp", + "_$type": "HBox", + "name": "HBox_3", + "y": 186, + "width": 276, + "height": 90, + "space": 3, + "align": "middle", + "_$child": [ + { + "_$id": "102diek1", + "_$type": "Box", + "name": "Box_1", + "width": 90, + "height": 90 + }, + { + "_$id": "fwzr94ie", + "_$type": "Box", + "name": "Box_2", + "x": 93, + "width": 90, + "height": 90 + }, + { + "_$id": "nbvqn3f3", + "_$type": "Box", + "name": "Box_3", + "x": 186, + "width": 90, + "height": 90 + } + ] + } + ] + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "d9m8qe4l", + "_$type": "Box", + "name": "right", + "x": 960, + "y": 30, + "width": 912, + "height": 852, + "_mouseState": 2, + "right": 48, + "top": 30, + "_$child": [ + { + "_$id": "k7h7kcbo", + "_$type": "HBox", + "name": "buttons", + "x": 1, + "y": 102, + "width": 910, + "height": 150, + "_mouseState": 2, + "drawCallOptimize": true, + "bottom": 600, + "centerX": 0, + "space": 10, + "align": "middle", + "_$child": [ + { + "_$id": "5tjil58p", + "_$type": "Button", + "name": "btn_undo", + "width": 220, + "height": 150, + "_mouseState": 2, + "skin": "res://d8b02de6-eee7-47ea-b227-d6dbffdadae3", + "label": "", + "labelSize": 20, + "labelAlign": "center", + "labelVAlign": "middle", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": false + } + ], + "_$child": [ + { + "_$id": "93gv08fv", + "_$type": "Image", + "name": "Image", + "x": 75, + "y": 20, + "width": 70, + "height": 70, + "centerX": 0, + "centerY": -20, + "skin": "res://8cacbf45-5b2c-4ec0-ad94-5ca671b74d72", + "color": "#ffffff" + }, + { + "_$id": "qyd2fm1t", + "_$type": "Label", + "name": "label", + "x": 60, + "y": 100, + "width": 100, + "height": 40, + "centerX": 0, + "centerY": 45, + "text": "Undo", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 24, + "color": "rgba(84, 89, 98, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1no6qk11", + "_$type": "Button", + "name": "btn_erase", + "x": 230, + "width": 220, + "height": 150, + "_mouseState": 2, + "skin": "res://d8b02de6-eee7-47ea-b227-d6dbffdadae3", + "label": "", + "labelSize": 20, + "labelAlign": "center", + "labelVAlign": "middle", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": false + } + ], + "_$child": [ + { + "_$id": "u09sxy57", + "_$type": "Image", + "name": "Image", + "x": 75, + "y": 20, + "width": 70, + "height": 70, + "centerX": 0, + "centerY": -20, + "skin": "res://4870f053-9781-471b-a405-ea95b5318a98", + "color": "#ffffff" + }, + { + "_$id": "nw5m8y9p", + "_$type": "Label", + "name": "label", + "x": 60, + "y": 100, + "width": 100, + "height": 40, + "centerX": 0, + "centerY": 45, + "text": "Erase", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 24, + "color": "rgba(84, 89, 98, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "yypi883c", + "_$type": "Button", + "name": "btn_note", + "x": 460, + "width": 220, + "height": 150, + "_mouseState": 2, + "skin": "res://d8b02de6-eee7-47ea-b227-d6dbffdadae3", + "label": "", + "labelSize": 20, + "labelAlign": "center", + "labelVAlign": "middle", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": false + } + ], + "_$child": [ + { + "_$id": "3coimgb5", + "_$type": "Box", + "name": "normal", + "x": 83, + "y": 28, + "width": 54, + "height": 54, + "visible": false, + "centerX": 0, + "centerY": -20, + "_$child": [ + { + "_$id": "z4nyb4bn", + "_$type": "Image", + "name": "Image", + "width": 54, + "height": 54, + "skin": "res://18ec8458-52a2-405b-886a-f6441ed4f785", + "color": "#ffffff", + "_$child": [ + { + "_$id": "ztz2tnzj", + "_$type": "Sprite", + "name": "off", + "x": 30, + "y": -20, + "width": 64, + "height": 36, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 16, + "rt": 16, + "lb": 16, + "rb": 16, + "lineWidth": 2, + "lineColor": "rgba(255, 255, 255, 1)", + "fillColor": "rgba(167, 171, 179, 1)" + } + ], + "_$child": [ + { + "_$id": "s448abxw", + "_$type": "Label", + "name": "label", + "y": 2, + "width": 64, + "height": 36, + "centerX": 0, + "centerY": 2, + "text": "OFF", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 22, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(160, 160, 160, 1)" + } + ] + } + ] + } + ] + }, + { + "_$id": "12n21tf5", + "_$type": "Box", + "name": "checked", + "x": 83, + "y": 28, + "width": 54, + "height": 54, + "centerX": 0, + "centerY": -20, + "_$child": [ + { + "_$id": "9hvi6732", + "_$type": "Image", + "name": "Image", + "width": 54, + "height": 54, + "skin": "res://3d714bdf-39fd-48aa-b29d-5c179abc1981", + "color": "#ffffff", + "_$child": [ + { + "_$id": "kuwb7wnr", + "_$type": "Sprite", + "name": "on", + "x": 30, + "y": -20, + "width": 48, + "height": 36, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 16, + "rt": 16, + "lb": 16, + "rb": 16, + "lineWidth": 2, + "lineColor": "rgba(255, 255, 255, 1)", + "fillColor": "rgba(29, 92, 220, 1)" + } + ], + "_$child": [ + { + "_$id": "r7fwk6ko", + "_$type": "Label", + "name": "label", + "y": 2, + "width": 48, + "height": 36, + "centerX": 0, + "centerY": 2, + "text": "ON", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 22, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(160, 160, 160, 1)" + } + ] + } + ] + } + ] + }, + { + "_$id": "i0q1644f", + "_$type": "Label", + "name": "label", + "x": 60, + "y": 100, + "width": 100, + "height": 40, + "centerX": 0, + "centerY": 45, + "text": "Notes", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 24, + "color": "rgba(29, 92, 220, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "d5ez89m6", + "_$type": "Button", + "name": "btn_hint", + "x": 690, + "width": 220, + "height": 150, + "_mouseState": 2, + "skin": "res://d8b02de6-eee7-47ea-b227-d6dbffdadae3", + "label": "", + "labelSize": 20, + "labelAlign": "center", + "labelVAlign": "middle", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": false + } + ], + "_$child": [ + { + "_$id": "79f7a7u2", + "_$type": "Image", + "name": "Image", + "x": 86, + "y": 25, + "width": 48, + "height": 60, + "mouseThrough": true, + "centerX": 0, + "centerY": -20, + "skin": "res://45de1954-6e2a-45bf-a9a3-aa9a684be816", + "color": "#ffffff", + "_$child": [ + { + "_$id": "l9bah2a9", + "_$type": "Sprite", + "name": "normal", + "x": 30, + "y": -18, + "width": 36, + "height": 36, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 2, + "lineColor": "rgba(255, 255, 255, 1)", + "fillColor": "rgba(29, 108, 220, 1)" + } + ], + "_$child": [ + { + "_$id": "ag5jbsxv", + "_$type": "Label", + "name": "label", + "y": 2, + "width": 36, + "height": 36, + "centerX": 0, + "centerY": 2, + "text": "2", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 22, + "color": "rgba(245, 247, 251, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(160, 160, 160, 1)" + } + ] + }, + { + "_$id": "bx8c1ghg", + "_$type": "Sprite", + "name": "ad", + "x": 30, + "y": -18, + "width": 72, + "height": 36, + "visible": false, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 16, + "rt": 16, + "lb": 16, + "rb": 16, + "lineWidth": 2, + "lineColor": "rgba(255, 255, 255, 1)", + "fillColor": "rgba(29, 92, 220, 1)" + } + ], + "_$child": [ + { + "_$id": "u3yvi5nz", + "_$type": "Sprite", + "name": "Sprite", + "x": 16, + "y": 10, + "width": 16, + "height": 16, + "_gcmds": [ + { + "_$type": "DrawPolyCmd", + "x": 0, + "y": 0, + "points": [ + 0, + 0, + 12, + 8, + 0, + 16 + ], + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + }, + { + "_$id": "cv1e1ww3", + "_$type": "Label", + "name": "label", + "x": 30, + "y": 2, + "width": 36, + "height": 36, + "centerX": 12, + "centerY": 2, + "text": "+2", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 22, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(160, 160, 160, 1)" + } + ] + } + ] + }, + { + "_$id": "posx5hhd", + "_$type": "Label", + "name": "label", + "x": 60, + "y": 100, + "width": 100, + "height": 40, + "centerX": 0, + "centerY": 45, + "text": "Hint", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 24, + "color": "rgba(84, 89, 98, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "fmnkhvuy", + "_$type": "VBox", + "name": "candys", + "y": 276, + "width": 912, + "height": 444, + "drawCallOptimize": true, + "bottom": 132, + "centerX": 0, + "space": 20, + "align": "center", + "_$child": [ + { + "_$id": "enu9h3u2", + "_$type": "HBox", + "name": "HBox_1", + "width": 912, + "height": 132, + "_mouseState": 2, + "space": 24, + "align": "middle", + "_$child": [ + { + "_$id": "5w40wc7r", + "_$type": "Box", + "name": "Box_1", + "width": 288, + "height": 132, + "_$comp": [ + { + "_$type": "067a5d3a-4d7c-48d7-bb01-db2682fd6c01", + "scriptPath": "../src/views/Candy.ts" + } + ], + "_$child": [ + { + "_$id": "2zzkhg32", + "_$type": "Box", + "name": "offset", + "x": 144, + "y": 66, + "width": 288, + "height": 132, + "anchorX": 0.5, + "anchorY": 0.5, + "centerX": 0, + "_$child": [ + { + "_$id": "4l8bh52v", + "_$type": "Sprite", + "name": "shadow", + "width": 288, + "height": 132, + "alpha": 0.16, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 2, + "color": "#000" + } + ] + }, + { + "_$id": "ahixga50", + "_$type": "Sprite", + "name": "Sprite", + "width": 288, + "height": 132, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "wn2o3r4c", + "_$type": "Sprite", + "name": "mask", + "width": 288, + "height": 132, + "alpha": 0, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#1d5cdc" + } + ] + }, + { + "_$id": "83305adv", + "_$type": "Label", + "name": "label", + "y": 12, + "width": 288, + "height": 72, + "mouseThrough": true, + "top": 12, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(37, 89, 192, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(0, 0, 0, 1)" + }, + { + "_$id": "d3fh3kji", + "_$type": "Label", + "name": "label_left", + "y": 84, + "width": 288, + "height": 36, + "mouseThrough": true, + "bottom": 12, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "77euex3t", + "_$type": "Box", + "name": "Box_2", + "x": 312, + "width": 288, + "height": 132, + "_$comp": [ + { + "_$type": "067a5d3a-4d7c-48d7-bb01-db2682fd6c01", + "scriptPath": "../src/views/Candy.ts" + } + ], + "_$child": [ + { + "_$id": "ymroi8mx", + "_$type": "Box", + "name": "offset", + "x": 144, + "y": 66, + "width": 288, + "height": 132, + "anchorX": 0.5, + "anchorY": 0.5, + "centerX": 0, + "_$child": [ + { + "_$id": "5s1izjha", + "_$type": "Sprite", + "name": "shadow", + "width": 288, + "height": 132, + "alpha": 0.16, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 2, + "color": "#000" + } + ] + }, + { + "_$id": "tb72m4yk", + "_$type": "Sprite", + "name": "Sprite", + "width": 288, + "height": 132, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "8oa1hx12", + "_$type": "Sprite", + "name": "mask", + "width": 288, + "height": 132, + "alpha": 0, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#1d5cdc" + } + ] + }, + { + "_$id": "34v9xig7", + "_$type": "Label", + "name": "label", + "y": 12, + "width": 288, + "height": 72, + "mouseThrough": true, + "top": 12, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(37, 89, 192, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(0, 0, 0, 1)" + }, + { + "_$id": "p5tr5kds", + "_$type": "Label", + "name": "label_left", + "y": 84, + "width": 288, + "height": 36, + "mouseThrough": true, + "bottom": 12, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "40byj353", + "_$type": "Box", + "name": "Box_3", + "x": 624, + "width": 288, + "height": 132, + "_$comp": [ + { + "_$type": "067a5d3a-4d7c-48d7-bb01-db2682fd6c01", + "scriptPath": "../src/views/Candy.ts" + } + ], + "_$child": [ + { + "_$id": "rd2zsbha", + "_$type": "Box", + "name": "offset", + "x": 144, + "y": 66, + "width": 288, + "height": 132, + "anchorX": 0.5, + "anchorY": 0.5, + "centerX": 0, + "_$child": [ + { + "_$id": "29ww44hy", + "_$type": "Sprite", + "name": "shadow", + "width": 288, + "height": 132, + "alpha": 0.16, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 2, + "color": "#000" + } + ] + }, + { + "_$id": "z5y5h23u", + "_$type": "Sprite", + "name": "Sprite", + "width": 288, + "height": 132, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "drixctca", + "_$type": "Sprite", + "name": "mask", + "width": 288, + "height": 132, + "alpha": 0, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#1d5cdc" + } + ] + }, + { + "_$id": "t0e2dzom", + "_$type": "Label", + "name": "label", + "y": 12, + "width": 288, + "height": 72, + "mouseThrough": true, + "top": 12, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(37, 89, 192, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(0, 0, 0, 1)" + }, + { + "_$id": "bsdaph6p", + "_$type": "Label", + "name": "label_left", + "y": 84, + "width": 288, + "height": 36, + "mouseThrough": true, + "bottom": 12, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "bprkjtn1", + "_$type": "HBox", + "name": "HBox_2", + "y": 152, + "width": 912, + "height": 132, + "_mouseState": 2, + "space": 24, + "align": "middle", + "_$child": [ + { + "_$id": "rg8u1u31", + "_$type": "Box", + "name": "Box_1", + "width": 288, + "height": 132, + "_$comp": [ + { + "_$type": "067a5d3a-4d7c-48d7-bb01-db2682fd6c01", + "scriptPath": "../src/views/Candy.ts" + } + ], + "_$child": [ + { + "_$id": "cpwv1svb", + "_$type": "Box", + "name": "offset", + "x": 144, + "y": 66, + "width": 288, + "height": 132, + "anchorX": 0.5, + "anchorY": 0.5, + "centerX": 0, + "_$child": [ + { + "_$id": "7l1n7qlz", + "_$type": "Sprite", + "name": "shadow", + "width": 288, + "height": 132, + "alpha": 0.16, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 2, + "color": "#000" + } + ] + }, + { + "_$id": "3sny8mw3", + "_$type": "Sprite", + "name": "Sprite", + "width": 288, + "height": 132, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "9ml9sgav", + "_$type": "Sprite", + "name": "mask", + "width": 288, + "height": 132, + "alpha": 0, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#1d5cdc" + } + ] + }, + { + "_$id": "xxaoahoh", + "_$type": "Label", + "name": "label", + "y": 12, + "width": 288, + "height": 72, + "mouseThrough": true, + "top": 12, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(37, 89, 192, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(0, 0, 0, 1)" + }, + { + "_$id": "hsz93gzv", + "_$type": "Label", + "name": "label_left", + "y": 84, + "width": 288, + "height": 36, + "mouseThrough": true, + "bottom": 12, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "9lnx9jbm", + "_$type": "Box", + "name": "Box_2", + "x": 312, + "width": 288, + "height": 132, + "_$comp": [ + { + "_$type": "067a5d3a-4d7c-48d7-bb01-db2682fd6c01", + "scriptPath": "../src/views/Candy.ts" + } + ], + "_$child": [ + { + "_$id": "5u0jcess", + "_$type": "Box", + "name": "offset", + "x": 144, + "y": 66, + "width": 288, + "height": 132, + "anchorX": 0.5, + "anchorY": 0.5, + "centerX": 0, + "_$child": [ + { + "_$id": "fbpl9vcz", + "_$type": "Sprite", + "name": "shadow", + "width": 288, + "height": 132, + "alpha": 0.16, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 2, + "color": "#000" + } + ] + }, + { + "_$id": "ybtyvtea", + "_$type": "Sprite", + "name": "Sprite", + "width": 288, + "height": 132, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "wwozyz9s", + "_$type": "Sprite", + "name": "mask", + "width": 288, + "height": 132, + "alpha": 0, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#1d5cdc" + } + ] + }, + { + "_$id": "t2dyz14c", + "_$type": "Label", + "name": "label", + "y": 12, + "width": 288, + "height": 72, + "mouseThrough": true, + "top": 12, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(37, 89, 192, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(0, 0, 0, 1)" + }, + { + "_$id": "x8d570kp", + "_$type": "Label", + "name": "label_left", + "y": 84, + "width": 288, + "height": 36, + "mouseThrough": true, + "bottom": 12, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "3ve0598d", + "_$type": "Box", + "name": "Box_3", + "x": 624, + "width": 288, + "height": 132, + "_$comp": [ + { + "_$type": "067a5d3a-4d7c-48d7-bb01-db2682fd6c01", + "scriptPath": "../src/views/Candy.ts" + } + ], + "_$child": [ + { + "_$id": "kemod4e0", + "_$type": "Box", + "name": "offset", + "x": 144, + "y": 66, + "width": 288, + "height": 132, + "anchorX": 0.5, + "anchorY": 0.5, + "centerX": 0, + "_$child": [ + { + "_$id": "6rqsps87", + "_$type": "Sprite", + "name": "shadow", + "width": 288, + "height": 132, + "alpha": 0.16, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 2, + "color": "#000" + } + ] + }, + { + "_$id": "wdco1049", + "_$type": "Sprite", + "name": "Sprite", + "width": 288, + "height": 132, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "h9gx9ye7", + "_$type": "Sprite", + "name": "mask", + "width": 288, + "height": 132, + "alpha": 0, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#1d5cdc" + } + ] + }, + { + "_$id": "8i26ti7a", + "_$type": "Label", + "name": "label", + "y": 12, + "width": 288, + "height": 72, + "mouseThrough": true, + "top": 12, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(37, 89, 192, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(0, 0, 0, 1)" + }, + { + "_$id": "zgzmhg2p", + "_$type": "Label", + "name": "label_left", + "y": 84, + "width": 288, + "height": 36, + "mouseThrough": true, + "bottom": 12, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "iimii5aa", + "_$type": "HBox", + "name": "HBox_3", + "y": 304, + "width": 912, + "height": 132, + "_mouseState": 2, + "space": 24, + "align": "middle", + "_$child": [ + { + "_$id": "hw6fofdb", + "_$type": "Box", + "name": "Box_1", + "width": 288, + "height": 132, + "_$comp": [ + { + "_$type": "067a5d3a-4d7c-48d7-bb01-db2682fd6c01", + "scriptPath": "../src/views/Candy.ts" + } + ], + "_$child": [ + { + "_$id": "1wqt1upf", + "_$type": "Box", + "name": "offset", + "x": 144, + "y": 66, + "width": 288, + "height": 132, + "anchorX": 0.5, + "anchorY": 0.5, + "centerX": 0, + "_$child": [ + { + "_$id": "462eoylg", + "_$type": "Sprite", + "name": "shadow", + "width": 288, + "height": 132, + "alpha": 0.16, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 2, + "color": "#000" + } + ] + }, + { + "_$id": "j4st2rma", + "_$type": "Sprite", + "name": "Sprite", + "width": 288, + "height": 132, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "596y3a1o", + "_$type": "Sprite", + "name": "mask", + "width": 288, + "height": 132, + "alpha": 0, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#1d5cdc" + } + ] + }, + { + "_$id": "zk026hoc", + "_$type": "Label", + "name": "label", + "y": 12, + "width": 288, + "height": 72, + "mouseThrough": true, + "top": 12, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(37, 89, 192, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(0, 0, 0, 1)" + }, + { + "_$id": "sin9m4rz", + "_$type": "Label", + "name": "label_left", + "y": 84, + "width": 288, + "height": 36, + "mouseThrough": true, + "bottom": 12, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "ui0uok79", + "_$type": "Box", + "name": "Box_2", + "x": 312, + "width": 288, + "height": 132, + "_$comp": [ + { + "_$type": "067a5d3a-4d7c-48d7-bb01-db2682fd6c01", + "scriptPath": "../src/views/Candy.ts" + } + ], + "_$child": [ + { + "_$id": "lw44n0ym", + "_$type": "Box", + "name": "offset", + "x": 144, + "y": 66, + "width": 288, + "height": 132, + "anchorX": 0.5, + "anchorY": 0.5, + "centerX": 0, + "_$child": [ + { + "_$id": "3ihhvegg", + "_$type": "Sprite", + "name": "shadow", + "width": 288, + "height": 132, + "alpha": 0.16, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 2, + "color": "#000" + } + ] + }, + { + "_$id": "ggulvu35", + "_$type": "Sprite", + "name": "Sprite", + "width": 288, + "height": 132, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "4um3jeff", + "_$type": "Sprite", + "name": "mask", + "width": 288, + "height": 132, + "alpha": 0, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#1d5cdc" + } + ] + }, + { + "_$id": "is7kum33", + "_$type": "Label", + "name": "label", + "y": 12, + "width": 288, + "height": 72, + "mouseThrough": true, + "top": 12, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(37, 89, 192, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(0, 0, 0, 1)" + }, + { + "_$id": "o9qwyx98", + "_$type": "Label", + "name": "label_left", + "y": 84, + "width": 288, + "height": 36, + "mouseThrough": true, + "bottom": 12, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "0bd03erd", + "_$type": "Box", + "name": "Box_3", + "x": 624, + "width": 288, + "height": 132, + "_$comp": [ + { + "_$type": "067a5d3a-4d7c-48d7-bb01-db2682fd6c01", + "scriptPath": "../src/views/Candy.ts" + } + ], + "_$child": [ + { + "_$id": "79ao0wyx", + "_$type": "Box", + "name": "offset", + "x": 144, + "y": 66, + "width": 288, + "height": 132, + "anchorX": 0.5, + "anchorY": 0.5, + "centerX": 0, + "_$child": [ + { + "_$id": "b4rvz2ab", + "_$type": "Sprite", + "name": "shadow", + "width": 288, + "height": 132, + "alpha": 0.16, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 2, + "color": "#000" + } + ] + }, + { + "_$id": "bd3vrr1r", + "_$type": "Sprite", + "name": "Sprite", + "width": 288, + "height": 132, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#ffffff" + } + ] + }, + { + "_$id": "ltrjk0gt", + "_$type": "Sprite", + "name": "mask", + "width": 288, + "height": 132, + "alpha": 0, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "fillColor": "#1d5cdc" + } + ] + }, + { + "_$id": "b5cnwivh", + "_$type": "Label", + "name": "label", + "y": 12, + "width": 288, + "height": 72, + "mouseThrough": true, + "top": 12, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 72, + "color": "rgba(37, 89, 192, 1)", + "align": "center", + "valign": "middle", + "strokeColor": "rgba(0, 0, 0, 1)" + }, + { + "_$id": "8mt20a99", + "_$type": "Label", + "name": "label_left", + "y": 84, + "width": 288, + "height": 36, + "mouseThrough": true, + "bottom": 12, + "centerX": 0, + "text": "9", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] + }, + { + "_$id": "qegjy7c7", + "_$type": "Box", + "name": "btn_back", + "y": 732, + "width": 912, + "height": 120, + "bottom": 0, + "centerX": 0, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "1ot0e6se", + "_$type": "Sprite", + "name": "Sprite", + "width": 912, + "height": 120, + "alpha": 0.1, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 27, + "rt": 27, + "lb": 27, + "rb": 27, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + }, + { + "_$id": "7kj4e6li", + "_$type": "Label", + "name": "Label", + "width": 912, + "height": 120, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "text": "Back", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 45, + "color": "rgba(29, 92, 220, 1)", + "bold": true, + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "zz4k3kw6", + "_$type": "Box", + "name": "btn_new", + "y": 732, + "width": 912, + "height": 120, + "visible": false, + "bottom": 0, + "centerX": 0, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "p11cl0oa", + "_$type": "Sprite", + "name": "Sprite", + "width": 912, + "height": 120, + "alpha": 0.1, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 27, + "rt": 27, + "lb": 27, + "rb": 27, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + }, + { + "_$id": "xbhbcxvm", + "_$type": "Label", + "name": "Label", + "width": 912, + "height": 120, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "text": "New Game", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 45, + "color": "rgba(29, 92, 220, 1)", + "bold": true, + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dtn5odr9", + "_$type": "Label", + "name": "label_score", + "x": 306, + "width": 300, + "height": 48, + "top": 0, + "centerX": 0, + "text": "Score:999", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(29, 92, 220, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "h1knlkx4", + "_$type": "Label", + "name": "label_mistake", + "y": 54, + "width": 300, + "height": 30, + "left": 0, + "top": 54, + "text": "mistake:3/3", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 27, + "color": "rgba(123, 129, 140, 1)", + "valign": "middle" + }, + { + "_$id": "94567dc2", + "_$type": "Label", + "name": "label_name", + "x": 306, + "y": 54, + "width": 300, + "height": 30, + "top": 54, + "centerX": 0, + "text": "Hard", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 27, + "color": "rgba(123, 129, 140, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "luw2dbbj", + "_$type": "Label", + "name": "label_time", + "x": 576, + "y": 54, + "width": 300, + "height": 30, + "_mouseState": 2, + "right": 36, + "top": 54, + "text": "00:00:00", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 27, + "color": "rgba(123, 129, 140, 1)", + "align": "right", + "valign": "middle", + "_$child": [ + { + "_$id": "xl8gtdmx", + "_$type": "Box", + "name": "btn_pause", + "x": 306, + "y": -4, + "width": 30, + "height": 30, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "e1tdwlwt", + "_$type": "Sprite", + "name": "Sprite", + "width": 30, + "height": 30, + "alpha": 0.1, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#7b818c" + } + ] + }, + { + "_$id": "7000il0d", + "_$type": "Image", + "name": "Image", + "x": 3, + "y": 3, + "width": 24, + "height": 24, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://1fdb96f6-bb74-4923-8839-b44093e9d6d1", + "color": "#ffffff" + } + ] + } + ] + } + ] + }, + { + "_$id": "9y0dq6th", + "_$type": "Box", + "name": "mask", + "width": 1920, + "height": 960, + "visible": false, + "bottom": 0, + "centerX": 0, + "_$child": [ + { + "_$id": "urbuggs2", + "_$type": "Sprite", + "name": "Sprite", + "width": 1920, + "height": 960, + "alpha": 0.8, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(245, 247, 251, 1)" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/shudu/assets/resources/Stage_H.lh.meta b/shudu/assets/resources/Stage_H.lh.meta new file mode 100644 index 0000000..fefc068 --- /dev/null +++ b/shudu/assets/resources/Stage_H.lh.meta @@ -0,0 +1,3 @@ +{ + "uuid": "13ccdd2d-0569-4982-8f9e-16edf0ab2f32" +} \ No newline at end of file diff --git a/shudu/assets/resources/TopBar.lh b/shudu/assets/resources/TopBar.lh new file mode 100644 index 0000000..ed204b0 --- /dev/null +++ b/shudu/assets/resources/TopBar.lh @@ -0,0 +1,513 @@ +{ + "_$ver": 1, + "_$id": "737qwljh", + "_$type": "Box", + "name": "TopBar", + "width": 1920, + "height": 120, + "top": 0, + "centerX": 0, + "_$comp": [ + { + "_$type": "cadd567d-5099-49b9-a9b3-b7c404d5fe1b", + "scriptPath": "../src/views/TopBar.ts", + "btn_classic": { + "_$ref": "5pupc495" + }, + "sprite_classic": { + "_$ref": "1nndzv6a" + }, + "label_classic": { + "_$ref": "eaco6uwz" + }, + "btn_dc": { + "_$ref": "220e6u8y" + }, + "sprite_dc": { + "_$ref": "ool3zqvi" + }, + "label_dc": { + "_$ref": "nut19fpx" + }, + "obj_label": { + "_$ref": "tdwcole3" + }, + "obj_items": { + "_$ref": "l4cpub9f" + } + } + ], + "_$child": [ + { + "_$id": "nceaidfr", + "_$type": "HBox", + "name": "left", + "x": 44, + "width": 648, + "height": 120, + "left": 44, + "top": 0, + "bottom": 0, + "space": 20, + "align": "middle", + "_$child": [ + { + "_$id": "5pupc495", + "_$type": "Box", + "name": "btn_classic", + "y": 24, + "width": 312, + "height": 72, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "1nndzv6a", + "_$type": "Sprite", + "name": "Sprite", + "width": 312, + "height": 72, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "x": 0, + "y": 0, + "width": 1, + "height": 1, + "lt": 12, + "rt": 12, + "lb": 12, + "rb": 12, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(14, 42, 83, 1)" + } + ] + }, + { + "_$id": "eaco6uwz", + "_$type": "Label", + "name": "Label", + "width": 312, + "height": 72, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "text": "Classic Sudoku", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 36, + "color": "#FFFFFF", + "align": "center", + "valign": "middle", + "padding": "0,0,0,0" + } + ] + }, + { + "_$id": "220e6u8y", + "_$type": "Box", + "name": "btn_dc", + "x": 332, + "y": 24, + "width": 312, + "height": 72, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "ool3zqvi", + "_$type": "Sprite", + "name": "Sprite", + "width": 312, + "height": 72, + "alpha": 0.1, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "x": 0, + "y": 0, + "width": 1, + "height": 1, + "lt": 12, + "rt": 12, + "lb": 12, + "rb": 12, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(14, 42, 83, 1)" + } + ] + }, + { + "_$id": "nut19fpx", + "_$type": "Label", + "name": "Label", + "width": 312, + "height": 72, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "text": "Daily Challenge", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 36, + "color": "rgba(14, 42, 83, 1)", + "align": "center", + "valign": "middle", + "padding": "0,0,0,0" + } + ] + } + ] + }, + { + "_$id": "520u454q", + "_$type": "Box", + "name": "right", + "x": 866, + "width": 1054, + "height": 120, + "right": 0, + "top": 0, + "bottom": 0, + "_$child": [ + { + "_$id": "tdwcole3", + "_$type": "Label", + "name": "Label", + "x": -108, + "y": 34, + "width": 292, + "height": 60, + "centerY": 4, + "text": "Difficulty:", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 36, + "color": "rgba(167, 171, 179, 1)", + "align": "center", + "valign": "middle", + "padding": "0,0,0,0" + }, + { + "_$id": "l4cpub9f", + "_$type": "HBox", + "name": "items", + "x": 144, + "y": 30, + "width": 200, + "height": 60, + "centerY": 0, + "space": 20, + "align": "middle", + "_$child": [ + { + "_$id": "1n7t6kj9", + "_$type": "Box", + "name": "Box(1)", + "width": 132, + "height": 60, + "_$comp": [ + { + "_$type": "8857686b-9b2c-4e9c-af0f-0164c0994e46", + "scriptPath": "../src/views/common/CommonData.ts", + "intValue": 0, + "strValue": "" + } + ], + "_$child": [ + { + "_$id": "77fmalez", + "_$type": "Sprite", + "name": "Sprite", + "width": 132, + "height": 60, + "alpha": 0.1, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "x": 0, + "y": 0, + "width": 1, + "height": 1, + "lt": 12, + "rt": 12, + "lb": 12, + "rb": 12, + "percent": true, + "lineWidth": 5, + "fillColor": "rgba(245, 247, 251, 1)" + } + ] + }, + { + "_$id": "eo6dwz4x", + "_$type": "Label", + "name": "Label", + "y": 3, + "width": 132, + "height": 60, + "top": 3, + "centerX": 0, + "text": "Easy", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 36, + "color": "rgba(14, 42, 83, 1)", + "align": "center", + "valign": "middle", + "padding": "0,0,0,0" + } + ] + }, + { + "_$id": "p50qyu0x", + "_$type": "Box", + "name": "Box(2)", + "x": 152, + "width": 189, + "height": 60, + "_$comp": [ + { + "_$type": "8857686b-9b2c-4e9c-af0f-0164c0994e46", + "scriptPath": "../src/views/common/CommonData.ts", + "intValue": 0, + "strValue": "" + } + ], + "_$child": [ + { + "_$id": "04iszq1m", + "_$type": "Sprite", + "name": "Sprite", + "width": 189, + "height": 60, + "alpha": 0.1, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "x": 0, + "y": 0, + "width": 1, + "height": 1, + "lt": 12, + "rt": 12, + "lb": 12, + "rb": 12, + "percent": true, + "lineWidth": 5, + "fillColor": "rgba(245, 247, 251, 1)" + } + ] + }, + { + "_$id": "s60rt1wo", + "_$type": "Label", + "name": "Label", + "y": 3, + "width": 189, + "height": 60, + "top": 3, + "centerX": 0, + "text": "Medium", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 36, + "color": "rgba(14, 42, 83, 1)", + "align": "center", + "valign": "middle", + "padding": "0,0,0,0" + } + ] + }, + { + "_$id": "tkos9w0i", + "_$type": "Box", + "name": "Box(3)", + "x": 361, + "width": 132, + "height": 60, + "_$comp": [ + { + "_$type": "8857686b-9b2c-4e9c-af0f-0164c0994e46", + "scriptPath": "../src/views/common/CommonData.ts", + "intValue": 0, + "strValue": "" + } + ], + "_$child": [ + { + "_$id": "y40g4f7e", + "_$type": "Sprite", + "name": "Sprite", + "width": 132, + "height": 60, + "alpha": 0.1, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "x": 0, + "y": 0, + "width": 1, + "height": 1, + "lt": 12, + "rt": 12, + "lb": 12, + "rb": 12, + "percent": true, + "lineWidth": 5, + "fillColor": "rgba(245, 247, 251, 1)" + } + ] + }, + { + "_$id": "6tnzzdsv", + "_$type": "Label", + "name": "Label", + "y": 3, + "width": 132, + "height": 60, + "top": 3, + "centerX": 0, + "text": "Hard", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 36, + "color": "rgba(14, 42, 83, 1)", + "align": "center", + "valign": "middle", + "padding": "0,0,0,0" + } + ] + }, + { + "_$id": "jakjcbvb", + "_$type": "Box", + "name": "Box(4)", + "x": 513, + "width": 162, + "height": 60, + "_$comp": [ + { + "_$type": "8857686b-9b2c-4e9c-af0f-0164c0994e46", + "scriptPath": "../src/views/common/CommonData.ts", + "intValue": 0, + "strValue": "" + } + ], + "_$child": [ + { + "_$id": "xnl32bns", + "_$type": "Sprite", + "name": "Sprite", + "width": 162, + "height": 60, + "alpha": 0.1, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "x": 0, + "y": 0, + "width": 1, + "height": 1, + "lt": 12, + "rt": 12, + "lb": 12, + "rb": 12, + "percent": true, + "lineWidth": 5, + "fillColor": "rgba(245, 247, 251, 1)" + } + ] + }, + { + "_$id": "kik1c0v7", + "_$type": "Label", + "name": "Label", + "y": 3, + "width": 162, + "height": 60, + "top": 3, + "centerX": 0, + "text": "Expert", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 36, + "color": "rgba(14, 42, 83, 1)", + "align": "center", + "valign": "middle", + "padding": "0,0,0,0" + } + ] + }, + { + "_$id": "cywux1jk", + "_$type": "Box", + "name": "Box(5)", + "x": 695, + "width": 192, + "height": 60, + "_$comp": [ + { + "_$type": "8857686b-9b2c-4e9c-af0f-0164c0994e46", + "scriptPath": "../src/views/common/CommonData.ts", + "intValue": 0, + "strValue": "" + } + ], + "_$child": [ + { + "_$id": "lb6ygz0x", + "_$type": "Sprite", + "name": "Sprite", + "width": 192, + "height": 60, + "alpha": 0.1, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "x": 0, + "y": 0, + "width": 1, + "height": 1, + "lt": 12, + "rt": 12, + "lb": 12, + "rb": 12, + "percent": true, + "lineWidth": 5, + "fillColor": "rgba(245, 247, 251, 1)" + } + ] + }, + { + "_$id": "se91oxr6", + "_$type": "Label", + "name": "Label", + "y": 3, + "width": 192, + "height": 60, + "top": 3, + "centerX": 0, + "text": "Extreme", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 36, + "color": "rgba(14, 42, 83, 1)", + "align": "center", + "valign": "middle", + "padding": "0,0,0,0" + } + ] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/shudu/assets/resources/TopBar.lh.meta b/shudu/assets/resources/TopBar.lh.meta new file mode 100644 index 0000000..75e609d --- /dev/null +++ b/shudu/assets/resources/TopBar.lh.meta @@ -0,0 +1,3 @@ +{ + "uuid": "73f8f200-b49a-4804-9f8c-288361fad819" +} \ No newline at end of file diff --git a/shudu/assets/resources/dc/DailyChallenge.lh b/shudu/assets/resources/dc/DailyChallenge.lh new file mode 100644 index 0000000..6c95ef1 --- /dev/null +++ b/shudu/assets/resources/dc/DailyChallenge.lh @@ -0,0 +1,7413 @@ +{ + "_$ver": 1, + "_$id": "r0x6htig", + "_$type": "Box", + "name": "DailyChallenge", + "width": 1080, + "height": 1920, + "_mouseState": 2, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "_$comp": [ + { + "_$type": "3f68d98d-3867-41a7-b277-a24d279a22fa", + "scriptPath": "../src/views/dc/DailyChallenge.ts", + "sprite_bottom": { + "_$ref": "pnlhl1x0" + }, + "btn_back": { + "_$ref": "yvza2lgb" + }, + "btn_trophy": { + "_$ref": "ft6m7zwa" + }, + "btn_trophy_red": { + "_$ref": "zx15vggp" + }, + "trophy_light": { + "_$ref": "et3t0uy6" + }, + "trophy_icon": { + "_$ref": "e7a1ntdg" + }, + "btn_left": { + "_$ref": "ydwm2tu6" + }, + "btn_right": { + "_$ref": "e2xuqxps" + }, + "btn_left2": { + "_$ref": "ybbojil0" + }, + "btn_right2": { + "_$ref": "rp3gmpnp" + }, + "bg_dc": { + "_$ref": "hdia0flx" + }, + "label_year": { + "_$ref": "pohsc0lz" + }, + "label_month": { + "_$ref": "syblrak9" + }, + "label_star": { + "_$ref": "jpuovbao" + }, + "btn_play": { + "_$ref": "fcdi6bx3" + }, + "label_play": { + "_$ref": "fjjd0uhu" + }, + "obj_summary": { + "_$ref": "mv2bgo4b" + }, + "label_date": { + "_$ref": "n6h23gk2" + }, + "label_diffucuty": { + "_$ref": "bhpw991e" + }, + "label_score": { + "_$ref": "v5sr4uba" + }, + "label_time": { + "_$ref": "hyyuw0b3" + }, + "obj_items": { + "_$ref": "ilx0hjao" + } + } + ], + "_$child": [ + { + "_$id": "jfzgpbyj", + "_$type": "Box", + "name": "top", + "width": 1080, + "height": 1080, + "_mouseState": 2, + "left": 0, + "right": 0, + "top": 0, + "_$child": [ + { + "_$id": "hdia0flx", + "_$type": "Image", + "name": "bg", + "width": 1080, + "height": 1080, + "left": 0, + "right": 0, + "top": 0, + "skin": "res://4182ef3f-6065-44dd-83c2-70490f02e9cb", + "color": "#ffffff" + }, + { + "_$id": "et3t0uy6", + "_$type": "Image", + "name": "trophy_light", + "x": 480, + "y": 159, + "width": 512, + "height": 512, + "top": 159, + "centerX": 196, + "skin": "res://dc0b2268-3013-4c09-ae22-6e2e6aae3cc9", + "color": "#ffffff", + "_$comp": [ + { + "_$type": "ca60d5cb-d801-434b-9e6a-7b0c738cb0e9", + "scriptPath": "../src/views/common/UISequenceAnimation.ts", + "prefix": "sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00", + "beginIndex": 0, + "endIndex": 119, + "playOnAwake": true, + "loop": true + } + ] + }, + { + "_$id": "e7a1ntdg", + "_$type": "Image", + "name": "trophy", + "x": 530, + "y": 205, + "width": 468, + "height": 468, + "top": 205, + "centerX": 224, + "skin": "res://09690a9b-3d5a-4da1-b457-1a3275cf5c14", + "color": "#ffffff" + }, + { + "_$id": "cojpn11e", + "_$type": "Box", + "name": "back", + "x": 38, + "y": 72, + "width": 400, + "height": 64, + "_mouseState": 2, + "top": 72, + "centerX": -302, + "_$child": [ + { + "_$id": "yvza2lgb", + "_$type": "Button", + "name": "btn_back", + "width": 69, + "height": 48, + "_mouseState": 2, + "stateNum": 1, + "skin": "res://19283ae3-c041-4a01-8fab-3c03add31bf8", + "label": "", + "labelSize": 20, + "labelAlign": "center", + "labelVAlign": "middle" + }, + { + "_$id": "5n84svfd", + "_$type": "Label", + "name": "label_title", + "x": 92, + "y": -6, + "width": 500, + "height": 60, + "bottom": 10, + "text": "Daily Challenge", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 54, + "color": "rgba(255, 255, 255, 1)", + "valign": "middle" + } + ] + }, + { + "_$id": "ft6m7zwa", + "_$type": "Image", + "name": "btn_trophy", + "x": 930, + "y": 72, + "width": 84, + "height": 84, + "top": 72, + "centerX": 432, + "skin": "res://4458c7de-47ff-496e-a28f-be808c0823b3", + "useSourceSize": true, + "color": "#ffffff", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "zx15vggp", + "_$type": "Sprite", + "name": "Sprite", + "x": 64, + "y": -4, + "width": 24, + "height": 24, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 4, + "lineColor": "rgba(255, 255, 255, 1)", + "fillColor": "rgba(229, 34, 28, 1)" + } + ] + } + ] + }, + { + "_$id": "pohsc0lz", + "_$type": "Label", + "name": "label_year", + "x": 120, + "y": 265, + "width": 400, + "height": 72, + "alpha": 0.6, + "top": 265, + "centerX": -220, + "text": "2024", + "font": "res://3f79306d-f490-4a54-a4f3-26cb51d56a12", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "valign": "middle" + }, + { + "_$id": "syblrak9", + "_$type": "Label", + "name": "label_month", + "x": 120, + "y": 368, + "width": 400, + "height": 72, + "top": 368, + "centerX": -220, + "text": "Jul", + "font": "res://3f79306d-f490-4a54-a4f3-26cb51d56a12", + "fontSize": 72, + "color": "rgba(255, 255, 255, 1)", + "valign": "middle" + }, + { + "_$id": "w9sm094p", + "_$type": "Box", + "name": "Box", + "x": 120, + "y": 474, + "width": 400, + "height": 72, + "top": 474, + "centerX": -220, + "_$child": [ + { + "_$id": "3jc1lyi4", + "_$type": "Sprite", + "name": "Sprite", + "width": 213, + "height": 72, + "alpha": 0.2, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + }, + { + "_$id": "ngt791nt", + "_$type": "Image", + "name": "star", + "x": 8, + "y": 6, + "width": 60, + "height": 60, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "jpuovbao", + "_$type": "Label", + "name": "label_star", + "x": 76, + "y": 11, + "width": 120, + "height": 51, + "centerY": 0, + "text": "31/31", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 42, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ydwm2tu6", + "_$type": "Box", + "name": "btn_left", + "x": 34, + "y": 379, + "width": 48, + "height": 96, + "_mouseState": 2, + "top": 379, + "centerX": -482, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "xs2ndqlh", + "_$type": "Image", + "name": "Image", + "width": 48, + "height": 97, + "mouseThrough": true, + "skin": "res://535f9c82-7994-4fd9-a6b5-e7d08199cd4f", + "useSourceSize": true, + "color": "#ffffff" + } + ] + }, + { + "_$id": "e2xuqxps", + "_$type": "Box", + "name": "btn_right", + "x": 987, + "y": 397, + "width": 48, + "height": 96, + "_mouseState": 2, + "top": 397, + "centerX": 471, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "yeo3d7ex", + "_$type": "Image", + "name": "Image", + "width": 48, + "height": 97, + "mouseThrough": true, + "skin": "res://25320e1c-b60c-45af-9122-cdc433872fa7", + "useSourceSize": true, + "color": "#ffffff" + } + ] + } + ] + }, + { + "_$id": "rq2jiwrh", + "_$type": "Box", + "name": "bottom", + "y": 675, + "width": 1080, + "height": 1245, + "left": 0, + "right": 0, + "top": 675, + "bottom": 0, + "_$child": [ + { + "_$id": "pnlhl1x0", + "_$type": "Sprite", + "name": "Sprite", + "width": 1080, + "height": 1545, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 72, + "rt": 72, + "lb": 0, + "rb": 0, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + }, + { + "_$id": "ilx0hjao", + "_$type": "VBox", + "name": "items", + "x": 50, + "y": 120, + "width": 980, + "height": 720, + "drawCallOptimize": true, + "centerX": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "54nxj8gn", + "_$type": "HBox", + "name": "HBox_1", + "width": 980, + "height": 120, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "ezrhah0q", + "_$type": "Box", + "name": "Box_1", + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "iceirt63" + }, + "obj_pie": { + "_$ref": "d957m8qs" + }, + "sprite_pie": { + "_$ref": "um9v0yp3" + }, + "obj_mask": { + "_$ref": "st704ilm" + }, + "sprite_mask": { + "_$ref": "ho8yq0iy" + }, + "obj_star": { + "_$ref": "rya6ac92" + }, + "label_show": { + "_$ref": "53sb1q3k" + } + } + ], + "_$child": [ + { + "_$id": "iceirt63", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "d957m8qs", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "um9v0yp3", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "st704ilm", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "ho8yq0iy", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "rya6ac92", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "53sb1q3k", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "pz8yhpry", + "_$type": "Box", + "name": "Box_2", + "x": 140, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "e5cr2m2t" + }, + "obj_pie": { + "_$ref": "qfyir6ms" + }, + "sprite_pie": { + "_$ref": "8jgqukij" + }, + "obj_mask": { + "_$ref": "rh7hcfnc" + }, + "sprite_mask": { + "_$ref": "yf9pnz2m" + }, + "obj_star": { + "_$ref": "hc3q90gd" + }, + "label_show": { + "_$ref": "5hkzy0uh" + } + } + ], + "_$child": [ + { + "_$id": "e5cr2m2t", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "qfyir6ms", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "8jgqukij", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "rh7hcfnc", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "yf9pnz2m", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "hc3q90gd", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "5hkzy0uh", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "9i1odwu0", + "_$type": "Box", + "name": "Box_3", + "x": 280, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "im47tl64" + }, + "obj_pie": { + "_$ref": "0gjzvsvr" + }, + "sprite_pie": { + "_$ref": "9jkuymcv" + }, + "obj_mask": { + "_$ref": "ru53901c" + }, + "sprite_mask": { + "_$ref": "oh36onmc" + }, + "obj_star": { + "_$ref": "ymzot2ny" + }, + "label_show": { + "_$ref": "74krm1q2" + } + } + ], + "_$child": [ + { + "_$id": "im47tl64", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "0gjzvsvr", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "9jkuymcv", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "ru53901c", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "oh36onmc", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "ymzot2ny", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "74krm1q2", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "krgzjwaj", + "_$type": "Box", + "name": "Box_4", + "x": 420, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "byldk3an" + }, + "obj_pie": { + "_$ref": "mwkq96bm" + }, + "sprite_pie": { + "_$ref": "2oh23ldy" + }, + "obj_mask": { + "_$ref": "8dz8p2fu" + }, + "sprite_mask": { + "_$ref": "uw3wydwh" + }, + "obj_star": { + "_$ref": "g2korhwv" + }, + "label_show": { + "_$ref": "ezmq94gm" + } + } + ], + "_$child": [ + { + "_$id": "byldk3an", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "mwkq96bm", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "2oh23ldy", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "8dz8p2fu", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "uw3wydwh", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "g2korhwv", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "ezmq94gm", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "akfi4ryu", + "_$type": "Box", + "name": "Box_5", + "x": 560, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "tusxu893" + }, + "obj_pie": { + "_$ref": "cn2kl4fu" + }, + "sprite_pie": { + "_$ref": "wtmwhfwk" + }, + "obj_mask": { + "_$ref": "60rpsfm6" + }, + "sprite_mask": { + "_$ref": "q9ftdtyq" + }, + "obj_star": { + "_$ref": "l0cu1y2i" + }, + "label_show": { + "_$ref": "2g7ey3rn" + } + } + ], + "_$child": [ + { + "_$id": "tusxu893", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "cn2kl4fu", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "wtmwhfwk", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "60rpsfm6", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "q9ftdtyq", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "l0cu1y2i", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "2g7ey3rn", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "8l2tyfs3", + "_$type": "Box", + "name": "Box_6", + "x": 700, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "6uzpx6o9" + }, + "obj_pie": { + "_$ref": "7a0f5u8k" + }, + "sprite_pie": { + "_$ref": "xbxg1r4f" + }, + "obj_mask": { + "_$ref": "08y5voeb" + }, + "sprite_mask": { + "_$ref": "csicaooe" + }, + "obj_star": { + "_$ref": "rvykakv5" + }, + "label_show": { + "_$ref": "ygug0h0z" + } + } + ], + "_$child": [ + { + "_$id": "6uzpx6o9", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "7a0f5u8k", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "xbxg1r4f", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "08y5voeb", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "csicaooe", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "rvykakv5", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "ygug0h0z", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "yo3f058n", + "_$type": "Box", + "name": "Box_7", + "x": 840, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "6wypscnr" + }, + "obj_pie": { + "_$ref": "qe21t67w" + }, + "sprite_pie": { + "_$ref": "mx0p07qr" + }, + "obj_mask": { + "_$ref": "5sroo253" + }, + "sprite_mask": { + "_$ref": "ldyf2os2" + }, + "obj_star": { + "_$ref": "x5t5tf2c" + }, + "label_show": { + "_$ref": "ixfir4ve" + } + } + ], + "_$child": [ + { + "_$id": "6wypscnr", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "qe21t67w", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "mx0p07qr", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "5sroo253", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "ldyf2os2", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "x5t5tf2c", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "ixfir4ve", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "gpa839xe", + "_$type": "HBox", + "name": "HBox_2", + "y": 120, + "width": 980, + "height": 120, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "fxm31kl0", + "_$type": "Box", + "name": "Box_1", + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "fkvyfa7e" + }, + "obj_pie": { + "_$ref": "f5qq876j" + }, + "sprite_pie": { + "_$ref": "whuqgi5p" + }, + "obj_mask": { + "_$ref": "24s9zqmd" + }, + "sprite_mask": { + "_$ref": "g9cpobmi" + }, + "obj_star": { + "_$ref": "hxue4oce" + }, + "label_show": { + "_$ref": "3kl80n76" + } + } + ], + "_$child": [ + { + "_$id": "fkvyfa7e", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "f5qq876j", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "whuqgi5p", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "24s9zqmd", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "g9cpobmi", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "hxue4oce", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "3kl80n76", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "j9cpdl3i", + "_$type": "Box", + "name": "Box_2", + "x": 140, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "nojnfdvg" + }, + "obj_pie": { + "_$ref": "zg2ed1u3" + }, + "sprite_pie": { + "_$ref": "8p9354eh" + }, + "obj_mask": { + "_$ref": "1up3thsh" + }, + "sprite_mask": { + "_$ref": "w9ng5kin" + }, + "obj_star": { + "_$ref": "pie32ng2" + }, + "label_show": { + "_$ref": "756fvx67" + } + } + ], + "_$child": [ + { + "_$id": "nojnfdvg", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "zg2ed1u3", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "8p9354eh", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "1up3thsh", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "w9ng5kin", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "pie32ng2", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "756fvx67", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "lbs0cdjd", + "_$type": "Box", + "name": "Box_3", + "x": 280, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "wmutf1xv" + }, + "obj_pie": { + "_$ref": "opy5ktvu" + }, + "sprite_pie": { + "_$ref": "jfceyjgc" + }, + "obj_mask": { + "_$ref": "xpkzica6" + }, + "sprite_mask": { + "_$ref": "s2z9osd8" + }, + "obj_star": { + "_$ref": "b51mppzg" + }, + "label_show": { + "_$ref": "q9szz4dy" + } + } + ], + "_$child": [ + { + "_$id": "wmutf1xv", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "opy5ktvu", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "jfceyjgc", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "xpkzica6", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "s2z9osd8", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "b51mppzg", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "q9szz4dy", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "j0pu97wp", + "_$type": "Box", + "name": "Box_4", + "x": 420, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "jnfe7p4s" + }, + "obj_pie": { + "_$ref": "a5lfea0z" + }, + "sprite_pie": { + "_$ref": "96c9i16m" + }, + "obj_mask": { + "_$ref": "rvz5svdf" + }, + "sprite_mask": { + "_$ref": "mfg5x56v" + }, + "obj_star": { + "_$ref": "ux2c998j" + }, + "label_show": { + "_$ref": "jyutgvxa" + } + } + ], + "_$child": [ + { + "_$id": "jnfe7p4s", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "a5lfea0z", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "96c9i16m", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "rvz5svdf", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "mfg5x56v", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "ux2c998j", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "jyutgvxa", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "lfeb0036", + "_$type": "Box", + "name": "Box_5", + "x": 560, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "rh8zgzdy" + }, + "obj_pie": { + "_$ref": "5nxwvkik" + }, + "sprite_pie": { + "_$ref": "nbjopd6g" + }, + "obj_mask": { + "_$ref": "lh09w2r9" + }, + "sprite_mask": { + "_$ref": "w4jbzijl" + }, + "obj_star": { + "_$ref": "q5wkzcm0" + }, + "label_show": { + "_$ref": "f0n773hs" + } + } + ], + "_$child": [ + { + "_$id": "rh8zgzdy", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "5nxwvkik", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "nbjopd6g", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "lh09w2r9", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "w4jbzijl", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "q5wkzcm0", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "f0n773hs", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "i1jhlkqd", + "_$type": "Box", + "name": "Box_6", + "x": 700, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "6ysq8ruz" + }, + "obj_pie": { + "_$ref": "rmoqmkn4" + }, + "sprite_pie": { + "_$ref": "do9tpnux" + }, + "obj_mask": { + "_$ref": "rsavr1qx" + }, + "sprite_mask": { + "_$ref": "uksvddom" + }, + "obj_star": { + "_$ref": "gmbo0kki" + }, + "label_show": { + "_$ref": "zvvphneb" + } + } + ], + "_$child": [ + { + "_$id": "6ysq8ruz", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "rmoqmkn4", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "do9tpnux", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "rsavr1qx", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "uksvddom", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "gmbo0kki", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "zvvphneb", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "i9s2hglw", + "_$type": "Box", + "name": "Box_7", + "x": 840, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "k1gz0o7x" + }, + "obj_pie": { + "_$ref": "hwn1gk9b" + }, + "sprite_pie": { + "_$ref": "pxxaabbn" + }, + "obj_mask": { + "_$ref": "0ydd5k4q" + }, + "sprite_mask": { + "_$ref": "1zbke32n" + }, + "obj_star": { + "_$ref": "e7wco4qn" + }, + "label_show": { + "_$ref": "ky2zslfs" + } + } + ], + "_$child": [ + { + "_$id": "k1gz0o7x", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "hwn1gk9b", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "pxxaabbn", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "0ydd5k4q", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "1zbke32n", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "e7wco4qn", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "ky2zslfs", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "yhc2nsfm", + "_$type": "HBox", + "name": "HBox_3", + "y": 240, + "width": 980, + "height": 120, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "li2mxyrl", + "_$type": "Box", + "name": "Box_1", + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "eau9d5y8" + }, + "obj_pie": { + "_$ref": "zb9wf79c" + }, + "sprite_pie": { + "_$ref": "udxzggy8" + }, + "obj_mask": { + "_$ref": "9xn0kr7b" + }, + "sprite_mask": { + "_$ref": "tro05weu" + }, + "obj_star": { + "_$ref": "f5qswlfj" + }, + "label_show": { + "_$ref": "3jpgh6ev" + } + } + ], + "_$child": [ + { + "_$id": "eau9d5y8", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "zb9wf79c", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "udxzggy8", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "9xn0kr7b", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "tro05weu", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "f5qswlfj", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "3jpgh6ev", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bu2abvlb", + "_$type": "Box", + "name": "Box_2", + "x": 140, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "cwov78sp" + }, + "obj_pie": { + "_$ref": "82lk6ryi" + }, + "sprite_pie": { + "_$ref": "7fcmefp0" + }, + "obj_mask": { + "_$ref": "orjsgdax" + }, + "sprite_mask": { + "_$ref": "9p0eivhn" + }, + "obj_star": { + "_$ref": "2kufs426" + }, + "label_show": { + "_$ref": "xxiq2n7c" + } + } + ], + "_$child": [ + { + "_$id": "cwov78sp", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "82lk6ryi", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "7fcmefp0", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "orjsgdax", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "9p0eivhn", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "2kufs426", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "xxiq2n7c", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "cy3qezfd", + "_$type": "Box", + "name": "Box_3", + "x": 280, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "sqannnwn" + }, + "obj_pie": { + "_$ref": "tvfzoi6c" + }, + "sprite_pie": { + "_$ref": "26sr4rcn" + }, + "obj_mask": { + "_$ref": "aartqx94" + }, + "sprite_mask": { + "_$ref": "6nhdfsvi" + }, + "obj_star": { + "_$ref": "urkli6fx" + }, + "label_show": { + "_$ref": "i5zyt2qu" + } + } + ], + "_$child": [ + { + "_$id": "sqannnwn", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "tvfzoi6c", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "26sr4rcn", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "aartqx94", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "6nhdfsvi", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "urkli6fx", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "i5zyt2qu", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "dxuos0io", + "_$type": "Box", + "name": "Box_4", + "x": 420, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "lgsvrk70" + }, + "obj_pie": { + "_$ref": "9ssxbhbt" + }, + "sprite_pie": { + "_$ref": "r8kjjyzc" + }, + "obj_mask": { + "_$ref": "pe2pkblj" + }, + "sprite_mask": { + "_$ref": "oaoskgsu" + }, + "obj_star": { + "_$ref": "l0bj9xch" + }, + "label_show": { + "_$ref": "olhiq5e5" + } + } + ], + "_$child": [ + { + "_$id": "lgsvrk70", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "9ssxbhbt", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "r8kjjyzc", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "pe2pkblj", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "oaoskgsu", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "l0bj9xch", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "olhiq5e5", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "p5lh3mgj", + "_$type": "Box", + "name": "Box_5", + "x": 560, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "t17e30c8" + }, + "obj_pie": { + "_$ref": "b0vpgld6" + }, + "sprite_pie": { + "_$ref": "o2e4fuap" + }, + "obj_mask": { + "_$ref": "jfijvybc" + }, + "sprite_mask": { + "_$ref": "6yndsi6a" + }, + "obj_star": { + "_$ref": "9oh3y8p7" + }, + "label_show": { + "_$ref": "72l6i4x6" + } + } + ], + "_$child": [ + { + "_$id": "t17e30c8", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "b0vpgld6", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "o2e4fuap", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "jfijvybc", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "6yndsi6a", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "9oh3y8p7", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "72l6i4x6", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "5zkwsitu", + "_$type": "Box", + "name": "Box_6", + "x": 700, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "s8yvrnti" + }, + "obj_pie": { + "_$ref": "qli6jm0o" + }, + "sprite_pie": { + "_$ref": "i2xym524" + }, + "obj_mask": { + "_$ref": "n5ih4r4e" + }, + "sprite_mask": { + "_$ref": "oujqnrxe" + }, + "obj_star": { + "_$ref": "lp3xh292" + }, + "label_show": { + "_$ref": "kwi5qcdy" + } + } + ], + "_$child": [ + { + "_$id": "s8yvrnti", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "qli6jm0o", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "i2xym524", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "n5ih4r4e", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "oujqnrxe", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "lp3xh292", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "kwi5qcdy", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "42d3b7p4", + "_$type": "Box", + "name": "Box_7", + "x": 840, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "k1h63uz7" + }, + "obj_pie": { + "_$ref": "dt3o753v" + }, + "sprite_pie": { + "_$ref": "5t5h2x2x" + }, + "obj_mask": { + "_$ref": "8vx5gstp" + }, + "sprite_mask": { + "_$ref": "eeovcyjg" + }, + "obj_star": { + "_$ref": "vcz11t1w" + }, + "label_show": { + "_$ref": "ysu03kjy" + } + } + ], + "_$child": [ + { + "_$id": "k1h63uz7", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "dt3o753v", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "5t5h2x2x", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "8vx5gstp", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "eeovcyjg", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "vcz11t1w", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "ysu03kjy", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "ipxvqunf", + "_$type": "HBox", + "name": "HBox_4", + "y": 360, + "width": 980, + "height": 120, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "g3vcnjih", + "_$type": "Box", + "name": "Box_1", + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "rmzpbzp2" + }, + "obj_pie": { + "_$ref": "vcymtq0i" + }, + "sprite_pie": { + "_$ref": "c8skk69m" + }, + "obj_mask": { + "_$ref": "n3kbd12f" + }, + "sprite_mask": { + "_$ref": "hcu55jnp" + }, + "obj_star": { + "_$ref": "glck2ozc" + }, + "label_show": { + "_$ref": "girrnhpi" + } + } + ], + "_$child": [ + { + "_$id": "rmzpbzp2", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "vcymtq0i", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "c8skk69m", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "n3kbd12f", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "hcu55jnp", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "glck2ozc", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "girrnhpi", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "v6eleknk", + "_$type": "Box", + "name": "Box_2", + "x": 140, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "3ntjvxfi" + }, + "obj_pie": { + "_$ref": "xmqitzr4" + }, + "sprite_pie": { + "_$ref": "3qtowett" + }, + "obj_mask": { + "_$ref": "60jr5eow" + }, + "sprite_mask": { + "_$ref": "x5s3ripy" + }, + "obj_star": { + "_$ref": "xririyrm" + }, + "label_show": { + "_$ref": "sz3s1sb4" + } + } + ], + "_$child": [ + { + "_$id": "3ntjvxfi", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "xmqitzr4", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "3qtowett", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "60jr5eow", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "x5s3ripy", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "xririyrm", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "sz3s1sb4", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "lwh8zzju", + "_$type": "Box", + "name": "Box_3", + "x": 280, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "xu1tg5q1" + }, + "obj_pie": { + "_$ref": "me81al9v" + }, + "sprite_pie": { + "_$ref": "zbby0xx1" + }, + "obj_mask": { + "_$ref": "9czamxgq" + }, + "sprite_mask": { + "_$ref": "urby602p" + }, + "obj_star": { + "_$ref": "0abr4i31" + }, + "label_show": { + "_$ref": "x044z7fg" + } + } + ], + "_$child": [ + { + "_$id": "xu1tg5q1", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "me81al9v", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "zbby0xx1", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "9czamxgq", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "urby602p", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "0abr4i31", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "x044z7fg", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "eucljrhh", + "_$type": "Box", + "name": "Box_4", + "x": 420, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "hn37bnxh" + }, + "obj_pie": { + "_$ref": "mvg0o3jc" + }, + "sprite_pie": { + "_$ref": "39psgrab" + }, + "obj_mask": { + "_$ref": "jnd6ybrd" + }, + "sprite_mask": { + "_$ref": "o71r8urp" + }, + "obj_star": { + "_$ref": "jwo2y60f" + }, + "label_show": { + "_$ref": "6rnw0a4m" + } + } + ], + "_$child": [ + { + "_$id": "hn37bnxh", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "mvg0o3jc", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "39psgrab", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "jnd6ybrd", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "o71r8urp", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "jwo2y60f", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "6rnw0a4m", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "e1afy1lo", + "_$type": "Box", + "name": "Box_5", + "x": 560, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "1my2s5am" + }, + "obj_pie": { + "_$ref": "b5dsp0zg" + }, + "sprite_pie": { + "_$ref": "1wf900an" + }, + "obj_mask": { + "_$ref": "25ril0ed" + }, + "sprite_mask": { + "_$ref": "3fptvrqk" + }, + "obj_star": { + "_$ref": "s5fpsc3q" + }, + "label_show": { + "_$ref": "yh3ahy9e" + } + } + ], + "_$child": [ + { + "_$id": "1my2s5am", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "b5dsp0zg", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "1wf900an", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "25ril0ed", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "3fptvrqk", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "s5fpsc3q", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "yh3ahy9e", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "z0jyidb5", + "_$type": "Box", + "name": "Box_6", + "x": 700, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "eb74x4kl" + }, + "obj_pie": { + "_$ref": "omj7x2jz" + }, + "sprite_pie": { + "_$ref": "2ay4fd0i" + }, + "obj_mask": { + "_$ref": "j4b54ned" + }, + "sprite_mask": { + "_$ref": "xg4jj1of" + }, + "obj_star": { + "_$ref": "98hjlv58" + }, + "label_show": { + "_$ref": "gykofwlv" + } + } + ], + "_$child": [ + { + "_$id": "eb74x4kl", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "omj7x2jz", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "2ay4fd0i", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "j4b54ned", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "xg4jj1of", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "98hjlv58", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "gykofwlv", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "i69edhkv", + "_$type": "Box", + "name": "Box_7", + "x": 840, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "gio4cqkc" + }, + "obj_pie": { + "_$ref": "m4e78odw" + }, + "sprite_pie": { + "_$ref": "2kxv2n3b" + }, + "obj_mask": { + "_$ref": "b3kqlmao" + }, + "sprite_mask": { + "_$ref": "39zp77cc" + }, + "obj_star": { + "_$ref": "0hjce9hw" + }, + "label_show": { + "_$ref": "8v6dn1w9" + } + } + ], + "_$child": [ + { + "_$id": "gio4cqkc", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "m4e78odw", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "2kxv2n3b", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "b3kqlmao", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "39zp77cc", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "0hjce9hw", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "8v6dn1w9", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "nwqogss4", + "_$type": "HBox", + "name": "HBox_5", + "y": 480, + "width": 980, + "height": 120, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "072sik1f", + "_$type": "Box", + "name": "Box_1", + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "696vyv3s" + }, + "obj_pie": { + "_$ref": "65shsw4b" + }, + "sprite_pie": { + "_$ref": "frquw31h" + }, + "obj_mask": { + "_$ref": "hckiyxoa" + }, + "sprite_mask": { + "_$ref": "xgstk5mm" + }, + "obj_star": { + "_$ref": "lkw0uiu1" + }, + "label_show": { + "_$ref": "6rozqe1x" + } + } + ], + "_$child": [ + { + "_$id": "696vyv3s", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "65shsw4b", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "frquw31h", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "hckiyxoa", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "xgstk5mm", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "lkw0uiu1", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "6rozqe1x", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qyw85yf3", + "_$type": "Box", + "name": "Box_2", + "x": 140, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "gjvysoli" + }, + "obj_pie": { + "_$ref": "pta00lho" + }, + "sprite_pie": { + "_$ref": "2e592ewx" + }, + "obj_mask": { + "_$ref": "0n608fxk" + }, + "sprite_mask": { + "_$ref": "uzuc93u7" + }, + "obj_star": { + "_$ref": "uyi3v1y3" + }, + "label_show": { + "_$ref": "fyyn7ghf" + } + } + ], + "_$child": [ + { + "_$id": "gjvysoli", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "pta00lho", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "2e592ewx", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "0n608fxk", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "uzuc93u7", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "uyi3v1y3", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "fyyn7ghf", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "e5xtiezw", + "_$type": "Box", + "name": "Box_3", + "x": 280, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "4q5d4r17" + }, + "obj_pie": { + "_$ref": "srih2grc" + }, + "sprite_pie": { + "_$ref": "ylhhgoe5" + }, + "obj_mask": { + "_$ref": "ps8nrltq" + }, + "sprite_mask": { + "_$ref": "u5guou4f" + }, + "obj_star": { + "_$ref": "hpblmdpu" + }, + "label_show": { + "_$ref": "lyeq8q2o" + } + } + ], + "_$child": [ + { + "_$id": "4q5d4r17", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "srih2grc", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "ylhhgoe5", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "ps8nrltq", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "u5guou4f", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "hpblmdpu", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "lyeq8q2o", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qa4p4hwj", + "_$type": "Box", + "name": "Box_4", + "x": 420, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "6uxw67g7" + }, + "obj_pie": { + "_$ref": "33f8q0ok" + }, + "sprite_pie": { + "_$ref": "c8x07sw9" + }, + "obj_mask": { + "_$ref": "o6lens48" + }, + "sprite_mask": { + "_$ref": "y06h9vc9" + }, + "obj_star": { + "_$ref": "0pdm2sny" + }, + "label_show": { + "_$ref": "t0w1fmjr" + } + } + ], + "_$child": [ + { + "_$id": "6uxw67g7", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "33f8q0ok", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "c8x07sw9", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "o6lens48", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "y06h9vc9", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "0pdm2sny", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "t0w1fmjr", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "498aad7j", + "_$type": "Box", + "name": "Box_5", + "x": 560, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "ywne2pip" + }, + "obj_pie": { + "_$ref": "9mbarj3j" + }, + "sprite_pie": { + "_$ref": "9g2gz7df" + }, + "obj_mask": { + "_$ref": "71m0p628" + }, + "sprite_mask": { + "_$ref": "ado2di5m" + }, + "obj_star": { + "_$ref": "gusstctz" + }, + "label_show": { + "_$ref": "5zctzww6" + } + } + ], + "_$child": [ + { + "_$id": "ywne2pip", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "9mbarj3j", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "9g2gz7df", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "71m0p628", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "ado2di5m", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "gusstctz", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "5zctzww6", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ab07fc2n", + "_$type": "Box", + "name": "Box_6", + "x": 700, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "f4k6kcy6" + }, + "obj_pie": { + "_$ref": "bctkwa0p" + }, + "sprite_pie": { + "_$ref": "ikfdwixm" + }, + "obj_mask": { + "_$ref": "dfp943pj" + }, + "sprite_mask": { + "_$ref": "k51ox27i" + }, + "obj_star": { + "_$ref": "uyx0u3mc" + }, + "label_show": { + "_$ref": "86z6navd" + } + } + ], + "_$child": [ + { + "_$id": "f4k6kcy6", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "bctkwa0p", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "ikfdwixm", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "dfp943pj", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "k51ox27i", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "uyx0u3mc", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "86z6navd", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "6ez2wm8d", + "_$type": "Box", + "name": "Box_7", + "x": 840, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "naetl27v" + }, + "obj_pie": { + "_$ref": "20buqu4b" + }, + "sprite_pie": { + "_$ref": "ehebz89g" + }, + "obj_mask": { + "_$ref": "wn0lpw9x" + }, + "sprite_mask": { + "_$ref": "pofduec8" + }, + "obj_star": { + "_$ref": "waaidyst" + }, + "label_show": { + "_$ref": "f5g1zx6n" + } + } + ], + "_$child": [ + { + "_$id": "naetl27v", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "20buqu4b", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "ehebz89g", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "wn0lpw9x", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "pofduec8", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "waaidyst", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "f5g1zx6n", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "ginzynez", + "_$type": "HBox", + "name": "HBox_6", + "y": 600, + "width": 980, + "height": 120, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "kinklcza", + "_$type": "Box", + "name": "Box_1", + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "etyk6c1c" + }, + "obj_pie": { + "_$ref": "q411eqqa" + }, + "sprite_pie": { + "_$ref": "8dzktruj" + }, + "obj_mask": { + "_$ref": "kakxinde" + }, + "sprite_mask": { + "_$ref": "t9qwk0t5" + }, + "obj_star": { + "_$ref": "nhsvn4hn" + }, + "label_show": { + "_$ref": "58sulu2p" + } + } + ], + "_$child": [ + { + "_$id": "etyk6c1c", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "q411eqqa", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "8dzktruj", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "kakxinde", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "t9qwk0t5", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "nhsvn4hn", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "58sulu2p", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "huca0900", + "_$type": "Box", + "name": "Box_2", + "x": 140, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "zzs9iuah" + }, + "obj_pie": { + "_$ref": "jz7nz4df" + }, + "sprite_pie": { + "_$ref": "t3v9jvzi" + }, + "obj_mask": { + "_$ref": "w1r2okag" + }, + "sprite_mask": { + "_$ref": "mdl4rub7" + }, + "obj_star": { + "_$ref": "4lvuz0gk" + }, + "label_show": { + "_$ref": "qpzkxle8" + } + } + ], + "_$child": [ + { + "_$id": "zzs9iuah", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "jz7nz4df", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "t3v9jvzi", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "w1r2okag", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "mdl4rub7", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "4lvuz0gk", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "qpzkxle8", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "c89exvuz", + "_$type": "Box", + "name": "Box_3", + "x": 280, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "u8sy2jd6" + }, + "obj_pie": { + "_$ref": "mmn3s5sq" + }, + "sprite_pie": { + "_$ref": "fv3b21dh" + }, + "obj_mask": { + "_$ref": "lxfz3nfl" + }, + "sprite_mask": { + "_$ref": "yeae8jp2" + }, + "obj_star": { + "_$ref": "vjmlp7j7" + }, + "label_show": { + "_$ref": "j4d2qrfh" + } + } + ], + "_$child": [ + { + "_$id": "u8sy2jd6", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "mmn3s5sq", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "fv3b21dh", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "lxfz3nfl", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "yeae8jp2", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "vjmlp7j7", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "j4d2qrfh", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "n5ws0amt", + "_$type": "Box", + "name": "Box_4", + "x": 420, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "8tnezxrt" + }, + "obj_pie": { + "_$ref": "gv8d0jdg" + }, + "sprite_pie": { + "_$ref": "tqpjl5r6" + }, + "obj_mask": { + "_$ref": "lb2rgun6" + }, + "sprite_mask": { + "_$ref": "5ir2xjmu" + }, + "obj_star": { + "_$ref": "4gaqo4fv" + }, + "label_show": { + "_$ref": "0e3yefdr" + } + } + ], + "_$child": [ + { + "_$id": "8tnezxrt", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "gv8d0jdg", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "tqpjl5r6", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "lb2rgun6", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "5ir2xjmu", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "4gaqo4fv", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "0e3yefdr", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "v8hcz0qo", + "_$type": "Box", + "name": "Box_5", + "x": 560, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "740kqu8k" + }, + "obj_pie": { + "_$ref": "d0h0h3ih" + }, + "sprite_pie": { + "_$ref": "8fsifzil" + }, + "obj_mask": { + "_$ref": "w33x0kl6" + }, + "sprite_mask": { + "_$ref": "1pt6cfd4" + }, + "obj_star": { + "_$ref": "jrpmanu7" + }, + "label_show": { + "_$ref": "fm9m8g32" + } + } + ], + "_$child": [ + { + "_$id": "740kqu8k", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "d0h0h3ih", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "8fsifzil", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "w33x0kl6", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "1pt6cfd4", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "jrpmanu7", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "fm9m8g32", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "cne79531", + "_$type": "Box", + "name": "Box_6", + "x": 700, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "q0fr3o1p" + }, + "obj_pie": { + "_$ref": "hermyw00" + }, + "sprite_pie": { + "_$ref": "7brk9p78" + }, + "obj_mask": { + "_$ref": "71na70u0" + }, + "sprite_mask": { + "_$ref": "u2391zmq" + }, + "obj_star": { + "_$ref": "sag111bm" + }, + "label_show": { + "_$ref": "etlvtgir" + } + } + ], + "_$child": [ + { + "_$id": "q0fr3o1p", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "hermyw00", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "7brk9p78", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "71na70u0", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "u2391zmq", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "sag111bm", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "etlvtgir", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "lljuwjgh", + "_$type": "Box", + "name": "Box_7", + "x": 840, + "y": -6, + "width": 140, + "height": 132, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "div15rol" + }, + "obj_pie": { + "_$ref": "y8lazfpt" + }, + "sprite_pie": { + "_$ref": "om9hy9z2" + }, + "obj_mask": { + "_$ref": "onbrk1qw" + }, + "sprite_mask": { + "_$ref": "s09y50ef" + }, + "obj_star": { + "_$ref": "wyy8uhwk" + }, + "label_show": { + "_$ref": "q771i803" + } + } + ], + "_$child": [ + { + "_$id": "div15rol", + "_$type": "Image", + "name": "selected", + "x": 16, + "y": 12, + "width": 108, + "height": 108, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "y8lazfpt", + "_$type": "Box", + "name": "pie", + "x": 70, + "y": 66, + "width": 96, + "height": 96, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "om9hy9z2", + "_$type": "Sprite", + "name": "pie", + "width": 96, + "height": 96, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "onbrk1qw", + "_$type": "Box", + "name": "mask", + "x": 70, + "y": 66, + "width": 84, + "height": 84, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "s09y50ef", + "_$type": "Sprite", + "name": "mask", + "width": 84, + "height": 84, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "wyy8uhwk", + "_$type": "Image", + "name": "star", + "x": 22, + "y": 18, + "width": 96, + "height": 96, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "q771i803", + "_$type": "Label", + "name": "Label", + "width": 140, + "height": 132, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "x8f5wfnc", + "_$type": "HBox", + "name": "titles", + "x": 50, + "y": 48, + "width": 980, + "height": 45, + "centerX": 0, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "sgy9epuf", + "_$type": "Label", + "name": "Label(1)", + "width": 140, + "height": 45, + "text": "SUN", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 36, + "color": "rgba(167, 171, 179, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "b8rp6bed", + "_$type": "Label", + "name": "Label(2)", + "x": 140, + "width": 140, + "height": 45, + "text": "MON", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 36, + "color": "rgba(167, 171, 179, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "jscr44hp", + "_$type": "Label", + "name": "Label(3)", + "x": 280, + "width": 140, + "height": 45, + "text": "TUE", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 36, + "color": "rgba(167, 171, 179, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "9yfqxnlk", + "_$type": "Label", + "name": "Label(4)", + "x": 420, + "width": 140, + "height": 45, + "text": "WED", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 36, + "color": "rgba(167, 171, 179, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "dl3hf6r9", + "_$type": "Label", + "name": "Label(5)", + "x": 560, + "width": 140, + "height": 45, + "text": "THU", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 36, + "color": "rgba(167, 171, 179, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "4js6nuhj", + "_$type": "Label", + "name": "Label(6)", + "x": 700, + "width": 140, + "height": 45, + "text": "FRI", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 36, + "color": "rgba(167, 171, 179, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "7ba78kj9", + "_$type": "Label", + "name": "Label(7)", + "x": 840, + "width": 140, + "height": 45, + "text": "SAT", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 36, + "color": "rgba(167, 171, 179, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ybbojil0", + "_$type": "Box", + "name": "btn_left", + "x": 11, + "y": 492, + "width": 48, + "height": 96, + "_mouseState": 2, + "centerX": -505, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "wmm7xhim", + "_$type": "Image", + "name": "Image", + "width": 48, + "height": 97, + "mouseThrough": true, + "skin": "res://535f9c82-7994-4fd9-a6b5-e7d08199cd4f", + "useSourceSize": true, + "color": "#748290" + } + ] + }, + { + "_$id": "rp3gmpnp", + "_$type": "Box", + "name": "btn_right", + "x": 1021, + "y": 492, + "width": 48, + "height": 96, + "_mouseState": 2, + "centerX": 505, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "hxt6cgnk", + "_$type": "Image", + "name": "Image", + "width": 48, + "height": 97, + "mouseThrough": true, + "skin": "res://25320e1c-b60c-45af-9122-cdc433872fa7", + "useSourceSize": true, + "color": "#748290" + } + ] + }, + { + "_$id": "waobo8h4", + "_$type": "Box", + "name": "bottom", + "x": 72, + "y": 885, + "width": 936, + "height": 312, + "bottom": 48, + "centerX": 0, + "_$child": [ + { + "_$id": "94zvp67m", + "_$type": "Sprite", + "name": "Sprite", + "width": 936, + "height": 312, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(245, 247, 251, 1)" + } + ] + }, + { + "_$id": "n6h23gk2", + "_$type": "Label", + "name": "Label", + "x": 72, + "y": 24, + "width": 792, + "height": 60, + "top": 24, + "centerX": 0, + "text": "May 18,2024", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 48, + "color": "rgba(167, 171, 179, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "mv2bgo4b", + "_$type": "HBox", + "name": "summary", + "x": 24, + "y": 116, + "width": 888, + "height": 159, + "centerX": 0, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "gpofy1q5", + "_$type": "Box", + "name": "Box(1)", + "y": 20, + "width": 296, + "height": 120, + "_$child": [ + { + "_$id": "arsz3f79", + "_$type": "Label", + "name": "Label", + "width": 296, + "height": 60, + "top": 0, + "text": "Difficulty ", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(167, 171, 179, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "bhpw991e", + "_$type": "Label", + "name": "label_difficulty", + "y": 60, + "width": 296, + "height": 60, + "bottom": 0, + "text": "Medium", + "font": "res://3f79306d-f490-4a54-a4f3-26cb51d56a12", + "fontSize": 54, + "color": "rgba(45, 49, 56, 1)", + "bold": true, + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qn7c883a", + "_$type": "Box", + "name": "Box(2)", + "x": 296, + "y": 20, + "width": 296, + "height": 120, + "_$child": [ + { + "_$id": "up5giclg", + "_$type": "Label", + "name": "Label", + "width": 296, + "height": 60, + "top": 0, + "text": "Score", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(167, 171, 179, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "v5sr4uba", + "_$type": "Label", + "name": "label_score", + "y": 60, + "width": 296, + "height": 60, + "bottom": 0, + "text": "Medium", + "font": "res://3f79306d-f490-4a54-a4f3-26cb51d56a12", + "fontSize": 54, + "color": "rgba(45, 49, 56, 1)", + "bold": true, + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ofv6sob3", + "_$type": "Box", + "name": "Box(3)", + "x": 592, + "y": 20, + "width": 296, + "height": 120, + "_$child": [ + { + "_$id": "pizs0hve", + "_$type": "Label", + "name": "Label", + "width": 296, + "height": 60, + "top": 0, + "text": "Time", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 36, + "color": "rgba(167, 171, 179, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "hyyuw0b3", + "_$type": "Label", + "name": "label_time", + "y": 60, + "width": 296, + "height": 60, + "bottom": 0, + "text": "Medium", + "font": "res://3f79306d-f490-4a54-a4f3-26cb51d56a12", + "fontSize": 54, + "color": "rgba(45, 49, 56, 1)", + "bold": true, + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "fcdi6bx3", + "_$type": "Box", + "name": "btn_play", + "x": 72, + "y": 120, + "width": 792, + "height": 156, + "bottom": 36, + "centerX": 0, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "d4mtvd9m", + "_$type": "Sprite", + "name": "sdw", + "width": 792, + "height": 156, + "alpha": 0.2, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 4, + "blur": 8, + "color": "#1d5cdc" + } + ] + }, + { + "_$id": "fsdu7vjq", + "_$type": "Sprite", + "name": "Sprite", + "width": 792, + "height": 156, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + }, + { + "_$id": "fjjd0uhu", + "_$type": "Label", + "name": "Label", + "width": 792, + "height": 156, + "centerX": 0, + "centerY": 0, + "text": "Play", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 60, + "color": "#FFFFFF", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/shudu/assets/resources/dc/DailyChallenge.lh.meta b/shudu/assets/resources/dc/DailyChallenge.lh.meta new file mode 100644 index 0000000..5557cba --- /dev/null +++ b/shudu/assets/resources/dc/DailyChallenge.lh.meta @@ -0,0 +1,3 @@ +{ + "uuid": "ab0e47f1-b092-4e81-ac0c-ff02fc97c6a0" +} \ No newline at end of file diff --git a/shudu/assets/resources/dc/DailyChallenge_H.lh b/shudu/assets/resources/dc/DailyChallenge_H.lh new file mode 100644 index 0000000..5c65ed9 --- /dev/null +++ b/shudu/assets/resources/dc/DailyChallenge_H.lh @@ -0,0 +1,7356 @@ +{ + "_$ver": 1, + "_$id": "8tlrx7vy", + "_$type": "Box", + "name": "DailyChallenge_H", + "y": 120, + "width": 1920, + "height": 960, + "_mouseState": 2, + "top": 120, + "centerX": 0, + "_$comp": [ + { + "_$type": "3f68d98d-3867-41a7-b277-a24d279a22fa", + "scriptPath": "../src/views/dc/DailyChallenge.ts", + "sprite_bottom": null, + "btn_back": null, + "btn_trophy": { + "_$ref": "3sotc6mc" + }, + "btn_trophy_red": { + "_$ref": "7nzau29s" + }, + "trophy_light": { + "_$ref": "geon9fbm" + }, + "trophy_icon": { + "_$ref": "5cayqz7i" + }, + "btn_left": { + "_$ref": "hy6mhkm1" + }, + "btn_right": { + "_$ref": "cesch3ua" + }, + "btn_left2": { + "_$ref": "ooo778f6" + }, + "btn_right2": { + "_$ref": "9u1eta96" + }, + "bg_dc": { + "_$ref": "s1tpy9gm" + }, + "label_year": { + "_$ref": "uy1v515z" + }, + "label_month": { + "_$ref": "d0l5bm19" + }, + "label_star": { + "_$ref": "lxb6ukc1" + }, + "btn_play": { + "_$ref": "sg9xzsr3" + }, + "label_play": { + "_$ref": "gf6gyao8" + }, + "obj_summary": { + "_$ref": "h3zqtx71" + }, + "label_date": { + "_$ref": "86x6eeht" + }, + "label_diffucuty": { + "_$ref": "e7uzpzuf" + }, + "label_score": { + "_$ref": "c1zlbdr3" + }, + "label_time": { + "_$ref": "1eu0fpsu" + }, + "obj_items": { + "_$ref": "t6dl4g1n" + } + } + ], + "_$child": [ + { + "_$id": "ffeg16nf", + "_$type": "Box", + "name": "left", + "width": 720, + "height": 960, + "_mouseState": 2, + "left": 0, + "top": 0, + "_$child": [ + { + "_$id": "s1tpy9gm", + "_$type": "Image", + "name": "bg", + "width": 960, + "height": 960, + "left": 0, + "top": 0, + "skin": "res://4182ef3f-6065-44dd-83c2-70490f02e9cb", + "color": "#ffffff" + }, + { + "_$id": "geon9fbm", + "_$type": "Image", + "name": "light", + "y": 210, + "width": 720, + "height": 720, + "bottom": 30, + "centerX": 0, + "skin": "res://449a140e-576e-4a52-ace4-f2695351f489", + "color": "#ffffff", + "_$comp": [ + { + "_$type": "ca60d5cb-d801-434b-9e6a-7b0c738cb0e9", + "scriptPath": "../src/views/common/UISequenceAnimation.ts", + "prefix": "sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00", + "beginIndex": 0, + "endIndex": 119, + "playOnAwake": true, + "loop": true + } + ] + }, + { + "_$id": "5cayqz7i", + "_$type": "Image", + "name": "trophy", + "x": 60, + "y": 330, + "width": 600, + "height": 600, + "bottom": 30, + "centerX": 0, + "skin": "res://09690a9b-3d5a-4da1-b457-1a3275cf5c14", + "color": "#ffffff" + }, + { + "_$id": "uy1v515z", + "_$type": "Label", + "name": "label_year", + "x": 260, + "y": 30, + "width": 200, + "height": 40, + "alpha": 0.6, + "top": 30, + "centerX": 0, + "text": "2024", + "font": "res://3f79306d-f490-4a54-a4f3-26cb51d56a12", + "fontSize": 32, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "d0l5bm19", + "_$type": "Label", + "name": "label_month", + "x": 110, + "y": 80, + "width": 500, + "height": 54, + "top": 80, + "centerX": 0, + "text": "Jul", + "font": "res://3f79306d-f490-4a54-a4f3-26cb51d56a12", + "fontSize": 68, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "lblbb8yk", + "_$type": "Box", + "name": "Box", + "x": 288, + "y": 165, + "width": 144, + "height": 48, + "top": 165, + "centerX": 0, + "_$child": [ + { + "_$id": "39l1c48x", + "_$type": "Sprite", + "name": "Sprite", + "width": 144, + "height": 48, + "alpha": 0.2, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 24, + "rt": 24, + "lb": 24, + "rb": 24, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + }, + { + "_$id": "ag0rceay", + "_$type": "Image", + "name": "star", + "x": 6, + "y": 4, + "width": 40, + "height": 40, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "lxb6ukc1", + "_$type": "Label", + "name": "label_star", + "x": 46, + "y": 3, + "width": 90, + "height": 48, + "centerY": 3, + "text": "31/31", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 30, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "hy6mhkm1", + "_$type": "Box", + "name": "btn_left", + "x": 50, + "y": 102, + "width": 36, + "height": 72, + "_mouseState": 2, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "kj0szcw3", + "_$type": "Image", + "name": "Image", + "width": 48, + "height": 97, + "scaleX": 0.75, + "scaleY": 0.75, + "mouseThrough": true, + "skin": "res://535f9c82-7994-4fd9-a6b5-e7d08199cd4f", + "useSourceSize": true, + "color": "#ffffff" + } + ] + }, + { + "_$id": "cesch3ua", + "_$type": "Box", + "name": "btn_right", + "x": 638, + "y": 102, + "width": 36, + "height": 72, + "_mouseState": 2, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "4w6yqgr4", + "_$type": "Image", + "name": "Image", + "width": 48, + "height": 97, + "scaleX": 0.75, + "scaleY": 0.75, + "mouseThrough": true, + "skin": "res://25320e1c-b60c-45af-9122-cdc433872fa7", + "useSourceSize": true, + "color": "#ffffff" + } + ] + } + ] + }, + { + "_$id": "eo7huhks", + "_$type": "Box", + "name": "right", + "x": 720, + "width": 1200, + "height": 960, + "right": 0, + "top": 0, + "_$child": [ + { + "_$id": "dlm2xhn0", + "_$type": "Sprite", + "name": "Sprite", + "width": 1200, + "height": 960, + "_gcmds": [ + { + "_$type": "DrawRectCmd", + "lineWidth": 1, + "fillColor": "rgba(255, 255, 255, 1)" + } + ] + }, + { + "_$id": "3sotc6mc", + "_$type": "Image", + "name": "btn_trophy", + "x": 1086, + "y": -96, + "width": 54, + "height": 54, + "skin": "res://4458c7de-47ff-496e-a28f-be808c0823b3", + "color": "#545962", + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "7nzau29s", + "_$type": "Sprite", + "name": "Sprite", + "x": 44, + "y": -6, + "width": 24, + "height": 24, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 4, + "lineColor": "rgba(255, 255, 255, 1)", + "fillColor": "rgba(229, 34, 28, 1)" + } + ] + } + ] + }, + { + "_$id": "t6dl4g1n", + "_$type": "VBox", + "name": "items", + "x": 40, + "y": 96, + "width": 1120, + "height": 504, + "drawCallOptimize": true, + "top": 96, + "centerX": 0, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "39mogtze", + "_$type": "HBox", + "name": "HBox(1)", + "width": 1120, + "height": 84, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "xlbdqe0b", + "_$type": "Box", + "name": "Box(1)", + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "msbc075x" + }, + "obj_pie": { + "_$ref": "t7otcr4k" + }, + "sprite_pie": { + "_$ref": "z3v4ee5f" + }, + "obj_mask": { + "_$ref": "asdjtq1x" + }, + "sprite_mask": { + "_$ref": "5r53dv4j" + }, + "obj_star": { + "_$ref": "nievvcuf" + }, + "label_show": { + "_$ref": "uzilrc0h" + } + } + ], + "_$child": [ + { + "_$id": "msbc075x", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "t7otcr4k", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "z3v4ee5f", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "asdjtq1x", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "5r53dv4j", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "nievvcuf", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "uzilrc0h", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "eeiwhhz9", + "_$type": "Box", + "name": "Box(2)", + "x": 160, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "ym6afzas" + }, + "obj_pie": { + "_$ref": "4p9fg0go" + }, + "sprite_pie": { + "_$ref": "xrtuv3z4" + }, + "obj_mask": { + "_$ref": "9e8c2qpf" + }, + "sprite_mask": { + "_$ref": "h6zlaz7b" + }, + "obj_star": { + "_$ref": "wt04b77p" + }, + "label_show": { + "_$ref": "7m4dxujg" + } + } + ], + "_$child": [ + { + "_$id": "ym6afzas", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "4p9fg0go", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "xrtuv3z4", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "9e8c2qpf", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "h6zlaz7b", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "wt04b77p", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "7m4dxujg", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7tixpout", + "_$type": "Box", + "name": "Box(3)", + "x": 320, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "t298zzgx" + }, + "obj_pie": { + "_$ref": "the9um1a" + }, + "sprite_pie": { + "_$ref": "914xziv2" + }, + "obj_mask": { + "_$ref": "3eszfavs" + }, + "sprite_mask": { + "_$ref": "ihjfbclq" + }, + "obj_star": { + "_$ref": "zxerva8u" + }, + "label_show": { + "_$ref": "mb5dtz78" + } + } + ], + "_$child": [ + { + "_$id": "t298zzgx", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "the9um1a", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "914xziv2", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "3eszfavs", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "ihjfbclq", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "zxerva8u", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "mb5dtz78", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qqbxviq2", + "_$type": "Box", + "name": "Box(4)", + "x": 480, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "mmwh1y57" + }, + "obj_pie": { + "_$ref": "ko5vu8nx" + }, + "sprite_pie": { + "_$ref": "j3l8xwsx" + }, + "obj_mask": { + "_$ref": "yf3o3s36" + }, + "sprite_mask": { + "_$ref": "s7wfv0be" + }, + "obj_star": { + "_$ref": "4dcbtfku" + }, + "label_show": { + "_$ref": "k6h3rywu" + } + } + ], + "_$child": [ + { + "_$id": "mmwh1y57", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "ko5vu8nx", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "j3l8xwsx", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "yf3o3s36", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "s7wfv0be", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "4dcbtfku", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "k6h3rywu", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "d6zfsx4q", + "_$type": "Box", + "name": "Box(5)", + "x": 640, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "fffm7h37" + }, + "obj_pie": { + "_$ref": "jdr48u1m" + }, + "sprite_pie": { + "_$ref": "2mqi65n9" + }, + "obj_mask": { + "_$ref": "0oigcuaw" + }, + "sprite_mask": { + "_$ref": "vn87b9ld" + }, + "obj_star": { + "_$ref": "eb8wpih4" + }, + "label_show": { + "_$ref": "r25obw17" + } + } + ], + "_$child": [ + { + "_$id": "fffm7h37", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "jdr48u1m", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "2mqi65n9", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "0oigcuaw", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "vn87b9ld", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "eb8wpih4", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "r25obw17", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "kfy6q2yg", + "_$type": "Box", + "name": "Box(6)", + "x": 800, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "0q47n9hw" + }, + "obj_pie": { + "_$ref": "v1jaaqtt" + }, + "sprite_pie": { + "_$ref": "ogypw6ab" + }, + "obj_mask": { + "_$ref": "1vlwyhx3" + }, + "sprite_mask": { + "_$ref": "5apydbah" + }, + "obj_star": { + "_$ref": "q0yph9nh" + }, + "label_show": { + "_$ref": "e0xvyh0d" + } + } + ], + "_$child": [ + { + "_$id": "0q47n9hw", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "v1jaaqtt", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "ogypw6ab", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "1vlwyhx3", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "5apydbah", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "q0yph9nh", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "e0xvyh0d", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "h6fqa9di", + "_$type": "Box", + "name": "Box(7)", + "x": 960, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "e1ijkd23" + }, + "obj_pie": { + "_$ref": "7tzjz1t0" + }, + "sprite_pie": { + "_$ref": "elxctreq" + }, + "obj_mask": { + "_$ref": "likln3nz" + }, + "sprite_mask": { + "_$ref": "gv1djy5o" + }, + "obj_star": { + "_$ref": "2swu0v3a" + }, + "label_show": { + "_$ref": "gk47qjn0" + } + } + ], + "_$child": [ + { + "_$id": "e1ijkd23", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "7tzjz1t0", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "elxctreq", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "likln3nz", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "gv1djy5o", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "2swu0v3a", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "gk47qjn0", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "t9p6vdl1", + "_$type": "HBox", + "name": "HBox(2)", + "y": 84, + "width": 1120, + "height": 84, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "osd0tw3m", + "_$type": "Box", + "name": "Box(1)", + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "iehbpnmw" + }, + "obj_pie": { + "_$ref": "3issouzk" + }, + "sprite_pie": { + "_$ref": "r91ke6jp" + }, + "obj_mask": { + "_$ref": "1wg42t6f" + }, + "sprite_mask": { + "_$ref": "iwryie25" + }, + "obj_star": { + "_$ref": "k491opey" + }, + "label_show": { + "_$ref": "2p0lipbe" + } + } + ], + "_$child": [ + { + "_$id": "iehbpnmw", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "3issouzk", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "r91ke6jp", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "1wg42t6f", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "iwryie25", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "k491opey", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "2p0lipbe", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "f837xur4", + "_$type": "Box", + "name": "Box(2)", + "x": 160, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "jbhhiewz" + }, + "obj_pie": { + "_$ref": "ykmfjmsk" + }, + "sprite_pie": { + "_$ref": "rmoowrmn" + }, + "obj_mask": { + "_$ref": "qibgt0eu" + }, + "sprite_mask": { + "_$ref": "2lhybu5u" + }, + "obj_star": { + "_$ref": "5mmskz6e" + }, + "label_show": { + "_$ref": "ctwnrd3j" + } + } + ], + "_$child": [ + { + "_$id": "jbhhiewz", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "ykmfjmsk", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "rmoowrmn", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "qibgt0eu", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "2lhybu5u", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "5mmskz6e", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "ctwnrd3j", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "erpznrkd", + "_$type": "Box", + "name": "Box(3)", + "x": 320, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "h622mzyg" + }, + "obj_pie": { + "_$ref": "7jonajce" + }, + "sprite_pie": { + "_$ref": "ong77cqz" + }, + "obj_mask": { + "_$ref": "keabqofm" + }, + "sprite_mask": { + "_$ref": "x363ket5" + }, + "obj_star": { + "_$ref": "9xeddfhy" + }, + "label_show": { + "_$ref": "stufcqlt" + } + } + ], + "_$child": [ + { + "_$id": "h622mzyg", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "7jonajce", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "ong77cqz", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "keabqofm", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "x363ket5", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "9xeddfhy", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "stufcqlt", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "3vi5xfn5", + "_$type": "Box", + "name": "Box(4)", + "x": 480, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "4326vdvi" + }, + "obj_pie": { + "_$ref": "13m3ta1k" + }, + "sprite_pie": { + "_$ref": "t7sp2bnn" + }, + "obj_mask": { + "_$ref": "vafyech4" + }, + "sprite_mask": { + "_$ref": "ootnnhb7" + }, + "obj_star": { + "_$ref": "9sq5b885" + }, + "label_show": { + "_$ref": "jzn05f15" + } + } + ], + "_$child": [ + { + "_$id": "4326vdvi", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "13m3ta1k", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "t7sp2bnn", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "vafyech4", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "ootnnhb7", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "9sq5b885", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "jzn05f15", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "fa1kvuo2", + "_$type": "Box", + "name": "Box(5)", + "x": 640, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "8dm50gl5" + }, + "obj_pie": { + "_$ref": "brybdvaw" + }, + "sprite_pie": { + "_$ref": "ofex9dxx" + }, + "obj_mask": { + "_$ref": "g16mfh8r" + }, + "sprite_mask": { + "_$ref": "to6bjzov" + }, + "obj_star": { + "_$ref": "ap6cv7kr" + }, + "label_show": { + "_$ref": "jeubqcau" + } + } + ], + "_$child": [ + { + "_$id": "8dm50gl5", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "brybdvaw", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "ofex9dxx", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "g16mfh8r", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "to6bjzov", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "ap6cv7kr", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "jeubqcau", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "v0o9spmk", + "_$type": "Box", + "name": "Box(6)", + "x": 800, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "cydtdzzo" + }, + "obj_pie": { + "_$ref": "sakai4t7" + }, + "sprite_pie": { + "_$ref": "l0xekj47" + }, + "obj_mask": { + "_$ref": "9wxccfmi" + }, + "sprite_mask": { + "_$ref": "bpahp2c2" + }, + "obj_star": { + "_$ref": "b1umyn20" + }, + "label_show": { + "_$ref": "7jyqiik0" + } + } + ], + "_$child": [ + { + "_$id": "cydtdzzo", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "sakai4t7", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "l0xekj47", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "9wxccfmi", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "bpahp2c2", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "b1umyn20", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "7jyqiik0", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "muxuq1qo", + "_$type": "Box", + "name": "Box(7)", + "x": 960, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "mkgh0vsz" + }, + "obj_pie": { + "_$ref": "e1s2ikfm" + }, + "sprite_pie": { + "_$ref": "z21jmw9p" + }, + "obj_mask": { + "_$ref": "dj97uw61" + }, + "sprite_mask": { + "_$ref": "y8p0x14u" + }, + "obj_star": { + "_$ref": "ivcahdp8" + }, + "label_show": { + "_$ref": "bqer9wdp" + } + } + ], + "_$child": [ + { + "_$id": "mkgh0vsz", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "e1s2ikfm", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "z21jmw9p", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "dj97uw61", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "y8p0x14u", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "ivcahdp8", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "bqer9wdp", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "3l86mofb", + "_$type": "HBox", + "name": "HBox(3)", + "y": 168, + "width": 1120, + "height": 84, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "pxn8wpmq", + "_$type": "Box", + "name": "Box(1)", + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "joy1jyo7" + }, + "obj_pie": { + "_$ref": "6toyl8iq" + }, + "sprite_pie": { + "_$ref": "ktde2rck" + }, + "obj_mask": { + "_$ref": "07kgaxa1" + }, + "sprite_mask": { + "_$ref": "012xzamt" + }, + "obj_star": { + "_$ref": "vka7qee4" + }, + "label_show": { + "_$ref": "2h7h4ojz" + } + } + ], + "_$child": [ + { + "_$id": "joy1jyo7", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "6toyl8iq", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "ktde2rck", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "07kgaxa1", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "012xzamt", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "vka7qee4", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "2h7h4ojz", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "635yu3en", + "_$type": "Box", + "name": "Box(2)", + "x": 160, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "ek7914wu" + }, + "obj_pie": { + "_$ref": "japkq3xj" + }, + "sprite_pie": { + "_$ref": "lm4plphd" + }, + "obj_mask": { + "_$ref": "3g9ws8d9" + }, + "sprite_mask": { + "_$ref": "9yeg79f3" + }, + "obj_star": { + "_$ref": "g49etywb" + }, + "label_show": { + "_$ref": "fenpnpo1" + } + } + ], + "_$child": [ + { + "_$id": "ek7914wu", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "japkq3xj", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "lm4plphd", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "3g9ws8d9", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "9yeg79f3", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "g49etywb", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "fenpnpo1", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "gg6wvjy6", + "_$type": "Box", + "name": "Box(3)", + "x": 320, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "athrnjsg" + }, + "obj_pie": { + "_$ref": "7lxiv0o8" + }, + "sprite_pie": { + "_$ref": "2k8y1veg" + }, + "obj_mask": { + "_$ref": "8rij02pz" + }, + "sprite_mask": { + "_$ref": "a9c05csq" + }, + "obj_star": { + "_$ref": "a9vibxm8" + }, + "label_show": { + "_$ref": "rgrjdc56" + } + } + ], + "_$child": [ + { + "_$id": "athrnjsg", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "7lxiv0o8", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "2k8y1veg", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "8rij02pz", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "a9c05csq", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "a9vibxm8", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "rgrjdc56", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "4rb2nf6p", + "_$type": "Box", + "name": "Box(4)", + "x": 480, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "xfw7kejt" + }, + "obj_pie": { + "_$ref": "rti8yn1z" + }, + "sprite_pie": { + "_$ref": "qai6gbh6" + }, + "obj_mask": { + "_$ref": "itzncu4n" + }, + "sprite_mask": { + "_$ref": "6ap1u7hg" + }, + "obj_star": { + "_$ref": "890wtsfg" + }, + "label_show": { + "_$ref": "vwfom4oz" + } + } + ], + "_$child": [ + { + "_$id": "xfw7kejt", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "rti8yn1z", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "qai6gbh6", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "itzncu4n", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "6ap1u7hg", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "890wtsfg", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "vwfom4oz", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "vy5063c9", + "_$type": "Box", + "name": "Box(5)", + "x": 640, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "edqlbyae" + }, + "obj_pie": { + "_$ref": "s4e5p8w2" + }, + "sprite_pie": { + "_$ref": "0dhzqmtp" + }, + "obj_mask": { + "_$ref": "h9y2ij6l" + }, + "sprite_mask": { + "_$ref": "667grc5c" + }, + "obj_star": { + "_$ref": "1ye2g0gu" + }, + "label_show": { + "_$ref": "k840fhuy" + } + } + ], + "_$child": [ + { + "_$id": "edqlbyae", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "s4e5p8w2", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "0dhzqmtp", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "h9y2ij6l", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "667grc5c", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "1ye2g0gu", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "k840fhuy", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "je5uju68", + "_$type": "Box", + "name": "Box(6)", + "x": 800, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "inwl7824" + }, + "obj_pie": { + "_$ref": "0jh2l2d0" + }, + "sprite_pie": { + "_$ref": "ipgqnadr" + }, + "obj_mask": { + "_$ref": "gl7buni8" + }, + "sprite_mask": { + "_$ref": "9ka2d7w1" + }, + "obj_star": { + "_$ref": "ixo5qeqt" + }, + "label_show": { + "_$ref": "fu8d4l57" + } + } + ], + "_$child": [ + { + "_$id": "inwl7824", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "0jh2l2d0", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "ipgqnadr", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "gl7buni8", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "9ka2d7w1", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "ixo5qeqt", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "fu8d4l57", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bp1xpqn6", + "_$type": "Box", + "name": "Box(7)", + "x": 960, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "92ogepkx" + }, + "obj_pie": { + "_$ref": "seyeh07p" + }, + "sprite_pie": { + "_$ref": "wpdkqajl" + }, + "obj_mask": { + "_$ref": "xj3qisn4" + }, + "sprite_mask": { + "_$ref": "1g7egpv5" + }, + "obj_star": { + "_$ref": "9ss296tu" + }, + "label_show": { + "_$ref": "yb1e1wx4" + } + } + ], + "_$child": [ + { + "_$id": "92ogepkx", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "seyeh07p", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "wpdkqajl", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "xj3qisn4", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "1g7egpv5", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "9ss296tu", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "yb1e1wx4", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "uml64u63", + "_$type": "HBox", + "name": "HBox(4)", + "y": 252, + "width": 1120, + "height": 84, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "jv6ignvy", + "_$type": "Box", + "name": "Box(1)", + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "83qoix8r" + }, + "obj_pie": { + "_$ref": "upgdyd3e" + }, + "sprite_pie": { + "_$ref": "c6iv3obr" + }, + "obj_mask": { + "_$ref": "qakq5evf" + }, + "sprite_mask": { + "_$ref": "uhvoxjx2" + }, + "obj_star": { + "_$ref": "xbjairft" + }, + "label_show": { + "_$ref": "jd5eo59h" + } + } + ], + "_$child": [ + { + "_$id": "83qoix8r", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "upgdyd3e", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "c6iv3obr", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "qakq5evf", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "uhvoxjx2", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "xbjairft", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "jd5eo59h", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ew68w4t2", + "_$type": "Box", + "name": "Box(2)", + "x": 160, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "7dutej1j" + }, + "obj_pie": { + "_$ref": "fyuwijfk" + }, + "sprite_pie": { + "_$ref": "7q0mikm6" + }, + "obj_mask": { + "_$ref": "phrueh42" + }, + "sprite_mask": { + "_$ref": "jit2irt3" + }, + "obj_star": { + "_$ref": "77jakx3k" + }, + "label_show": { + "_$ref": "1whe99i7" + } + } + ], + "_$child": [ + { + "_$id": "7dutej1j", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "fyuwijfk", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "7q0mikm6", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "phrueh42", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "jit2irt3", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "77jakx3k", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "1whe99i7", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "xxz6ih69", + "_$type": "Box", + "name": "Box(3)", + "x": 320, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "zldac256" + }, + "obj_pie": { + "_$ref": "jepvr1dc" + }, + "sprite_pie": { + "_$ref": "07i4jfp8" + }, + "obj_mask": { + "_$ref": "22siq7fo" + }, + "sprite_mask": { + "_$ref": "mrkiwkus" + }, + "obj_star": { + "_$ref": "a5h3gwjf" + }, + "label_show": { + "_$ref": "b1zkyk7z" + } + } + ], + "_$child": [ + { + "_$id": "zldac256", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "jepvr1dc", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "07i4jfp8", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "22siq7fo", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "mrkiwkus", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "a5h3gwjf", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "b1zkyk7z", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "r0te26kj", + "_$type": "Box", + "name": "Box(4)", + "x": 480, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "wlgsmnrw" + }, + "obj_pie": { + "_$ref": "w1obhcor" + }, + "sprite_pie": { + "_$ref": "g7itengb" + }, + "obj_mask": { + "_$ref": "2xzcwnl0" + }, + "sprite_mask": { + "_$ref": "axzpt0su" + }, + "obj_star": { + "_$ref": "dxaap92d" + }, + "label_show": { + "_$ref": "gr1zo4t7" + } + } + ], + "_$child": [ + { + "_$id": "wlgsmnrw", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "w1obhcor", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "g7itengb", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "2xzcwnl0", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "axzpt0su", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "dxaap92d", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "gr1zo4t7", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "g1jc8c2h", + "_$type": "Box", + "name": "Box(5)", + "x": 640, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "618yup2k" + }, + "obj_pie": { + "_$ref": "1b6jo47v" + }, + "sprite_pie": { + "_$ref": "p6q618bd" + }, + "obj_mask": { + "_$ref": "0jy6xmue" + }, + "sprite_mask": { + "_$ref": "oj9ztduh" + }, + "obj_star": { + "_$ref": "giwj0qyr" + }, + "label_show": { + "_$ref": "ga66qx7y" + } + } + ], + "_$child": [ + { + "_$id": "618yup2k", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "1b6jo47v", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "p6q618bd", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "0jy6xmue", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "oj9ztduh", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "giwj0qyr", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "ga66qx7y", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "675ljewv", + "_$type": "Box", + "name": "Box(6)", + "x": 800, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "bw7lujyl" + }, + "obj_pie": { + "_$ref": "k7akr8y4" + }, + "sprite_pie": { + "_$ref": "92hwhmkd" + }, + "obj_mask": { + "_$ref": "ltmhc68h" + }, + "sprite_mask": { + "_$ref": "136ghuou" + }, + "obj_star": { + "_$ref": "xq7l8dv6" + }, + "label_show": { + "_$ref": "84ew9c14" + } + } + ], + "_$child": [ + { + "_$id": "bw7lujyl", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "k7akr8y4", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "92hwhmkd", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "ltmhc68h", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "136ghuou", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "xq7l8dv6", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "84ew9c14", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "gldsoaxe", + "_$type": "Box", + "name": "Box(7)", + "x": 960, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "4lgxy3ba" + }, + "obj_pie": { + "_$ref": "x4igggav" + }, + "sprite_pie": { + "_$ref": "danax8ni" + }, + "obj_mask": { + "_$ref": "csrdo2kv" + }, + "sprite_mask": { + "_$ref": "gy4sgm2e" + }, + "obj_star": { + "_$ref": "g3yn90j2" + }, + "label_show": { + "_$ref": "mk3pgmrg" + } + } + ], + "_$child": [ + { + "_$id": "4lgxy3ba", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "x4igggav", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "danax8ni", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "csrdo2kv", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "gy4sgm2e", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "g3yn90j2", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "mk3pgmrg", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "iz74ojhk", + "_$type": "HBox", + "name": "HBox(5)", + "y": 336, + "width": 1120, + "height": 84, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "3e89iyj6", + "_$type": "Box", + "name": "Box(1)", + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "v85vf7ii" + }, + "obj_pie": { + "_$ref": "j17cci0s" + }, + "sprite_pie": { + "_$ref": "n31odvfw" + }, + "obj_mask": { + "_$ref": "vlstufrx" + }, + "sprite_mask": { + "_$ref": "l35l35nj" + }, + "obj_star": { + "_$ref": "t6vwlu8f" + }, + "label_show": { + "_$ref": "uue23qee" + } + } + ], + "_$child": [ + { + "_$id": "v85vf7ii", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "j17cci0s", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "n31odvfw", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "vlstufrx", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "l35l35nj", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "t6vwlu8f", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "uue23qee", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ptomngxz", + "_$type": "Box", + "name": "Box(2)", + "x": 160, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "64dxmwdr" + }, + "obj_pie": { + "_$ref": "86mp7mkw" + }, + "sprite_pie": { + "_$ref": "mzxa1nyy" + }, + "obj_mask": { + "_$ref": "2zoakntj" + }, + "sprite_mask": { + "_$ref": "yllyqsfg" + }, + "obj_star": { + "_$ref": "hriqqrc0" + }, + "label_show": { + "_$ref": "sroccgie" + } + } + ], + "_$child": [ + { + "_$id": "64dxmwdr", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "86mp7mkw", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "mzxa1nyy", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "2zoakntj", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "yllyqsfg", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "hriqqrc0", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "sroccgie", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bsp7p5kf", + "_$type": "Box", + "name": "Box(3)", + "x": 320, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "bamgmeaw" + }, + "obj_pie": { + "_$ref": "hz7bnmfa" + }, + "sprite_pie": { + "_$ref": "duvw90gi" + }, + "obj_mask": { + "_$ref": "on1mf6mc" + }, + "sprite_mask": { + "_$ref": "6p84moep" + }, + "obj_star": { + "_$ref": "lpc4f0t5" + }, + "label_show": { + "_$ref": "470on2q1" + } + } + ], + "_$child": [ + { + "_$id": "bamgmeaw", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "hz7bnmfa", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "duvw90gi", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "on1mf6mc", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "6p84moep", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "lpc4f0t5", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "470on2q1", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "1w20l919", + "_$type": "Box", + "name": "Box(4)", + "x": 480, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "uatysfc3" + }, + "obj_pie": { + "_$ref": "j75jp22k" + }, + "sprite_pie": { + "_$ref": "489rmgzy" + }, + "obj_mask": { + "_$ref": "5tpwcp9z" + }, + "sprite_mask": { + "_$ref": "6m8eoazj" + }, + "obj_star": { + "_$ref": "yww65jam" + }, + "label_show": { + "_$ref": "osy3jnq7" + } + } + ], + "_$child": [ + { + "_$id": "uatysfc3", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "j75jp22k", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "489rmgzy", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "5tpwcp9z", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "6m8eoazj", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "yww65jam", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "osy3jnq7", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "bx80ia7l", + "_$type": "Box", + "name": "Box(5)", + "x": 640, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "0mjivcal" + }, + "obj_pie": { + "_$ref": "512gyvhq" + }, + "sprite_pie": { + "_$ref": "srlfcrct" + }, + "obj_mask": { + "_$ref": "v2m4h9xa" + }, + "sprite_mask": { + "_$ref": "bs4d8xi8" + }, + "obj_star": { + "_$ref": "x43onrfk" + }, + "label_show": { + "_$ref": "iqtmylez" + } + } + ], + "_$child": [ + { + "_$id": "0mjivcal", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "512gyvhq", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "srlfcrct", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "v2m4h9xa", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "bs4d8xi8", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "x43onrfk", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "iqtmylez", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ehfw1yhk", + "_$type": "Box", + "name": "Box(6)", + "x": 800, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "9yf3bc48" + }, + "obj_pie": { + "_$ref": "gip7u8e3" + }, + "sprite_pie": { + "_$ref": "530jyzx0" + }, + "obj_mask": { + "_$ref": "luly2nhn" + }, + "sprite_mask": { + "_$ref": "bm4m9kft" + }, + "obj_star": { + "_$ref": "l7jv2dfe" + }, + "label_show": { + "_$ref": "pul2obbf" + } + } + ], + "_$child": [ + { + "_$id": "9yf3bc48", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "gip7u8e3", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "530jyzx0", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "luly2nhn", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "bm4m9kft", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "l7jv2dfe", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "pul2obbf", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "qfc0t33v", + "_$type": "Box", + "name": "Box(7)", + "x": 960, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "2aptaf8s" + }, + "obj_pie": { + "_$ref": "3dmijzyx" + }, + "sprite_pie": { + "_$ref": "1dmmcdz9" + }, + "obj_mask": { + "_$ref": "bb3mb3bt" + }, + "sprite_mask": { + "_$ref": "i59d32pk" + }, + "obj_star": { + "_$ref": "f59n3ubh" + }, + "label_show": { + "_$ref": "x8ods7tk" + } + } + ], + "_$child": [ + { + "_$id": "2aptaf8s", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "3dmijzyx", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "1dmmcdz9", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "bb3mb3bt", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "i59d32pk", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "f59n3ubh", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "x8ods7tk", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "zw42ohbb", + "_$type": "HBox", + "name": "HBox(6)", + "y": 420, + "width": 1120, + "height": 84, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "wu2ephzy", + "_$type": "Box", + "name": "Box(1)", + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "8wq5qqqi" + }, + "obj_pie": { + "_$ref": "waf60yg2" + }, + "sprite_pie": { + "_$ref": "3itzhvzp" + }, + "obj_mask": { + "_$ref": "3g7uqrzj" + }, + "sprite_mask": { + "_$ref": "xkdnhlj1" + }, + "obj_star": { + "_$ref": "1qc79owb" + }, + "label_show": { + "_$ref": "nuvgal5i" + } + } + ], + "_$child": [ + { + "_$id": "8wq5qqqi", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "waf60yg2", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "3itzhvzp", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "3g7uqrzj", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "xkdnhlj1", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "1qc79owb", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "nuvgal5i", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "tad89xgv", + "_$type": "Box", + "name": "Box(2)", + "x": 160, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "enocmqa3" + }, + "obj_pie": { + "_$ref": "iwen3y6b" + }, + "sprite_pie": { + "_$ref": "cws3klad" + }, + "obj_mask": { + "_$ref": "vexwadoo" + }, + "sprite_mask": { + "_$ref": "d5jzd7tj" + }, + "obj_star": { + "_$ref": "8t15jkc1" + }, + "label_show": { + "_$ref": "c5y0eont" + } + } + ], + "_$child": [ + { + "_$id": "enocmqa3", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "iwen3y6b", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "cws3klad", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "vexwadoo", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "d5jzd7tj", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "8t15jkc1", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "c5y0eont", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "7gjxfpio", + "_$type": "Box", + "name": "Box(3)", + "x": 320, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "181c1rfo" + }, + "obj_pie": { + "_$ref": "ik1fe9td" + }, + "sprite_pie": { + "_$ref": "20mvdvi0" + }, + "obj_mask": { + "_$ref": "7jz9hl71" + }, + "sprite_mask": { + "_$ref": "obmal93v" + }, + "obj_star": { + "_$ref": "w9v4iwjx" + }, + "label_show": { + "_$ref": "81rc29yr" + } + } + ], + "_$child": [ + { + "_$id": "181c1rfo", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "ik1fe9td", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "20mvdvi0", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "7jz9hl71", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "obmal93v", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "w9v4iwjx", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "81rc29yr", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "00m372o2", + "_$type": "Box", + "name": "Box(4)", + "x": 480, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "4cvd5viw" + }, + "obj_pie": { + "_$ref": "yociu6cg" + }, + "sprite_pie": { + "_$ref": "1rs4uye1" + }, + "obj_mask": { + "_$ref": "933hv3pb" + }, + "sprite_mask": { + "_$ref": "0r2yumt0" + }, + "obj_star": { + "_$ref": "790zpcwc" + }, + "label_show": { + "_$ref": "w5a7lazj" + } + } + ], + "_$child": [ + { + "_$id": "4cvd5viw", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "yociu6cg", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "1rs4uye1", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "933hv3pb", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "0r2yumt0", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "790zpcwc", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "w5a7lazj", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "aivvhj2e", + "_$type": "Box", + "name": "Box(5)", + "x": 640, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "o7o1c4ey" + }, + "obj_pie": { + "_$ref": "5u50u5i3" + }, + "sprite_pie": { + "_$ref": "xewxfsaq" + }, + "obj_mask": { + "_$ref": "4s2eca6l" + }, + "sprite_mask": { + "_$ref": "vbq0e25y" + }, + "obj_star": { + "_$ref": "rcpsamba" + }, + "label_show": { + "_$ref": "4qn06t5c" + } + } + ], + "_$child": [ + { + "_$id": "o7o1c4ey", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "5u50u5i3", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "xewxfsaq", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "4s2eca6l", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "vbq0e25y", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "rcpsamba", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "4qn06t5c", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "g3of96tw", + "_$type": "Box", + "name": "Box(6)", + "x": 800, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "p7xnz1ns" + }, + "obj_pie": { + "_$ref": "kcaev8mg" + }, + "sprite_pie": { + "_$ref": "o5k9x7c8" + }, + "obj_mask": { + "_$ref": "k2gvc7ys" + }, + "sprite_mask": { + "_$ref": "nu0mwix4" + }, + "obj_star": { + "_$ref": "ys37z3tg" + }, + "label_show": { + "_$ref": "u2wkwi8v" + } + } + ], + "_$child": [ + { + "_$id": "p7xnz1ns", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "kcaev8mg", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "o5k9x7c8", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "k2gvc7ys", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "nu0mwix4", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "ys37z3tg", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "u2wkwi8v", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "ouwr74d4", + "_$type": "Box", + "name": "Box(7)", + "x": 960, + "width": 160, + "height": 84, + "_$comp": [ + { + "_$type": "04c54914-715e-4e07-8a45-770f2a2c05a6", + "scriptPath": "../src/views/dc/CalendarUnit.ts", + "year": 0, + "month": 0, + "day": 0, + "open": false, + "progress": 0, + "obj_selected": { + "_$ref": "c8w6kz82" + }, + "obj_pie": { + "_$ref": "g130nerg" + }, + "sprite_pie": { + "_$ref": "gi5qalv0" + }, + "obj_mask": { + "_$ref": "ie67620s" + }, + "sprite_mask": { + "_$ref": "tejcf1ep" + }, + "obj_star": { + "_$ref": "ac94yv4m" + }, + "label_show": { + "_$ref": "evfe36ob" + } + } + ], + "_$child": [ + { + "_$id": "c8w6kz82", + "_$type": "Image", + "name": "selected", + "x": 42, + "y": 4, + "width": 76, + "height": 76, + "centerX": 0, + "centerY": 0, + "skin": "res://322fb15d-5470-4876-a8db-3051a916dde4", + "color": "#ffffff" + }, + { + "_$id": "g130nerg", + "_$type": "Box", + "name": "pie", + "x": 80, + "y": 42, + "width": 66, + "height": 66, + "anchorX": 0.5, + "anchorY": 0.5, + "rotation": -90, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "gi5qalv0", + "_$type": "Sprite", + "name": "pie", + "width": 66, + "height": 66, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + } + ] + }, + { + "_$id": "ie67620s", + "_$type": "Box", + "name": "mask", + "x": 80, + "y": 42, + "width": 56, + "height": 56, + "anchorX": 0.5, + "anchorY": 0.5, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "_$child": [ + { + "_$id": "tejcf1ep", + "_$type": "Sprite", + "name": "mask", + "width": 56, + "height": 56, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + } + ] + }, + { + "_$id": "ac94yv4m", + "_$type": "Image", + "name": "star", + "x": 47, + "y": 9, + "width": 66, + "height": 66, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://17d69d50-f2d0-4423-b98b-965ff12806d1", + "color": "#ffffff" + }, + { + "_$id": "evfe36ob", + "_$type": "Label", + "name": "Label", + "y": 2, + "width": 160, + "height": 84, + "text": "1", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 34, + "color": "rgba(255, 255, 255, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + } + ] + }, + { + "_$id": "jlbkirel", + "_$type": "HBox", + "name": "titles", + "x": 40, + "y": 42, + "width": 1120, + "height": 30, + "top": 42, + "centerX": 0, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "61qjcgo7", + "_$type": "Label", + "name": "Label(1)", + "width": 160, + "height": 30, + "text": "SUN", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 25, + "color": "rgba(167, 171, 179, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "ek59pr53", + "_$type": "Label", + "name": "Label(2)", + "x": 160, + "width": 160, + "height": 30, + "text": "MON", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 25, + "color": "rgba(167, 171, 179, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "mva54vi9", + "_$type": "Label", + "name": "Label(3)", + "x": 320, + "width": 160, + "height": 30, + "text": "TUE", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 25, + "color": "rgba(167, 171, 179, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "p4olhazz", + "_$type": "Label", + "name": "Label(4)", + "x": 480, + "width": 160, + "height": 30, + "text": "WED", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 25, + "color": "rgba(167, 171, 179, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "sp85z7fp", + "_$type": "Label", + "name": "Label(5)", + "x": 640, + "width": 160, + "height": 30, + "text": "THU", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 25, + "color": "rgba(167, 171, 179, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "aw3lgrvt", + "_$type": "Label", + "name": "Label(6)", + "x": 800, + "width": 160, + "height": 30, + "text": "FRI", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 25, + "color": "rgba(167, 171, 179, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "u4y96lrc", + "_$type": "Label", + "name": "Label(7)", + "x": 960, + "width": 160, + "height": 30, + "text": "SAT", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 25, + "color": "rgba(167, 171, 179, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "rv945t25", + "_$type": "Box", + "name": "bottom", + "x": 64, + "y": 644, + "width": 1072, + "height": 268, + "bottom": 48, + "centerX": 0, + "_$child": [ + { + "_$id": "nca5qavb", + "_$type": "Sprite", + "name": "Sprite", + "width": 1072, + "height": 268, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 42, + "rt": 42, + "lb": 42, + "rb": 42, + "lineWidth": 1, + "fillColor": "rgba(250, 251, 253, 1)" + } + ] + }, + { + "_$id": "86x6eeht", + "_$type": "Label", + "name": "Label", + "x": 140, + "y": 21, + "width": 792, + "height": 52, + "top": 21, + "centerX": 0, + "text": "May 18,2024", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 36, + "color": "rgba(167, 171, 179, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "h3zqtx71", + "_$type": "HBox", + "name": "summary", + "x": 20, + "y": 96, + "width": 1032, + "height": 126, + "top": 96, + "centerX": 0, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "k5235d75", + "_$type": "Box", + "name": "Box(1)", + "width": 344, + "height": 126, + "_$child": [ + { + "_$id": "uzalcczu", + "_$type": "Label", + "name": "Label", + "width": 296, + "height": 60, + "top": 0, + "text": "Difficulty ", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(167, 171, 179, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "e7uzpzuf", + "_$type": "Label", + "name": "label_difficulty", + "y": 66, + "width": 296, + "height": 60, + "bottom": 0, + "text": "Medium", + "font": "res://3f79306d-f490-4a54-a4f3-26cb51d56a12", + "fontSize": 42, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "m8v62h1b", + "_$type": "Box", + "name": "Box(2)", + "x": 344, + "width": 344, + "height": 126, + "_$child": [ + { + "_$id": "2i3dx1ek", + "_$type": "Label", + "name": "Label", + "width": 296, + "height": 60, + "top": 0, + "text": "Score", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(167, 171, 179, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "c1zlbdr3", + "_$type": "Label", + "name": "label_score", + "y": 66, + "width": 296, + "height": 60, + "bottom": 0, + "text": "Medium", + "font": "res://3f79306d-f490-4a54-a4f3-26cb51d56a12", + "fontSize": 42, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "awnofuts", + "_$type": "Box", + "name": "Box(3)", + "x": 688, + "width": 344, + "height": 126, + "_$child": [ + { + "_$id": "qm0uvzdm", + "_$type": "Label", + "name": "Label", + "width": 296, + "height": 60, + "top": 0, + "text": "Time", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 30, + "color": "rgba(167, 171, 179, 1)", + "align": "center", + "valign": "middle" + }, + { + "_$id": "1eu0fpsu", + "_$type": "Label", + "name": "label_time", + "y": 66, + "width": 296, + "height": 60, + "bottom": 0, + "text": "Medium", + "font": "res://3f79306d-f490-4a54-a4f3-26cb51d56a12", + "fontSize": 42, + "color": "rgba(45, 49, 56, 1)", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "sg9xzsr3", + "_$type": "Box", + "name": "btn_play", + "x": 176, + "y": 106, + "width": 720, + "height": 120, + "bottom": 42, + "centerX": 0, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "yt7l7l6k", + "_$type": "Sprite", + "name": "sdw", + "width": 720, + "height": 120, + "alpha": 0.2, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 27, + "rt": 27, + "lb": 27, + "rb": 27, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 4, + "blur": 8, + "color": "#1d5cdc" + } + ] + }, + { + "_$id": "6wtxo5cb", + "_$type": "Sprite", + "name": "Sprite", + "width": 720, + "height": 120, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 27, + "rt": 27, + "lb": 27, + "rb": 27, + "lineWidth": 1, + "fillColor": "rgba(29, 92, 220, 1)" + } + ] + }, + { + "_$id": "gf6gyao8", + "_$type": "Label", + "name": "Label", + "x": -36, + "y": -18, + "width": 792, + "height": 156, + "centerX": 0, + "centerY": 0, + "text": "Play", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 45, + "color": "#FFFFFF", + "align": "center", + "valign": "middle" + } + ] + } + ] + }, + { + "_$id": "ooo778f6", + "_$type": "Box", + "name": "btn_left", + "x": 18, + "y": 308, + "width": 36, + "height": 72, + "_mouseState": 2, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "c58rx218", + "_$type": "Image", + "name": "Image", + "width": 48, + "height": 97, + "scaleX": 0.75, + "scaleY": 0.75, + "mouseThrough": true, + "skin": "res://535f9c82-7994-4fd9-a6b5-e7d08199cd4f", + "useSourceSize": true, + "color": "#748290" + } + ] + }, + { + "_$id": "9u1eta96", + "_$type": "Box", + "name": "btn_right", + "x": 1140, + "y": 308, + "width": 36, + "height": 72, + "_mouseState": 2, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "te6v8xqq", + "_$type": "Image", + "name": "Image", + "width": 48, + "height": 97, + "scaleX": 0.75, + "scaleY": 0.75, + "mouseThrough": true, + "skin": "res://25320e1c-b60c-45af-9122-cdc433872fa7", + "useSourceSize": true, + "color": "#748290" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/shudu/assets/resources/dc/DailyChallenge_H.lh.meta b/shudu/assets/resources/dc/DailyChallenge_H.lh.meta new file mode 100644 index 0000000..bd55cad --- /dev/null +++ b/shudu/assets/resources/dc/DailyChallenge_H.lh.meta @@ -0,0 +1,3 @@ +{ + "uuid": "30b15f50-c99e-4d83-9fa2-1cbae20e3f9f" +} \ No newline at end of file diff --git a/shudu/assets/resources/dc/TrophyClaim.lh b/shudu/assets/resources/dc/TrophyClaim.lh new file mode 100644 index 0000000..fecf2e8 --- /dev/null +++ b/shudu/assets/resources/dc/TrophyClaim.lh @@ -0,0 +1,238 @@ +{ + "_$ver": 1, + "_$id": "6l8gfnd1", + "_$type": "Box", + "name": "TrophyClaim", + "width": 1080, + "height": 1920, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "_$comp": [ + { + "_$type": "0550b681-b602-49fe-900f-e30866ce922c", + "scriptPath": "../src/views/dc/TrophyClaim.ts", + "icon": { + "_$ref": "ta6ji66s" + }, + "label_date": { + "_$ref": "a0u7wsik" + }, + "btn_close": { + "_$ref": "qgwt28k7" + } + } + ], + "_$child": [ + { + "_$id": "l3kqo0ly", + "_$type": "Image", + "name": "Image", + "width": 1080, + "height": 1920, + "alpha": 0.8, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "skin": "res://a98f334e-ce04-4cd0-8fc5-bbdf9b048609", + "color": "#000000" + }, + { + "_$id": "21y8h6ei", + "_$type": "Box", + "name": "center", + "x": 540, + "y": 804, + "width": 1080, + "height": 1080, + "anchorX": 0.5, + "anchorY": 0.5, + "centerX": 0, + "centerY": -156, + "_$child": [ + { + "_$id": "vngawy58", + "_$type": "Image", + "name": "light", + "x": 540, + "y": 540, + "width": 1080, + "height": 1080, + "anchorX": 0.5, + "anchorY": 0.5, + "centerX": 0, + "centerY": 0, + "skin": "res://0403c03d-0fbb-4930-8cf7-c4bf0f4d45b9", + "useSourceSize": true, + "color": "#ffffff", + "_$comp": [ + { + "_$type": "b4f67ca3-86fe-409d-a439-63a715243fb7", + "scriptPath": "../src/views/common/AutoRotate.ts", + "speed": 1 + } + ] + }, + { + "_$id": "ta6ji66s", + "_$type": "Image", + "name": "trophy", + "x": 123, + "y": 123, + "width": 834, + "height": 834, + "centerX": 0, + "centerY": 0, + "skin": "res://09690a9b-3d5a-4da1-b457-1a3275cf5c14", + "color": "#ffffff", + "_$child": [ + { + "_$id": "r4520d40", + "_$type": "Image", + "name": "blossom", + "width": 834, + "height": 834, + "centerX": 0, + "centerY": 0, + "skin": "res://449a140e-576e-4a52-ace4-f2695351f489", + "color": "#ffffff", + "_$comp": [ + { + "_$type": "ca60d5cb-d801-434b-9e6a-7b0c738cb0e9", + "scriptPath": "../src/views/common/UISequenceAnimation.ts", + "prefix": "sequences/lottie_blossom_light/lottie_blossom_light_00", + "beginIndex": 1, + "endIndex": 23, + "playOnAwake": false, + "loop": false + } + ] + } + ] + }, + { + "_$id": "qgwt28k7", + "_$type": "Box", + "name": "btn_close", + "x": 180, + "y": 1140, + "width": 720, + "height": 156, + "bottom": -216, + "centerX": 0, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "usqlzuu7", + "_$type": "Sprite", + "name": "sdw", + "width": 720, + "height": 156, + "alpha": 0.08, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 4, + "blur": 8, + "color": "#000" + } + ] + }, + { + "_$id": "y8abda90", + "_$type": "Sprite", + "name": "Sprite", + "width": 720, + "height": 156, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + }, + { + "_$id": "6v9udrtu", + "_$type": "Label", + "name": "label", + "x": -90, + "y": 28, + "width": 900, + "height": 100, + "centerX": 0, + "centerY": 0, + "text": "Claim", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 60, + "color": "rgba(29, 92, 220, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "0eaixmbm", + "_$type": "Label", + "name": "label_titlle", + "x": 90, + "y": -10, + "width": 900, + "height": 100, + "top": -10, + "centerX": 0, + "text": "Congratulations!", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 84, + "color": "#FFFFFF", + "align": "center", + "valign": "middle" + }, + { + "_$id": "a0u7wsik", + "_$type": "Label", + "name": "label_date", + "x": 90, + "y": 1010, + "width": 900, + "height": 60, + "alpha": 0.8, + "bottom": 10, + "centerX": 0, + "text": "Sep 11, 2024", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 60, + "color": "#FFFFFF", + "align": "center", + "valign": "middle" + } + ] + } + ] +} \ No newline at end of file diff --git a/shudu/assets/resources/dc/TrophyClaim.lh.meta b/shudu/assets/resources/dc/TrophyClaim.lh.meta new file mode 100644 index 0000000..8b09306 --- /dev/null +++ b/shudu/assets/resources/dc/TrophyClaim.lh.meta @@ -0,0 +1,3 @@ +{ + "uuid": "b12ed6b6-072b-4dd9-ab6f-c544692a6422" +} \ No newline at end of file diff --git a/shudu/assets/resources/dc/TrophyClaim_H.lh b/shudu/assets/resources/dc/TrophyClaim_H.lh new file mode 100644 index 0000000..ffc4c63 --- /dev/null +++ b/shudu/assets/resources/dc/TrophyClaim_H.lh @@ -0,0 +1,237 @@ +{ + "_$ver": 1, + "_$id": "3bnkaod1", + "_$type": "Box", + "name": "TrophyClaim_H", + "width": 1080, + "height": 1920, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "_$comp": [ + { + "_$type": "0550b681-b602-49fe-900f-e30866ce922c", + "scriptPath": "../src/views/dc/TrophyClaim.ts", + "icon": { + "_$ref": "wiyybdn9" + }, + "label_date": { + "_$ref": "hyd2a58t" + }, + "btn_close": { + "_$ref": "kv3go1zz" + } + } + ], + "_$child": [ + { + "_$id": "tlgrkg4b", + "_$type": "Image", + "name": "Image", + "width": 1080, + "height": 1920, + "alpha": 0.8, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "skin": "res://a98f334e-ce04-4cd0-8fc5-bbdf9b048609", + "color": "#000000" + }, + { + "_$id": "74q7qe1w", + "_$type": "Box", + "name": "center", + "x": 540, + "y": 842, + "width": 960, + "height": 960, + "anchorX": 0.5, + "anchorY": 0.5, + "centerX": 0, + "centerY": -118, + "_$child": [ + { + "_$id": "ojntqbg3", + "_$type": "Image", + "name": "light", + "x": 480, + "y": 480, + "width": 900, + "height": 900, + "anchorX": 0.5, + "anchorY": 0.5, + "centerX": 0, + "centerY": 0, + "skin": "res://0403c03d-0fbb-4930-8cf7-c4bf0f4d45b9", + "color": "#ffffff", + "_$comp": [ + { + "_$type": "b4f67ca3-86fe-409d-a439-63a715243fb7", + "scriptPath": "../src/views/common/AutoRotate.ts", + "speed": 1 + } + ] + }, + { + "_$id": "wiyybdn9", + "_$type": "Image", + "name": "trophy", + "x": 180, + "y": 180, + "width": 600, + "height": 600, + "centerX": 0, + "centerY": 0, + "skin": "res://07b90718-84ee-4924-9098-8f0ee3663d92", + "color": "#ffffff", + "_$child": [ + { + "_$id": "8lyea11m", + "_$type": "Image", + "name": "blossom", + "width": 600, + "height": 600, + "centerX": 0, + "centerY": 0, + "skin": "res://449a140e-576e-4a52-ace4-f2695351f489", + "color": "#ffffff", + "_$comp": [ + { + "_$type": "ca60d5cb-d801-434b-9e6a-7b0c738cb0e9", + "scriptPath": "../src/views/common/UISequenceAnimation.ts", + "prefix": "sequences/lottie_blossom_light/lottie_blossom_light_00", + "beginIndex": 1, + "endIndex": 23, + "playOnAwake": false, + "loop": false + } + ] + } + ] + }, + { + "_$id": "kv3go1zz", + "_$type": "Box", + "name": "btn_close", + "x": 180, + "y": 964, + "width": 600, + "height": 132, + "bottom": -136, + "centerX": 0, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "hht1xq5z", + "_$type": "Sprite", + "name": "sdw", + "width": 600, + "height": 132, + "alpha": 0.08, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ], + "_filters": [ + { + "_$type": "GlowFilter", + "offX": 0, + "offY": 4, + "blur": 8, + "color": "#000" + } + ] + }, + { + "_$id": "qg7a7ikf", + "_$type": "Sprite", + "name": "Sprite", + "width": 600, + "height": 132, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawRoundRectCmd", + "lt": 36, + "rt": 36, + "lb": 36, + "rb": 36, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + }, + { + "_$id": "ffs77u7p", + "_$type": "Label", + "name": "label", + "x": -150, + "y": 16, + "width": 900, + "height": 100, + "centerX": 0, + "centerY": 0, + "text": "Claim", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 54, + "color": "rgba(29, 92, 220, 1)", + "align": "center", + "valign": "middle" + } + ] + }, + { + "_$id": "z5u831v7", + "_$type": "Label", + "name": "label_titlle", + "x": 30, + "y": 114, + "width": 900, + "height": 100, + "top": 114, + "centerX": 0, + "text": "Congratulations!", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 84, + "color": "#FFFFFF", + "align": "center", + "valign": "middle" + }, + { + "_$id": "hyd2a58t", + "_$type": "Label", + "name": "label_date", + "x": 30, + "y": 843, + "width": 900, + "height": 60, + "alpha": 0.8, + "bottom": 57, + "centerX": 0, + "text": "Sep 11, 2024", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 54, + "color": "#FFFFFF", + "align": "center", + "valign": "middle" + } + ] + } + ] +} \ No newline at end of file diff --git a/shudu/assets/resources/dc/TrophyClaim_H.lh.meta b/shudu/assets/resources/dc/TrophyClaim_H.lh.meta new file mode 100644 index 0000000..6c25e6a --- /dev/null +++ b/shudu/assets/resources/dc/TrophyClaim_H.lh.meta @@ -0,0 +1,3 @@ +{ + "uuid": "5d5007fd-682d-40c1-9034-a5be4ab98ee2" +} \ No newline at end of file diff --git a/shudu/assets/resources/dc/TrophyRoom.lh b/shudu/assets/resources/dc/TrophyRoom.lh new file mode 100644 index 0000000..8acd57a --- /dev/null +++ b/shudu/assets/resources/dc/TrophyRoom.lh @@ -0,0 +1,150 @@ +{ + "_$ver": 1, + "_$id": "scvd34ii", + "_$type": "Box", + "name": "TrophyRoom", + "width": 1080, + "height": 1920, + "_mouseState": 2, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "_$comp": [ + { + "_$type": "554595b0-0dd8-4e4b-8073-8d775219659c", + "scriptPath": "../src/views/dc/TrophyRoom.ts", + "btn_back": { + "_$ref": "z1p4zsvs" + }, + "obj_items": { + "_$ref": "k3gvjlus" + } + } + ], + "_$child": [ + { + "_$id": "esbit3pc", + "_$type": "Image", + "name": "Image", + "width": 1080, + "height": 1920, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "skin": "res://a98f334e-ce04-4cd0-8fc5-bbdf9b048609", + "color": "#f5f7fb" + }, + { + "_$id": "z1p4zsvs", + "_$type": "Box", + "name": "btn_back", + "x": 45, + "y": 78, + "width": 70, + "height": 48, + "_mouseState": 2, + "centerX": -460, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "12tz34f8", + "_$type": "Button", + "name": "button", + "width": 70, + "height": 48, + "_mouseState": 2, + "mouseThrough": true, + "stateNum": 1, + "skin": "res://06a9c4a8-d664-4f3a-9c35-25b610195ced", + "label": "", + "labelSize": 20, + "labelAlign": "center", + "labelVAlign": "middle" + }, + { + "_$id": "nyfbewpo", + "_$type": "Label", + "name": "label_title", + "x": 92, + "y": -6, + "width": 500, + "height": 60, + "centerY": 0, + "text": "Trophy Room", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 54, + "color": "rgba(45, 49, 56, 1)", + "bold": true, + "valign": "middle", + "padding": "0,0,0,0" + } + ] + }, + { + "_$id": "8jansi3q", + "_$type": "Panel", + "name": "Panel", + "x": 48, + "y": 200, + "width": 984, + "height": 1720, + "_mouseState": 2, + "top": 200, + "bottom": 0, + "centerX": 0, + "scrollType": 2, + "_$child": [ + { + "_$id": "k3gvjlus", + "_$type": "VBox", + "name": "items", + "width": 984, + "height": 2000, + "space": 40, + "align": "center", + "_$child": [ + { + "_$id": "g7t27k1h", + "_$prefab": "ef797791-e197-4854-bf49-347fe92999f4", + "name": "TrophyRoomYear", + "active": true, + "x": 0, + "y": 0, + "visible": true, + "_$child": [ + { + "_$override": "i7ttmqwh", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376" + }, + { + "_$override": [ + "qn7hlno1", + "2bldvkij" + ], + "font": "res://3f79306d-f490-4a54-a4f3-26cb51d56a12" + }, + { + "_$override": [ + "qn7hlno1", + "5wwqja5x" + ], + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "name": "label_month", + "bold": false + } + ] + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/shudu/assets/resources/dc/TrophyRoom.lh.meta b/shudu/assets/resources/dc/TrophyRoom.lh.meta new file mode 100644 index 0000000..0b086e1 --- /dev/null +++ b/shudu/assets/resources/dc/TrophyRoom.lh.meta @@ -0,0 +1,3 @@ +{ + "uuid": "138e36b2-3fd0-4e8b-9fb8-1140477a4254" +} \ No newline at end of file diff --git a/shudu/assets/resources/dc/TrophyRoomCell.lh b/shudu/assets/resources/dc/TrophyRoomCell.lh new file mode 100644 index 0000000..1a8dca3 --- /dev/null +++ b/shudu/assets/resources/dc/TrophyRoomCell.lh @@ -0,0 +1,313 @@ +{ + "_$ver": 1, + "_$id": "42qxmdwy", + "_$type": "VBox", + "name": "TrophyRoomCell", + "y": 120, + "width": 984, + "height": 444, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "od2un0s9", + "_$type": "HBox", + "name": "HBox", + "width": 984, + "height": 288, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "t4qzx693", + "_$type": "Box", + "name": "Box(1)", + "width": 328, + "height": 288, + "_$comp": [ + { + "_$type": "79064920-30a6-4b11-a82e-bbdd4112c4e1", + "scriptPath": "../src/views/dc/TrophyUnit.ts", + "bg_light": { + "_$ref": "rnanoiet" + }, + "icon": { + "_$ref": "cnlfb8yz" + }, + "label_count": { + "_$ref": "2bldvkij" + }, + "label_month": { + "_$ref": "5wwqja5x" + } + } + ], + "_$child": [ + { + "_$id": "rnanoiet", + "_$type": "Image", + "name": "bg_light", + "x": 20, + "width": 288, + "height": 288, + "centerX": 0, + "skin": "res://d0c3b007-6036-460a-b23d-09d6f2492886", + "color": "#ffffff" + }, + { + "_$id": "cnlfb8yz", + "_$type": "Image", + "name": "icon", + "x": 20, + "width": 288, + "height": 288, + "centerX": 0, + "skin": "res://7d235ac1-6755-4409-ab86-23aaf41e1537", + "color": "#ffffff" + }, + { + "_$id": "2bldvkij", + "_$type": "Label", + "name": "label_count", + "x": 128, + "y": 236, + "width": 72, + "height": 20, + "centerX": 0, + "text": "03/20", + "font": "res://3f79306d-f490-4a54-a4f3-26cb51d56a12", + "fontSize": 24, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "align": "center", + "valign": "middle", + "padding": "0,0,0,0" + }, + { + "_$id": "5wwqja5x", + "_$type": "Label", + "name": "label_month", + "y": 334, + "width": 328, + "height": 60, + "bottom": -106, + "centerX": 0, + "text": "Otc", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 42, + "color": "rgba(167, 171, 179, 1)", + "align": "center", + "valign": "middle", + "padding": "0,0,0,0" + } + ] + }, + { + "_$id": "xso1lzf0", + "_$type": "Box", + "name": "Box(2)", + "x": 328, + "width": 328, + "height": 288, + "_$comp": [ + { + "_$type": "79064920-30a6-4b11-a82e-bbdd4112c4e1", + "scriptPath": "../src/views/dc/TrophyUnit.ts", + "bg_light": { + "_$ref": "75nohylj" + }, + "icon": { + "_$ref": "ce7r8no5" + }, + "label_count": { + "_$ref": "le0vwn6w" + }, + "label_month": { + "_$ref": "bnpog6lc" + } + } + ], + "_$child": [ + { + "_$id": "75nohylj", + "_$type": "Image", + "name": "bg_light", + "x": 20, + "width": 288, + "height": 288, + "centerX": 0, + "skin": "res://d0c3b007-6036-460a-b23d-09d6f2492886", + "color": "#ffffff" + }, + { + "_$id": "ce7r8no5", + "_$type": "Image", + "name": "icon", + "x": 20, + "width": 288, + "height": 288, + "centerX": 0, + "skin": "res://7d235ac1-6755-4409-ab86-23aaf41e1537", + "color": "#ffffff" + }, + { + "_$id": "le0vwn6w", + "_$type": "Label", + "name": "label_count", + "x": 128, + "y": 236, + "width": 72, + "height": 20, + "centerX": 0, + "text": "03/20", + "font": "res://3f79306d-f490-4a54-a4f3-26cb51d56a12", + "fontSize": 24, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "align": "center", + "valign": "middle", + "padding": "0,0,0,0" + }, + { + "_$id": "bnpog6lc", + "_$type": "Label", + "name": "label_month", + "y": 334, + "width": 328, + "height": 60, + "bottom": -106, + "centerX": 0, + "text": "Otc", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 42, + "color": "rgba(167, 171, 179, 1)", + "align": "center", + "valign": "middle", + "padding": "0,0,0,0" + } + ] + }, + { + "_$id": "jbiw06ix", + "_$type": "Box", + "name": "Box(3)", + "x": 656, + "width": 328, + "height": 288, + "_$comp": [ + { + "_$type": "79064920-30a6-4b11-a82e-bbdd4112c4e1", + "scriptPath": "../src/views/dc/TrophyUnit.ts", + "bg_light": { + "_$ref": "11wtb0ek" + }, + "icon": { + "_$ref": "nnwdfgj9" + }, + "label_count": { + "_$ref": "srlebn7e" + }, + "label_month": { + "_$ref": "zhocoqdd" + } + } + ], + "_$child": [ + { + "_$id": "11wtb0ek", + "_$type": "Image", + "name": "bg_light", + "x": 20, + "width": 288, + "height": 288, + "centerX": 0, + "skin": "res://d0c3b007-6036-460a-b23d-09d6f2492886", + "color": "#ffffff" + }, + { + "_$id": "nnwdfgj9", + "_$type": "Image", + "name": "icon", + "x": 20, + "width": 288, + "height": 288, + "centerX": 0, + "skin": "res://7d235ac1-6755-4409-ab86-23aaf41e1537", + "color": "#ffffff" + }, + { + "_$id": "srlebn7e", + "_$type": "Label", + "name": "label_count", + "x": 128, + "y": 236, + "width": 72, + "height": 20, + "centerX": 0, + "text": "03/20", + "font": "res://3f79306d-f490-4a54-a4f3-26cb51d56a12", + "fontSize": 24, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "align": "center", + "valign": "middle", + "padding": "0,0,0,0" + }, + { + "_$id": "zhocoqdd", + "_$type": "Label", + "name": "label_month", + "y": 334, + "width": 328, + "height": 60, + "bottom": -106, + "centerX": 0, + "text": "Otc", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 42, + "color": "rgba(167, 171, 179, 1)", + "align": "center", + "valign": "middle", + "padding": "0,0,0,0" + } + ] + } + ] + }, + { + "_$id": "8354nuxx", + "_$type": "Image", + "name": "White", + "x": 378, + "y": 288, + "width": 228, + "height": 60, + "centerX": 0, + "skin": "res://5f574ee6-46ee-4c31-b0ec-95c5731e6102", + "color": "#ffffff", + "_$child": [ + { + "_$id": "uoqz04df", + "_$type": "Image", + "name": "White_left", + "x": -366, + "width": 366, + "height": 60, + "skin": "res://f4fc5788-06e1-422c-876d-36b204a1f067", + "color": "#ffffff" + }, + { + "_$id": "zsx33kbx", + "_$type": "Image", + "name": "White_right", + "x": 228, + "width": 366, + "height": 60, + "skin": "res://dc59dea2-ef06-43dd-898f-01d253952f0c", + "useSourceSize": true, + "color": "#ffffff" + } + ] + } + ] +} \ No newline at end of file diff --git a/shudu/assets/resources/dc/TrophyRoomCell.lh.meta b/shudu/assets/resources/dc/TrophyRoomCell.lh.meta new file mode 100644 index 0000000..cd31b24 --- /dev/null +++ b/shudu/assets/resources/dc/TrophyRoomCell.lh.meta @@ -0,0 +1,3 @@ +{ + "uuid": "770e3b0c-7e51-4656-9a08-46992057f0a2" +} \ No newline at end of file diff --git a/shudu/assets/resources/dc/TrophyRoomCell_H.lh b/shudu/assets/resources/dc/TrophyRoomCell_H.lh new file mode 100644 index 0000000..7be14c0 --- /dev/null +++ b/shudu/assets/resources/dc/TrophyRoomCell_H.lh @@ -0,0 +1,481 @@ +{ + "_$ver": 1, + "_$id": "sg1sait6", + "_$type": "VBox", + "name": "TrophyRoomCell_H", + "y": 120, + "width": 1830, + "height": 444, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "36rgnwax", + "_$type": "HBox", + "name": "HBox", + "width": 1830, + "height": 288, + "space": 0, + "align": "middle", + "_$child": [ + { + "_$id": "gqndp8er", + "_$type": "Box", + "name": "Box(1)", + "width": 366, + "height": 288, + "_$comp": [ + { + "_$type": "79064920-30a6-4b11-a82e-bbdd4112c4e1", + "scriptPath": "../src/views/dc/TrophyUnit.ts", + "bg_light": { + "_$ref": "3ix5pi11" + }, + "icon": { + "_$ref": "bhpotbn8" + }, + "label_count": { + "_$ref": "vuyujnwb" + }, + "label_month": { + "_$ref": "ybx61p0y" + } + } + ], + "_$child": [ + { + "_$id": "3ix5pi11", + "_$type": "Image", + "name": "bg_light", + "x": 39, + "width": 288, + "height": 288, + "centerX": 0, + "skin": "res://d0c3b007-6036-460a-b23d-09d6f2492886", + "color": "#ffffff" + }, + { + "_$id": "bhpotbn8", + "_$type": "Image", + "name": "icon", + "x": 39, + "width": 288, + "height": 288, + "centerX": 0, + "skin": "res://88000a03-190e-42f2-aeee-794a20baf8e5", + "color": "#ffffff" + }, + { + "_$id": "vuyujnwb", + "_$type": "Label", + "name": "label_count", + "x": 147, + "y": 236, + "width": 72, + "height": 20, + "centerX": 0, + "text": "03/20", + "font": "res://3f79306d-f490-4a54-a4f3-26cb51d56a12", + "fontSize": 24, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "align": "center", + "valign": "middle", + "padding": "0,0,0,0" + }, + { + "_$id": "ybx61p0y", + "_$type": "Label", + "name": "label_month", + "y": 334, + "width": 366, + "height": 60, + "bottom": -106, + "centerX": 0, + "text": "Otc", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 42, + "color": "rgba(167, 171, 179, 1)", + "align": "center", + "valign": "middle", + "padding": "0,0,0,0" + } + ] + }, + { + "_$id": "k6mbjpe4", + "_$type": "Box", + "name": "Box(2)", + "x": 366, + "width": 366, + "height": 288, + "_$comp": [ + { + "_$type": "79064920-30a6-4b11-a82e-bbdd4112c4e1", + "scriptPath": "../src/views/dc/TrophyUnit.ts", + "bg_light": { + "_$ref": "1bsh8vm3" + }, + "icon": { + "_$ref": "mctcd6ue" + }, + "label_count": { + "_$ref": "010qceqs" + }, + "label_month": { + "_$ref": "bt49gp8h" + } + } + ], + "_$child": [ + { + "_$id": "1bsh8vm3", + "_$type": "Image", + "name": "bg_light", + "x": 39, + "width": 288, + "height": 288, + "centerX": 0, + "skin": "res://d0c3b007-6036-460a-b23d-09d6f2492886", + "color": "#ffffff" + }, + { + "_$id": "mctcd6ue", + "_$type": "Image", + "name": "icon", + "x": 39, + "width": 288, + "height": 288, + "centerX": 0, + "skin": "res://88000a03-190e-42f2-aeee-794a20baf8e5", + "color": "#ffffff" + }, + { + "_$id": "010qceqs", + "_$type": "Label", + "name": "label_count", + "x": 147, + "y": 236, + "width": 72, + "height": 20, + "centerX": 0, + "text": "03/20", + "font": "res://3f79306d-f490-4a54-a4f3-26cb51d56a12", + "fontSize": 24, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "align": "center", + "valign": "middle", + "padding": "0,0,0,0" + }, + { + "_$id": "bt49gp8h", + "_$type": "Label", + "name": "label_month", + "y": 334, + "width": 366, + "height": 60, + "bottom": -106, + "centerX": 0, + "text": "Otc", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 42, + "color": "rgba(167, 171, 179, 1)", + "align": "center", + "valign": "middle", + "padding": "0,0,0,0" + } + ] + }, + { + "_$id": "fzbtp8vl", + "_$type": "Box", + "name": "Box(3)", + "x": 732, + "width": 366, + "height": 288, + "_$comp": [ + { + "_$type": "79064920-30a6-4b11-a82e-bbdd4112c4e1", + "scriptPath": "../src/views/dc/TrophyUnit.ts", + "bg_light": { + "_$ref": "2i7tbzdf" + }, + "icon": { + "_$ref": "b8sqg40w" + }, + "label_count": { + "_$ref": "rfs8l0ru" + }, + "label_month": { + "_$ref": "2w6re2eq" + } + } + ], + "_$child": [ + { + "_$id": "2i7tbzdf", + "_$type": "Image", + "name": "bg_light", + "x": 39, + "width": 288, + "height": 288, + "centerX": 0, + "skin": "res://d0c3b007-6036-460a-b23d-09d6f2492886", + "color": "#ffffff" + }, + { + "_$id": "b8sqg40w", + "_$type": "Image", + "name": "icon", + "x": 39, + "width": 288, + "height": 288, + "centerX": 0, + "skin": "res://88000a03-190e-42f2-aeee-794a20baf8e5", + "color": "#ffffff" + }, + { + "_$id": "rfs8l0ru", + "_$type": "Label", + "name": "label_count", + "x": 147, + "y": 236, + "width": 72, + "height": 20, + "centerX": 0, + "text": "03/20", + "font": "res://3f79306d-f490-4a54-a4f3-26cb51d56a12", + "fontSize": 24, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "align": "center", + "valign": "middle", + "padding": "0,0,0,0" + }, + { + "_$id": "2w6re2eq", + "_$type": "Label", + "name": "label_month", + "y": 334, + "width": 366, + "height": 60, + "bottom": -106, + "centerX": 0, + "text": "Otc", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 42, + "color": "rgba(167, 171, 179, 1)", + "align": "center", + "valign": "middle", + "padding": "0,0,0,0" + } + ] + }, + { + "_$id": "ofbdoc5t", + "_$type": "Box", + "name": "Box(4)", + "x": 1098, + "width": 366, + "height": 288, + "_$comp": [ + { + "_$type": "79064920-30a6-4b11-a82e-bbdd4112c4e1", + "scriptPath": "../src/views/dc/TrophyUnit.ts", + "bg_light": { + "_$ref": "spymtggz" + }, + "icon": { + "_$ref": "beklhbah" + }, + "label_count": { + "_$ref": "u8y8zty8" + }, + "label_month": { + "_$ref": "fsnfm2mw" + } + } + ], + "_$child": [ + { + "_$id": "spymtggz", + "_$type": "Image", + "name": "bg_light", + "x": 39, + "width": 288, + "height": 288, + "centerX": 0, + "skin": "res://d0c3b007-6036-460a-b23d-09d6f2492886", + "color": "#ffffff" + }, + { + "_$id": "beklhbah", + "_$type": "Image", + "name": "icon", + "x": 39, + "width": 288, + "height": 288, + "centerX": 0, + "skin": "res://88000a03-190e-42f2-aeee-794a20baf8e5", + "color": "#ffffff" + }, + { + "_$id": "u8y8zty8", + "_$type": "Label", + "name": "label_count", + "x": 147, + "y": 236, + "width": 72, + "height": 20, + "centerX": 0, + "text": "03/20", + "font": "res://3f79306d-f490-4a54-a4f3-26cb51d56a12", + "fontSize": 24, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "align": "center", + "valign": "middle", + "padding": "0,0,0,0" + }, + { + "_$id": "fsnfm2mw", + "_$type": "Label", + "name": "label_month", + "y": 334, + "width": 366, + "height": 60, + "bottom": -106, + "centerX": 0, + "text": "Otc", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 42, + "color": "rgba(167, 171, 179, 1)", + "align": "center", + "valign": "middle", + "padding": "0,0,0,0" + } + ] + }, + { + "_$id": "9hidss96", + "_$type": "Box", + "name": "Box(5)", + "x": 1464, + "width": 366, + "height": 288, + "_$comp": [ + { + "_$type": "79064920-30a6-4b11-a82e-bbdd4112c4e1", + "scriptPath": "../src/views/dc/TrophyUnit.ts", + "bg_light": { + "_$ref": "007rz3wj" + }, + "icon": { + "_$ref": "iqjixqkn" + }, + "label_count": { + "_$ref": "akdela9o" + }, + "label_month": { + "_$ref": "e7u9f23e" + } + } + ], + "_$child": [ + { + "_$id": "007rz3wj", + "_$type": "Image", + "name": "bg_light", + "x": 39, + "width": 288, + "height": 288, + "centerX": 0, + "skin": "res://d0c3b007-6036-460a-b23d-09d6f2492886", + "color": "#ffffff" + }, + { + "_$id": "iqjixqkn", + "_$type": "Image", + "name": "icon", + "x": 39, + "width": 288, + "height": 288, + "centerX": 0, + "skin": "res://88000a03-190e-42f2-aeee-794a20baf8e5", + "color": "#ffffff" + }, + { + "_$id": "akdela9o", + "_$type": "Label", + "name": "label_count", + "x": 147, + "y": 236, + "width": 72, + "height": 20, + "centerX": 0, + "text": "03/20", + "font": "res://3f79306d-f490-4a54-a4f3-26cb51d56a12", + "fontSize": 24, + "color": "rgba(0, 0, 0, 1)", + "bold": true, + "align": "center", + "valign": "middle", + "padding": "0,0,0,0" + }, + { + "_$id": "e7u9f23e", + "_$type": "Label", + "name": "label_month", + "y": 334, + "width": 366, + "height": 60, + "bottom": -106, + "centerX": 0, + "text": "Otc", + "font": "res://83c7971a-e73f-40ba-92a8-7d6fccac0958", + "fontSize": 42, + "color": "rgba(167, 171, 179, 1)", + "align": "center", + "valign": "middle", + "padding": "0,0,0,0" + } + ] + } + ] + }, + { + "_$id": "d2khpcxf", + "_$type": "Image", + "name": "White", + "x": 366, + "y": 288, + "width": 1098, + "height": 60, + "skin": "res://5f574ee6-46ee-4c31-b0ec-95c5731e6102", + "color": "#ffffff", + "_$child": [ + { + "_$id": "psz5ovz4", + "_$type": "Image", + "name": "White_left", + "x": -366, + "width": 366, + "height": 60, + "skin": "res://f4fc5788-06e1-422c-876d-36b204a1f067", + "color": "#ffffff" + }, + { + "_$id": "p9bzjd1z", + "_$type": "Image", + "name": "White_right", + "x": 1098, + "width": 366, + "height": 60, + "skin": "res://dc59dea2-ef06-43dd-898f-01d253952f0c", + "color": "#ffffff" + } + ] + } + ] +} \ No newline at end of file diff --git a/shudu/assets/resources/dc/TrophyRoomCell_H.lh.meta b/shudu/assets/resources/dc/TrophyRoomCell_H.lh.meta new file mode 100644 index 0000000..fc97440 --- /dev/null +++ b/shudu/assets/resources/dc/TrophyRoomCell_H.lh.meta @@ -0,0 +1,3 @@ +{ + "uuid": "d8ad3382-304a-46b3-85bc-91bd44ec5b5c" +} \ No newline at end of file diff --git a/shudu/assets/resources/dc/TrophyRoomYear.lh b/shudu/assets/resources/dc/TrophyRoomYear.lh new file mode 100644 index 0000000..2dff427 --- /dev/null +++ b/shudu/assets/resources/dc/TrophyRoomYear.lh @@ -0,0 +1,64 @@ +{ + "_$ver": 1, + "_$id": "0cxaz0lv", + "_$type": "VBox", + "name": "TrophyRoomYear", + "width": 984, + "height": 564, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "kq3dv2lv", + "_$type": "Box", + "name": "year", + "width": 984, + "height": 120, + "_$child": [ + { + "_$id": "t2jfk9je", + "_$type": "Image", + "name": "White_year", + "y": 24, + "width": 984, + "height": 72, + "skin": "res://970e3101-839f-40ec-b888-894ef1981bc3", + "useSourceSize": true, + "color": "#ffffff" + }, + { + "_$id": "i7ttmqwh", + "_$type": "Label", + "name": "Label", + "y": 24, + "width": 984, + "height": 72, + "centerX": 0, + "centerY": 0, + "text": "2025", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 48, + "color": "rgba(84, 89, 98, 1)", + "align": "center", + "valign": "middle", + "padding": "0,0,0,0" + } + ] + }, + { + "_$id": "qn7hlno1", + "_$prefab": "770e3b0c-7e51-4656-9a08-46992057f0a2", + "name": "TrophyRoomCell", + "active": true, + "x": 0, + "y": 120, + "visible": true, + "_$child": [ + { + "_$override": "cnlfb8yz", + "skin": "res://07b90718-84ee-4924-9098-8f0ee3663d92" + } + ] + } + ] +} \ No newline at end of file diff --git a/shudu/assets/resources/dc/TrophyRoomYear.lh.meta b/shudu/assets/resources/dc/TrophyRoomYear.lh.meta new file mode 100644 index 0000000..df5fbcb --- /dev/null +++ b/shudu/assets/resources/dc/TrophyRoomYear.lh.meta @@ -0,0 +1,3 @@ +{ + "uuid": "ef797791-e197-4854-bf49-347fe92999f4" +} \ No newline at end of file diff --git a/shudu/assets/resources/dc/TrophyRoomYear_H.lh b/shudu/assets/resources/dc/TrophyRoomYear_H.lh new file mode 100644 index 0000000..7ee0345 --- /dev/null +++ b/shudu/assets/resources/dc/TrophyRoomYear_H.lh @@ -0,0 +1,64 @@ +{ + "_$ver": 1, + "_$id": "v478ofey", + "_$type": "VBox", + "name": "TrophyRoomYear_H", + "width": 1830, + "height": 564, + "space": 0, + "align": "center", + "_$child": [ + { + "_$id": "uncmfzuo", + "_$type": "Box", + "name": "year", + "width": 1830, + "height": 120, + "_$child": [ + { + "_$id": "2sw7meiy", + "_$type": "Image", + "name": "White_year", + "y": 24, + "width": 1830, + "height": 72, + "skin": "res://970e3101-839f-40ec-b888-894ef1981bc3", + "color": "#ffffff" + }, + { + "_$id": "lskpm66b", + "_$type": "Label", + "name": "Label", + "x": 423, + "y": 24, + "width": 984, + "height": 72, + "centerX": 0, + "centerY": 0, + "text": "2025", + "font": "res://5f760925-14a8-4e61-b8c4-d19c523e7376", + "fontSize": 48, + "color": "rgba(84, 89, 98, 1)", + "align": "center", + "valign": "middle", + "padding": "0,0,0,0" + } + ] + }, + { + "_$id": "mbue9iyc", + "_$prefab": "d8ad3382-304a-46b3-85bc-91bd44ec5b5c", + "name": "TrophyRoomCell_H", + "active": true, + "x": 0, + "y": 120, + "visible": true, + "_$child": [ + { + "_$override": "bhpotbn8", + "skin": "res://07b90718-84ee-4924-9098-8f0ee3663d92" + } + ] + } + ] +} \ No newline at end of file diff --git a/shudu/assets/resources/dc/TrophyRoomYear_H.lh.meta b/shudu/assets/resources/dc/TrophyRoomYear_H.lh.meta new file mode 100644 index 0000000..ffad807 --- /dev/null +++ b/shudu/assets/resources/dc/TrophyRoomYear_H.lh.meta @@ -0,0 +1,3 @@ +{ + "uuid": "c1b8084e-7edd-4519-9680-5deaab191d1d" +} \ No newline at end of file diff --git a/shudu/assets/resources/dc/TrophyRoom_H.lh b/shudu/assets/resources/dc/TrophyRoom_H.lh new file mode 100644 index 0000000..9dfce7d --- /dev/null +++ b/shudu/assets/resources/dc/TrophyRoom_H.lh @@ -0,0 +1,149 @@ +{ + "_$ver": 1, + "_$id": "grnsce2m", + "_$type": "Box", + "name": "TrophyRoom_H", + "y": 120, + "width": 1920, + "height": 960, + "_mouseState": 2, + "top": 120, + "centerX": 0, + "_$comp": [ + { + "_$type": "554595b0-0dd8-4e4b-8073-8d775219659c", + "scriptPath": "../src/views/dc/TrophyRoom.ts", + "btn_back": { + "_$ref": "jdgsds0q" + }, + "obj_items": { + "_$ref": "f1u9ghcd" + } + } + ], + "_$child": [ + { + "_$id": "uzmnryti", + "_$type": "Image", + "name": "Image", + "width": 1920, + "height": 960, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "skin": "res://a98f334e-ce04-4cd0-8fc5-bbdf9b048609", + "color": "#f5f7fb" + }, + { + "_$id": "tke06ydk", + "_$type": "Panel", + "name": "Panel", + "width": 1920, + "height": 842, + "_mouseState": 2, + "scrollType": 2, + "_$child": [ + { + "_$id": "f1u9ghcd", + "_$type": "VBox", + "name": "items", + "width": 1920, + "height": 960, + "centerX": 0, + "space": 40, + "align": "center", + "_$child": [ + { + "_$id": "4mhx6hbp", + "_$prefab": "c1b8084e-7edd-4519-9680-5deaab191d1d", + "name": "TrophyRoomYear_H", + "active": true, + "x": 45, + "y": 0, + "visible": true, + "_$child": [ + { + "_$override": [ + "mbue9iyc", + "ybx61p0y" + ], + "name": "label_month" + }, + { + "_$override": [ + "mbue9iyc", + "xzf561ib" + ], + "name": "label_month" + }, + { + "_$override": [ + "mbue9iyc", + "y5wo3jiq" + ], + "name": "label_month" + }, + { + "_$override": [ + "mbue9iyc", + "sj7l0rt1" + ], + "name": "label_month" + }, + { + "_$override": [ + "mbue9iyc", + "f0b5rsee" + ], + "name": "label_month" + } + ] + } + ] + } + ] + }, + { + "_$id": "oduu8jie", + "_$type": "Panel", + "name": "Back", + "x": 48, + "y": 842, + "width": 267, + "height": 135, + "_mouseState": 2, + "left": 48, + "top": 842, + "_$child": [ + { + "_$id": "jdgsds0q", + "_$type": "Box", + "name": "btn_back", + "width": 267, + "height": 135, + "_mouseState": 2, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "7ewl4raa", + "_$type": "Image", + "name": "back", + "width": 267, + "height": 135, + "skin": "res://21a7a361-2c1f-455b-9551-73a231f3efea", + "useSourceSize": true, + "color": "#ffffff" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/shudu/assets/resources/dc/TrophyRoom_H.lh.meta b/shudu/assets/resources/dc/TrophyRoom_H.lh.meta new file mode 100644 index 0000000..3125391 --- /dev/null +++ b/shudu/assets/resources/dc/TrophyRoom_H.lh.meta @@ -0,0 +1,3 @@ +{ + "uuid": "7c4f74c1-cf8b-4181-9dc1-f84b44ab89a1" +} \ No newline at end of file diff --git a/shudu/assets/resources/dc/TrophyShow.lh b/shudu/assets/resources/dc/TrophyShow.lh new file mode 100644 index 0000000..321812f --- /dev/null +++ b/shudu/assets/resources/dc/TrophyShow.lh @@ -0,0 +1,154 @@ +{ + "_$ver": 1, + "_$id": "1fwr5vkm", + "_$type": "Box", + "name": "TrophyShow", + "width": 1080, + "height": 1920, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "_$comp": [ + { + "_$type": "42f2370b-c65c-4119-8725-6d4520582431", + "scriptPath": "../src/views/dc/TrophyShow.ts", + "icon": { + "_$ref": "ln9pnpqz" + }, + "label_date": { + "_$ref": "xrkm18lm" + }, + "btn_close": { + "_$ref": "wij1by9x" + } + } + ], + "_$child": [ + { + "_$id": "fey28xb5", + "_$type": "Image", + "name": "Image", + "width": 1080, + "height": 1920, + "alpha": 0.8, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "skin": "res://a98f334e-ce04-4cd0-8fc5-bbdf9b048609", + "color": "#000000" + }, + { + "_$id": "2177oyto", + "_$type": "Box", + "name": "center", + "y": 164, + "width": 1080, + "height": 1080, + "centerX": 0, + "centerY": -256, + "_$child": [ + { + "_$id": "x5epx2r5", + "_$type": "Image", + "name": "img_light_yellow", + "width": 1080, + "height": 1080, + "centerX": 0, + "centerY": 0, + "skin": "res://0403c03d-0fbb-4930-8cf7-c4bf0f4d45b9", + "useSourceSize": true, + "color": "#ffffff" + }, + { + "_$id": "ln9pnpqz", + "_$type": "Image", + "name": "trophy", + "x": 123, + "y": 123, + "width": 834, + "height": 834, + "centerX": 0, + "centerY": 0, + "skin": "res://07b90718-84ee-4924-9098-8f0ee3663d92", + "color": "#ffffff" + }, + { + "_$id": "wij1by9x", + "_$type": "Box", + "name": "btn_close", + "x": 474, + "y": 1164, + "width": 132, + "height": 132, + "bottom": -216, + "centerX": 0, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "080lm4sm", + "_$type": "Sprite", + "name": "Sprite", + "width": 132, + "height": 132, + "alpha": 0.1, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + }, + { + "_$id": "ziectevo", + "_$type": "Image", + "name": "icon_x", + "x": 43, + "y": 44, + "width": 46, + "height": 45, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://f558f5db-ce87-4707-92ac-0c0f426844f0", + "useSourceSize": true, + "color": "#ffffff" + } + ] + }, + { + "_$id": "xrkm18lm", + "_$type": "Label", + "name": "label_date", + "x": 90, + "y": 1010, + "width": 900, + "height": 60, + "alpha": 0.8, + "bottom": 10, + "centerX": 0, + "text": "Sep 11, 2024", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 60, + "color": "#FFFFFF", + "align": "center", + "valign": "middle", + "padding": "0,0,0,0" + } + ] + } + ] +} \ No newline at end of file diff --git a/shudu/assets/resources/dc/TrophyShow.lh.meta b/shudu/assets/resources/dc/TrophyShow.lh.meta new file mode 100644 index 0000000..51a1298 --- /dev/null +++ b/shudu/assets/resources/dc/TrophyShow.lh.meta @@ -0,0 +1,3 @@ +{ + "uuid": "3b41f5b0-65b5-40eb-83cb-5d8f9f17cb31" +} \ No newline at end of file diff --git a/shudu/assets/resources/dc/TrophyShow_H.lh b/shudu/assets/resources/dc/TrophyShow_H.lh new file mode 100644 index 0000000..45b2ffd --- /dev/null +++ b/shudu/assets/resources/dc/TrophyShow_H.lh @@ -0,0 +1,156 @@ +{ + "_$ver": 1, + "_$id": "seuym1oo", + "_$type": "Box", + "name": "TrophyShow_H", + "width": 1080, + "height": 1920, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "_$comp": [ + { + "_$type": "42f2370b-c65c-4119-8725-6d4520582431", + "scriptPath": "../src/views/dc/TrophyShow.ts", + "icon": { + "_$ref": "4r5ny6w7" + }, + "label_date": { + "_$ref": "usx3pwpf" + }, + "btn_close": { + "_$ref": "ac23juv7" + } + } + ], + "_$child": [ + { + "_$id": "9zrpe4y7", + "_$type": "Image", + "name": "Image", + "width": 1080, + "height": 1920, + "alpha": 0.8, + "left": 0, + "right": 0, + "top": 0, + "bottom": 0, + "skin": "res://a98f334e-ce04-4cd0-8fc5-bbdf9b048609", + "color": "#000000" + }, + { + "_$id": "jvo3s6e8", + "_$type": "Box", + "name": "center", + "x": 60, + "y": 295, + "width": 960, + "height": 960, + "centerX": 0, + "centerY": -185, + "_$child": [ + { + "_$id": "dol8u5bz", + "_$type": "Image", + "name": "img_light_yellow", + "x": 30, + "y": 30, + "width": 900, + "height": 900, + "centerX": 0, + "centerY": 0, + "skin": "res://0403c03d-0fbb-4930-8cf7-c4bf0f4d45b9", + "color": "#ffffff" + }, + { + "_$id": "4r5ny6w7", + "_$type": "Image", + "name": "trophy", + "x": 180, + "y": 180, + "width": 600, + "height": 600, + "centerX": 0, + "centerY": 0, + "skin": "res://07b90718-84ee-4924-9098-8f0ee3663d92", + "color": "#ffffff" + }, + { + "_$id": "ac23juv7", + "_$type": "Box", + "name": "btn_close", + "x": 414, + "y": 972, + "width": 132, + "height": 132, + "bottom": -144, + "centerX": 0, + "_$comp": [ + { + "_$type": "a541bdfc-e8e1-4795-b68e-7138c5190f17", + "scriptPath": "../src/views/common/CommonHover.ts", + "hoverAlpha": true + } + ], + "_$child": [ + { + "_$id": "juo5bxev", + "_$type": "Sprite", + "name": "Sprite", + "width": 132, + "height": 132, + "alpha": 0.1, + "mouseThrough": true, + "_gcmds": [ + { + "_$type": "DrawCircleCmd", + "x": 0.5, + "y": 0.5, + "radius": 0.5, + "percent": true, + "lineWidth": 1, + "fillColor": "#FFFFFF" + } + ] + }, + { + "_$id": "lykx30us", + "_$type": "Image", + "name": "icon_x", + "x": 43, + "y": 44, + "width": 46, + "height": 45, + "mouseThrough": true, + "centerX": 0, + "centerY": 0, + "skin": "res://f558f5db-ce87-4707-92ac-0c0f426844f0", + "useSourceSize": true, + "color": "#ffffff" + } + ] + }, + { + "_$id": "usx3pwpf", + "_$type": "Label", + "name": "label_date", + "x": 30, + "y": 868, + "width": 900, + "height": 60, + "alpha": 0.8, + "bottom": 32, + "centerX": 0, + "text": "Sep 11, 2024", + "font": "res://f015dd22-1bf2-4dff-bf92-97185a4da48b", + "fontSize": 60, + "color": "#FFFFFF", + "align": "center", + "valign": "middle", + "padding": "0,0,0,0" + } + ] + } + ] +} \ No newline at end of file diff --git a/shudu/assets/resources/dc/TrophyShow_H.lh.meta b/shudu/assets/resources/dc/TrophyShow_H.lh.meta new file mode 100644 index 0000000..2b1bed8 --- /dev/null +++ b/shudu/assets/resources/dc/TrophyShow_H.lh.meta @@ -0,0 +1,3 @@ +{ + "uuid": "d2027970-69ba-4fcb-9d43-6d9adcb5756b" +} \ No newline at end of file diff --git a/shudu/assets/resources/layaAir.png b/shudu/assets/resources/layaAir.png new file mode 100644 index 0000000..765a91a Binary files /dev/null and b/shudu/assets/resources/layaAir.png differ diff --git a/shudu/assets/resources/layaAir.png.meta b/shudu/assets/resources/layaAir.png.meta new file mode 100644 index 0000000..cf68b42 --- /dev/null +++ b/shudu/assets/resources/layaAir.png.meta @@ -0,0 +1,8 @@ +{ + "uuid": "c95ef96a-e095-434f-95a4-58156890681f", + "importer": { + "textureType": 2, + "sRGB": true, + "generateMipmap": true + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00001.png b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00001.png new file mode 100644 index 0000000..2a5e6ff Binary files /dev/null and b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00001.png differ diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00001.png.meta b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00001.png.meta new file mode 100644 index 0000000..8916147 --- /dev/null +++ b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00001.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "449a140e-576e-4a52-ace4-f2695351f489", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00002.png b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00002.png new file mode 100644 index 0000000..43e258c Binary files /dev/null and b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00002.png differ diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00002.png.meta b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00002.png.meta new file mode 100644 index 0000000..de18822 --- /dev/null +++ b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00002.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "40c65b3b-0f70-4540-a503-89b34c51a478", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00003.png b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00003.png new file mode 100644 index 0000000..3611f8e Binary files /dev/null and b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00003.png differ diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00003.png.meta b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00003.png.meta new file mode 100644 index 0000000..b39a158 --- /dev/null +++ b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00003.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "e6680d53-0f4d-4133-b98b-53c70f0ff03d", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00004.png b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00004.png new file mode 100644 index 0000000..d6e7588 Binary files /dev/null and b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00004.png differ diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00004.png.meta b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00004.png.meta new file mode 100644 index 0000000..7db8a66 --- /dev/null +++ b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00004.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "12978a75-cd09-4b56-a091-20735162a675", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00005.png b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00005.png new file mode 100644 index 0000000..b7c6312 Binary files /dev/null and b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00005.png differ diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00005.png.meta b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00005.png.meta new file mode 100644 index 0000000..bedeed5 --- /dev/null +++ b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00005.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "4891cc6c-412e-4194-997f-e8fa9908feec", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00006.png b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00006.png new file mode 100644 index 0000000..a365600 Binary files /dev/null and b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00006.png differ diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00006.png.meta b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00006.png.meta new file mode 100644 index 0000000..12dd8a3 --- /dev/null +++ b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00006.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "ac428b3f-10a3-4e4c-9d6f-1e5aa4e31b47", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00007.png b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00007.png new file mode 100644 index 0000000..6d038da Binary files /dev/null and b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00007.png differ diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00007.png.meta b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00007.png.meta new file mode 100644 index 0000000..39fca10 --- /dev/null +++ b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00007.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "9c27ff38-5817-4c6c-9f26-5e28cb65b123", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00008.png b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00008.png new file mode 100644 index 0000000..faf6dc3 Binary files /dev/null and b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00008.png differ diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00008.png.meta b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00008.png.meta new file mode 100644 index 0000000..21722cd --- /dev/null +++ b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00008.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "c5360756-99ac-4dc4-bb10-5a18548efd15", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00009.png b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00009.png new file mode 100644 index 0000000..8f891eb Binary files /dev/null and b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00009.png differ diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00009.png.meta b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00009.png.meta new file mode 100644 index 0000000..ff1646e --- /dev/null +++ b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00009.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "05fc79ca-3283-417a-b31f-6ce7c079c55f", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00010.png b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00010.png new file mode 100644 index 0000000..92022f6 Binary files /dev/null and b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00010.png differ diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00010.png.meta b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00010.png.meta new file mode 100644 index 0000000..d8f8b74 --- /dev/null +++ b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00010.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "61e8c125-c5e9-4bfc-a025-a607ac7c4c0f", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00011.png b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00011.png new file mode 100644 index 0000000..01d711e Binary files /dev/null and b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00011.png differ diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00011.png.meta b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00011.png.meta new file mode 100644 index 0000000..f5329e0 --- /dev/null +++ b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00011.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "f2b1c04d-10cd-4a80-96d6-b4945a9519f7", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00012.png b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00012.png new file mode 100644 index 0000000..ead0501 Binary files /dev/null and b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00012.png differ diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00012.png.meta b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00012.png.meta new file mode 100644 index 0000000..db98ef0 --- /dev/null +++ b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00012.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "d3104550-3d9b-4dad-b65f-3a4790c28818", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00013.png b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00013.png new file mode 100644 index 0000000..b8da270 Binary files /dev/null and b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00013.png differ diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00013.png.meta b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00013.png.meta new file mode 100644 index 0000000..5779c2d --- /dev/null +++ b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00013.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "b6cd7cf8-6a1e-4710-b048-c0e448d446c2", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00014.png b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00014.png new file mode 100644 index 0000000..aa5637e Binary files /dev/null and b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00014.png differ diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00014.png.meta b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00014.png.meta new file mode 100644 index 0000000..661a122 --- /dev/null +++ b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00014.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "d637903f-391e-4599-b5e1-369b46e4cc36", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00015.png b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00015.png new file mode 100644 index 0000000..0f680a1 Binary files /dev/null and b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00015.png differ diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00015.png.meta b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00015.png.meta new file mode 100644 index 0000000..85aebe7 --- /dev/null +++ b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00015.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "03ca6f31-260d-44b6-be17-0b4e0ce04637", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00016.png b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00016.png new file mode 100644 index 0000000..074ef38 Binary files /dev/null and b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00016.png differ diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00016.png.meta b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00016.png.meta new file mode 100644 index 0000000..20270ba --- /dev/null +++ b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00016.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "af7c59ff-5c72-4675-b77d-d1bfde92175d", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00017.png b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00017.png new file mode 100644 index 0000000..985e488 Binary files /dev/null and b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00017.png differ diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00017.png.meta b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00017.png.meta new file mode 100644 index 0000000..7eeec4b --- /dev/null +++ b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00017.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "4166f3ed-82d6-4c7b-bf24-a3ca9e2df6ff", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00018.png b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00018.png new file mode 100644 index 0000000..51e2cae Binary files /dev/null and b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00018.png differ diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00018.png.meta b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00018.png.meta new file mode 100644 index 0000000..1c1a4f9 --- /dev/null +++ b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00018.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "4e897841-ebb0-4cbf-8d4c-ad5cef56b643", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00019.png b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00019.png new file mode 100644 index 0000000..01d1792 Binary files /dev/null and b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00019.png differ diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00019.png.meta b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00019.png.meta new file mode 100644 index 0000000..a13b2ff --- /dev/null +++ b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00019.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "7f2dec4d-ccd8-4559-b355-6fb366907ce4", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00020.png b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00020.png new file mode 100644 index 0000000..c60c25e Binary files /dev/null and b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00020.png differ diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00020.png.meta b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00020.png.meta new file mode 100644 index 0000000..e18a3d0 --- /dev/null +++ b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00020.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "a16eda7d-f464-4ee9-b5f8-ad659f068846", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00021.png b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00021.png new file mode 100644 index 0000000..36a5604 Binary files /dev/null and b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00021.png differ diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00021.png.meta b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00021.png.meta new file mode 100644 index 0000000..099023a --- /dev/null +++ b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00021.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "dfc9cc47-793d-4783-9b94-b233b46b5990", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00022.png b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00022.png new file mode 100644 index 0000000..62dfcd6 Binary files /dev/null and b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00022.png differ diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00022.png.meta b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00022.png.meta new file mode 100644 index 0000000..bd20c33 --- /dev/null +++ b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00022.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "4066e3ff-5d0f-4a58-affa-5009489e5d75", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00023.png b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00023.png new file mode 100644 index 0000000..0a68775 Binary files /dev/null and b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00023.png differ diff --git a/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00023.png.meta b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00023.png.meta new file mode 100644 index 0000000..e0a6f91 --- /dev/null +++ b/shudu/assets/sequences/lottie_blossom_light/lottie_blossom_light_00023.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "9e7b158a-ea0c-43f5-b17b-21108f593dc3", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00000.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00000.png new file mode 100644 index 0000000..aaf6481 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00000.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00000.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00000.png.meta new file mode 100644 index 0000000..d525ad9 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00000.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "dc0b2268-3013-4c09-ae22-6e2e6aae3cc9", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00001.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00001.png new file mode 100644 index 0000000..a57f6a7 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00001.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00001.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00001.png.meta new file mode 100644 index 0000000..e980293 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00001.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "4d131099-b71c-4b0a-bacc-0b776494b67c", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00002.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00002.png new file mode 100644 index 0000000..2117b2e Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00002.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00002.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00002.png.meta new file mode 100644 index 0000000..9aa3346 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00002.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "6bf8651a-47b1-4836-8cea-2e47a398a248", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00003.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00003.png new file mode 100644 index 0000000..6558295 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00003.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00003.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00003.png.meta new file mode 100644 index 0000000..87c8a00 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00003.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "dedf62d4-b0bc-44fe-8ebd-dae67e2410d2", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00004.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00004.png new file mode 100644 index 0000000..f23ebd3 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00004.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00004.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00004.png.meta new file mode 100644 index 0000000..b8ad6f3 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00004.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "25af67bb-8fc6-4822-8ce0-7cae377050ff", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00005.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00005.png new file mode 100644 index 0000000..79ebd12 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00005.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00005.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00005.png.meta new file mode 100644 index 0000000..93631f9 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00005.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "42aba34b-76d5-4ee3-a576-3f72e134e255", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00006.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00006.png new file mode 100644 index 0000000..b81c1fc Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00006.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00006.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00006.png.meta new file mode 100644 index 0000000..13223df --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00006.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "2e211e8f-9474-487c-8b2c-64a441c2559a", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00007.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00007.png new file mode 100644 index 0000000..655117c Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00007.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00007.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00007.png.meta new file mode 100644 index 0000000..76c6bc2 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00007.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "a9727fc5-3c45-49e3-af76-4c61e3e8bb35", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00008.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00008.png new file mode 100644 index 0000000..d665fb4 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00008.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00008.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00008.png.meta new file mode 100644 index 0000000..68f552f --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00008.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "4217d6cd-70d5-4714-ab8f-98240285cbc0", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00009.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00009.png new file mode 100644 index 0000000..81f0c1d Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00009.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00009.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00009.png.meta new file mode 100644 index 0000000..04d9f86 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00009.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "506bb703-f23d-4ed0-92b3-9b380e54953f", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00010.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00010.png new file mode 100644 index 0000000..c49f41b Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00010.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00010.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00010.png.meta new file mode 100644 index 0000000..fde3c72 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00010.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "4c0c816b-0fe7-477e-aec6-ae9ca9e4998d", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00011.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00011.png new file mode 100644 index 0000000..1be3f66 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00011.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00011.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00011.png.meta new file mode 100644 index 0000000..0c50290 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00011.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "f42167dd-6032-41f8-a6fe-9dbdeec572b5", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00012.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00012.png new file mode 100644 index 0000000..179cb1c Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00012.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00012.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00012.png.meta new file mode 100644 index 0000000..6e2c79a --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00012.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "13ff1d4f-4e74-4bbb-bd7a-468879471881", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00013.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00013.png new file mode 100644 index 0000000..e02de17 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00013.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00013.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00013.png.meta new file mode 100644 index 0000000..c8c09d6 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00013.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "361dbd2e-0f52-4e36-809a-94cba3cf9c7f", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00014.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00014.png new file mode 100644 index 0000000..aeadcc7 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00014.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00014.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00014.png.meta new file mode 100644 index 0000000..8023497 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00014.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "1c07d150-f62b-4383-a3f6-6654228df229", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00015.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00015.png new file mode 100644 index 0000000..b6d43c8 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00015.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00015.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00015.png.meta new file mode 100644 index 0000000..79c9e4e --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00015.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "b205d535-0457-4d68-b0f9-f87e405c2c2f", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00016.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00016.png new file mode 100644 index 0000000..a988234 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00016.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00016.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00016.png.meta new file mode 100644 index 0000000..01bbca1 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00016.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "4e1ff4d0-d099-4913-afe5-d8a04ea82894", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00017.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00017.png new file mode 100644 index 0000000..7edec6b Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00017.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00017.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00017.png.meta new file mode 100644 index 0000000..5d8c95a --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00017.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "4c2b3e3d-e5b5-47fb-b79f-d16c56db489f", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00018.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00018.png new file mode 100644 index 0000000..10f9d93 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00018.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00018.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00018.png.meta new file mode 100644 index 0000000..d084cd2 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00018.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "723c6079-c4cc-4d84-9324-59f7a1746573", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00019.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00019.png new file mode 100644 index 0000000..da06d99 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00019.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00019.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00019.png.meta new file mode 100644 index 0000000..411b16f --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00019.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "9de116c5-b8d5-4aa5-82d1-e094ac509324", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00020.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00020.png new file mode 100644 index 0000000..76f524e Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00020.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00020.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00020.png.meta new file mode 100644 index 0000000..54f4161 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00020.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "e511dff4-a004-4a97-a825-13cfb79f0a30", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00021.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00021.png new file mode 100644 index 0000000..c8ca2e9 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00021.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00021.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00021.png.meta new file mode 100644 index 0000000..9019c24 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00021.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "3139ec21-0f41-4c0f-a472-f62d9aaf85c2", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00022.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00022.png new file mode 100644 index 0000000..f34bb44 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00022.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00022.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00022.png.meta new file mode 100644 index 0000000..9092cc4 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00022.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "07701dc5-2a32-4bf9-98f8-c7939bb3054c", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00023.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00023.png new file mode 100644 index 0000000..d9c0d57 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00023.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00023.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00023.png.meta new file mode 100644 index 0000000..1739799 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00023.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "26234674-88f1-4b4a-ad38-ebccbfcfd1ca", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00024.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00024.png new file mode 100644 index 0000000..5dc7786 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00024.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00024.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00024.png.meta new file mode 100644 index 0000000..68b412f --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00024.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "3acbd050-ad7e-4b4c-97e5-e11319dfae0f", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00025.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00025.png new file mode 100644 index 0000000..6a29a55 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00025.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00025.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00025.png.meta new file mode 100644 index 0000000..8fb1ef1 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00025.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "6dd4bd9d-3612-41d5-aa0b-970025f3e85b", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00026.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00026.png new file mode 100644 index 0000000..d1e92c2 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00026.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00026.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00026.png.meta new file mode 100644 index 0000000..d495996 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00026.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "f7503393-3b33-4b33-8c23-afdd2137b8c8", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00027.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00027.png new file mode 100644 index 0000000..a25cd6c Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00027.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00027.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00027.png.meta new file mode 100644 index 0000000..f2a3a51 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00027.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "9f08b9ad-20cf-418f-b835-2b8db9824b29", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00028.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00028.png new file mode 100644 index 0000000..e44c4f2 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00028.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00028.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00028.png.meta new file mode 100644 index 0000000..405509a --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00028.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "e3b652b5-d03d-4179-b1ba-0a67050c17d5", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00029.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00029.png new file mode 100644 index 0000000..b552b35 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00029.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00029.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00029.png.meta new file mode 100644 index 0000000..5bd1ed9 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00029.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "508e574c-12bc-45cf-a868-14bf95150e53", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00030.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00030.png new file mode 100644 index 0000000..863bb07 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00030.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00030.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00030.png.meta new file mode 100644 index 0000000..57f1396 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00030.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "2e2ee6a2-3e43-4091-9c26-0218b6793a3b", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00031.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00031.png new file mode 100644 index 0000000..7673dbc Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00031.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00031.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00031.png.meta new file mode 100644 index 0000000..a33ec80 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00031.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "923eae1a-5e25-4972-af20-2dcb21112253", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00032.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00032.png new file mode 100644 index 0000000..ad800d6 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00032.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00032.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00032.png.meta new file mode 100644 index 0000000..aa4cd52 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00032.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "f1f326f6-8d8e-4af5-bbe4-84d978f1da17", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00033.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00033.png new file mode 100644 index 0000000..2c578a0 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00033.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00033.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00033.png.meta new file mode 100644 index 0000000..52417da --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00033.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "e335a1b8-b240-4cd3-8a2d-9913dca91265", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00034.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00034.png new file mode 100644 index 0000000..6b9242f Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00034.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00034.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00034.png.meta new file mode 100644 index 0000000..30897d1 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00034.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "a3dcfe66-7033-4bac-9890-67d4385ae7c1", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00035.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00035.png new file mode 100644 index 0000000..820fe4a Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00035.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00035.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00035.png.meta new file mode 100644 index 0000000..77ff8b1 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00035.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "47658c41-37cb-408c-b9e7-373089669fe0", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00036.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00036.png new file mode 100644 index 0000000..0bfa642 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00036.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00036.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00036.png.meta new file mode 100644 index 0000000..a117ff4 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00036.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "68ac4686-4b46-4f8d-8be6-036390986b6d", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00037.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00037.png new file mode 100644 index 0000000..0a84ee5 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00037.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00037.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00037.png.meta new file mode 100644 index 0000000..b2b5635 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00037.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "fcd04017-a838-4a23-9863-677f61526124", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00038.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00038.png new file mode 100644 index 0000000..7fc8326 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00038.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00038.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00038.png.meta new file mode 100644 index 0000000..ce630bd --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00038.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "3c23b76d-f943-431c-81dc-5020c5cc84bb", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00039.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00039.png new file mode 100644 index 0000000..a887c67 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00039.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00039.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00039.png.meta new file mode 100644 index 0000000..c399fb7 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00039.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "2c8c01de-dc30-4916-b6d1-cec1b8cbf9b0", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00040.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00040.png new file mode 100644 index 0000000..0c3baeb Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00040.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00040.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00040.png.meta new file mode 100644 index 0000000..bc559f9 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00040.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "3a0a246a-ecd0-47ee-9643-623667bdd17c", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00041.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00041.png new file mode 100644 index 0000000..31f4749 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00041.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00041.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00041.png.meta new file mode 100644 index 0000000..73d88bb --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00041.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "eaf28c19-c5d2-49ff-8d65-03f83cceb4e4", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00042.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00042.png new file mode 100644 index 0000000..e138f93 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00042.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00042.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00042.png.meta new file mode 100644 index 0000000..8bad483 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00042.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "16c33853-90f9-4012-b82d-9af5416f4182", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00043.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00043.png new file mode 100644 index 0000000..7d49284 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00043.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00043.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00043.png.meta new file mode 100644 index 0000000..2079d15 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00043.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "05d1f311-a1e5-4b29-b783-b1378980ebf4", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00044.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00044.png new file mode 100644 index 0000000..635ede8 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00044.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00044.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00044.png.meta new file mode 100644 index 0000000..71fb163 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00044.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "8ece4ebb-13a8-4163-beaa-be3826b7c93b", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00045.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00045.png new file mode 100644 index 0000000..11b8785 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00045.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00045.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00045.png.meta new file mode 100644 index 0000000..1d88f7d --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00045.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "55944825-e3ac-4346-82f3-18e0fef3de96", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00046.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00046.png new file mode 100644 index 0000000..34e3cfc Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00046.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00046.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00046.png.meta new file mode 100644 index 0000000..4f7d688 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00046.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "a9937961-6e65-473e-b446-0b9e81e8df9e", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00047.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00047.png new file mode 100644 index 0000000..0ea0b39 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00047.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00047.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00047.png.meta new file mode 100644 index 0000000..bd0d60b --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00047.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "0bef61bd-d6f3-4530-90dd-96a0c3d34c85", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00048.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00048.png new file mode 100644 index 0000000..f8bc306 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00048.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00048.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00048.png.meta new file mode 100644 index 0000000..de9d6c5 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00048.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "2e7ae5e5-6ab2-464e-a7ae-a935daf3569e", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00049.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00049.png new file mode 100644 index 0000000..711528e Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00049.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00049.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00049.png.meta new file mode 100644 index 0000000..57d8163 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00049.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "81812472-636d-4500-92a8-a6372b443fa5", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00050.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00050.png new file mode 100644 index 0000000..d369e3b Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00050.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00050.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00050.png.meta new file mode 100644 index 0000000..7d731cd --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00050.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "7ecfe048-26d1-4d4d-b234-9c0a0f9f48cf", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00051.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00051.png new file mode 100644 index 0000000..5c36677 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00051.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00051.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00051.png.meta new file mode 100644 index 0000000..e5b89cb --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00051.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "2e40b251-9c5b-4bed-a535-fb00492fe9d2", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00052.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00052.png new file mode 100644 index 0000000..cc5a1d5 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00052.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00052.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00052.png.meta new file mode 100644 index 0000000..7158af0 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00052.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "ef136f36-e342-421a-ba01-d0e650408041", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00053.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00053.png new file mode 100644 index 0000000..70a6dab Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00053.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00053.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00053.png.meta new file mode 100644 index 0000000..f924a6c --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00053.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "838f701e-34db-4aad-b292-d110d3f86108", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00054.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00054.png new file mode 100644 index 0000000..1d75965 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00054.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00054.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00054.png.meta new file mode 100644 index 0000000..694d2dd --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00054.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "db28ba9e-a6a4-4522-b5d0-4f94355ddcb1", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00055.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00055.png new file mode 100644 index 0000000..c0d6e3d Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00055.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00055.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00055.png.meta new file mode 100644 index 0000000..fc3cdb5 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00055.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "be7d031f-655d-4ce5-8000-d5abba867c15", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00056.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00056.png new file mode 100644 index 0000000..8731878 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00056.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00056.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00056.png.meta new file mode 100644 index 0000000..c858ac8 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00056.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "38b4e6f2-947a-4221-a5a2-b884757a80f8", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00057.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00057.png new file mode 100644 index 0000000..4e3a8ea Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00057.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00057.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00057.png.meta new file mode 100644 index 0000000..abb3b92 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00057.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "ddc41659-5092-401c-b062-31e2aa00a74b", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00058.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00058.png new file mode 100644 index 0000000..fbc6096 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00058.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00058.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00058.png.meta new file mode 100644 index 0000000..ea44b45 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00058.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "6bc528c1-bd0d-4ae6-9e7d-bad2caf9b153", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00059.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00059.png new file mode 100644 index 0000000..6fbfbec Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00059.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00059.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00059.png.meta new file mode 100644 index 0000000..b46bb87 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00059.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "c2aec59a-e07c-44b5-b0e9-69ac4daeab1b", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00060.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00060.png new file mode 100644 index 0000000..28aac78 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00060.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00060.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00060.png.meta new file mode 100644 index 0000000..dbe7671 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00060.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "b8f78804-33e7-4356-ac24-06fb2d192852", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00061.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00061.png new file mode 100644 index 0000000..b8f5525 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00061.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00061.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00061.png.meta new file mode 100644 index 0000000..2d62c3a --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00061.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "9ebe53ed-a1f1-48aa-8673-0d86d2ba71df", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00062.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00062.png new file mode 100644 index 0000000..c3da7b1 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00062.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00062.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00062.png.meta new file mode 100644 index 0000000..e8e592a --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00062.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "e42a6078-26c2-48ea-b25d-c738ff58dc7f", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00063.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00063.png new file mode 100644 index 0000000..92e714f Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00063.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00063.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00063.png.meta new file mode 100644 index 0000000..1fc907c --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00063.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "ea931fb5-0f46-45b8-a6ed-a92acc5446ac", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00064.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00064.png new file mode 100644 index 0000000..5bd1d7a Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00064.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00064.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00064.png.meta new file mode 100644 index 0000000..b48f260 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00064.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "d5ba82b9-b4be-43e0-979f-05c1cbe860b8", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00065.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00065.png new file mode 100644 index 0000000..645b34b Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00065.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00065.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00065.png.meta new file mode 100644 index 0000000..7698f8a --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00065.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "c86127d4-12f8-420e-9f1d-dc9a309082fe", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00066.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00066.png new file mode 100644 index 0000000..fe8d567 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00066.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00066.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00066.png.meta new file mode 100644 index 0000000..e75708b --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00066.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "d56b7166-e778-4c55-a838-657c265f3465", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00067.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00067.png new file mode 100644 index 0000000..a3c8a25 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00067.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00067.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00067.png.meta new file mode 100644 index 0000000..0f955aa --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00067.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "e729a100-c476-44c8-ba1d-67b0077981af", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00068.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00068.png new file mode 100644 index 0000000..1549d56 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00068.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00068.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00068.png.meta new file mode 100644 index 0000000..97b552c --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00068.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "443c4c9b-f287-4f13-9764-21dc3eb35085", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00069.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00069.png new file mode 100644 index 0000000..e2d833b Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00069.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00069.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00069.png.meta new file mode 100644 index 0000000..4897577 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00069.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "ac713dcb-a14e-4022-9495-bbf1201df0d8", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00070.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00070.png new file mode 100644 index 0000000..b939492 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00070.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00070.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00070.png.meta new file mode 100644 index 0000000..b7fe1df --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00070.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "5c182e12-d351-40ce-a074-dd4402774331", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00071.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00071.png new file mode 100644 index 0000000..799c399 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00071.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00071.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00071.png.meta new file mode 100644 index 0000000..1430748 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00071.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "851b4711-4ce8-4430-b0b4-925606c9a214", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00072.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00072.png new file mode 100644 index 0000000..7671370 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00072.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00072.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00072.png.meta new file mode 100644 index 0000000..4f4a1b2 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00072.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "8261b93b-0c67-47b0-bab8-26498283d5ce", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00073.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00073.png new file mode 100644 index 0000000..2682276 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00073.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00073.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00073.png.meta new file mode 100644 index 0000000..ce82125 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00073.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "71691017-f825-4bc0-a4fd-a595e89ff6d0", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00074.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00074.png new file mode 100644 index 0000000..aae709e Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00074.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00074.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00074.png.meta new file mode 100644 index 0000000..941bfb3 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00074.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "d13488bd-5f81-49dd-97c0-7c3c02f3ef32", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00075.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00075.png new file mode 100644 index 0000000..234fdf8 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00075.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00075.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00075.png.meta new file mode 100644 index 0000000..98c4875 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00075.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "8855690f-69da-48ee-ad93-60d5122754ac", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00076.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00076.png new file mode 100644 index 0000000..e5690ed Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00076.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00076.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00076.png.meta new file mode 100644 index 0000000..3dd5d4f --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00076.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "c03b979d-58f5-4d90-9c71-f78f34ddf821", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00077.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00077.png new file mode 100644 index 0000000..9167b0f Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00077.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00077.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00077.png.meta new file mode 100644 index 0000000..f0d8857 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00077.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "aa43e705-4efb-4654-bea9-865e4a0ca38c", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00078.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00078.png new file mode 100644 index 0000000..2557e6d Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00078.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00078.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00078.png.meta new file mode 100644 index 0000000..c7b66f1 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00078.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "0e8af244-9214-40b4-9569-7e248ed52cf0", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00079.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00079.png new file mode 100644 index 0000000..96cd43b Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00079.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00079.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00079.png.meta new file mode 100644 index 0000000..a97c6b3 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00079.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "f095792b-8efd-46cc-b078-ef0a7f03be93", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00080.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00080.png new file mode 100644 index 0000000..fd6f3d0 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00080.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00080.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00080.png.meta new file mode 100644 index 0000000..0252739 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00080.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "68ec0d1d-d20f-4e2f-a6d8-5fb4871c9e83", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00081.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00081.png new file mode 100644 index 0000000..3b85d8e Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00081.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00081.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00081.png.meta new file mode 100644 index 0000000..3c3604e --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00081.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "86ef58c9-2cbc-4478-9d2c-dd939b9ca816", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00082.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00082.png new file mode 100644 index 0000000..48ec13a Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00082.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00082.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00082.png.meta new file mode 100644 index 0000000..e0fe31d --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00082.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "377f51e6-ac96-4551-9fff-50e122c6df91", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00083.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00083.png new file mode 100644 index 0000000..34ac52d Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00083.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00083.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00083.png.meta new file mode 100644 index 0000000..e6d08ad --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00083.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "9c61b3de-dc64-4d27-b3dc-dede907021d7", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00084.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00084.png new file mode 100644 index 0000000..7ab472b Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00084.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00084.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00084.png.meta new file mode 100644 index 0000000..69fcfa0 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00084.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "1dc147b2-e4ee-4f1f-82a0-23a9d6f6157d", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00085.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00085.png new file mode 100644 index 0000000..3ccc4f0 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00085.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00085.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00085.png.meta new file mode 100644 index 0000000..37756a4 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00085.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "0f85b708-e218-4d9e-91fb-63f55095aa9f", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00086.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00086.png new file mode 100644 index 0000000..d7d1234 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00086.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00086.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00086.png.meta new file mode 100644 index 0000000..7d42778 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00086.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "66a90fe9-15b3-47d0-a84d-9ad4287f680b", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00087.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00087.png new file mode 100644 index 0000000..20b8efd Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00087.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00087.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00087.png.meta new file mode 100644 index 0000000..c22c8ef --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00087.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "6dc20fe4-1f9e-4096-acbb-ac17c2e68cc1", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00088.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00088.png new file mode 100644 index 0000000..ae80518 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00088.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00088.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00088.png.meta new file mode 100644 index 0000000..3fc3004 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00088.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "b95e1954-cd41-41c3-adb0-c20d3314e5f2", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00089.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00089.png new file mode 100644 index 0000000..79546f0 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00089.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00089.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00089.png.meta new file mode 100644 index 0000000..9defd10 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00089.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "365b4373-6f6e-41f0-903a-73737fb65012", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00090.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00090.png new file mode 100644 index 0000000..658eadf Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00090.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00090.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00090.png.meta new file mode 100644 index 0000000..577fd99 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00090.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "be861f51-af35-4402-929a-1ea431edfd48", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00091.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00091.png new file mode 100644 index 0000000..49cf907 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00091.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00091.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00091.png.meta new file mode 100644 index 0000000..d12cbee --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00091.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "5f35c577-9ad3-49da-9ec9-09578f456720", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00092.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00092.png new file mode 100644 index 0000000..eee3165 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00092.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00092.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00092.png.meta new file mode 100644 index 0000000..1809b4f --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00092.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "41552139-4e6b-4f3b-8752-69e300d19120", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00093.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00093.png new file mode 100644 index 0000000..9a8fb25 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00093.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00093.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00093.png.meta new file mode 100644 index 0000000..247dcaa --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00093.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "cceecb23-4203-423d-870d-555cc25174c2", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00094.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00094.png new file mode 100644 index 0000000..bc1cb8f Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00094.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00094.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00094.png.meta new file mode 100644 index 0000000..6d7e41d --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00094.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "7193ee95-1988-4c00-9e8e-04b1516c8b0c", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00095.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00095.png new file mode 100644 index 0000000..668baa3 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00095.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00095.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00095.png.meta new file mode 100644 index 0000000..c50ef58 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00095.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "0ac49548-8a72-4cf9-85c2-52c4687d8aef", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00096.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00096.png new file mode 100644 index 0000000..6a93567 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00096.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00096.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00096.png.meta new file mode 100644 index 0000000..6957d5f --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00096.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "046910ed-2237-442c-b072-67650079a3f5", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00097.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00097.png new file mode 100644 index 0000000..7a798c5 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00097.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00097.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00097.png.meta new file mode 100644 index 0000000..e6ef970 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00097.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "efb15dd6-978c-43e1-81d4-cb61ee8ac993", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00098.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00098.png new file mode 100644 index 0000000..85ef5e6 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00098.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00098.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00098.png.meta new file mode 100644 index 0000000..5cefdf7 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00098.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "31ea99bb-cf01-4ccb-9101-b7bd99e74161", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00099.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00099.png new file mode 100644 index 0000000..27be7e9 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00099.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00099.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00099.png.meta new file mode 100644 index 0000000..6eebd55 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00099.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "2055f203-e498-4733-86b5-7041af6e7275", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00100.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00100.png new file mode 100644 index 0000000..a261134 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00100.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00100.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00100.png.meta new file mode 100644 index 0000000..2fa096c --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00100.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "100cbdb5-e9d6-4cd1-b1d6-99afa77a9566", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00101.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00101.png new file mode 100644 index 0000000..1d28039 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00101.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00101.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00101.png.meta new file mode 100644 index 0000000..3441869 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00101.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "40dfc1d0-c326-4b89-a41d-580bf241844f", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00102.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00102.png new file mode 100644 index 0000000..3f88294 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00102.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00102.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00102.png.meta new file mode 100644 index 0000000..e45356c --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00102.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "ef50f04f-f268-41a5-85f9-669672ac0228", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00103.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00103.png new file mode 100644 index 0000000..43160a1 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00103.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00103.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00103.png.meta new file mode 100644 index 0000000..274a0d2 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00103.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "d6aa00de-a2dc-4c6a-aa8a-c7dad413c1c7", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00104.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00104.png new file mode 100644 index 0000000..00c346b Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00104.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00104.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00104.png.meta new file mode 100644 index 0000000..4687782 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00104.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "f78a676a-65c4-4204-b16a-2022c76af1e8", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00105.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00105.png new file mode 100644 index 0000000..a85b8cb Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00105.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00105.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00105.png.meta new file mode 100644 index 0000000..b8d2b5a --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00105.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "6a481e8b-2543-4b0a-afc5-c2df9284b2ae", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00106.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00106.png new file mode 100644 index 0000000..cb3c294 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00106.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00106.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00106.png.meta new file mode 100644 index 0000000..516d5e3 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00106.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "cf7d6857-8110-45e5-b71e-074a414aab92", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00107.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00107.png new file mode 100644 index 0000000..095bc72 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00107.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00107.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00107.png.meta new file mode 100644 index 0000000..52137dd --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00107.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "3e95ad08-05cb-49fb-a267-314f3402a55a", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00108.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00108.png new file mode 100644 index 0000000..5e356d4 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00108.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00108.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00108.png.meta new file mode 100644 index 0000000..3145bdc --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00108.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "8f483599-0ce5-4f01-bce3-e406b7cd6fd8", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00109.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00109.png new file mode 100644 index 0000000..1c717eb Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00109.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00109.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00109.png.meta new file mode 100644 index 0000000..2c45057 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00109.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "6b34e876-abab-4c4a-a1f8-577fe7449ea1", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00110.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00110.png new file mode 100644 index 0000000..2d0b78e Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00110.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00110.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00110.png.meta new file mode 100644 index 0000000..ada6328 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00110.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "e393ae1d-5be1-4821-879d-f8d402b60c13", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00111.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00111.png new file mode 100644 index 0000000..7478d14 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00111.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00111.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00111.png.meta new file mode 100644 index 0000000..1d1fb98 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00111.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "328805ac-64c7-4265-83c4-71e0c85d622e", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00112.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00112.png new file mode 100644 index 0000000..595e862 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00112.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00112.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00112.png.meta new file mode 100644 index 0000000..c216092 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00112.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "46781b68-d582-4534-b5d1-648b706c75a1", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00113.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00113.png new file mode 100644 index 0000000..17338d8 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00113.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00113.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00113.png.meta new file mode 100644 index 0000000..b036c77 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00113.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "87752994-41d7-469e-88c6-2fcdb4a59fdf", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00114.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00114.png new file mode 100644 index 0000000..22f267e Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00114.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00114.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00114.png.meta new file mode 100644 index 0000000..f0999ee --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00114.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "c37fb42a-86cb-4423-8cfb-d57b311e9bcd", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00115.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00115.png new file mode 100644 index 0000000..055d2be Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00115.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00115.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00115.png.meta new file mode 100644 index 0000000..bdd94a0 --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00115.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "0372c0e3-9c34-40dc-b72f-ce8042e10bc8", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00116.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00116.png new file mode 100644 index 0000000..759deb6 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00116.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00116.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00116.png.meta new file mode 100644 index 0000000..e28a3ce --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00116.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "dcc812a4-1eb4-43cd-aaa5-9c04e5089a39", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00117.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00117.png new file mode 100644 index 0000000..8cd1315 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00117.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00117.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00117.png.meta new file mode 100644 index 0000000..8e1547e --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00117.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "c6fac989-dbfd-4cff-ad6a-516b6f02c41d", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00118.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00118.png new file mode 100644 index 0000000..6046d97 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00118.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00118.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00118.png.meta new file mode 100644 index 0000000..890ad1b --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00118.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "d2e4972b-2e30-408a-a86d-6c5cb43e38f1", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00119.png b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00119.png new file mode 100644 index 0000000..a230198 Binary files /dev/null and b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00119.png differ diff --git a/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00119.png.meta b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00119.png.meta new file mode 100644 index 0000000..e93174b --- /dev/null +++ b/shudu/assets/sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00119.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "8d8e95c1-2b3c-4741-a72f-40b153e3ab9d", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/trophys/img_trophy_bg_light_gold.png b/shudu/assets/trophys/img_trophy_bg_light_gold.png new file mode 100644 index 0000000..5417e2e Binary files /dev/null and b/shudu/assets/trophys/img_trophy_bg_light_gold.png differ diff --git a/shudu/assets/trophys/img_trophy_bg_light_gold.png.meta b/shudu/assets/trophys/img_trophy_bg_light_gold.png.meta new file mode 100644 index 0000000..081a1bb --- /dev/null +++ b/shudu/assets/trophys/img_trophy_bg_light_gold.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "d0c3b007-6036-460a-b23d-09d6f2492886", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/trophys/img_trophy_bg_light_gray.png b/shudu/assets/trophys/img_trophy_bg_light_gray.png new file mode 100644 index 0000000..fa1cbbe Binary files /dev/null and b/shudu/assets/trophys/img_trophy_bg_light_gray.png differ diff --git a/shudu/assets/trophys/img_trophy_bg_light_gray.png.meta b/shudu/assets/trophys/img_trophy_bg_light_gray.png.meta new file mode 100644 index 0000000..fb12273 --- /dev/null +++ b/shudu/assets/trophys/img_trophy_bg_light_gray.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "338cf96d-06aa-4f4a-becc-470188c6fac2", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/trophys/trophy_01.png b/shudu/assets/trophys/trophy_01.png new file mode 100644 index 0000000..9ccfa85 Binary files /dev/null and b/shudu/assets/trophys/trophy_01.png differ diff --git a/shudu/assets/trophys/trophy_01.png.meta b/shudu/assets/trophys/trophy_01.png.meta new file mode 100644 index 0000000..d91cf70 --- /dev/null +++ b/shudu/assets/trophys/trophy_01.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "7d235ac1-6755-4409-ab86-23aaf41e1537", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/trophys/trophy_02.png b/shudu/assets/trophys/trophy_02.png new file mode 100644 index 0000000..47da39a Binary files /dev/null and b/shudu/assets/trophys/trophy_02.png differ diff --git a/shudu/assets/trophys/trophy_02.png.meta b/shudu/assets/trophys/trophy_02.png.meta new file mode 100644 index 0000000..6ac52c0 --- /dev/null +++ b/shudu/assets/trophys/trophy_02.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "96a58de5-fc90-4ade-adfd-4a4d118a623c", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/trophys/trophy_03.png b/shudu/assets/trophys/trophy_03.png new file mode 100644 index 0000000..ea0ab48 Binary files /dev/null and b/shudu/assets/trophys/trophy_03.png differ diff --git a/shudu/assets/trophys/trophy_03.png.meta b/shudu/assets/trophys/trophy_03.png.meta new file mode 100644 index 0000000..b986659 --- /dev/null +++ b/shudu/assets/trophys/trophy_03.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "88000a03-190e-42f2-aeee-794a20baf8e5", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/trophys/trophy_04.png b/shudu/assets/trophys/trophy_04.png new file mode 100644 index 0000000..928e21f Binary files /dev/null and b/shudu/assets/trophys/trophy_04.png differ diff --git a/shudu/assets/trophys/trophy_04.png.meta b/shudu/assets/trophys/trophy_04.png.meta new file mode 100644 index 0000000..9fc79b3 --- /dev/null +++ b/shudu/assets/trophys/trophy_04.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "9e98624e-927b-4b99-88ad-8d6f2343208f", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/trophys/trophy_05.png b/shudu/assets/trophys/trophy_05.png new file mode 100644 index 0000000..914fb39 Binary files /dev/null and b/shudu/assets/trophys/trophy_05.png differ diff --git a/shudu/assets/trophys/trophy_05.png.meta b/shudu/assets/trophys/trophy_05.png.meta new file mode 100644 index 0000000..fc96419 --- /dev/null +++ b/shudu/assets/trophys/trophy_05.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "f343eec5-a5d9-4aee-b990-06dd8814a49f", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/trophys/trophy_06.png b/shudu/assets/trophys/trophy_06.png new file mode 100644 index 0000000..458561d Binary files /dev/null and b/shudu/assets/trophys/trophy_06.png differ diff --git a/shudu/assets/trophys/trophy_06.png.meta b/shudu/assets/trophys/trophy_06.png.meta new file mode 100644 index 0000000..b484417 --- /dev/null +++ b/shudu/assets/trophys/trophy_06.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "09690a9b-3d5a-4da1-b457-1a3275cf5c14", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/trophys/trophy_07.png b/shudu/assets/trophys/trophy_07.png new file mode 100644 index 0000000..7fc076b Binary files /dev/null and b/shudu/assets/trophys/trophy_07.png differ diff --git a/shudu/assets/trophys/trophy_07.png.meta b/shudu/assets/trophys/trophy_07.png.meta new file mode 100644 index 0000000..2bd513a --- /dev/null +++ b/shudu/assets/trophys/trophy_07.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "823f9da6-1190-4cc2-8ade-1235b6e63a71", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/trophys/trophy_08.png b/shudu/assets/trophys/trophy_08.png new file mode 100644 index 0000000..27678fb Binary files /dev/null and b/shudu/assets/trophys/trophy_08.png differ diff --git a/shudu/assets/trophys/trophy_08.png.meta b/shudu/assets/trophys/trophy_08.png.meta new file mode 100644 index 0000000..3ad953e --- /dev/null +++ b/shudu/assets/trophys/trophy_08.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "56fae124-b8a0-41de-991a-0a8bfe4d81f7", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/trophys/trophy_09.png b/shudu/assets/trophys/trophy_09.png new file mode 100644 index 0000000..1d43244 Binary files /dev/null and b/shudu/assets/trophys/trophy_09.png differ diff --git a/shudu/assets/trophys/trophy_09.png.meta b/shudu/assets/trophys/trophy_09.png.meta new file mode 100644 index 0000000..4988b42 --- /dev/null +++ b/shudu/assets/trophys/trophy_09.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "e32f3996-6f91-4bea-9220-51fbe0db6000", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/trophys/trophy_10.png b/shudu/assets/trophys/trophy_10.png new file mode 100644 index 0000000..6d90c1b Binary files /dev/null and b/shudu/assets/trophys/trophy_10.png differ diff --git a/shudu/assets/trophys/trophy_10.png.meta b/shudu/assets/trophys/trophy_10.png.meta new file mode 100644 index 0000000..b5c3560 --- /dev/null +++ b/shudu/assets/trophys/trophy_10.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "5ac664df-00fa-4926-92cf-8c37f34b643c", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/trophys/trophy_11.png b/shudu/assets/trophys/trophy_11.png new file mode 100644 index 0000000..893d0d5 Binary files /dev/null and b/shudu/assets/trophys/trophy_11.png differ diff --git a/shudu/assets/trophys/trophy_11.png.meta b/shudu/assets/trophys/trophy_11.png.meta new file mode 100644 index 0000000..490d3f5 --- /dev/null +++ b/shudu/assets/trophys/trophy_11.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "90ebce6d-2376-4daa-a99b-eb932f08f396", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/assets/trophys/trophy_12.png b/shudu/assets/trophys/trophy_12.png new file mode 100644 index 0000000..7530aec Binary files /dev/null and b/shudu/assets/trophys/trophy_12.png differ diff --git a/shudu/assets/trophys/trophy_12.png.meta b/shudu/assets/trophys/trophy_12.png.meta new file mode 100644 index 0000000..2f03bd4 --- /dev/null +++ b/shudu/assets/trophys/trophy_12.png.meta @@ -0,0 +1,6 @@ +{ + "uuid": "0fe91155-944d-47ad-b26a-0765f93e8134", + "importer": { + "textureType": 2 + } +} \ No newline at end of file diff --git a/shudu/engine/types/Blueprint.d.ts b/shudu/engine/types/Blueprint.d.ts new file mode 100644 index 0000000..97298d0 --- /dev/null +++ b/shudu/engine/types/Blueprint.d.ts @@ -0,0 +1,1595 @@ +declare module BP { + class BlueprintCreateUtil { + static __init__(): Promise; + static reg(): void; + } + class BlueprintDecorator { + static bpUserMap: Map; + static initDeclaration(name: string, cls: Function): TBPDeclaration; + /** + * 蓝图装饰器 + * @param options + */ + static bpClass(target: any, options: BPDecoratorsOptionClass): TBPDeclaration; + /** + * 蓝图装饰器,属性 + */ + static bpProperty(target: any, propertyKey: string, options: BPDecoratorsOptionProp): void; + /** + * 蓝图装饰器,方法 + */ + static bpFunction(target: any, propertyKey: string, descriptor: any, options: BPDecoratorsOptionFunction): void; + /** + * 蓝图装饰器,getset + */ + static bpAccessor(target: any, propertyKey: string, descriptor: any, options: BPDecoratorsOptionProp): void; + /** + * 增加一个蓝图枚举 + * @param name 枚举名称 + * @param merbers 枚举成员 + */ + static createBPEnum(name: string, merbers: TBPDeclarationMerber[]): void; + } + /** + * 蓝图装饰器 + * @param options + */ + function bpClass(options: BPDecoratorsOptionClass): (target: any) => void; + /** + * 蓝图装饰器,属性 + */ + function bpProperty(options: BPDecoratorsOptionProp): (target: any, propertyKey: string) => void; + /** + * 蓝图装饰器,方法 + */ + function bpFunction(options?: BPDecoratorsOptionFunction): (target: any, propertyKey: string, descriptor: any) => void; + /** + * 蓝图装饰器,getset + */ + function bpAccessor(options: BPDecoratorsOptionProp): (target: any, propertyKey: string, descriptor: any) => void; + /** + * 增加一个蓝图枚举 + * @param name 枚举名称 + * @param merbers 枚举成员 + */ + function createBPEnum(name: string, merbers: TBPDeclarationMerber[]): void; + class BlueprintLoader implements IResourceLoader { + load(task: ILoadTask): Promise; + postLoad(task: ILoadTask, bp: BlueprintResource): Promise; + } + class BlueprintResource extends Resource { + data: IBPSaveData; + dec: TBPDeclaration; + allData: Record; + private _cls; + private _bid; + private varMap; + private allNode; + constructor(bid: string); + get cls(): Function; + private _initTarget; + initClass(data: IBPSaveData): void; + parse(): void; + protected _disposeResource(): void; + } + class BlueprintConst { + static MAX_CODELINE: number; + static NULL_NODE: number; + static VERSION: number; + static EXT: string; + static TYPE: string; + static configPath: string; + } + const EXECID = "-1"; + const TARGETID = "-2"; + class BlueprintData { + /**对当前打开的蓝图数据进行检测的逻辑 */ + getConstDataExt: (target: string, dataId: string) => IBPCNode; + static allDataMap: Map>; + private static defFunOut; + private static defFunIn; + private static defTarget; + private static defEventOut; + /**所有的数据 */ + /** + * constData里面的数据应该包含customData的数据 + */ + constData: Record; + /**自動生成的模板數據,這些數據不會在鼠標右鍵菜單中出現,也不會傳輸到ide層去 */ + autoCreateData: Record; + private static readonly funlike; + private static readonly checklike; + private _extendsData; + private _regFunction; + private _getClass; + static formatName(param: TBPDeclarationParam): string; + static formatType(type: Laya.FPropertyType): Laya.FPropertyType; + constructor(extendsData: Record, regFunction?: (fname: string, fun: Function, isMember: boolean, cls: any, target: string) => void, getClass?: (name: string) => any); + get extendsData(): Record; + getExtends(ext: string, arr?: string[]): string[]; + getConstDataById(target: string, dataId: string): IBPCNode; + private _getConstData; + /**在引擎执行的时候需要启用catch来提高效率,在ide中不需要,因为ide中有时候会经常变动数据 */ + isStartCatch: boolean; + static clone(obj: T): T; + private _getConstByNode; + getConstNode(node: IBPNode): IBPCNode; + private _checkAndPush; + private _createExtData; + private _createConstData; + isResetData: boolean; + removeData(ext: string): void; + resetData(data: TBPDeclaration, ext: string): void; + initData(data: Record): void; + private static handleCDataTypes; + private static createCData; + static formatData(data: IBPSaveData, assetId: string, dataMap?: Record, varMap?: Record): TBPDeclaration; + private static _initTarget; + } + abstract class BlueprintNode { + id: string; + nid: number; + name: string; + type: BPType; + def: IBPCNode; + pins: T[]; + constructor(); + abstract createPin(def: TBPPinDef): T; + addPin(pin: T): void; + parse(def: IBPCNode): void; + getPropertyItem(key: string): import("../datas/types/IBlueprint").IBPCInput; + getValueType(key: string): "class" | "resource"; + isEmptyObj(o: any): boolean; + /** + * 强制写入target的inputValue + * @param node + * @returns + */ + private _checkTarget; + parseLinkData(node: IBPNode, manger: INodeManger>): void; + protected onParseLinkData(node: IBPNode, manger: INodeManger>): void; + setFunction(fun: Function, isMember: boolean): void; + setType(type: BPType): void; + addInput(input: TBPPinDef[]): void; + addOutput(output: TBPPinDef[]): void; + getPinByName(id: string): T; + } + class BlueprintPin { + private _direction; + get direction(): EPinDirection; + set direction(value: EPinDirection); + id: string; + name: string; + nid: string; + type: EPinType; + otype: string; + linkTo: BlueprintPin[]; + value: any; + constructor(); + parse(def: TBPPinDef): void; + startLinkTo(e: BlueprintPin): void; + } + class BlueprintUtil { + static classMap: any; + static bpData: BlueprintData; + static onfinishCallbacks: Record; + static resouceMap: Map; + static CustomClassFinish: string; + static customModify: boolean; + static clone(obj: T): T; + static getConstNode(node?: IBPNode): IBPCNode; + static getConstDataById(target: string, dataId: string): IBPCNode; + /** + * hook + * @param name + * @param data + */ + static addCustomData(name: string, data: TBPDeclaration): void; + static getDeclaration(name: string): TBPDeclaration; + static initConstNode(): void; + static getClass(ext: any): any; + static regClass(name: string, cls: any): void; + static regResByUUID(uuid: string, res: any): void; + static getResByUUID(uuid: string): any; + static getNameByUUID(uuid: string): string; + } + /** + * 引脚方向 + */ + enum EPinDirection { + Input = 0, + Output = 1, + All = 2 + } + /** + * 节点类型 + */ + enum EBlueNodeType { + Unknow = "unkown", + Event = "event", + Fun = "fun", + Pure = "pure", + GetVariable = "var", + SetVarialbe = "setVar", + Branch = "branch", + Sequnece = "sequnece" + } + /** + * 引脚类型 + */ + enum EPinType { + Exec = 0, + BPFun = 1, + Other = 2 + } + interface IBluePrintSubclass { + [BlueprintFactory.bpSymbol]: BlueprintRuntime; + [BlueprintFactory.contextSymbol]: IRunAble; + [key: string]: any; + } + interface IExcuteListInfo { + nid: number; + } + interface INodeManger { + getNodeById(id: any): T; + dataMap: Record; + } + interface IOutParm { + readonly name: string; + setValue(runId: number, value: any): void; + } + interface IRuntimeDataManger { + getDataById(nid: number): RuntimeNodeData; + setPinData(pin: BlueprintPinRuntime, value: any, runId: number): void; + getPinData(pin: BlueprintPinRuntime, runId: number): any; + getRuntimePinById(id: string): RuntimePinData; + getVar(name: string, runId: number): any; + setVar(name: string, value: any, runId: number): void; + clearVar(runId: number): void; + saveContextData(from: number, to: number): void; + } + type TBPNodeDef = { + name: string; + id: string; + type: BPType; + inPut?: TBPPinDef[]; + outPut?: TBPPinDef[]; + fun?: Function; + }; + type TBPPinDef = { + id: string; + name: string; + type: string; + }; + type TBPNodeData = { + id: string; + did: string; + data: Record; + }; + type TBPLinkInfo = { + varname: string; + }; + type TBPPinData = { + value?: any; + linkto?: string[]; + }; + const BlueprintDataList: IBPCNode[]; + /** + * 开发者自定义相关 + */ + const customData: Record; + const extendsData: Record; + type TBPDecoratorsPropertType = "function" | "property" | "class"; + type TBPDecoratorsFuncType = "pure" | "function" | "event" | BPType.Pure | BPType.Function | BPType.Event; + type TBPDeclarationType = "Enum" | "Node" | "Component" | "Others"; + /** 修饰符 */ + type BPModifiers = { + /** 是否是私有 */ + isPrivate?: boolean; + /** 是否是公有 */ + isPublic?: boolean; + /** 是否是受保护的 */ + isProtected?: boolean; + /** 是否是静态 */ + isStatic?: boolean; + /** 是否为只读 */ + isReadonly?: boolean; + /** + * 是否是自动运行 + */ + isAutoRun?: boolean; + }; + type TBPDeclaration = { + /** 包名 */ + module?: string; + /** 当前描述名 */ + name: string; + /** 当前描述的具体类型 */ + type: TBPDeclarationType; + /** 能否被继承 */ + canInherited?: boolean; + /** 父类 */ + extends?: string; + /** 事件相关 */ + events?: TBPDeclarationEvent[]; + /** 实现的接口名 */ + implements?: string[]; + /** 该描述的属性列表 */ + props?: TBPDeclarationProp[]; + /** 该描述的方法列表 */ + funcs?: TBPDeclarationFunction[]; + /** 构造函数 */ + construct?: TBPDeclarationConstructor; + /** 枚举成员 */ + merbers?: TBPDeclarationMerber[]; + /** 显示名称,没有默认使用name */ + caption?: string; + /** 分组 */ + catalog?: string; + /** 提示内容 */ + tips?: string; + }; + type TBPDeclarationMerber = { + /** 枚举名称 */ + name: string; + /** 枚举值 */ + value: number | string; + /** 显示名称,没有默认使用name */ + caption?: string; + /** 分组 */ + catalog?: string; + /** 提示内容 */ + tips?: string; + }; + type TBPDeclarationEvent = { + name: string; + params?: TBPDeclarationEventData[]; + }; + type TBPDeclarationEventData = { + id?: number; + /** 参数名称 */ + name: string; + /** 参数类型 */ + type: string; + /** 显示名称,没有默认使用name */ + caption?: string; + /** 分组 */ + catalog?: string; + /** 提示内容 */ + tips?: string; + }; + type TBPDeclarationConstructor = { + params?: TBPDeclarationParam[]; + /** 显示名称,没有默认使用name */ + caption?: string; + /** 分组 */ + catalog?: string; + /** 提示内容 */ + tips?: string; + }; + type TBPDeclarationProp = { + /** 变量名称 */ + name: string; + value?: any; + /** 变量类型 */ + type?: string | Function; + customId?: string | number; + /** 是否有getter 方法 */ + getter?: boolean; + /** 是否有setter 方法 */ + setter?: boolean; + /** 泛型 */ + typeParameters?: any; + /** 修饰符 */ + modifiers?: BPModifiers; + /** 是否来自父类 */ + fromParent?: string; + /** 显示名称,没有默认使用name */ + caption?: string; + /** 分组 */ + catalog?: string; + /** 提示内容 */ + tips?: string; + }; + type TBPDeclarationFunction = { + /** 方法名称 */ + name: string; + /**鼠标右键里面的菜单路径,如果填写none则代表不在菜单中显示 */ + menuPath?: string; + /** 具体方法类型 */ + type?: TBPDecoratorsFuncType; + /** 修饰符 */ + modifiers?: BPModifiers; + /** 方法的参数列表 */ + params?: TBPDeclarationParam[]; + /** 方法的返回类型 */ + returnType: string | any[]; + /** 方法的返回注释 */ + returnTips?: string; + /** 泛型 */ + typeParameters?: any; + /** 注册的原始方法 */ + originFunc?: Function; + /** 是否来自父类 */ + fromParent?: string; + customId?: number | string; + /** 显示名称,没有默认使用name */ + caption?: string; + /** 分组 */ + catalog?: string; + /** 提示内容 */ + tips?: string; + }; + type TBPDeclarationParam = { + id?: number; + /** 参数名称 */ + name: string; + /** 参数类型 */ + type: string; + /** 是否为可选项 */ + optional?: boolean; + /** 是否为...方法 */ + dotdotdot?: boolean; + /** 显示名称,没有默认使用name */ + caption?: string; + /** 分组 */ + catalog?: string; + /** 提示内容 */ + tips?: string; + }; + interface BPDecoratorsOptionBase { + /** 标题,如果不提供将使用name */ + caption?: string; + /** 注册对象成员类型 */ + propertType?: TBPDecoratorsPropertType; + /** 修饰符 */ + modifiers?: BPModifiers; + /** 分类 */ + catalog?: string; + /** 提示内容 */ + tips?: string; + } + interface BPDecoratorsOptionClass extends BPDecoratorsOptionBase { + /** 注册名称 */ + name: string; + /** 继承的父类 */ + extends?: string; + /** 能否被继承 */ + canInherited?: boolean; + /** 构造函数参数 */ + construct?: TBPDeclarationConstructor; + /** 事件相关 */ + events?: TBPDeclarationEvent[]; + } + interface BPDecoratorsOptionFunction extends BPDecoratorsOptionBase { + /** 方法或者构造函数参数,必填 */ + params?: TBPDeclarationParam[]; + /** + * 方法分类 + * @default BPType.Function + */ + type?: TBPDecoratorsFuncType; + /** + * 返回类型 + */ + returnType?: string; + } + interface BPDecoratorsOptionProp extends BPDecoratorsOptionBase { + /** 参数类型 */ + type: string; + } + interface IBPSaveData { + autoID: number; + preload?: string[]; + extends: string; + blueprintArr: Array; + variable: IBPVariable[]; + functions: IBPStageData[]; + events: IBPCNode[]; + source?: any; + globalInfo?: Record; + } + interface CopyType { + arr: (IBPNode | IBComment)[]; + width: number; + height: number; + } + interface IBPVariable extends Partial { + name: string; + type: string; + value?: any; + } + interface IBPStageData extends Partial { + /** 修饰符 */ + modifiers?: BPModifiers; + name: string; + id: number; + uiData?: { + /**场景的x坐标位置 */ + x: number; + /**场景的y坐标位置 */ + y: number; + /**场景的缩放 */ + scale: number; + }; + /**临时变量数据 */ + variable?: IBPVariable[]; + arr: Array; + comments?: Array; + /**保存的时候不会有这个值,这是build的时候传值用的 */ + dataMap?: Record; + tips?: string; + properties?: Array; + output?: IBPCOutput[]; + } + interface IBComment { + id: number; + x: number; + y: number; + width: number; + height: number; + desc: string; + fontSize?: number; + color?: { + r: number; + g: number; + b: number; + }; + noSticky?: boolean; + } + interface IBPConstNode { + extends?: string; + data: Record; + caption?: string; + } + interface IBPCNode { + isSelf?: boolean; + /**程序中用到的名字 */ + name: string; + caption?: string; + /** */ + bpType?: "function" | "event" | "prop" | "construct"; + target?: string; + /**target有可能是uuid,所以需要这个别名 */ + targetAliasName?: string; + /** 提示内容 */ + tips?: string; + module?: string; + /**如果是自定义函数会有这个id号 */ + customId?: number; + /**泛型的类型定义 */ + typeParameters?: Record; + /** 修饰符 */ + modifiers?: BPModifiers; + /** 数据唯一的id号,可以不写,默认为name*/ + id?: string | number; + /** 旧的id号,用于兼容旧的版本 */ + oldId?: string; + /**该节点的类型,如果是variable则类型为string */ + type: BPType | string; + /**鼠标右键里面的菜单路径,如果填写none则代表不在菜单中显示 */ + menuPath?: string; + /**版本号 */ + ver?: number; + properties: Array; + output?: IBPCOutput[]; + /**插槽上的默認值 */ + inputValue?: Record; + const?: boolean; + } + interface IBPCOutput { + /**插槽的id号,一般用户自定义插槽会有这个值 */ + id?: string | number; + /** 插槽名称 */ + name?: string; + /**插槽的别名,通常用于自定义函数中 */ + caption?: string; + tips?: string; + /** 插槽允许的输出连接类型,输入字符串表示仅能连接该类型,数组表示可连接数组内类型*/ + type: Laya.FPropertyType; + } + interface IBPCInput { + id?: string | number; + type?: Laya.FPropertyType; + name?: string; + caption?: string; + tips?: string; + /**input简介提示,UI上显示使用,鼠标挪动到UI上会出现该提示信息 */ + alt?: string; + /**inputValue的类型 */ + valueType?: "class" | "resource"; + isAsset?: boolean; + } + enum BPType { + Event = "event", + Function = "function", + BPEvent = "bpEvent", + Pure = "pure", + Class = "class", + Operator = "operator", + GetValue = "getvalue", + SetValue = "setvalue", + GetTmpValue = "getTmpValue", + SetTmpValue = "setTmpValue", + Branch = "branch", + Block = "Block", + Sequence = "sequence", + NewTarget = "newtarget", + CustomFun = "customFun", + CustomFunStart = "customFunStart", + CustomFunReturn = "customFunReturn", + Expression = "expression", + Assertion = "Assertion" + } + interface IBPNode { + /** 数据唯一的id号*/ + id: number; + ver?: number; + /**当前的类 */ + target?: string; + name?: string; + /** constData的id号 */ + cid: string; + /**var或者event的id */ + dataId?: string; + customId?: number; + /**所有UI所用到的数据 */ + uiData?: { + /**数据的x坐标位置 */ + x: number; + /**数据的y坐标位置 */ + y: number; + /**函数注释 */ + desc?: any; + /**是否隐藏 */ + isHidden?: boolean; + /**是否显示desc的气泡 */ + isShowDesc?: boolean; + }; + debugType?: number; + input?: Record; + /**对应inputValue的type关键字,如果typeKey发生变化说明inputValue需要被清空 */ + typeKey?: string; + /**插槽上的默認值 */ + inputValue?: Record; + /**动态增加的input节点 */ + properties?: Array; + /**动态增加的输出节点 */ + outputs?: IBPCOutput[]; + output?: Record; + autoReg?: boolean; + } + interface IBPInput { + type?: Laya.FPropertyType; + /**插槽注释 */ + desc?: string; + class?: string; + resource?: string; + } + interface IBPOutput { + infoArr: IBPConnType[]; + } + interface IBPConnType { + /** 插槽连接到的另一个节点的id */ + nodeId: number; + /** 插槽连接到的另一个节点的第n个插槽 */ + index?: number; + /**连接到的input或者output的ID号 */ + id?: string; + /**连接到的input或者output的name */ + name?: string; + } + interface IBPProperty { + title?: string; + type: string; + data: any; + } + class BPArray { + length: number; + static getItem(arr: Array, index: number): T; + static setItem(arr: Array, index: number, value: T): void; + push(item: T): number; + pop(): T; + splice(start: number, deleteCount?: number): T; + shift(): T; + unshift(item: T): T; + join(separator?: string): string; + concat(item: ConcatArray): T; + } + class BPMathLib { + /** + * 两数相加 + * @param a 第一个数 + * @param b 第二个数 + * @returns 两数相加的结果 + */ + static add(a: number, b: number): number; + /** + * 两数相减 + * @param a 被减数 + * @param b 减数 + * @returns 两数相减的结果 + */ + static subtract(a: number, b: number): number; + /** + * 两数相乘 + * @param a 第一个数 + * @param b 第二个数 + * @returns 两数相乘的结果 + */ + static multiply(a: number, b: number): number; + /** + * 两数相除 + * @param a 被除数 + * @param b 除数 + * @returns 两数相除的结果 + * @throws 如果除数为0,则抛出错误 + */ + static divide(a: number, b: number): number; + /** + * 计算数字的幂次方 + * @param base 底数 + * @param exponent 指数 + * @returns 幂次方的结果 + */ + static power(base: number, exponent: number): number; + /** + * 计算平方根 + * @param value 数字 + * @returns 平方根的结果 + * @throws 如果数字为负数,则抛出错误 + */ + static sqrt(value: number): number; + /** + * 计算一个数的绝对值 + * @param value 数字 + * @returns 数字的绝对值 + */ + static abs(value: number): number; + /** + * 计算正弦值 + * @param angle 角度 + * @returns 正弦值 + */ + static sin(angle: number): number; + /** + * 计算余弦值 + * @param angle 角度 + * @returns 余弦值 + */ + static cos(angle: number): number; + /** + * 计算正切值 + * @param angle 角度 + * @returns 正切值 + */ + static tan(angle: number): number; + /** + * 计算反正弦值 + * @param value 数值 + * @returns 反正弦值 + */ + static asin(value: number): number; + /** + * 计算反余弦值 + * @param value 数值 + * @returns 反余弦值 + */ + static acos(value: number): number; + /** + * 计算反正切值 + * @param value 数值 + * @returns 反正切值 + */ + static atan(value: number): number; + /** + * 计算 y/x(弧度表示)的反正切值 + * @param y y 轴坐标 + * @param x x 轴坐标 + * @returns 弧度 + */ + static atan2(y: number, x: number): number; + /** + * 计算两点之间的距离 + * @param x1 第一个点的x坐标 + * @param y1 第一个点的y坐标 + * @param x2 第二个点的x坐标 + * @param y2 第二个点的y坐标 + * @returns 两点之间的距离 + */ + static distance(x1: number, y1: number, x2: number, y2: number): number; + /** + * 四舍五入到指定的小数位数 + * @param value 要四舍五入的数字 + * @param decimals 小数位数,默认为0 + * @returns 四舍五入后的结果 + */ + static round(value: number, decimals?: number): number; + /** + * 向下取整 + * @param value 数字 + * @returns 向下取整后的结果 + */ + static floor(value: number): number; + /** + * 向上取整 + * @param value 数字 + * @returns 向上取整后的结果 + */ + static ceil(value: number): number; + /** + * 计算余数 + * @param dividend 被除数 + * @param divisor 除数 + * @returns 余数 + */ + static mod(dividend: number, divisor: number): number; + /** + * 计算两数的最小值 + * @param a 第一个数 + * @param b 第二个数 + * @returns 两数的最小值 + */ + static min(a: number, b: number): number; + /** + * 计算两数的最大值 + * @param a 第一个数 + * @param b 第二个数 + * @returns 两数的最大值 + */ + static max(a: number, b: number): number; + /** + * 生成随机数,介于 0(包含) 到 1(不包括)之间 + * @returns 随机数 + */ + static random(): number; + /** + * 判断a是否大于b + * @param a 第一个数字 + * @param b 第二个数字 + * @returns 如果a大于b,则返回true;否则返回false + */ + static greater(a: number, b: number): boolean; + /** + * 判断a是否小于b + * @param a 第一个数字 + * @param b 第二个数字 + * @returns 如果a小于b,则返回true;否则返回false + */ + static less(a: number, b: number): boolean; + /** + * + * @param a + * @param b + * @returns 是否相同 + */ + static equal(a: any, b: any): any; + /** + * 判断a是否大于等于b + * @param a 第一个数字 + * @param b 第二个数字 + * @returns 如果a大于等于b,则返回true;否则返回false + */ + static greaterEqual(a: number, b: number): boolean; + /** + * 判断a是否小于等于b + * @param a 第一个数字 + * @param b 第二个数字 + * @returns 如果a小于等于b,则返回true;否则返回false + */ + static lessEqual(a: number, b: number): boolean; + } + class BPObject { + static getItem(obj: Record, key: string): T; + static setItem(obj: Record, key: string, value: T): void; + } + class ExpressParse { + _catch: Map; + static brackets: string[]; + static brackmap: any; + private static _instance; + static get instance(): ExpressParse; + private isOperator; + private tokenize; + parse(expression: string): ExpressTree; + } + class ExpressTree { + value: any; + left: ExpressTree | null; + right: ExpressTree | null; + static strReg: RegExp; + static realMap: any; + call(context: any): any; + constructor(value: any); + static autoFormat(value: string): any; + equal(value: any, context: any): void; + private static isNumber; + private static isString; + private static isExpress; + private static splitExpress; + clone(): ExpressTree; + static operatorPriority: any; + static _inited: boolean; + static parseProperty(express: string): ExpressTree; + static creatreExpressTree(express: string): ExpressTree; + static init(): void; + } + class ExpressOrgin extends ExpressTree { + constructor(value: any); + call(context: any): any; + } + class ExpressString extends ExpressTree { + constructor(value: any); + call(context: any): any; + } + class ExpressProperty extends ExpressTree { + constructor(value: any); + propertys: string[]; + realObj: any; + realKey: string; + equal(value: any, context: any): any; + call(context: any): any; + } + class ExpressFunction extends ExpressProperty { + params: ExpressTree[]; + call(context: any): any; + } + class ExpressDict extends ExpressTree { + call(context: any): any; + equal(value: any, context: any): void; + } + const Precedence: any; + class BlueprintExcuteNode extends BlueprintRunBase implements IRunAble { + owner: any; + varDefineMap: Map; + runtimeDataMgrMap: Map; + readCache: boolean; + private _cacheMap; + setCacheAble(node: BlueprintRuntimeBaseNode, runId: number, value: any): void; + getCacheAble(node: BlueprintRuntimeBaseNode, runId: number): boolean; + constructor(data: any); + finish(runtime: IBPRutime): void; + getDataMangerByID(id: string | symbol): IRuntimeDataManger; + initData(key: string | symbol, nodeMap: Map, localVarMap: Record, parentId?: string | symbol): void; + debuggerPause: boolean; + pushBack(excuteNode: IExcuteListInfo, callback: any): void; + getSelf(): any; + initVar(name: string, value: any): void; + setVar(name: string, value: any): void; + getVar(name: string): any; + getCode(): string; + beginExcute(runtimeNode: BlueprintRuntimeBaseNode, runner: IBPRutime, enableDebugPause: boolean, fromPin: BlueprintPinRuntime, parmsArray: any[], prePin: BlueprintPinRuntime): BlueprintPromise; + endExcute(runtimeNode: BlueprintRuntimeBaseNode): void; + parmFromCustom(parmsArray: any[], parm: any, parmname: string): void; + vars: { + [key: string]: any; + }; + parmFromOtherPin(current: BlueprintPinRuntime, runtimeDataMgr: IRuntimeDataManger, from: BlueprintPinRuntime, parmsArray: any[], runId: number): void; + parmFromSelf(current: BlueprintPinRuntime, runtimeDataMgr: IRuntimeDataManger, parmsArray: any[], runId: number): void; + parmFromOutPut(outPutParmPins: BlueprintPinRuntime[], runtimeDataMgr: IRuntimeDataManger, parmsArray: any[]): void; + excuteFun(nativeFun: Function, returnResult: BlueprintPinRuntime, runtimeDataMgr: IRuntimeDataManger, caller: any, parmsArray: any[], runId: number): any; + reCall(index: number): void; + } + class RuntimeDataManger implements IRuntimeDataManger { + id: symbol | string; + isInit: boolean; + /** + * 节点数据区Map + */ + nodeMap: Map; + /** + * 引脚数据Map + */ + pinMap: Map; + parmsArray: RuntimePinData[]; + localVarObj: any; + localVarMap: Map; + constructor(id: symbol | string); + saveContextData(from: number, to: number): void; + private _initGetVarObj; + clearVar(runId: number): void; + getVar(name: string, runId: number): any; + setVar(name: string, value: any, runId: number): void; + getDataById(nid: number): RuntimeNodeData; + getRuntimePinById(id: string): RuntimePinData; + setPinData(pin: BlueprintPinRuntime, value: any, runId: number): void; + getPinData(pin: BlueprintPinRuntime, runId: number): any; + initData(nodeMap: Map, localVarMap: Record): void; + } + class BlueprintGenCodeNode extends BlueprintRunBase implements IRunAble { + finish(runtime: IBPRutime): void; + setCacheAble(node: BlueprintRuntimeBaseNode, runId: number, value: any): void; + getCacheAble(node: BlueprintRuntimeBaseNode, runId: number): boolean; + getDataMangerByID(id: string | symbol): IRuntimeDataManger; + initData(key: string | symbol, nodeMap: Map): void; + debuggerPause: boolean; + readCache: boolean; + pushBack(excuteNode: IExcuteListInfo): void; + getSelf(): void; + reCall(index: number): void; + getVar(name: string): void; + initVar(name: string, value: any): void; + setVar(name: string, value: any): void; + find(input: any, outExcutes: BlueprintPinRuntime[]): BlueprintPinRuntime; + codes: string[][]; + currentFun: string[]; + vars: { + [key: string]: any; + }; + blockMap: Map; + beginExcute(runtimeNode: BlueprintRuntimeBaseNode): BlueprintPromise; + endExcute(runtimeNode: BlueprintRuntimeBaseNode): void; + parmFromOtherPin(current: BlueprintPinRuntime, runtimeDataMgr: IRuntimeDataManger, from: BlueprintPinRuntime, parmsArray: any[], runId: number): void; + parmFromSelf(current: BlueprintPinRuntime, runtimeDataMgr: IRuntimeDataManger, parmsArray: any[], runId: number): void; + parmFromOutPut(outPutParmPins: BlueprintPinRuntime[], runtimeDataMgr: IRuntimeDataManger, parmsArray: any[]): void; + parmFromCustom(parmsArray: any[], parm: any, parmname: string): void; + excuteFun(nativeFun: Function, returnResult: BlueprintPinRuntime, runtimeDataMgr: IRuntimeDataManger, caller: any, parmsArray: any[], runId: number): void; + toString(): string; + getCode(): string; + } + class BlueprintRunBase { + listNode: BlueprintRuntimeBaseNode[]; + } + class RuntimeNodeData { + map: Map; + callFunMap: Map; + eventName: string; + constructor(); + getCallFun(runId: number): Function; + setCallFun(runId: number, fun: Function): void; + getParamsArray(runId: number): any[]; + } + class RuntimePinData implements IOutParm { + name: string; + private value; + private valueMap; + constructor(); + copyValue(runId: number, toRunId: number): void; + initValue(value: any): void; + setValue(runId: number, value: any): void; + private getValueOnly; + getValue(runId: number): any; + } + class BluePrintBlock implements INodeManger, IBPRutime { + hasRefAnony: boolean; + localVarMap: Record; + get blockSourceType(): EBlockSource; + private poolIds; + protected _maxID: number; + /** + * block ID 注释 + */ + id: symbol | string; + /** + * block 名称 + */ + name: string; + /** + * 节点Map + */ + nodeMap: Map; + /** + * 执行list + */ + excuteList: BlueprintRuntimeBaseNode[]; + anonymousfunMap: Map; + anonymousBlockMap: Map; + dataMap: Record; + constructor(id: symbol | string); + getDataMangerByID(context: IRunAble): IRuntimeDataManger; + get bpId(): string; + getNodeById(id: any): BlueprintRuntimeBaseNode; + idToIndex: Map; + private _addNode; + optimizeByStart(value: BlueprintRuntimeBaseNode, excuteAbleList: BlueprintRuntimeBaseNode[]): void; + clear(): void; + optimize(): void; + protected onParse(bpjson: IBPNode[]): void; + append(node: BlueprintRuntimeBaseNode, item: IBPNode): void; + getRunID(): number; + _recoverRunID(id: number, runtimeDataMgr: IRuntimeDataManger): void; + recoverRunID(id: number, runtimeDataMgr: IRuntimeDataManger): void; + runAnonymous(context: IRunAble, event: BlueprintEventNode, parms: any[], cb: Function, runId: number, execId: number, newRunId: number, oldRuntimeDataMgr: IRuntimeDataManger): boolean; + runByContext(context: IRunAble, runtimeDataMgr: IRuntimeDataManger, node: IExcuteListInfo, enableDebugPause: boolean, cb: Function, runId: number, fromPin: BlueprintPinRuntime, prePin: BlueprintPinRuntime, notRecover?: boolean): boolean; + finish(context: IRunAble): void; + } + enum EBlockSource { + Unknown = 0, + Main = 1, + Function = 2 + } + class BluePrintComplexBlock extends BluePrintBlock { + static EventId: number; + private _asList; + private _pendingClass; + private _eventId; + constructor(id: symbol | string); + protected initEventBlockMap(map: Map, eventMap: Map): void; + optimize(): void; + parse(bpjson: Array, getCNodeByNode: (node: IBPNode) => IBPCNode, varMap: Record): void; + private _onReParse; + protected onEventParse(eventName: string): void; + private _checkReady; + append(node: BlueprintRuntimeBaseNode, item: IBPNode): void; + finishChild(context: IRunAble, runtime: IBPRutime): void; + } + class BluePrintEventBlock extends BluePrintBlock { + protected parentId: symbol | string; + protected parent: BluePrintComplexBlock; + haRef: boolean; + static findParamPin(node: BlueprintRuntimeBaseNode, nodeMap: Map, anonymousfunMap: Map, excuteList: BlueprintRuntimeBaseNode[], bluePrintEventBlock: BluePrintEventBlock): void; + init(event: BlueprintEventNode): void; + private _checkRef; + optimizeByBlockMap(parent: BluePrintComplexBlock): void; + getRunID(): number; + recoverRunID(id: number, runtimeDataMgr: IRuntimeDataManger): void; + run(context: IRunAble, event: BlueprintEventNode, parms: any[], cb: Function, runId: number, execId: number): boolean; + getDataMangerByID(context: IRunAble): IRuntimeDataManger; + get bpId(): string; + get blockSourceType(): EBlockSource; + finish(context: IRunAble): void; + } + class BluePrintFunBlock extends BluePrintComplexBlock { + mainBlock: BluePrintMainBlock; + funStart: BlueprintCustomFunStart; + isStatic: boolean; + funBlock: BluePrintFunStartBlock; + get bpId(): string; + get blockSourceType(): EBlockSource; + optimize(): void; + protected onParse(bpjson: IBPNode[]): void; + parse(bpjson: IBPNode[], getCNodeByNode: (node: IBPNode) => IBPCNode, varMap: Record): void; + run(context: IRunAble, eventName: string, parms: any[], cb: Function, runId: number, execId: number, outExcutes: BlueprintPinRuntime[], runner: IBPRutime, oldRuntimeDataMgr: IRuntimeDataManger): boolean; + } + class BluePrintFunStartBlock extends BluePrintEventBlock { + funEnds: BlueprintCustomFunReturn[]; + funStart: BlueprintCustomFunStart; + init(event: BlueprintCustomFunStart): void; + runFun(context: IRunAble, eventName: string, parms: any[], cb: Function, runId: number, execId: number, outExcutes: BlueprintPinRuntime[], runner: IBPRutime, oldRuntimeDataMgr: IRuntimeDataManger): boolean; + } + class BluePrintMainBlock extends BluePrintComplexBlock { + autoAnonymousfuns: BlueprintEventNode[]; + autoRunNodes: BlueprintAutoRun[]; + eventBlockMap: Map; + constructor(id: symbol); + get bpName(): string; + get blockSourceType(): EBlockSource; + eventMap: Map; + cls: Function; + optimize(): void; + protected onEventParse(eventName: string): void; + protected _onEventParse(...args: any[]): void; + append(node: BlueprintRuntimeBaseNode, item: IBPNode): void; + runAuto(context: IRunAble): void; + run(context: IRunAble, event: BlueprintEventNode, parms: any[], cb: Function, runId: number, execId: number): boolean; + finishChild(context: IRunAble, runtime: IBPRutime): void; + } + class BlueprintFactory { + static readonly bpSymbol: unique symbol; + static readonly contextSymbol: unique symbol; + static readonly onChangeSymbol: unique symbol; + static readonly autoRunSymbol: unique symbol; + private static _funMap; + private static _instance; + private static _bpMap; + private static _bpContextMap; + static bpNewMap: Map; + static BPExcuteCls: any; + static BPRuntimeCls: any; + /** + * 根据节点类型创建相应的对象 + * @param type + * @param cls + */ + static regBPClass(type: BPType, cls: new () => BlueprintRuntimeBaseNode): void; + static regFunction(fname: string, fun: Function, isMember?: boolean, cls?: any, target?: string): void; + static getFunction(fname: string, target: string): [ + Function, + boolean + ]; + static regBPContextData(type: BPType, cls: new () => RuntimeNodeData): void; + static getBPContextData(type: BPType): new () => RuntimeNodeData; + /** + * 生成类 + * @param name + * @param cls + * @returns + */ + static createCls(name: string, cls: T): T; + /** + * 解析数组 + * @param name + * @param isPlaying + * @param newClass + * @param data + * @param funs + * @param varMap + */ + static parseCls(name: string, saveData: IBPSaveData, newClass: any, data: IBPStageData, funs: IBPStageData[], varMap: Record, preload: string[]): void; + static createClsNew(name: string, saveData: IBPSaveData, cls: T, data: IBPStageData, funs: IBPStageData[], varMap: Record): T; + static initClassHook(parent: string, cls: Function): void; + static onPropertyChanged_EM(bp: any): void; + static get instance(): BlueprintFactory; + createNew(config: IBPCNode, item: IBPNode): BlueprintRuntimeBaseNode; + } + class BlueprintPinRuntime extends BlueprintPin { + /** + * 所属节点 + */ + owner: BlueprintRuntimeBaseNode; + step(context: IRunAble, runtimeDataMgr: IRuntimeDataManger, runner: IBPRutime, runId: number, prePin: BlueprintPinRuntime): BlueprintPinRuntime | BlueprintPromise | number; + excute(context: IRunAble, runtimeDataMgr: IRuntimeDataManger, runner: IBPRutime, runId: number): BlueprintPinRuntime; + getValueCode(): any; + } + class BlueprintPromise implements IExcuteListInfo { + nid: number; + enableDebugPause: boolean; + pin: BlueprintPinRuntime; + prePin: BlueprintPinRuntime; + static create(): BlueprintPromise; + private _completed; + private _callback; + /** + * 等待行为完成回调 + * @param callback 完成回调接口 + */ + wait(callback: (mis: BlueprintPromise) => void): void; + hasCallBack(): boolean; + complete(): void; + recover(): void; + clear(): void; + } + class BlueprintRuntime { + isRunningInIDE: boolean; + mainBlock: BluePrintMainBlock; + funBlockMap: Map; + varMap: Record; + dataMap: Record; + constructor(); + run(context: IRunAble, event: BlueprintEventNode, parms: any[], cb: Function): void; + /** + * 执行自定义函数 + * @param context + * @param funName + * @param parms + */ + runCustomFun(context: IRunAble, funId: string, parms: any[], cb: Function, runId: number, execId: number, outExcutes: BlueprintPinRuntime[], runner: IBPRutime, oldRuntimeDataMgr: IRuntimeDataManger): boolean; + parse(mainBlockData: IBPStageData, getCNodeByNode: (node: IBPNode) => IBPCNode, varMap: Record, newCls: Function): void; + parseFunction(funData: IBPStageData, getCNodeByNode: (node: IBPNode) => IBPCNode): void; + toCode(context: IRunAble): void; + } + /** + * + */ + class BlueprintStaticFun { + /** + * @private + * @param outExcutes + * @param input + * @returns + */ + static switchFun(outExcutes: BlueprintPinRuntime[], input: any): BlueprintPinRuntime; + /** + * 打印 + * @param str + */ + static print(str: string): void; + static getTempVar(name: string, runtimeDataMgr: IRuntimeDataManger, runId: number): any; + static setTempVar(value: any, name: string, runtimeDataMgr: IRuntimeDataManger, runId: number): void; + /** + * @private + * @param target + * @param name + * @param context + * @returns + */ + static getVariable(target: IBluePrintSubclass, name: string, context: IRunAble): any; + /** + * @private + * @param target + * @param name + * @param context + * @returns + */ + static getSelf(name: string, context: IRunAble): any; + /** + * @private + * @param target + * @param value + * @param name + * @param context + */ + static setVariable(target: IBluePrintSubclass, value: any, name: string, context: IRunAble): any; + /** + * 等待 + * @param second + * @returns + */ + static waitTime(second: number): Promise; + /** + * @private + * @returns + */ + static expression(): boolean; + /** + * @private + * @param target + * @param value + * @param name + * @param context + */ + static typeInstanceof(outExcutes: BlueprintPinRuntime[], target: any, type: new () => T): BlueprintPinRuntime; + /** + * @private + * @param nextExec + * @param outPutParmPins + * @param parms + * @param context + * @param runner + * @param runtimeDataMgr + */ + private static runBranch; + /** + * @private + * @param target + * @param value + * @param name + * @param context + */ + static forEach(inputExcute: BlueprintPinRuntime, inputExcutes: BlueprintPinRuntime[], outExcutes: BlueprintPinRuntime[], outPutParmPins: BlueprintPinRuntime[], context: IRunAble, runner: IBPRutime, runtimeDataMgr: IRuntimeDataManger, runId: number, array: any[]): BlueprintPinRuntime; + /** + * @private + * @param target + * @param value + * @param name + * @param context + */ + static forEachWithBreak(inputExcute: BlueprintPinRuntime, inputExcutes: BlueprintPinRuntime[], outExcutes: BlueprintPinRuntime[], outPutParmPins: BlueprintPinRuntime[], context: IRunAble, runner: IBPRutime, runtimeDataMgr: IRuntimeDataManger, runId: number, array: any[]): BlueprintPinRuntime; + /** + * @private + * @param target + * @param value + * @param name + * @param context + */ + static forLoop(inputExcute: BlueprintPinRuntime, inputExcutes: BlueprintPinRuntime[], outExcutes: BlueprintPinRuntime[], outPutParmPins: BlueprintPinRuntime[], context: IRunAble, runner: IBPRutime, runtimeDataMgr: IRuntimeDataManger, runId: number, firstIndex: number, lastIndex: number, step?: number): BlueprintPinRuntime; + /** + * @private + * breakNode 1 代表只在执行中,2代表执行中断,0代表执行完毕 + */ + static forLoopWithBreak(inputExcute: BlueprintPinRuntime, inputExcutes: BlueprintPinRuntime[], outExcutes: BlueprintPinRuntime[], outPutParmPins: BlueprintPinRuntime[], context: IRunAble, runner: IBPRutime, runtimeDataMgr: IRuntimeDataManger, runId: number, firstIndex: number, lastIndex: number, step?: number): BlueprintPinRuntime; + /** + * 执行表达式 + * @param express + * @param a + * @param b + * @param c + * @returns + */ + static runExpress(express: string, a: any, b: any, c: any): any; + } + interface IBPRutime { + readonly name: string; + readonly blockSourceType: EBlockSource; + readonly bpId: string; + getDataMangerByID(context: IRunAble): IRuntimeDataManger; + getRunID(): number; + runAnonymous(context: IRunAble, event: BlueprintEventNode, parms: any[], cb: Function, runId: number, execId: number, newRunId: number, oldRuntimeDataMgr: IRuntimeDataManger): boolean; + runByContext(context: IRunAble, runtimeDataMgr: IRuntimeDataManger, node: IExcuteListInfo, enableDebugPause: boolean, cb: Function, runid: number, fromPin: BlueprintPinRuntime, prePin: BlueprintPinRuntime, notRecover?: boolean): boolean; + } + interface IRunAble { + debuggerPause: boolean; + readCache: boolean; + pushBack(excuteNode: IExcuteListInfo, callback: any): void; + readonly vars: { + [key: string]: any; + }; + beginExcute(runtimeNode: BlueprintRuntimeBaseNode, runner: IBPRutime, enableDebugPause: boolean, fromPin: BlueprintPinRuntime, parmsArray: any[], prePin: BlueprintPinRuntime): BlueprintPromise; + endExcute(runtimeNode: BlueprintRuntimeBaseNode): void; + parmFromOtherPin(current: BlueprintPinRuntime, runtimeDataMgr: IRuntimeDataManger, from: BlueprintPinRuntime, parmsArray: any[], runId: number): void; + parmFromSelf(current: BlueprintPinRuntime, runtimeDataMgr: IRuntimeDataManger, parmsArray: any[], runId: number): void; + parmFromOutPut(outPutParmPins: BlueprintPinRuntime[], runtimeDataMgr: IRuntimeDataManger, parmsArray: any[]): void; + parmFromCustom(parmsArray: any[], parm: any, parmname: string): void; + excuteFun(nativeFun: Function, returnResult: BlueprintPinRuntime, runtimeDataMgr: IRuntimeDataManger, caller: any, parmsArray: any[], runId: number): any; + getCode(): string; + getVar(name: string): any; + setVar(name: string, value: any): void; + initVar(name: string, value: any): void; + reCall(index: number): void; + getSelf(): any; + initData(key: string | symbol, nodeMap: Map, localVarMap: Record, parentId?: string | symbol): void; + getDataMangerByID(id: symbol | string): IRuntimeDataManger; + setCacheAble(node: BlueprintRuntimeBaseNode, runId: number, value: any): void; + getCacheAble(node: BlueprintRuntimeBaseNode, runId: number): boolean; + finish(runtime: IBPRutime): void; + } + class BluePrintAsNode extends BlueprintRuntimeBaseNode { + optimize(): void; + } + class BlueprintAutoRun extends BlueprintRuntimeBaseNode { + protected colloctParam(context: IRunAble, runtimeDataMgr: IRuntimeDataManger, inputPins: BlueprintPinRuntime[], runner: IBPRutime, runId: number, prePin: BlueprintPinRuntime): any[]; + } + class BluePrintBlockNode extends BlueprintComplexNode { + deal: (inputExcute: BlueprintPinRuntime, inputExcutes: BlueprintPinRuntime[], outExcutes: BlueprintPinRuntime[], outPutParmPins: BlueprintPinRuntime[], context: IRunAble, runner: IBPRutime, runtimeDataMgr: IRuntimeDataManger, runId: number, ...args: any) => BlueprintPinRuntime; + next(context: IRunAble, runtimeDataMgr: IRuntimeDataManger, parmsArray: any[], runner: IBPRutime, enableDebugPause: boolean, runId: number, fromPin: BlueprintPinRuntime): BlueprintPinRuntime; + setFunction(fun: Function): void; + } + class BlueprintComplexNode extends BlueprintRuntimeBaseNode { + /** + * 输入引脚 + */ + inExcutes: BlueprintPinRuntime[]; + constructor(); + next(context: IRunAble, runtimeDataMgr: IRuntimeDataManger, parmsArray: any[], runner: IBPRutime, enableDebugPause: boolean, runId: number, fromPin: BlueprintPinRuntime): BlueprintPinRuntime; + find: (outExcutes: BlueprintPinRuntime[], ...args: any) => BlueprintPinRuntime; + addPin(pin: BlueprintPinRuntime): void; + setFunction(fun: Function): void; + } + class BlueprintCustomFunNode extends BlueprintFunNode { + /** + * 输入引脚 + */ + inExcutes: BlueprintPinRuntime[]; + functionID: string; + staticContext: IRunAble; + bpruntime: BlueprintRuntime; + private _isCheck; + constructor(); + colloctParam(context: IRunAble, runtimeDataMgr: IRuntimeDataManger, inputPins: BlueprintPinRuntime[], runner: IBPRutime, runId: number, prePin: BlueprintPinRuntime): any[]; + private _checkFun; + protected onParseLinkData(node: IBPNode, manger: INodeManger): void; + protected excuteFun(context: IRunAble, runtimeDataMgr: IRuntimeDataManger, runner: IBPRutime, caller: IBluePrintSubclass, parmsArray: any[], runId: number, fromPin: BlueprintPinRuntime): Promise; + protected _excuteFun(context: IRunAble, cb: any, parmsArray: any[], runner: IBPRutime): void; + addPin(pin: BlueprintPinRuntime): void; + optimize(): void; + setFunction(fun: Function, isMember: boolean): void; + customFun(parms: any[]): void; + } + class BlueprintCustomFunReturn extends BlueprintRuntimeBaseNode { + /** + * 输入引脚 + */ + inExcutes: BlueprintPinRuntime[]; + constructor(); + step(context: IRunAble, runtimeDataMgr: IRuntimeDataManger, fromExcute: boolean, runner: IBPRutime, enableDebugPause: boolean, runId: number, fromPin: BlueprintPinRuntime, prePin: BlueprintPinRuntime): BlueprintPinRuntime | BlueprintPromise | number; + initData(runtimeDataMgr: IRuntimeDataManger, curRunId: number, runId: number, parms: any[], offset: number, outExcutes: BlueprintPinRuntime[], runner: IBPRutime, oldRuntimeDataMgr: IRuntimeDataManger): void; + addPin(pin: BlueprintPinRuntime): void; + } + class BlueprintCustomFunReturnContext extends RuntimeNodeData { + returnMap: Map; + runIdMap: Map; + outExcutesMap: Map; + runnerMap: Map; + constructor(); + initData(curRunId: number, runId: number, parms: any[], offset: number, outExcutes: BlueprintPinRuntime[], runner: IBPRutime, runtimeDataMgr: IRuntimeDataManger): void; + runExcute(runId: number, index: number, context: IRunAble): void; + returnResult(runId: number, curRunId: number): void; + } + class BlueprintCustomFunStart extends BlueprintEventNode { + protected onParseLinkData(node: IBPNode, manger: INodeManger): void; + } + class BlueprintEventNode extends BlueprintRuntimeBaseNode { + /** + * 输出引脚 + */ + outExcute: BlueprintPinRuntime; + eventName: string; + autoReg: boolean; + isAnonymous: boolean; + constructor(); + protected onParseLinkData(node: IBPNode, manger: INodeManger): void; + setFunction(fun: Function, isMember: boolean): void; + emptyExcute(context: IRunAble, runtimeDataMgr: IRuntimeDataManger, fromExcute: boolean, runner: IBPRutime, enableDebugPause: boolean, runId: number, fromPin: BlueprintPinRuntime): BlueprintPinRuntime | BlueprintPromise; + step(context: IRunAble, runtimeDataMgr: IRuntimeDataManger, fromExcute: boolean, runner: IBPRutime, enableDebugPause: boolean, runId: number, fromPin: BlueprintPinRuntime, prePin: BlueprintPinRuntime): BlueprintPinRuntime | BlueprintPromise; + addPin(pin: BlueprintPinRuntime): void; + optimize(): void; + initData(runtimeDataMgr: IRuntimeDataManger, parms: any[], curRunId: number): void; + } + class BlueprintFunNode extends BlueprintRuntimeBaseNode { + /** + * 输入引脚 + */ + inExcute: BlueprintPinRuntime; + /** + * 输出引脚 + */ + outExcute: BlueprintPinRuntime; + eventName: string; + constructor(); + protected onParseLinkData(node: IBPNode, manger: INodeManger): void; + private excuteHookFun; + protected excuteFun(context: IRunAble, runtimeDataMgr: IRuntimeDataManger, runner: IBPRutime, caller: any, parmsArray: any[], runId: number, fromPin: BlueprintPinRuntime): any; + next(): BlueprintPinRuntime; + addPin(pin: BlueprintPinRuntime): void; + optimize(): void; + } + class BlueprintGetTempVarNode extends BlueprintRuntimeBaseNode { + protected _varKey: string; + constructor(); + protected onParseLinkData(node: IBPNode, manger: INodeManger): void; + step(context: IRunAble, runtimeDataMgr: IRuntimeDataManger, fromExcute: boolean, runner: IBPRutime, enableDebugPause: boolean, runId: number, fromPin: BlueprintPinRuntime, prePin: BlueprintPinRuntime): BlueprintPinRuntime | BlueprintPromise; + } + class BlueprintGetVarNode extends BlueprintRuntimeBaseNode { + protected _varKey: string; + constructor(); + protected onParseLinkData(node: IBPNode, manger: INodeManger): void; + step(context: IRunAble, runtimeDataMgr: IRuntimeDataManger, fromExcute: boolean, runner: IBPRutime, enableDebugPause: boolean, runId: number, fromPin: BlueprintPinRuntime, prePin: BlueprintPinRuntime): BlueprintPinRuntime | BlueprintPromise; + } + class BlueprintNewTargetNode extends BlueprintRuntimeBaseNode { + cls: ClassDecorator; + parse(def: IBPCNode): void; + step(context: IRunAble, runtimeDataMgr: IRuntimeDataManger, fromExcute: boolean, runner: IBPRutime, enableDebugPause: boolean, runId: number, fromPin: BlueprintPinRuntime, prePin: BlueprintPinRuntime): BlueprintPinRuntime | BlueprintPromise; + } + class BlueprintRuntimeBaseNode extends BlueprintNode implements IExcuteListInfo { + private _refNumber; + staticNext: BlueprintPinRuntime; + private static _EMPTY; + nativeFun: Function; + isMember: boolean; + funcode: string; + canCache: boolean; + /** + * 输入参数列表 + */ + inPutParmPins: BlueprintPinRuntime[]; + /** + * 输出参数列表 + */ + outPutParmPins: BlueprintPinRuntime[]; + returnValue: BlueprintPinRuntime; + /** + * 输出引脚 + */ + outExcutes: BlueprintPinRuntime[]; + tryExcute: (context: IRunAble, runtimeDataMgr: IRuntimeDataManger, fromExcute: boolean, runner: IBPRutime, enableDebugPause: boolean, runId: number, fromPin: BlueprintPinRuntime, prePin: BlueprintPinRuntime) => BlueprintPinRuntime | BlueprintPromise | number; + hasDebugger: boolean; + constructor(); + addRef(): void; + getRef(): number; + emptyExcute(context: IRunAble, runtimeDataMgr: IRuntimeDataManger, fromExcute: boolean, runner: IBPRutime, enableDebugPause: boolean, runId: number, fromPin: BlueprintPinRuntime): BlueprintPinRuntime | BlueprintPromise; + createPin(def: TBPPinDef): BlueprintPinRuntime; + protected excuteFun(context: IRunAble, runtimeDataMgr: IRuntimeDataManger, runner: IBPRutime, caller: any, parmsArray: any[], runId: number, fromPin: BlueprintPinRuntime): any; + protected colloctParam(context: IRunAble, runtimeDataMgr: IRuntimeDataManger, inputPins: BlueprintPinRuntime[], runner: IBPRutime, runId: number, prePin: BlueprintPinRuntime): any[]; + private _checkRun; + step(context: IRunAble, runtimeDataMgr: IRuntimeDataManger, fromExcute: boolean, runner: IBPRutime, enableDebugPause: boolean, runId: number, fromPin: BlueprintPinRuntime, prePin: BlueprintPinRuntime): BlueprintPinRuntime | BlueprintPromise | number; + next(context: IRunAble, runtimeDataMgr: IRuntimeDataManger, parmsArray: any[], runner: IBPRutime, enableDebugPause: boolean, runId: number, fromPin: BlueprintPinRuntime): BlueprintPinRuntime; + addPin(pin: BlueprintPinRuntime): void; + optimize(): void; + setFunction(fun: Function, isMember: boolean): void; + protected addNextPIn(): void; + } + class BlueprintSequenceNode extends BlueprintComplexNode { + next(context: IRunAble, runtimeDataMgr: IRuntimeDataManger, parmsArray: any[], runner: IBPRutime, enableDebugPause: boolean, runId: number): BlueprintPinRuntime; + setFunction(fun: Function): void; + } + class BlueprintSetTempVarNode extends BlueprintFunNode { + protected _varKey: string; + constructor(); + protected onParseLinkData(node: IBPNode, manger: INodeManger): void; + step(context: IRunAble, runtimeDataMgr: IRuntimeDataManger, fromExcute: boolean, runner: IBPRutime, enableDebugPause: boolean, runId: number, fromPin: BlueprintPinRuntime, prePin: BlueprintPinRuntime): BlueprintPinRuntime | BlueprintPromise; + } + class BlueprintSetVarNode extends BlueprintFunNode { + protected _varKey: string; + constructor(); + protected onParseLinkData(node: IBPNode, manger: INodeManger): void; + step(context: IRunAble, runtimeDataMgr: IRuntimeDataManger, fromExcute: boolean, runner: IBPRutime, enableDebugPause: boolean, runId: number, fromPin: BlueprintPinRuntime, prePin: BlueprintPinRuntime): BlueprintPinRuntime | BlueprintPromise; + } + class TestBluePrint { + static BPMap: Map; + regBPNode(): void; + testBPNode(): void; + constructor(); + } + class test { + constructor(); + } +} diff --git a/shudu/engine/types/LayaAir.d.ts b/shudu/engine/types/LayaAir.d.ts new file mode 100644 index 0000000..fe35178 --- /dev/null +++ b/shudu/engine/types/LayaAir.d.ts @@ -0,0 +1,71386 @@ +/** + * @en Laya is the reference entry for global objects. + * - The Laya class refers to some commonly used global objects, such as Laya.stage: stage, Laya.timer: time manager, Laya.loader: loading manager. Pay attention to case when using. + * @zh Laya是全局对象的引用入口集。 + * - Laya类引用了一些常用的全局对象,比如Laya.stage:舞台,Laya.timer:时间管理器,Laya.loader:加载管理器,使用时注意大小写。 + */ +declare class Laya { + /** + * @en Reference to the stage object. + * @zh 舞台对象的引用。 + */ + static stage: Laya.Stage; + /** + * @ignore + * @en System clock manager, used by the engine internally. + * @zh 系统时钟管理器,引擎内部使用。 + */ + static systemTimer: Laya.Timer; + /** + * @ignore + * @en physics clock manager for components. + * @zh 组件的物理时钟管理器 + */ + static physicsTimer: Laya.Timer; + /** + * @en Main game timer, also manages scene, animation, tween effects clock. By controlling this timer's scale, fast-forward and slow-motion effects can be achieved. + * @zh 游戏主时针,同时也是管理场景,动画,缓动等效果时钟,通过控制本时针缩放,达到快进慢播效果。 + */ + static timer: Laya.Timer; + /** + * @en Reference to the loading manager. + * @zh 加载管理器的引用。 + */ + static loader: Laya.Loader; + /** + * @ignore + * @en Reference to the Render class. + * @zh Render类的引用。 + */ + static render: Laya.Render; + private static _inited; + private static _initCallbacks; + private static _beforeInitCallbacks; + private static _afterInitCallbacks; + private static _evcode; + private static isNativeRender_enable; + /** + * @en Initialize the engine. To use the engine, you need to initialize it first. + * @param stageConfig Stage settings used to initialize the engine + * @zh 初始化引擎。使用引擎需要先初始化引擎。 + * @param stageConfig 初始化引擎的舞台设置。 + */ + static init(stageConfig?: Laya.IStageConfig): Promise; + /** + * @en Initialize the engine. To use the engine, you need to initialize it first. + * @param width The width of the initialized game window, also known as design width. + * @param height The height of the initialized game window, also known as design height. + * @zh 初始化引擎。使用引擎需要先初始化引擎。 + * @param width 初始化的游戏窗口宽度,又称设计宽度。 + * @param height 初始化的游戏窗口高度,又称设计高度。 + */ + static init(width: number, height: number): Promise; + /** + * @en Initialize 2D rendering. + * @param stageConfig Settings used to initialize 2D rendering. + * @zh 初始化2D渲染。 + * @param stageConfig 用于初始化2D的设置。 + */ + static initRender2D(stageConfig: Laya.IStageConfig): void; + /** + * @en Pop up error information, suitable for mobile devices and other convenient debugging. + * @param value Indicates whether to capture global errors and display a prompt. When set to true, detailed error stacks can be thrown in a pop-up window if unknown errors occur. The default is false. + * @zh 弹出错误信息,适用于移动设备等不方便调试的时候, + * @param value 表示是否捕获全局错误并弹出提示。设置为true后,如有未知错误,可以弹窗抛出详细错误堆栈,默认为false。 + */ + static alertGlobalError(value: boolean): void; + /** + * @en Enable DebugPanel. + * @param debugJsPath Path to the laya.debugtool.js file. + * @zh 开启DebugPanel。 + * @param debugJsPath laya.debugtool.js文件路径。 + */ + static enableDebugPanel(debugJsPath?: string): void; + /** + * @en Adds an initialization function. Various engine modules, such as physics, pathfinding, etc., can register their initialization logic here if needed. + * Developers typically do not use this directly. All registered callbacks are executed in parallel. + * @param callback The initialization function of the module. + * @zh 新增初始化函数,引擎各个模块,例如物理,寻路等,如果有初始化逻辑可以在这里注册初始化函数。 + * 开发者一般不直接使用。所有注册的回调是并行执行。 + * @param callback 模块的初始化函数。 + */ + static addInitCallback(callback: () => void | Promise): void; + /** + * @en Execute custom logic before engine initialization. At this time, the Stage has not been created yet, so you can modify stageConfig to implement dynamic stage configuration. All registered callbacks are executed in the order of registration. + * @param callback The initialization function of the module. + * @zh 在引擎初始化前执行自定义逻辑。 + * 此时 Stage 尚未创建,可以修改 stageConfig 实现动态舞台配置。所有注册的回调按注册顺序依次执行。 + * @param callback 模块的初始化函数。 + */ + static addBeforeInitCallback(callback: (stageConfig: Laya.IStageConfig) => void | Promise): void; + /** + * @en Execute custom logic after engine initialization. All registered callbacks are executed in the order of registration. + * @param callback The initialization function of the module. + * @zh 在引擎初始化后执行自定义逻辑。所有注册的回调按注册顺序依次执行。 + * @param callback 模块的初始化函数。 + */ + static addAfterInitCallback(callback: () => void | Promise): void; +} +declare var addInitCallback: typeof Laya.addInitCallback; +declare var addBeforeInitCallback: typeof Laya.addBeforeInitCallback; +declare var addAfterInitCallback: typeof Laya.addAfterInitCallback; +/** + * @en Laya3D class is used to initialize 3D settings. + * @zh Laya3D类用于初始化3D设置。 + */ +declare class Laya3D { + /** + * @en Physics creation manager. + * @zh 物理创建管理器。 + */ + static _PhysicsCreateUtil: Laya.IPhysicsCreateUtil; + /** + * @en The physics creation manager. + * @zh 物理创建管理器。 + */ + static get PhysicsCreateUtil(): Laya.IPhysicsCreateUtil; + static set PhysicsCreateUtil(value: Laya.IPhysicsCreateUtil); + /** + * @en Whether physics is enabled. + * @zh 是否启用物理。 + * @returns {boolean} True if physics is enabled, false otherwise. + * @returns {boolean} 如果启用了物理则返回true,否则返回false。 + */ + static get enablePhysics(): any; +} +declare module Laya { + /** + * @en Config is used to set some global parameters. If you need to change them, please set them before initializing the engine. + * @zh Config类用于配置一些全局参数。如需更改,请在初始化引擎之前设置。 + */ + class Config { + /** + * @en Canvas setting for anti-aliasing, only effective for 2D(WebGL). 3D anti-aliasing is controlled on the camera or RT. + * @zh 画布设置是否抗锯齿,只对2D(WebGL)有效,3D抗锯齿在camera或RT上面控制。 + */ + static isAntialias: boolean; + /** + * @en Whether to use WebGL2 + * @zh 是否使用WebGL2 + */ + static useWebGL2: boolean; + /** + * @en FPS limit + * @zh 限制FPS + */ + static FPS: number; + /** + * @en Whether to use retina mode, which may create larger RT on iOS for better effects + * @zh 是否使用视网膜模式,在iOS上面可能会创建更大的RT,来达到更佳的效果 + */ + static useRetinalCanvas: boolean; + /** + * @en Default playback interval for 2D animation, in milliseconds. + * @zh 2D动画 Animation 的默认播放时间间隔,单位为毫秒。 + */ + static animationInterval: number; + /** + * @en When using WebGL to render 2D, whether to allocate enough cache for 64k vertices each time a VB is created. This can improve efficiency. + * @zh 当使用WebGL渲染2D的时候,每次创建VB是否直接分配足够64k个顶点的缓存。这样可以提高效率。 + */ + static webGL2D_MeshAllocMaxMem: boolean; + /** + * @en Default text size, default is 12 + * @zh 默认文本大小,默认为12 + */ + static defaultFontSize: number; + /** + * @en Default font, default is Arial + * @zh 默认文本字体,默认为Arial + */ + static defaultFont: string; + /** + * @en Set whether the canvas is transparent, only effective for 2D(WebGL) and 3D. + * @zh 设置画布是否透明,只对2D(WebGL)、3D有效。 + */ + static isAlpha: boolean; + /** + * @en Set whether the canvas contains depth + * @zh 设置画布是否包含深度 + */ + static isDepth: boolean; + /** + * @en Boolean value indicating whether to create this context in a system with low performance + * @zh 表明在一个系统性能低的环境是否创建该上下文 + */ + static isfailIfMajorPerformanceCaveat: boolean; + /** + * @en Power preference for the WebGL/WebGPU context. Hints the browser about the desired GPU configuration. + * - "default": Let the browser decide. In WebGPU mode, this is automatically set to "high-performance". + * - "high-performance": Prefer high-performance GPU. Use for graphically intensive applications. + * - "low-power": Prefer low-power GPU. Suitable for energy-efficient applications. + * @zh 图形(WebGL/WebGPU)上下文的电源偏好设置。向浏览器提示所需的 GPU 配置。 + * - "default":让浏览器决定。在 WebGPU 模式下,`default`会让引擎自动设置为`high-performance`。 + * - "high-performance":倾向于高性能 GPU。用于图形密集型应用。 + * - "low-power":倾向于低功耗 GPU。适用于节能的应用。 + */ + static powerPreference: WebGLPowerPreference; + /** + * @en Set whether the canvas is pre-multiplied, only effective for 2D(WebGL) and 3D. + * @zh 设置画布是否预乘,只对2D(WebGL)、3D有效。 + */ + static premultipliedAlpha: boolean; + /** + * @en Set whether to enable stencil buffer for the canvas, only effective for 2D(WebGL) and 3D. + * @zh 设置画布的是否开启模板缓冲,只对2D(WebGL)、3D有效。 + */ + static isStencil: boolean; + /** + * @en Whether to preserve the drawing buffer. + * @zh 是否保留渲染缓冲区。 + */ + static preserveDrawingBuffer: boolean; + /** + * @en Whether to print WebGL instructions and locate WebGL errors + * @zh 是否打印WebGL指令,同时定位WebGL报错 + */ + static printWebglOrder: boolean; + /** + * @en On iOS, some fonts may not be found. The engine provides font mapping functionality. For example, by default, "黑体" is mapped to "黑体-简". More mappings can be added. + * @zh 在iOS下,一些字体会找不到,引擎提供了字体映射功能,比如默认会把 "黑体" 映射为 "黑体-简",更多映射,可以自己添加 + */ + static fontFamilyMap: any; + /** + * @en Whether to use a fixed frame rate for rendering and updates. + * - When true: Rendering and logic updates are limited to the frame rate defined by Config.FPS. Ensures consistent application speed across different devices. + * - When false: Updates occur on every requestAnimationFrame callback. Can lead to varying application speeds on different devices. + * @zh 是否使用固定帧率进行渲染和更新。 + * - 当为 true 时:渲染和逻辑更新被限制在由 Config.FPS 定义的帧率内。确保在不同设备上应用程序运行速度一致。 + * - 当为 false 时:在每次 requestAnimationFrame 回调时进行更新。可能导致在不同设备上应用程序运行速度不同。 + */ + static fixedFrames: boolean; + /** + * @en Whether to immediately delete resources when the reference parameter is 0. If not immediate deletion, please call DestrotyUnUse + * @zh 资源引用参数为0是否立即删除资源,如果不立即删除请调用DestrotyUnUse + */ + static destroyResourceImmediatelyDefault: boolean; + } + const PlayerConfig: { + physics2D?: any; + physics3D?: any; + spineVersion?: string; + workerLoaderLib?: string; + [key: string]: any; + }; + /** + * @en Config3D class is used to create 3D initialization configuration. + * @zh Config3D 类用于创建3D初始化配置。 + */ + class Config3D { + /** + * @en Whether to enable dynamic batch + * @zh 是否启用动态合并 + */ + static enableDynamicBatch: boolean; + /** + * @en Whether to enable static batch + * @zh 是否启用静态合并 + */ + static enableStaticBatch: boolean; + /** + * @en Whether to enable UniformBuffer + * @zh 是否启用UniformBuffer + */ + static enableUniformBufferObject: boolean; + /** + * @en Set 3D RT resolution multiplier + * @zh 设置3D RT分辨率倍数 + */ + static pixelRatio: number; + /** + * @en Set custom resolution + * @zh 设置自定义分辨率 + */ + static customResolution: boolean; + /** + * @en Set the maximum value cached by RendertexturePool + * @zh 设置最大RendertexturePool缓存的值 + */ + static defaultCacheRTMemory: number; + /** + * @en Default physics function initialization memory, in MB. + * @zh 默认物理功能初始化内存,单位为M。 + */ + static defaultPhysicsMemory: number; + /** + * @en Whether to enable multiple lights. If the scene doesn't need multiple lights, turning it off can improve performance. + * @zh 是否启用多光源。如果场景不需要多光源,关闭后可提升性能。 + */ + static enableMultiLight: boolean; + /** + * @en Maximum number of lights. + * @zh 最大光源数量。 + */ + static maxLightCount: number; + /** + * @en Number of light clusters on X, Y, Z axes. The Z value affects the number of area lights (point lights, spotlights) that a Cluster can receive. Math.floor(2048 / lightClusterCount.z - 1) * 4 is the maximum average number of area lights each Cluster can receive. If the average number of light sources affecting each Cluster is greater than this value, the more distant Clusters will ignore the excess light effects. + * @zh X、Y、Z轴的光照集群数量。Z值会影响Cluster接受区域光(点光、聚光)影响的数量。Math.floor(2048 / lightClusterCount.z - 1) * 4 为每个Cluster的最大平均接受区域光数量。如果每个Cluster所接受光源影响的平均数量大于该值,则较远的Cluster会忽略其中多余的光照影响。 + */ + static lightClusterCount: Vector3; + /** + * @en Maximum number of morph targets + * @zh 最大形变数量 + */ + static maxMorphTargetCount: number; + /** + * @en Set resolution size (not the actual rendering resolution) + * @param width Set resolution width, unit: pixel + * @param height Set resolution height, unit: pixel + * @zh 设置分辨率大小(并不是实际渲染分辨率) + * @param width 设置分辨率宽度,单位为像素 + * @param height 设置分辨率高度,单位为像素 + */ + static setResolution(width: number, height: number): void; + /** + * @en Whether to use BVH culling + * @zh 是否使用BVH裁剪 + */ + static useBVHCull: boolean; + /** + * @en Maximum number of cells in a BVH node, nodes exceeding this number will be separated + * @zh 一个BVH节点最大的cell数,超过这个数会分离 + */ + static BVH_max_SpatialCount: number; + /** + * @en Maximum size of BVH node + * @zh 最大BVH节点的大小 + */ + static BVH_limit_size: number; + /** + * @en Minimum number of cellbuilds, if less than this number, BVH construction will not occur + * @zh 最小cellbuild数,如果小于这个数,不会进行BVH构建 + */ + static BVH_Min_Build_nums: number; + } + type FEnumDescriptor = { + name: string; + value: any; + extend?: FEnumDescriptor; + [index: string]: any; + }[] | any[] | Object | string; + type FPropertyType = string | Function | Object | [ + FPropertyType + ] | [ + "Record", + FPropertyType + ]; + interface FPropertyDescriptor { + /** + * @en Property name. Generally does not need to be set. + * @zh 属性名称。一般不需要设定。 + */ + name: string; + /** + * @en Property type. + * Basic types are: "number", "string", "boolean", "any", note that these are used as strings, not types. + * Composite types are: arrays, expressed as ["number"]; dictionaries, expressed as ["Record", "number"], where the first element is fixed as "Record" and the second element is the actual type. + * Other object types can directly use the class name, but note that the class must use the regClass decorator. Enum types are also supported. Enum types do not need regClass. + * If type is not provided, it indicates that it is only used for UI style, has no actual corresponding data, and will not be serialized. + * @zh 属性类型。 + * 基础类型有:number,string,boolean,any,注意是使用字符串,不是类型。 + * 复合类型有:数组,使用类似["number"]这样的方式表达;字典,使用类似["Record", "number"]这样的方式表达,第一个元素固定为Record,第二个元素为实际类型。 + * 其他对象类型可以直接使用类名,但要注意该类必须有使用regClass装饰器。也支持枚举类型。枚举类型不需要regClass。 + * 如果不提供type,表示只用于ui样式,没有实际对应数据,和不会序列化 + */ + type: FPropertyType; + /** + * @en The initial value of the property in the prototype. This value is also used for comparison during serialization, so if they are the same, this property will not be serialized. It must be ensured that the value set here is the initial value of the variable in the class. + * @zh 该属性在原型中的初始值。这个值也用于序列化时比较,如果相同则不序列化这个属性,所以必须保证这里设置的值就是类中变量的初始值。 + */ + default?: any; + /** + * @en Title. If not provided, the name will be used. + * @zh 标题。如果不提供,则使用name。 + */ + caption: string; + /** + * @en Tooltip text + * @zh 提示文字 + */ + tips: string; + /** + * @en Property category. Setting the same value for multiple properties can display them in the same Inspector category. + * @zh 属性栏目。为多个属性设置相同的值,可以将它们显示在同一个属性栏目内。 + */ + catalog: string; + /** + * @en Category title. If not provided, the category name will be used directly. + * @zh 栏目标题。不提供则直接使用栏目名称。 + */ + catalogCaption: string; + /** + * @en The display order of the category, lower values are displayed in front. If not provided, it follows the order in which properties appear. + * @zh 栏目的显示顺序,数值越小显示在前面。不提供则按属性出现的顺序。 + */ + catalogOrder: number; + /** + * @en The control for editing this property. Built-in ones include: number, string, boolean, color, vec2, vec3, vec4, asset + * - number : Number input. + * - string : String input. Default is single-line input, for multi-line, need to activate the multiline option. + * - boolean : Boolean input, used for checkboxes or radio buttons. + * - color : A color box + palette + color picker + * - vec2 : Combination of X and Y inputs + * - vec3 : Combination of X, Y, and Z inputs + * - vec4 : Combination of X, Y, Z, and W inputs + * - asset : Select resource + * - Generally, you don't need to set this option, the editor will automatically select the appropriate control based on the property type, but in some cases you may need to specify it forcefully. + * - For example, if the data type is Vector4, but it actually expresses a color, the default control for editing Vector4 is not suitable, and you need to set it to "color" here. + * - Explicitly setting inspector to null will not construct an inspector for the property. This is different from setting hidden to true. When hidden is true, it is created but not visible, + * while when inspector is null, it is not created at all. + * @zh 编辑这个属性的控件。内置有:number,string,boolean,color,vec2,vec3,vec4,asset + * - number : 数字输入。 + * - string : 字符串输入。默认为单行输入,如果是多行,需要激活multiline选项。 + * - boolean : 布尔值输入,用于单选框或多选框。 + * - color : 一个颜色框+调色盘+拾色器 + * - vec2 : XY输入的组合 + * - vec3 : XYZ输入的组合 + * - vec4 : XYZW输入的组合 + * - asset : 选择资源 + * - 一般来说,不需要设置这个选项,编辑器会自动根据属性类型选择适合的控件,但在某些情况下可以需要强制指定。 + * - 例如,如果数据类型是Vector4,但其实它表达的是颜色,用默认编辑Vector4的控件不适合,需要在这里设置为"color"。 + * - 显式设置inspector为null,则不会为属性构造inspector。这与hidden设置为true不同。hidden为true是创建但不可见, + * inspector为null的话则是完全不创建。 + */ + inspector: string; + /** + * @en Hide control: true to hide, false to show. Often used in cases of associated properties. + * - 1. Can use expressions by putting condition expressions in strings to get boolean type calculation results, for example "!data.a && !data.b" means when properties a and b are both empty, the condition is true, and this property is hidden. + * - 2. Here, data is the object data of the current component, data.a and data.b property fields a and b refer to the a and b property values in the current component, by this method to get the property values in the component object data, used for conditional judgment, acting on whether the current property is hidden. + * @zh 隐藏控制:true隐藏,false显示。常用于关联属性的情况。 + * - 1. 可以用表达式,通过将条件表达式放到字符串里,获得布尔类型的运算结果,例如"!data.a && !data.b",表示属性a和属性b均为空时,条件成立(true),隐藏这个属性。 + * - 2. 这里的data为当前组件的对象数据,data.a与data.b属性字段的a与b就是指当前组件中的a与b属性值,通过这种方法取到组件对象数据中的属性值,用于条件判断,作用于当前属性是否隐藏。 + */ + hidden: boolean | string; + /** + * @en Read-only control. + * - 1. Can use expressions by putting condition expressions in strings to get boolean type calculation results, for example "!data.a && !data.b" means when properties a and b are both empty, the condition is true, and this property is read-only. + * - 2. Here, data is the object data of the current component, data.a and data.b property fields a and b refer to the a and b property values in the current component, by this method to get the property values in the component object data, used for conditional judgment, acting on whether the current property is hidden. + * @zh 只读控制。 + * - 1. 可以用表达式,通过将条件表达式放到字符串里,获得布尔类型的运算结果,例如"!data.a && !data.b",表示属性a和属性b均为空时,条件成立(true),该属性只读。 + * - 2. 这里的data为当前组件的对象数据,data.a与data.b属性字段的a与b就是指当前组件中的a与b属性值,通过这种方法取到组件对象数据中的属性值,用于条件判断,作用于当前属性是否隐藏。 + */ + readonly: boolean | string; + /** + * @en Data checking mechanism. + * - 1. Pass in a string including expressions to judge whether it meets the conditions of the expression. If it meets the conditions, it needs to return an error message. + * - 2. Usage example: "if(value == data.a) return 'Cannot be the same as the value of a'" + * Where value is the value entered by the user for this property, data is the object data of the current component, data.a is the a property value in the current component + * @zh 数据检查机制。 + * - 1. 将包括表达式的字符串传入,用于判断检查是否符合表达式的条件。符合条件,需要返回报错信息。 + * - 2. 使用示例为:"if(value == data.a) return '不能与a的值相同'" + * 其中的value为当前用户在该属性输入的值,data为当前组件的对象数据,data.a是当前组件中的a属性值 + */ + validator: string; + /** + * @en Whether to allow the data to be empty. + * Can use expressions to return true or false results. + * @zh 是否允许数据为空值。 + * 可以用表达式,返回true或者false的结果。 + */ + required: boolean | string; + /** + * @en Whether to serialize + * @zh 是否序列化 + */ + serializable: boolean; + /** + * @en When the property does not participate in serialization, if its data may be affected by other serializable properties, fill in the names of other properties here. This is usually used to determine whether prefab properties are overridden. + * @zh 属性在不参与序列化时,如果它的数据可能受其他可序列化的属性影响,在这里填写其他属性名称。这通常用于判断预制体属性是否覆盖。 + */ + affectBy: string; + /** + * @en Whether it's multi-line text input + * @zh 是否多行文本输入 + */ + multiline: boolean; + /** + * @en Whether it's password input + * @zh 是否密码输入 + */ + password: boolean; + /** + * @en If true or default, text input is submitted every time; otherwise, it's only submitted when losing focus + * @zh 如果true或者缺省,文本输入每次输入都提交;否则只有在失焦时才提交 + */ + submitOnTyping: boolean; + /** + * @en If it's a text type, it's the prompt information for input text; if it's a boolean type, it's the title of the checkbox. + * @zh 如果是文本类型,是输入文本的提示信息;如果是布尔类型,是多选框的标题。 + */ + prompt: string; + /** + * @en Define enumeration + * @zh 定义枚举 + */ + enumSource: FEnumDescriptor; + /** + * @en Hide this property when the data source is empty + * @zh 当数据源为空时,隐藏这个属性 + */ + hideIfEnumSourceEmpty: boolean; + /** + * @en Whether to invert the boolean value. For example, when the property value is true, the checkbox is displayed as unchecked. + * @zh 是否反转布尔值。例如当属性值为true时,多选框显示为不勾选。 + */ + reverseBool: boolean; + /** + * @en Whether null values are allowed. Default is true. Sometimes it is necessary to explicitly set it to true, e.g. to display a checkbox for a color/vec2/vec3/vec4 inspector to determine whether the property value is null. + * @zh 是否允许null值。默认为true。有时需要显式设置为true,例如为了显示一个color/vec2/vec3/vec4检查器的checkbox,决定属性值是否为null。 + */ + nullable: boolean; + /** + * @en For a property that can switch between null and non-null, when switching from a null value to a non-null value, the value here will be used. + * @zh 对于可以在null和非null之间切换的属性,从null值切换到非null值时,会使用这里的值。 + */ + nonNullDefault?: any; + /** + * @en Minimum value for numbers + * @zh 数字的最小值 + */ + min: number; + /** + * @en Maximum value for numbers + * @zh 数字的最大值 + */ + max: number; + /** + * @en Value range, equivalent to setting min and max at once. + * @zh 数值范围,等同于一次性设置min和max。 + */ + range: [ + number, + number + ]; + /** + * @en The magnitude of value change each time when changing the value by dragging. + * @zh 拖动方式改变数值时,每次数值改变的幅度。 + */ + step: number; + /** + * @en Number of decimal places + * @zh 小数点后的位数 + */ + fractionDigits: number; + /** + * @en Display as percentage + * @zh 显示为百分比 + */ + percentage: boolean; + /** + * @en Applicable to array type properties. Indicates that the array is of fixed length and not allowed to be modified. + * @zh 对数组类型属性适用。表示数组是固定长度,不允许修改。 + */ + fixedLength: boolean; + /** + * @en Applicable to array type properties. If not provided, it means the array allows all operations, if provided, only the listed operations are allowed. + * @zh 对数组类型属性适用。如果不提供,则表示数组允许所有操作,如果提供,则只允许列出的操作。 + */ + arrayActions: Array<"append" | "insert" | "delete" | "move">; + /** + * @en Applicable to array type properties. Here you can define the properties of array elements + * @zh 对数组类型属性适用。这里可以定义数组元素的属性 + */ + elementProps: Partial; + /** + * @en Applicable to color type properties. Indicates whether to provide modification of the transparency a value. + * @zh 对颜色类型属性适用。表示是否提供透明度a值的修改。 + */ + showAlpha: boolean; + /** + * @deprecated Use 'nonNullDefault' instead. + */ + defaultColor: any; + /** + * @deprecated Explicitly set 'nullable' to true to display a checkbox. + */ + colorNullable: boolean; + /** + * @en Applicable to color type properties. When storing hexadecimal color values, this property determines the position of each channel. If the color value does not include an alpha channel, the default value is 'rgb'; if it does, the default value is 'argb'. + * @zh 对颜色类型属性适用。存储十六进制颜色值时,这个属性决定每个通道的位置。如果颜色值不包含alpha通道,则默认值是'rgb';如果包含,则默认值是'argb'。 + */ + colorFormat?: 'rgb' | 'argb' | 'abgr'; + /** + * @en Applicable to object type properties. If true, hide the object's title, and the display indentation of the properties under the object will be reduced by one level. + * @zh 对对象类型属性适用。如果为true,隐藏对象的标题,同时对象下的属性的显示缩进会减少一级。 + */ + hideHeader: boolean; + /** + * @en Applicable to object type properties. When creating an object, you can select a type from a dropdown menu. If explicitly set to null, the menu is disabled. By default, a menu for creating the base class is displayed. + * @zh 对对象类型属性适用。对象创建时可以下拉选择一个类型。如果显示设置为null,则禁止菜单。默认是显示一个创建基类的菜单。 + */ + createObjectMenu: Array; + /** + * @en Applicable to object type properties. Indicates that this property type has struct-like behavior characteristics, that is, it is always used as a whole. + * For example, if the value of property b of object obj is a1, a1 is an instance of type T, and the structLike of type T is true, then when the properties of a1 change, the editor will simultaneously call obj.b = a1. + * Default is false. + * @zh 对对象类型属性适用。表示这个属性类型有类似结构体的行为特性,即总是作为一个整体使用。 + * 例如,obj对象的某个属性b的值是a1,a1是T类型的实例,且T类型的structLike为true,那么当a1的属性改变时,编辑器将同时调用obj.b = a1。 + * 默认为false。 + */ + structLike: boolean; + /** + * @en Indicates that this property is a reference to a resource + * @zh 说明此属性是引用一个资源 + */ + isAsset: boolean; + /** + * @en Applicable to resource type properties. Multiple resource types are separated by commas, for example "Image,Audio". + * @zh 对资源类型的属性适用。多个资源类型用逗号分隔,例如"Image,Audio"。 + */ + assetTypeFilter: string; + /** + * @en If the property type is string, and when selecting a resource, this option determines whether the property value is the original path of the resource or in the format of res://uuid. If true, it's the original path of the resource. Default is false. + * @zh 如果属性类型是string,并且进行资源选择时,这个选项决定属性值是资源原始路径还是res://uuid这样的格式。如果是true,则是资源原始路径。默认false。 + */ + useAssetPath: boolean; + /** + * @en Applicable to resource type properties. Whether to allow selection of internal resources when choosing a resource + * @zh 对资源类型的属性适用。选择资源时是否允许选择内部资源 + */ + allowInternalAssets: boolean; + /** + * @en Applicable to resource type properties. You can set a custom filter. The filter needs to be registered first through EditorEnv.assetMgr.customAssetFilters. + * @zh 对资源类型的属性适用。可以设置一个自定义的过滤器。过滤器需要先通过EditorEnv.assetMgr.customAssetFilters注册。 + */ + customAssetFilter: string; + /** + * @en Applicable to properties of type Node or Component. If not null, when deserialization is performed in the actual runtime environment, the referenced object is no longer instantiated, but its serialized data is saved as-is to the specified property. + * @zh 对类型是Node或者Component的属性适用。如果不为null,当在实际运行环境里执行反序列化时,引用对象不再实例化,而是将它的序列化数据原样保存到指定的属性中。 + */ + toTemplate: string; + /** + * @en Display position. Syntax: before xxx/after xxx/first/last. + * @zh 显示位置。语法:before xxx/after xxx/first/last。 + */ + position: string; + /** + * @en Increase indentation, unit is level, not pixels. + * @zh 增加缩进,单位是层级,不是像素。 + */ + addIndent?: number; + /** + * @en Default collapsed state of sub-properties + * @zh 子属性默认折叠状态 + */ + collapsed?: boolean; + /** + * @en Indicates that the property is a private property. Private properties will not be displayed in the Inspector, but will be serialized and saved. + * @zh 表示属性是私有属性。私有属性不会显示在Inspector里,但会序列化保存。 + */ + "private": boolean; + /** + * @en Indicates whether the property is allowed to be edited in multiple selection situations. Default is true. + * @zh 表示属性是否允许多选情况下编辑。默认true。 + */ + allowMultipleObjects: boolean; + /** + * @en Indicates that the property is not displayed in the property table of derived classes + * @zh 表示属性不显示在派生类的属性表中 + */ + hideInDeriveType: boolean; + /** + * @en When the property changes, additionally call a function of the object, this is the function name. + * The function prototype is func(key?:string). Where key is passed when changing internal properties of members. + * For example, when changing the internal properties of an element of the data, key is the index of this element. + * @zh 属性改变时额外调用对象的一个函数,这里是函数名称。 + * 函数原型是func(key?:string)。其中key在改变成员内部属性时会传递。 + * 例如改变数据某个元素的内部属性,则key是这个元素的索引。 + */ + onChange: string; + /** + * @en Additional options + * @zh 额外的选项 + */ + options: Record; + } + interface FTypeDescriptor { + /** + * @en Title. If not provided, the name will be used. + * @zh 标题。如果不提供,则使用name。 + */ + caption: string; + /** + * @en URL of the help documentation. + * @zh 帮助文档url地址。 + */ + help: string; + /** + * @en Add to the component menu. + * @zh 添加到组件菜单。 + */ + menu: string; + /** + * @en Icon. + * @zh 图标。 + */ + icon: string; + /** + * @en Whether it's a resource type. + * @zh 是否资源类型。 + */ + isAsset: boolean; + /** + * @en Applicable to properties of resource types. Multiple resource types are separated by commas, e.g., "Image,Audio". + * Available values can be found in editor/public/IAssetInfo.ts. + * @zh 对资源类型的属性适用。多个资源类型用逗号分隔,例如"Image,Audio"。 + * 可用值参考editor/public/IAssetInfo.ts。 + */ + assetTypeFilter: string; + /** + * @en Indicates that this type has struct-like behavior, i.e., it's always used as a whole. + * For example, if the value of property b of object obj is a1, a1 is an instance of type T, + * and T's structLike is true, then when a1's properties change, the editor will also call obj.b = a1. + * Default is false. + * @zh 表示这个类型有类似结构体的行为特性,即总是作为一个整体使用。 + * 例如,obj对象的某个属性b的值是a1,a1是T类型的实例,且T类型的structLike为true, + * 那么当a1的属性改变时,编辑器将同时调用obj.b = a1。 + * 默认为false。 + */ + structLike: boolean; + /** + * @en Initial value. This value is only used in the panel, it specifies the initial value + * given to the property when creating an object from the interface. + * @zh 初始值。这个值只在面板中使用,它指从界面上创建对象时赋予属性的初始值。 + */ + init: any; + /** + * @en List of properties. + * @zh 属性列表。 + */ + properties: Array>; + /** + * @en Control for editing instances of this class. + * @zh 编辑这个类实例的控件。 + */ + inspector: string; + /** + * @en Applicable to Components, indicates the type of node this component can be mounted on. Default is null. + * @zh 对Component使用,表示这个组件允许挂载的节点类型。默认null。 + */ + worldType: "2d" | "3d" | null; + /** + * @en Applicable to Components, when AddComponent, add dependent Components at the same time. + * @zh 对Component适用,当AddComponent时同时添加依赖的Component。 + */ + requireComponents?: Array; + /** + * @en When creating a new node or adding a component, the dependent engine library is automatically added for Node and Component. For example: ["laya. physicals3D"] + * @zh 对Node和Component使用,当新建Node或者添加Component时,自动添加依赖的引擎库。例如:["laya.physics3D"] + */ + requireEngineLibs?: Array; + /** + * @en Used for Component, if true and menu property is defined, this component will also + * be displayed in the new object menu of the hierarchy panel. + * @zh 对Component使用,如果为true,并且定义了menu属性,则这个组件还会显示在层级面板的新建对象菜单上。 + */ + inHierarchyMenu: boolean; + /** + * @en Additional options. + * @zh 额外的选项。 + */ + options: Record; + } + /** + * @en Register a class so it can be automatically saved and loaded by the serialization system. + * @param assetId The asset ID for the class. + * @zh 注册一个类型,注册后才能被序列化系统自动保存和载入。 + * @param assetId 类型的资源ID。 + */ + function regClass(assetId?: string): any; + /** + * @en Set additional information for a class type. + * @param info Additional information for the class type. + * @zh 设置类型的额外信息。 + * @param info 类型的额外信息。 + */ + function classInfo(info?: Partial): any; + /** + * @en Set the component to execute a complete lifecycle in the editor environment. + * @param constructor The constructor of the component. + * @zh 设置组件可以在编辑器环境中执行完整生命周期。 + * @param constructor 组件的构造函数。 + */ + function runInEditor(constructor: Function): void; + /** + * @en Allow multiple instances of the component to be added to the same node. + * @param constructor The constructor of the component. + * @zh 设置组件可以添加多个实例到同一个节点上。 + * @param constructor 组件的构造函数。 + */ + function allowMultiple(constructor: Function): void; + /** + * @en Use this decorator to make a property visible in the editor's property panel and serializable. + * @param info The type of the property, such as Number, "number", [Number], ["Record", Number], etc. + * Or pass an object describing detailed information, e.g., { type: "string", multiline: true }. + * @zh 使用这个装饰器,可以使属性显示在编辑器属性设置面板上,并且能序列化保存。 + * @param info 属性的类型,如: Number,"number",[Number],["Record", Number]等。 + * 或传递对象描述详细信息,例如{ type: "string", multiline: true }。 + */ + function property(info: FPropertyType | Partial): any; + /** + * @en Register a resource loader. + * @param fileExtensions File extensions that this loader can handle. + * @param type Type identifier. If this resource needs to support identification without extension, + * or if one extension corresponds to multiple resource types, specifying the type parameter is a best practice. + * @param hotReloadable Whether it supports hot reloading. + * @zh 注册一种资源装载器。 + * @param fileExtensions 扩展名。 + * @param type 类型标识。如果这种资源需要支持识别没有扩展名的情况, + * 或者一个扩展名对应了多种资源类型的情况,那么指定type参数是个最优实践。 + * @param hotReloadable 是否支持热重载。 + */ + function regLoader(fileExtensions: string[], type?: string, hotReloadable?: boolean): (constructor: Function) => void; + /** + * @en Schedule at start of playback. + * @zh 开始播放时调度。 + * @eventType Event.PLAYED + * */ + /** + * @en Schedule when paused. + * @zh 暂停时调度。 + * @eventType Event.PAUSED + * */ + /** + * @en Schedule upon completion of one cycle. + * @zh 完成一次循环时调度。 + * @eventType Event.COMPLETE + * */ + /** + * @enSchedule when stopped. + * @zh 停止时调度。 + * @eventType Event.STOPPED + * */ + /** + * @en The AnimationPlayer class is used for animation players. + * @zh AnimationPlayer类用于动画播放器。 + */ + class AnimationPlayer extends EventDispatcher { + /** + * @en Whether to cache. + * @zh 是否缓存。 + */ + isCache: boolean; + /** + * @en The playback rate of the animation. + * @zh 播放速率。 + */ + playbackRate: number; + /** + * @en Whether to return to zero when stopped. + * @zh 停止时是否归零。 + */ + returnToZeroStopped: boolean; + /** + * @en The animation data template. Note: Modifying this value incurs computational overhead. + * @zh 动画数据模板。注意:修改此值会有计算开销。 + */ + get templet(): AnimationTemplet; + set templet(value: AnimationTemplet); + /** + * @en The start time position of the animation playback. + * @zh 动画播放的起始时间位置。 + */ + get playStart(): number; + /** + * @en The end time position of the animation playback. + * @zh 动画播放的结束时间位置。 + */ + get playEnd(): number; + /** + * @en The total duration of one playback of the animation. + * @zh 动画播放一次的总时间。 + */ + get playDuration(): number; + /** + * @en The total duration of the animation playback. + * @zh 动画播放的总时间 + */ + get overallDuration(): number; + /** + * @en The current animation clip index. + * @zh 当前动画索引。 + */ + get currentAnimationClipIndex(): number; + /** + * @en The current keyframe index. + * @zh 当前帧数。 + */ + get currentKeyframeIndex(): number; + /** + * @en The current precise time, excluding replay time. + * @zh 当前精确时间,不包括重播时间。 + */ + get currentPlayTime(): number; + /** + * @en The current frame time, excluding replay time. + * @zh 当前帧时间,不包括重播时间。 + */ + get currentFrameTime(): number; + /** + * @en The cached playback rate. The default value is 1.0, note: Modifying this value incurs computational overhead. + * @zh 缓存播放速率。默认值为1.0,注意:修改此值会有计算开销。 + */ + get cachePlayRate(): number; + set cachePlayRate(value: number); + /** + * @en The default frame rate. The default is 60 frames per second, note: Modifying this value incurs computational overhead. + * @zh 默认帧率。默认为每秒60帧,注意:修改此值会有计算开销。 + */ + get cacheFrameRate(): number; + set cacheFrameRate(value: number); + /** + * @en The current playback position. + * @zh 当前播放位置。 + */ + set currentTime(value: number); + /** + * @en Whether the animation is currently paused. + * @zh 当前是否暂停。 + */ + get paused(): boolean; + set paused(value: boolean); + /** + * @en The cached frame rate interval time. + * @zh 缓存帧率间隔时间。 + */ + get cacheFrameRateInterval(): number; + /** + * @en The current playback state of the animation. + * @zh 当前动画的播放状态。 + */ + get state(): number; + /** + * @en If the animation instance has been destroyed. + * @zh 动画实例是否已被销毁。 + */ + get destroyed(): boolean; + /** + * @en Constructor method of AnimationPlayer. + * @zh 动画播放器的构造方法。 + */ + constructor(); + /** + * @private + */ + private _setPlayParams; + /** + * @private + * 动画停止了对应的参数。目前都是设置时间为最后 + */ + private _setPlayParamsWhenStop; + /** + * @en Play animation based on time. + * @param index The index of the animation to play. + * @param playbackRate The rate at which to play the animation. + * @param overallDuration The duration to play the animation (0 for once, Number.MAX_VALUE for loop play). + * @param playStart The start time position of the playback. + * @param playEnd The end time position of the playback (0 for the longest end time position of one loop of the animation). + * @zh 基于时间来播放动画。 + * @param index 动画索引。 + * @param playbackRate 播放速率。 + * @param overallDuration 播放时长(0为1次,Number.MAX_VALUE为循环播放)。 + * @param playStart 播放的起始时间位置。 + * @param playEnd 播放的结束时间位置。(0为动画一次循环的最长结束时间位置)。 + */ + play(index?: number, playbackRate?: number, overallDuration?: number, playStart?: number, playEnd?: number): void; + /** + * @en Play animation based on frame parameters. + * @param index The index of the animation to play. + * @param playbackRate The rate at which to play the animation. + * @param overallDuration The duration to play the animation (0 for once, Number.MAX_VALUE for loop play). + * @param playStartFrame The original start frame rate position for playback. + * @param playEndFrame The original end frame rate position for playback (0 for the longest end time position of one loop of the animation). + * @param fpsIn3DBuilder The frames per second in the 3D builder. + * @zh 基于帧的参数来播放动画。 + * @param index 动画索引。 + * @param playbackRate 播放速率。 + * @param overallDuration 播放时长(0为1次,Number.MAX_VALUE为循环播放)。 + * @param playStartFrame 播放的原始起始帧率位置。 + * @param playEndFrame 播放的原始结束帧率位置。(0为动画一次循环的最长结束时间位置)。 + * @param fpsIn3DBuilder 3D构建器中的帧率。 + */ + playByFrame(index?: number, playbackRate?: number, overallDuration?: number, playStartFrame?: number, playEndFrame?: number, fpsIn3DBuilder?: number): void; + /** + * @en Stop playing the current animation. + * If you don't stop immediately, wait for the animation to finish playing before stopping + * @param immediate Whether to stop immediately. The default value is true. + * @zh 停止播放当前动画。 + * 如果不是立即停止,则会等待动画播放完成后再停止。 + * @param immediate 是否立即停止,默认为true。 + */ + stop(immediate?: boolean): void; + /** + * @private + */ + destroy(): void; + } + /** + * @en The AnimationTemplate class is used for animation template resources. + * @zh AnimationTemplet类用于动画模板资源。 + */ + class AnimationTemplet extends Resource { + /** + * @en Interpolation function + * @zh 插值函数 + */ + static interpolation: any[]; + /** + * @private + */ + private static _LinearInterpolation_0; + /** + * @private + */ + private static _QuaternionInterpolation_1; + /** + * @private + */ + private static _AngleInterpolation_2; + /** + * @private + */ + private static _RadiansInterpolation_3; + /** + * @private + */ + private static _Matrix4x4Interpolation_4; + /** + * @private + */ + private static _NoInterpolation_5; + /** + * @private + */ + private static _BezierInterpolation_6; + /** + * @private + */ + private static _BezierInterpolation_7; + /**@private */ + protected unfixedCurrentFrameIndexes: Uint32Array; + /**@private */ + protected unfixedCurrentTimes: Float32Array; + /**@private */ + protected unfixedKeyframes: KeyFramesContent[]; + /**@private */ + protected unfixedLastAniIndex: number; + /**@private + * 记录每个骨骼当前在动画的第几帧。这个是为了去掉缓存的帧索引数据。 + */ + private _boneCurKeyFrm; + constructor(); + /** + * @en Get the number of animations. + * @zh 获取动画的数量。 + */ + getAnimationCount(): number; + /** + * @en Retrieve an animation by its index. + * @param aniIndex The index of the animation to retrieve. + * @zh 通过索引获取动画。 + * @param aniIndex 要获取的动画的索引。 + */ + getAnimation(aniIndex: number): any; + /** + * @en Get the duration of an animation. + * @param aniIndex The index of the animation to check. + * @zh 获取动画时长。 + * @param aniIndex 要检查的动画的索引。 + */ + getAniDuration(aniIndex: number): number; + /** + * @en Get information about the nodes involved in an animation. + * @param aniIndex The index of the animation. + * @zh 获取动画的nodes信息。 + * @param aniIndex 指定动画的索引。 + */ + getNodes(aniIndex: number): any; + /** + * @en Retrieve the index of a bone by its name within an animation. + * @param aniIndex The index of the animation. + * @param name The name of the bone to retrieve. + * @returns The index of the bone. + * @zh 通过名称获取动画中的骨骼索引。 + * @param aniIndex 动画的索引。 + * @param name 要检索的骨骼名称。 + * @returns 骨骼的索引。 + */ + getNodeIndexWithName(aniIndex: number, name: string): number; + /** + * @en Get the count of nodes in an animation. + * @param aniIndex The index of the animation. + * @returns The number of nodes in the animation. + * @zh 获取动画中的nodes数量。 + * @param aniIndex 动画的索引。 + * @returns 动画中的nodes数量。 + */ + getNodeCount(aniIndex: number): number; + /** + * @en Get the total length of keyframes in an animation. + * @param aniIndex The index of the animation. + * @returns The total number of keyframes. + * @zh 获取动画关键帧长度。 + * @param aniIndex 动画的索引。 + * @returns 动画关键帧总数。 + */ + getTotalkeyframesLength(aniIndex: number): number; + /** + * @en Get the public extension data associated with the animation. + * @returns The ArrayBuffer containing the public extension data. + * @zh 获取动画的附加数据。 + * @returns 包含附加数据的ArrayBuffer。 + */ + getPublicExtData(): ArrayBuffer; + /** + * @en Retrieve animation data with caching mechanism. + * @param key The key associated with the data to retrieve. + * @param cacheDatas The cache data storage. + * @param aniIndex The index of the animation. + * @param frameIndex The index of the frame to retrieve data from. + * @returns The Float32Array containing the animation data, or null if not found. + * @zh 使用缓存机制获取动画数据。 + * @param key 与要检索的数据关联的键。 + * @param cacheDatas 缓存数据存储。 + * @param aniIndex 动画的索引。 + * @param frameIndex 要检索数据的帧索引。 + * @returns 包含动画数据的Float32Array,如果未找到则返回null。 + */ + getAnimationDataWithCache(key: any, cacheDatas: any, aniIndex: number, frameIndex: number): Float32Array; + /** + * @en Set animation data with caching mechanism. + * @param key The key associated with the data to set. + * @param cacheDatas The array of cache data storages. + * @param aniIndex The index of the animation. + * @param frameIndex The index of the frame to set data to. + * @param data The data to set. + * @zh 设置动画数据并使用缓存机制。 + * @param key 与要设置的数据关联的键。 + * @param cacheDatas 缓存数据存储数组。 + * @param aniIndex 动画的索引。 + * @param frameIndex 要设置数据的帧索引。 + * @param data 要设置的数据。 + */ + setAnimationDataWithCache(key: any, cacheDatas: any[], aniIndex: number, frameIndex: number, data: any): void; + /** + * @en Calculate which keyframe corresponds to the current time. + * - There is an issue with the last frame. For example, if the time of the second to last frame is 0.033ms,the next two frames are very close together. When the actual last frame is given, the time calculated based on the frame number actually falls on the second to last frame. Using accumulated time consistent with AnimationPlayer will resolve this issue. + * @param nodeframes The keyframe data for the current bone. + * @param nodeid The bone ID, used for updating the _boneCurKeyFrm. + * @param tm The current time in the animation. + * @returns The index of the keyframe that corresponds to the current time. + * @zh 计算当前时间应该对应关键帧的哪一帧。 + * - 最后一帧有问题,例如倒数第二帧时间是0.033ms,则后两帧非常靠近, + * 当实际给最后一帧的时候,根据帧数计算出的时间实际上落在倒数第二帧使用与AnimationPlayer一致的累积时间就行 + * @param nodeframes 当前骨骼的关键帧数据。 + * @param nodeid 骨骼ID,用于更新 _boneCurKeyFrm。 + * @param tm 当前动画的时间。 + * @returns 对应当前时间的关键帧的索引。 + */ + getNodeKeyFrame(nodeframes: KeyFramesContent[], nodeid: number, tm: number): number; + /** + * @en Retrieve and fill the original animation data for a specific frame and time. + * @param aniIndex The index of the animation. + * @param originalData A Float32Array to be filled with the retrieved animation data. This array is modified in-place. + * @param nodesFrameIndices An array containing frame indices for each node (Note: This parameter is not used in the current implementation). + * @param frameIndex The index of the frame to retrieve data for (Note: This parameter is not used in the current implementation). + * @param playCurTime The current play time in the animation (in milliseconds). + * @zh 获取并填充特定帧和时间的原始动画数据。 + * @param aniIndex 动画的索引。 + * @param originalData 用于存储检索到的动画数据的Float32Array。此数组会被直接修改。 + * @param nodesFrameIndices 包含每个节点的帧索引的数组(注意:当前实现中已删除此参数,为保持旧版本兼容而保留)。 + * @param frameIndex 要获取数据的帧索引(注意:当前实现中已删除此参数,为保持旧版本兼容而保留)。 + * @param playCurTime 动画的当前播放时间(毫秒)。 + */ + getOriginalData(aniIndex: number, originalData: Float32Array, nodesFrameIndices: any[], frameIndex: number, playCurTime: number): void; + /** + * @en Get the current frame index for each node in the specified animation. + * @param aniIndex The index of the animation to retrieve node information from. + * @param playCurTime The current play time of the animation in milliseconds. + * @returns A Uint32Array containing the current frame index for each node. + * @zh 获取指定动画中每个节点的当前帧索引。 + * @param aniIndex 要检索节点信息的动画索引。 + * @param playCurTime 动画的当前播放时间(毫秒)。 + * @returns 包含每个节点当前帧索引的Uint32Array。 + */ + getNodesCurrentFrameIndex(aniIndex: number, playCurTime: number): Uint32Array; + /** + * @en Retrieve and fill the original animation data at a specific time for the given animation. + * @param aniIndex The index of the animation to retrieve data from. + * @param originalData A Float32Array to be filled with the retrieved animation data. This array is modified in-place. + * @param playCurTime The current play time of the animation in milliseconds. + * @zh 获取并填充指定动画在特定时间的原始动画数据。 + * @param aniIndex 要检索数据的动画索引。 + * @param originalData 用于存储检索到的动画数据的Float32Array。此数组会被直接修改。 + * @param playCurTime 动画的当前播放时间(毫秒)。 + */ + getOriginalDataUnfixedRate(aniIndex: number, originalData: Float32Array, playCurTime: number): void; + } + /** + * @private + * @en The `Bone` class , used for skeletal animations. + * @zh 骨骼类,用于骨骼动画 + */ + class Bone { + /** + * @en The visibility state of bones. + * @zh 骨骼的可见性状态。 + */ + static ShowBones: any; + /** + * @en The name of the bone. + * @zh 骨骼的名称。 + */ + name: string; + /** + * @en The root bone of the skeleton. + * @zh 骨骼的根骨骼。 + */ + root: Bone; + /** + * @en The parent bone of this bone. + * @zh 此骨骼的父骨骼。 + */ + parentBone: Bone; + /** + * @en The length of the bone, default is 10. + * @zh 骨骼的长度,默认为 10。 + */ + length: number; + /** + * @en The transform properties of the bone. + * @zh 骨骼的变换属性。 + */ + transform: Transform; + /** + * @en The result transform of the bone after applying all transformations. + * @zh 应用所有变换后骨骼的结果变换。 + */ + resultTransform: Transform; + /** + * @en The result matrix of the bone after applying all transformations. + * @zh 应用所有变换后骨骼的结果矩阵。 + */ + resultMatrix: Matrix; + /** + * @en Whether the bone inherits scale from its parent. + * @zh 是否从父骨骼继承缩放。 + */ + inheritScale: boolean; + /** + * @en Whether the bone inherits rotation from its parent. + * @zh 是否从父骨骼继承旋转。 + */ + inheritRotation: boolean; + /** + * @en The rotation of the bone in degrees. + * @zh 骨骼的旋转角度,以度为单位。 + */ + rotation: number; + /** + * @en The result rotation of the bone after applying all transformations. + * @zh 应用所有变换后骨骼的结果旋转。 + */ + resultRotation: number; + d: number; + constructor(); + /** + * @en Sets the temporary matrix for this bone and recursively for all child bones. + * @param matrix The matrix to set as the temporary matrix. + * @zh 为这个骨骼及其所有子骨骼设置临时矩阵。 + * @param matrix 要设置为临时矩阵的矩阵。 + */ + setTempMatrix(matrix: Matrix): void; + /** + * @en Updates the transformation of this bone and recursively updates all child bones. + * @param pMatrix An optional matrix to apply to the transformation. + * @zh 更新此骨骼的变换并递归更新所有子骨骼。 + * @param pMatrix 一个可选的矩阵,用于应用到变换中。 + */ + update(pMatrix?: Matrix | null): void; + /** + * @en Updates all child bones of this bone. + * @zh 更新此骨骼的所有子骨骼。 + */ + updateChild(): void; + /** + * @en Convert the rotation of bone sprites from radians to degrees. + * @param rd The rotation in radians. + * @zh 将骨骼精灵的旋转从弧度转换为度。 + * @param rd 弧度值。 + */ + setRotation(rd: number): void; + /** + * @en Updates the drawing of the bone and its sprite at the specified position. + * @param x The x-coordinate position to draw the bone. + * @param y The y-coordinate position to draw the bone. + * @zh 在指定的位置更新骨骼及其精灵的绘制。 + * @param x 绘制骨骼的 x 坐标位置。 + * @param y 绘制骨骼的 y 坐标位置。 + */ + updateDraw(x: number, y: number): void; + /** + * @en Adds a bone as a child to this bone. + * @param bone The bone to be added as a child. + * @zh 将一个骨骼添加为此骨骼的子骨骼。 + * @param bone 要添加为子骨骼的骨骼。 + */ + addChild(bone: Bone): void; + /** + * @en Finds a bone by its name in the hierarchy of this bone. + * @param boneName The name of the bone to find. + * @returns The bone if found, otherwise null. + * @zh 在此骨骼的层级结构中按名称查找骨骼。 + * @param boneName 要查找的骨骼名称。 + * @returns 如果找到返回骨骼,否则返回 null。 + */ + findBone(boneName: string): Bone | null; + /** + * @en Converts local coordinates to world coordinates using this bone's transformation matrix. + * @param local The local coordinates array to be converted. + * @zh 使用此骨骼的变换矩阵将本地坐标转换为世界坐标。 + * @param local 要转换的本地坐标数组。 + */ + localToWorld(local: number[]): void; + } + /** + * @en The `BoneSlot` class represents a slot in a skeletal animation that can display different skins or attachments. + * @zh `BoneSlot` 类代表骨骼动画中的一个插槽,可以显示不同的皮肤或附件。 + */ + class BoneSlot { + /** + * @en The name of the slot. + * @zh 插槽的名称。 + */ + name: string; + /** + * @en The name of the bone to which the slot is attached. + * @zh 插槽绑定的骨骼名称。 + */ + parent: string; + /** + * @en The name of the current display data or attachment. + * @zh 插槽显示数据数据的名称。 + */ + attachmentName: string; + /** + * @en The original index of the data. + * @zh 原始数据的索引。 + */ + srcDisplayIndex: number; + /** + * @en Used to determine if it is the original object. + * @zh 判断对象是否是原对象。 + */ + type: string; + /** + * @en The pointer to the template. + * @zh 模板的指针。 + */ + templet: Templet; + /** + * @en The current slot data that the slot corresponds to. + * @zh 当前插槽对应的数据。 + */ + currSlotData: SlotData; + /** + * @en The current texture that the slot is displaying. + * @zh 当前插槽显示的纹理。 + */ + currTexture: Texture | null; + /** + * @en The data corresponding to the display object. + * @zh 显示对象对应的数据。 + */ + currDisplayData: SkinSlotDisplayData | null; + /** + * @en The index of the displayed skin. + * @zh 显示皮肤的索引。 + */ + displayIndex: number; + /** @private */ + originalIndex: number; + /** @private 变形动画数据 */ + deformData: any[]; + /** + * @en Sets the slot data to be displayed. + * @param slotData The slot data to display. + * @param freshIndex Whether to reset the texture, default is true. + * @zh 设置要显示的插槽数据。 + * @param slotData 要显示的插槽数据。 + * @param freshIndex 是否重置纹理,默认为 true。 + */ + showSlotData(slotData: SlotData, freshIndex?: boolean): void; + /** + * @en Displays the specified object by name. + * @param name The name of the object to display. + * @zh 通过名字显示指定对象。 + * @param name 要显示的对象的名称。 + */ + showDisplayByName(name: string): void; + /** + * @en Replaces the texture by name. + * @param tarName The name of the texture to be replaced. + * @param newName The name of the new texture to replace with. + * @zh 替换贴图名。 + * @param tarName 要替换的贴图名 + * @param newName 替换后的贴图名 + */ + replaceDisplayByName(tarName: string, newName: string): void; + /** + * @en Replaces the display by index. + * @param tarIndex The index of the display to be replaced. + * @param newIndex The new index to replace with. + * @zh 替换贴图索引。 + * @param tarIndex 要替换的索引 + * @param newIndex 替换后的索引 + */ + replaceDisplayByIndex(tarIndex: number, newIndex: number): void; + /** + * @en Displays the object by index. + * @param index The index of the display object. + * @zh 指定显示对象。 + * @param index 要显示的对象索引。 + */ + showDisplayByIndex(index: number): void; + /** + * @en Replaces the skin with a custom texture. + * @param _texture The custom texture to replace the skin. + * @zh 替换皮肤。 + * @param _texture 要替换的自定义皮肤。 + */ + replaceSkin(_texture: Texture): void; + /** + * @en Saves the index of the parent matrix. + * @param parentMatrix The parent matrix to save. + * @zh 保存父矩阵的索引。 + * @param parentMatrix 要保存的父矩阵。 + */ + setParentMatrix(parentMatrix: Matrix): void; + private _mVerticleArr; + /** + * @en Create SkinGraphic Mesh data. + * @zh 创建SkinGraphic网格数据 + */ + static createSkinMesh(): any; + private static isSameArr; + private getSaveVerticle; + /** + * @en Compares two matrices to check if they are identical. + * @param mtA The first matrix. + * @param mtB The second matrix. + * @returns Whether the matrices are identical. + * @zh 比较两个矩阵是否相同 + * @param mtA 第一个矩阵。 + * @param mtB 第二个矩阵。 + * @returns 是否相同 + */ + static isSameMatrix(mtA: Matrix, mtB: Matrix): boolean; + private _preGraphicMatrix; + private static useSameMatrixAndVerticle; + private getSaveMatrix; + /** + * @en Draws the texture onto the Graphics object. + * @param graphics The Graphics object to draw the texture onto. + * @param boneMatrixArray An array of matrices corresponding to bone transformations. + * @param noUseSave If true, do not use the shared matrix object _tempResultMatrix; only set to true when calculating in real-time. + * @param alpha The alpha value for the texture being drawn, default is 1 (fully opaque). + * @zh 将纹理绘制到 Graphics 对象上。 + * @param graphics 要在其上绘制纹理的Graphics对象。 + * @param boneMatrixArray 对应骨骼变换的矩阵数组。 + * @param noUseSave 如果为 true,则不使用共享的矩阵对象 _tempResultMatrix;仅在实时计算时设置为 true。 + * @param alpha 绘制纹理的透明度值,默认为 1(完全不透明)。 + */ + draw(graphics: GraphicsAni, boneMatrixArray: any[], noUseSave?: boolean, alpha?: number): void; + /** + * 显示蒙皮动画 + * @param boneMatrixArray 当前帧的骨骼矩阵 + */ + private skinMesh; + /** + * @en Draws the bone's origin point for debugging purposes. + * @param graphics The Graphics object to draw the bone origin point. + * @zh 绘制骨骼的起始点,方便调试。 + * @param graphics 要绘制骨骼起始点的 Graphics 对象。 + */ + drawBonePoint(graphics: Graphics): void; + /** + * 得到显示对象的矩阵 + * @return + */ + private getDisplayMatrix; + /** + * @en Gets the matrix of the slot. + * @zh 获取插槽的矩阵。 + */ + getMatrix(): Matrix; + /** + * @en Copies the original data to create a new instance. + * @returns A new BoneSlot instance copied from the original data. + * @zh 使用原始数据拷贝出一个新实例。 + * @returns 返回从原始数据拷贝出的新 BoneSlot 实例。 + */ + copy(): BoneSlot; + } + /** + * @en Mesh data + * @zh 网格数据 + */ + class MeshData { + /** + * @en Texture + * @zh 纹理 + */ + texture: Texture; + /** + * @en UV data + * @zh UV数据 + */ + uvs: Float32Array; + /** + * @en Vertex data + * @zh 顶点数据 + */ + vertices: Float32Array; + /** + * @en Vertex indices + * @zh 顶点索引 + */ + indexes: Uint16Array; + /** + * @en UV transform matrix + * @zh UV变换矩阵 + */ + uvTransform: Matrix; + /** + * @en Whether to use UV transform matrix + * @zh 是否使用UV变换矩阵 + */ + useUvTransform: boolean; + /** + * @en Extended pixels used to remove black edges + * @zh 扩展像素,用于去除黑边 + */ + canvasPadding: number; + /** + * @en Calculate the bounds of the mesh + * @returns Rectangle representing the bounds of the mesh + * @zh 计算网格的边界 + * @returns 表示网格边界的矩形 + */ + getBounds(): Rectangle; + } + /** + * @en Create SkinGraphic Mesh data. + * @zh 创建SkinGraphic网格数据 + */ + class SkinMeshForGraphic extends MeshData { + /** + * @en Constructor method. Create SkinGraphic Mesh data. + * @zh 构造方法,创建SkinGraphic网格数据 + */ + constructor(); + /** + * @en Transform matrix + * @zh 变换矩阵 + */ + transform: Matrix | null; + /** + * @en Create Texture MeshData + * @param texture Texture + * @param ps Index data + * @param verticles Vertex data + * @param uvs UV data + * @zh 创建纹理网格数据 + * @param texture 纹理 + * @param ps 索引数据 + * @param verticles 顶点数据 + * @param uvs UV数据 + */ + init2(texture: Texture, ps: any[], verticles: any[], uvs: any[]): void; + } + /** + * @en Event data of Skeleton animation. + * @zh 骨骼动画事件数据 + */ + class EventData { + /** + * @en The name of the event. + * @zh 事件的名称。 + */ + name: string; + /** + * @en An integer data. + * @zh 整数数据。 + */ + intValue: number; + /** + * @en A single-precision floating point data. + * @zh 单精度浮点数数据。 + */ + floatValue: number; + /** + * @en String data. + * @zh 字符串数据。 + */ + stringValue: string; + /** + * @en Multimedia data. + * @zh 多媒体数据。 + */ + audioValue: string; + /** + * @en Time data. + * @zh 时间数据。 + */ + time: number; + constructor(); + } + /** + * @en Animation start playback scheduling + * @zh 动画开始播放调度 + * @eventType Event.PLAYED + * */ + /** + * @en Animation stop playback scheduling + * @zh 动画停止播放调度 + * @eventType Event.STOPPED + * */ + /** + * @en Animation resume playback scheduling + * @zh 动画暂停播放调度 + * @eventType Event.PAUSED + * */ + /** + * @en Custom events. + * @zh 自定义事件。 + * @eventType Event.LABEL + */ + /** + * @en Skeleton animation consists of three parts: Template, AnimationPlayer, and Skeleton. + * @zh 骨骼动画由Templet,AnimationPlayer,Skeleton三部分组成。 + */ + class Skeleton extends Sprite { + private _animationName; + private _loop; + /** + * @en Constructs method of Skeleton animation. + * @param aniMode - Animation mode, 0 for no costume changes support, 1 or 2 for costume changes support. + * @zh 骨骼动画的构造方法 + * @param aniMode 动画模式,0不支持换装,1、2支持换装 + */ + constructor(aniMode?: number); + /** + * @private + * @en The frame index. + * @zh 帧索引。 + */ + get index(): number; + /** @private */ + set index(value: number); + /** + * @en The total number of frames. + * @zh 总帧数。 + */ + get total(): number; + /** + * @en The reference to the animation player. + * @zh 动画播放器的引用。 + */ + get player(): AnimationPlayer; + /** + * @en The skin name. + * @zh 皮肤名称。 + */ + get skinName(): string; + set skinName(value: string); + /** + * @en The animation name. + * @zh 动画名称。 + */ + get animationName(): string; + set animationName(value: string); + /** + * @en Whether the animation is looped. + * @zh 动画是否循环播放。 + */ + get loop(): boolean; + set loop(value: boolean); + /** + * @en The reference to the animation template. + * @zh 动画模板的引用。 + */ + get templet(): Templet; + set templet(value: Templet); + /** + * @en Animation address + * @zh 动画地址 + */ + get source(): string; + set source(value: string); + /** + * @en Animation types with their descriptions. + * - Mode 0: Uses template buffer data which cannot be modified. (Low memory overhead, low computation overhead, does not support costume changes) + * - Mode 1: Uses the animation's own buffer. Each animation has its own buffer, which is quite memory-intensive. (High memory overhead, low computation overhead, supports costume changes) + * - Mode 2: Uses a dynamic approach for real-time drawing. (Low memory overhead, high computation overhead, supports costume changes, not recommended) + * @zh 动画类型及其描述。 + * - 模式 0: 使用模板缓冲数据,不允许修改。(内存开销小,计算开销小,不支持换装) + * - 模式 1: 使用动画自己的缓冲区,每个动画都有自己的缓冲区,相当耗费内存。(内存开销大,计算开销小,支持换装) + * - 模式 2: 使用动态方式进行实时绘制。(内存开销小,计算开销大,支持换装,不建议使用) + */ + get aniMode(): number; + set aniMode(value: number); + /** + * 初始化动画 + * @param templet 模板 + */ + protected init(templet: Templet): void; + /** + * @en Load and create an animation directly from a path. + * @param path The path of the animation file to load. + * @param complete The callback function when the loading is complete. + * @zh 通过路径直接加载并创建动画。 + * @param path 要加载的动画文件路径。 + * @param complete 加载完成后的回调函数。 + */ + load(path: string, complete?: Handler): void; + private _checkIsAllParsed; + /*******************************************定义接口*************************************************/ + /** + * @en Get the number of current animations. + * @return The number of current animations. + * @zh 获取当前动画的数量。 + * @return 当前动画的数量 + */ + getAnimNum(): number; + /** + * @en Get the name of the animation by its index. + * @param index The index of the animation. + * @zh 通过索引获取动画的名称。 + * @param index 动画的索引 + */ + getAniNameByIndex(index: number): string; + /** + * @en Get the reference to a bone slot by its name. + * @param name The name of the bone slot. + * @return The reference to the bone slot. + * @zh 通过名称获取插槽的引用。 + * @param name 动画的名字 + * @return 插槽的引用 + */ + getSlotByName(name: string): BoneSlot; + /** + * @en Display a set of skins by name. + * @param name The name of the skin. + * @param freshSlotIndex Whether to reset the slot textures to the initial state, default is true. + * @zh 通过名称显示一套皮肤。 + * @param name 皮肤的名字 + * @param freshSlotIndex 是否将插槽纹理重置到初始状态,默认为true。 + */ + showSkinByName(name: string, freshSlotIndex?: boolean): void; + /** + * @en Display a set of skins by index. + * @param skinIndex The index of the skin. + * @param freshSlotIndex Whether to reset the slot textures to the initial state, default is true. + * @zh 通过索引显示一套皮肤。 + * @param skinIndex 皮肤索引 + * @param freshSlotIndex 是否将插槽纹理重置到初始状态,默认为true。 + */ + showSkinByIndex(skinIndex: number, freshSlotIndex?: boolean): void; + /** + * @en Set the skin for a specific slot by index. + * @param slotName The name of the slot. + * @param index The index of the slot's skin. + * @zh 通过索引设置某插槽的皮肤。 + * @param slotName 插槽名称 + * @param index 插槽的皮肤索引 + */ + showSlotSkinByIndex(slotName: string, index: number): void; + /** + * @en Set the skin for a specific slot by name. + * @param slotName The name of the slot. + * @param name The name of the skin. + * @zh 通过名称设置某插槽的皮肤。 + * @param slotName 插槽名称 + * @param name 皮肤名称 + */ + showSlotSkinByName(slotName: string, name: string): void; + /** + * @en Replace the texture name of a slot. + * @param slotName The name of the slot. + * @param oldName The old texture name that will be replaced. + * @param newName The new texture name to replace with. + * @zh 替换插槽的贴图名称。 + * @param slotName 插槽名称 + * @param oldName 要替换的贴图名 + * @param newName 替换后的贴图名 + */ + replaceSlotSkinName(slotName: string, oldName: string, newName: string): void; + /** + * @en Replace the texture index of a slot. + * @param slotName The name of the slot. + * @param oldIndex The old texture index that will be replaced. + * @param newIndex The new texture index to replace with. + * @zh 替换插槽的贴图索引。 + * @param slotName 插槽名称 + * @param oldIndex 要替换的索引 + * @param newIndex 替换后的索引 + */ + replaceSlotSkinByIndex(slotName: string, oldIndex: number, newIndex: number): void; + /** + * @en Set custom skin for a slot. + * @param slotName The name of the slot. + * @param texture The custom texture to be applied. + * @zh 为指定的插槽设置自定义皮肤。 + * @param slotName 插糟的名字 + * @param texture 自定义的纹理 + */ + setSlotSkin(slotName: string, texture: Texture): void; + /** + * @en Play an animation. + * @param nameOrIndex The name or index of the animation to play. + * @param loop Whether to loop the animation. + * @param force If false, the animation will not take effect if the same one is already playing. If true, it will force the animation to play. + * @param start The start time of the animation. + * @param end The end time of the animation. + * @param freshSkin Whether to refresh the skin data. + * @param playAudio Whether to play the animation's audio. + * @zh 播放动画。 + * @param nameOrIndex 动画名字或者索引 + * @param loop 是否循环播放 + * @param force false,如果要播的动画跟上一个相同就不生效,true,强制生效 + * @param start 起始时间 + * @param end 结束时间 + * @param freshSkin 是否刷新皮肤数据 + * @param playAudio 是否播放音频 + */ + play(nameOrIndex: any, loop: boolean, force?: boolean, start?: number, end?: number, freshSkin?: boolean, playAudio?: boolean): void; + /** + * @en Stop the animation. + * @zh 停止动画。 + */ + stop(): void; + /** + * @en Set the playback rate of the animation. + * @param value The playback rate, where 1 is the standard rate. + * @zh 设置动画的播放速率。 + * @param value 1为标准速率 + */ + playbackRate(value: number): void; + /** + * @en Pause the animation. + * @zh 暂停动画。 + */ + paused(): void; + /** + * @en Resume playing the animation. + * @zh 恢复动画的播放。 + */ + resume(): void; + /** + * @override + * @en Destroy the current animation node. + * @param destroyChild Whether to destroy child nodes. + * @zh 销毁当前动画节点。 + * @param destroyChild 是否销毁子节点 + */ + destroy(destroyChild?: boolean): void; + } + /** + * @en Slot display data + * @zh 插槽显示数据 + */ + class SkinSlotDisplayData { + /** + * @en The name of the slot. + * @zh 插槽的名称。 + */ + name: string; + /** + * @en The name of the attachment. + * @zh 附件的名称。 + */ + attachmentName: string; + /** + * @en The type of the slot display. + * @zh 插槽显示的类型。 + */ + type: number; + /** + * @en The transformation data of the slot. + * @zh 插槽的变换数据。 + */ + transform: Transform; + /** + * @en The width of the slot. + * @zh 插槽的宽度。 + */ + width: number; + /** + * @en The height of the slot. + * @zh 插槽的高度。 + */ + height: number; + /** + * @en The texture of the slot. + * @zh 插槽的纹理。 + */ + texture: Texture; + /** + * @en The bone data array. + * @zh 骨骼数据数组。 + */ + bones: any[]; + /** + * @en The UV data array. + * @zh UV数据数组。 + */ + uvs: any[]; + /** + * @en The weight data array. + * @zh 权重数据数组。 + */ + weights: any[]; + /** + * @en The triangle data array. + * @zh 三角面数据数组。 + */ + triangles: any[]; + /** + * @en The vertex data array. + * @zh 顶点数据数组。 + */ + vertices: any[]; + /** + * @en The length data array. + * @zh 长度数据数组。 + */ + lengths: any[]; + /** + * @en The version. + * @zh 版本号。 + */ + verLen: number; + /** + * @en Create and update the texture for the slot based on the current texture. + * @param currTexture The current texture to be used for creating the slot's texture. + * @return The created and updated texture. + * @zh 根据当前纹理创建并更新插槽纹理。 + * @param currTexture 用于创建槽纹理的当前纹理。 + * @return 新的插槽纹理。 + */ + createTexture(currTexture: Texture): Texture; + /** + * @en Destroy and clean up the resources used by the slot's texture. + * @zh 销毁并清理插槽纹理所使用的资源。 + */ + destory(): void; + } + /** + * Represents the data of a slot, which includes the slot's name and an array of display data. + * @zh 表示插槽的数据,包括插槽名称和显示数据数组。 + */ + class SlotData { + /** + * @en The name of the slot. + * @zh 插槽的名称。 + */ + name: string; + /** + * @en An array of display data that this slot contains. + * @zh 此插槽包含的显示数据数组。 + */ + displayArr: any[]; + /** + * @en Get the index of the display data by attachment name. + * @param name The name of the attachment to search for. + * @zh 通过附件名称获取显示数据的位置。 + * @param name 附件名称。 + */ + getDisplayByName(name: string): number; + } + /** + * @en Animation template class + * @zh 动画模板类 + */ + class Templet extends AnimationTemplet { + /** + * @en The frame rate of the animation + * @zh 动画的帧率 + */ + rate: number; + /** + * @en Stores the original bone information. + * @zh 存放原始骨骼信息。 + */ + srcBoneMatrixArr: any[]; + /** + * @en IK (Inverse Kinematics) data array. + * @zh IK数据数组。 + */ + ikArr: any[]; + /** + * @en Transform data array. + * @zh transform数据数组。 + */ + tfArr: any[]; + /** + * @en Path data array. + * @zh path数据数组。 + */ + pathArr: any[]; + /** + * @en Dictionary for storing slot data. + * @zh 存放插槽数据的字典。 + */ + boneSlotDic: any; + /** + * @en Dictionary for binding slot data. + * @zh 绑定插槽数据的字典。 + */ + bindBoneBoneSlotDic: any; + /** + * @en Array for storing slot data. + * @zh 存放插槽数据的数组。 + */ + boneSlotArray: any[]; + /** + * @en Skin data array. + * @zh 皮肤数据数组。 + */ + skinDataArray: any[]; + /** + * @en Dictionary for skin data. + * @zh 皮肤的字典数据。 + */ + skinDic: any; + /** + * @en Dictionary for storing texture data. + * @zh 存放纹理数据的字典。 + */ + subTextureDic: Record; + /** + * @en Indicates whether parsing has failed. + * @zh 是否解析失败。 + */ + isParseFail: boolean; + /** + * @en The reverse matrix, some bone animations need to be reversed to be displayed correctly. + * @zh 反转矩阵,有些骨骼动画需要反转才能正确显示。 + */ + yReverseMatrix: Matrix; + /** + * @en Render order animation data array. + * @zh 渲染顺序动画数据数组。 + */ + drawOrderAniArr: any[]; + /** + * @en Event animation data array. + * @zh 事件动画数据数组。 + */ + eventAniArr: any[]; + /** @private 索引对应的名称 */ + attachmentNames: any[]; + /** + * @en Vertex animation data array. + * @zh 顶点动画数据数组。 + */ + deformAniArr: any[]; + /** + * @en Actual display object list for destruction purposes. + * @zh 实际显示对象列表,用于销毁用。 + */ + skinSlotDisplayDataArr: SkinSlotDisplayData[]; + aniSectionDic: any; + /**@private */ + tMatrixDataLen: number; + /** + * @en Root bone of the skeleton + * @zh 骨骼的根骨骼 + */ + mRootBone: Bone; + /** + * @en Array of all bones in the skeleton + * @zh 骨骼中所有骨骼的数组 + */ + mBoneArr: Bone[]; + /** + * @en Create skeletal animation. + * - 0: Use the template's buffer data, which cannot be modified. (Low memory overhead, low computation overhead, does not support costume changes) + * - 1: Use the animation's own buffer. Each animation will have its own buffer, which is quite memory-intensive. (High memory overhead, low computation overhead, supports costume changes) + * - 2: Use a dynamic approach for real-time drawing. (Low memory overhead, high computation overhead, supports costume changes, not recommended) + * @param aniMode The animation mode: 0 for no costume change support, 1 or 2 for costume change support. + * @return The created instance. + * @zh 创建骨骼动画。 + * - 0: 使用模板缓冲的数据,不允许修改。(内存开销小,计算开销小,不支持换装) + * - 1: 使用动画自己的缓冲区,每个动画都会有自己的缓冲区,相当耗费内存。(内存开销大,计算开销小,支持换装) + * - 2: 使用动态方式进行实时绘制。(内存开销小,计算开销大,支持换装,不建议使用) + * @param aniMode 动画模式,0:不支持换装;1、2支持换装 + * @return 创建的实例。 + */ + buildArmature(aniMode?: number): Skeleton; + _parse(texture: Texture, createURL: string, skeletonData: ArrayBuffer): void; + /** + * @en Get the specified texture by its name. + * @param name The name of the texture. + * @returns The requested texture object. + * @zh 通过名称获取指定的纹理。 + * @param name 纹理的名字 + * @returns 所请求的纹理对象。 + */ + getTexture(name: string): Texture; + /** + * @private + * @en Display the specified skin using the bone slot dictionary and skin index. + * @param boneSlotDic The dictionary of bone slots. + * @param skinIndex The index of the skin to display. + * @param freshDisplayIndex Whether to reset the slot textures, default is true. + * @return Whether the skin was successfully displayed. + * @zh 使用插槽字典和皮肤索引显示指定的皮肤。 + * @param boneSlotDic 插槽字典的引用 + * @param skinIndex 要显示的皮肤的索引 + * @param freshDisplayIndex 是否重置插槽纹理,默认为true + * @return 是否显示皮肤成功 + */ + showSkinByIndex(boneSlotDic: any, skinIndex: number, freshDisplayIndex?: boolean): boolean; + /** + * @en Retrieves the index of a skin based on its name. + * @param skinName The name of the skin. + * @return The index of the skin, or -1 if not found. + * @zh 通过皮肤名称获取皮肤索引。 + * @param skinName 皮肤名称 + * @return 皮肤索引,找不到返回-1 + */ + getSkinIndexByName(skinName: string): number; + /** + * @en Retrieves the name of an animation based on its index. + * @param index The index of the animation. + * @return The name of the animation, or null if not found. + * @zh 通过索引获取动画名称。 + * @param index 动画索引 + * @return 动画名称,找不到返回null + */ + getAniNameByIndex(index: number): string; + /** + * @private + * @en Retrieves the buffered graphics data for a specific animation frame. + * @param aniIndex The index of the animation. + * @param frameIndex The index of the frame within the animation. + * @return The graphics object for the specified animation frame, or null if not available. + * @zh 获取特定动画帧的缓冲图形数据。 + * @param aniIndex 动画索引 + * @param frameIndex 帧索引 + * @return 指定动画帧的对象,如果不存在则返回null + */ + getGrahicsDataWithCache(aniIndex: number, frameIndex: number): Graphics; + /** + * @private + * @en Saves graphics data to the cache for a specific animation frame. + * @param aniIndex The index of the animation. + * @param frameIndex The index of the frame within the animation. + * @param graphics The graphics object to cache. + * @zh 保存特定动画帧的图形数据到缓冲区。 + * @param aniIndex 动画索引 + * @param frameIndex 帧索引 + * @param graphics 要缓存的数据 + */ + setGrahicsDataWithCache(aniIndex: number, frameIndex: number, graphics: Graphics): void; + /** + * @en Deletes animation data at the specified index. + * @param aniIndex The index of the animation data to delete. + * @zh 删除指定索引的动画数据。 + * @param aniIndex 要删除的动画索引 + */ + deleteAniData(aniIndex: number): void; + protected _disposeResource(): void; + } + /** + * @en The `Transform` class represents a 2D transformation matrix, used to apply rotations, scaling, skewing, and translation to objects. + * @zh `Transform` 类表示一个2D变换矩阵,用于对对象应用旋转、缩放、倾斜和位移。 + */ + class Transform { + /** + * @en The rotation angle around the X-axis (in degrees). + * @zh 绕X轴旋转的角度(以度为单位)。 + */ + skX: number; + /** + * @en The rotation angle around the Y-axis (in degrees). + * @zh 绕Y轴旋转的角度(以度为单位)。 + */ + skY: number; + /** + * @en The scaling factor along the X-axis. + * @zh 沿X轴的缩放系数。 + */ + scX: number; + /** + * @en The scaling factor along the Y-axis. + * @zh 沿Y轴的缩放系数。 + */ + scY: number; + /** + * @en The translation along the X-axis. + * @zh 沿X轴的平移。 + */ + x: number; + /** + * @en The translation along the Y-axis. + * @zh 沿Y轴的平移。 + */ + y: number; + /** + * @en The skew angle along the X-axis (in degrees). + * @zh 沿X轴的倾斜角度(以度为单位)。 + */ + skewX: number; + /** + * @en The skew angle along the Y-axis (in degrees). + * @zh 沿Y轴的倾斜角度(以度为单位)。 + */ + skewY: number; + /** + * @en The internal matrix used for transformations. + * @zh 用于变换的内部矩阵。 + * @private + */ + private mMatrix; + /** + * @en Initializes the transform data with the provided values. + * @param data The data object containing transformation properties. + * @zh 使用提供的数据初始化变换。 + * @param data 数据对象,包含变换属性。 + */ + initData(data: any): void; + /** + * @en Gets the current matrix. + * @returns The transformation matrix. + * @zh 获取当前矩阵。 + * @returns 变换矩阵。 + */ + getMatrix(): Matrix; + /** + * @en Applies skew to the matrix based on the given angles. + * @param m The matrix to apply the skew transformation to. + * @param x The horizontal skew angle, in radians. + * @param y The vertical skew angle, in radians. + * @returns The modified matrix with skew applied. + * @zh 根据给定的角度对矩阵应用倾斜。 + * @param m 要应用倾斜变换的矩阵。 + * @param x 水平倾斜角度,以弧度为单位。 + * @param y 垂直倾斜角度,以弧度为单位。 + * @returns 应用倾斜后的矩阵。 + */ + skew(m: Matrix, x: number, y: number): Matrix; + } + /** + * @en Graphic animation class. + * @zh 图形动画类。 + */ + class GraphicsAni extends Graphics { + /** + * @private + * @en Draws a custom skinned mesh for graphic animation. + * @param skinA The skin mesh object for graphic. + * @param alpha The opacity value to apply to the graphic. + * @zh 绘制自定义蒙皮动画。 + * @param skinA 图形的蒙皮网格对象。 + * @param alpha 要应用于图形的不透明度值。 + */ + drawSkin(skinA: SkinMeshForGraphic, alpha: number): void; + private static _caches; + /** + * @en Retrieves an instance of GraphicsAni from the cache or creates a new one if none are available. + * @returns An instance of GraphicsAni. + * @zh 从缓存中获取一个 GraphicsAni 实例,如果没有可用的实例则创建一个新的。 + * @returns GraphicsAni 的一个实例。 + */ + static create(): GraphicsAni; + /** + * @en Recycles a GraphicsAni instance by clearing its content and adding it to the cache for future use. + * @param graphics The GraphicsAni instance to recycle. + * @zh 通过清除其内容并将其实例添加到缓存中来回收 GraphicsAni。 + * @param graphics 要回收的 GraphicsAni 实例。 + */ + static recycle(graphics: GraphicsAni): void; + } + /** + * @en Keyframes + * @zh 关键帧 + */ + class KeyFramesContent { + /** + * @en The start time of the keyframe in milliseconds. + * @zh 关键帧的开始时间(毫秒)。 + */ + startTime: number; + /** + * @en The duration of the keyframe in milliseconds. + * @zh 关键帧的持续时间(毫秒)。 + */ + duration: number; + /** + * @en Private interpolation data. + * An array containing the interpolation types and their associated data in the format [type0, Data0, type1, Data1, ...]. + * Type represents the interpolation method, and Data is the associated interpolation data which can be null. + * Note: The value 254 indicates linear interpolation throughout, and 255 indicates no interpolation. + * @zh 私有插值数据。 + * 数组内包含插值类型和相关数据,格式为 [type0, Data0, type1, Data1, ...]。 + * Type 表示插值方法,Data 是相关的插值数据,可以为空。 + * 注意:值 254 表示全线性插值,255 表示不进行插值。 + */ + interpolationData: any[]; + /** + * @en The keyframe data. + * @zh 关键帧的数据。 + */ + data: Float32Array; + /** + * @en The change in keyframe data. + * @zh 关键帧数据的变化量。 + */ + dData: Float32Array; + /** + * @en The data for the next keyframe. + * @zh 下一个关键帧的数据。 + */ + nextData: Float32Array; + } + /** + * @en The animation is scheduled after playing. + * @zh 动画播放完毕后调度。 + * @eventType Event.COMPLETE + */ + /** + * @en Schedule after playing to a tag. + * @zh 播放到某标签后调度。 + * @eventType Event.LABEL + */ + /** + * @en Schedule after loading. + * @zh 加载完成后调度。 + * @eventType Event.LOADED + */ + /** + * @en Schedule after enter post frame. + * @zh 进入帧后调度。 + * @eventType Event.FRAME + */ + /** + * @en MovieClip is used to play SWF animations that have been processed by tools. + * @zh MovieClip 用于播放经过工具处理后的 swf 动画。 + */ + class MovieClip extends Sprite { + /** + * @en Resource root directory + * @zh 资源根目录 + */ + basePath: string; + private _source; + /** + * @en Playback interval (in milliseconds) + * @zh 播放间隔(单位:毫秒)。 + */ + interval: number; + /** + * @en Whether to play in a loop + * @zh 是否循环播放 + */ + loop: boolean; + /** + * @en Constructor method of MovieClip. + * @param parentMovieClip The parent MovieClip, this parameter is not required when creating your own MovieClip. + * @zh MovieClip构造方法 + * @param parentMovieClip 父 MovieClip,自己创建时不需要传该参数。 + */ + constructor(parentMovieClip?: MovieClip); + /** + * @override + * @en Destroys this object and its referenced Texture. + * @param destroyChild Whether to destroy child nodes simultaneously. If true, child nodes are destroyed; otherwise, they are not. + * @zh 销毁此对象及其引用的Texture。 + * @param destroyChild 是否同时销毁子节点,若值为true,则销毁子节点,否则不销毁子节点。 + */ + destroy(destroyChild?: boolean): void; + /** + * @private + * @en Update the timeline of the MovieClip. + * @zh 更新 MovieClip 的时间轴。 + */ + updates(): void; + /** + * @en The current playback index of the MovieClip. + * @zh MovieClip 当前播放的索引。 + */ + get index(): number; + set index(value: number); + /** + * @en Adds a label to a specified frame index. When played to this index, a label event will be dispatched. + * @param label The name of the label. + * @param index The frame index to add the label to. + * @zh 在指定的帧索引上增加一个标签,播放到此索引后会派发label事件。 + * @param label 标签名称 + * @param index 索引位置 + */ + addLabel(label: string, index: number): void; + /** + * @en Remove the corresponding label from the specified label name. + * @param label The name of the label to remove. If not provided, all labels are removed. + * @zh 从指定的标签名字删除对应标签。 + * @param label 标签名字,如果label为空,则删除所有Label + */ + removeLabel(label: string): void; + /** + * @en The total number of frames in the MovieClip. + * @zh MovieClip 中的帧总数。 + */ + get count(): number; + /** + * @en Whether the MovieClip is currently playing. + * @zh MovieClip 是否正在播放中。 + */ + get playing(): boolean; + /** + * @en Stops the playback of the animation. + * @zh 停止播放动画。 + */ + stop(): void; + /** + * @en Jumps to a specified frame and stops playing the animation. + * @param index The frame index to jump to. + * @zh 跳到指定帧并停止播放动画。 + * @param index 要跳到的帧 + */ + gotoAndStop(index: number): void; + /** + * @en Play Animation + * @param index frame index + * @zh 播放动画。 + * @param index 帧索引 + */ + play(index?: number, loop?: boolean): void; + /** + * @en The source of the MovieClip. + * @zh MovieClip 的资源地址。 + */ + get source(): string; + set source(value: string); + /** + * @deprecated 请使用Loader.load(url:string, type: ILaya.Loader.BUFFER) + * @en Loads resources for the MovieClip. + * @param url The URL of the SWF resource. + * @param atlas Whether to use atlas resources. + * @param atlasPath The path of the atlas, by default it uses the atlas with the same name as the SWF. + * @zh 加载 MovieClip 资源。 + * @param url SWF 资源的 URL。 + * @param atlas 是否使用图集资源。 + * @param atlasPath 图集路径,默认使用与swf同名的图集 + */ + load(url: string, atlas?: boolean, atlasPath?: string): void; + /** + * @en Plays the animation from the start index to the end index, and triggers the complete callback when finished. + * @param start The starting frame index. + * @param end The ending frame index. + * @param complete End callback. + * @zh 从开始索引播放到结束索引,结束后触发 complete 回调。 + * @param start 开始索引 + * @param end 结束索引 + * @param complete 结束回调 + */ + playTo(start: number, end: number, complete?: Handler): void; + } + /** + * @en Animation condition types + * @zh 动画条件类型 + */ + enum AniConditionType { + /** + * @en Greater than + * @zh 大于 + */ + Greater = 0, + /** + * @en Less than + * @zh 小于 + */ + Less = 1, + /** + * @en Equal to + * @zh 等于 + */ + Equals = 2, + /** + * @en Not equal to + * @zh 不等于 + */ + NotEqual = 3 + } + /** + * @en 2D animation types + * @zh 2D动画类型 + */ + class Animation2DCondition { + /** + * @en ID number + * @zh id编号 + */ + id: number; + /** + * @en Animation conditions + * @zh 动画条件 + */ + type: AniConditionType; + /** + * @en Detection value + * @zh 检测值 + */ + checkValue: any; + } + /** + * @en Animation2DEvent class is used to implement animation events. + * @zh Animation2DEvent 类用于实现动画事件。 + */ + class Animation2DEvent { + /** + * @en The time at which the event is triggered. + * @zh 事件触发的时间。 + */ + time: number; + /** + * @en The name of the event that is triggered. + * @zh 被触发的事件名称。 + */ + eventName: string; + /** + * @en Event triggering parameters + * @zh 事件触发参数。 + */ + params: any[]; + /** + * @en Constructor method, instance of Animation2DEvent. + * @zh 2D动画事件类实例 + */ + constructor(); + } + /** + * @en Represents a parameter for 2D animation that includes a name, type, and value. + * @zh 表示2D动画的参数,包括名称、类型和值。 + */ + class Animation2DParm { + name: string; + type: AniParmType; + value: boolean | number; + } + /** + * @en Class for parsing and storing 2D animation data. + * @zh 用于处理2D动画片段的类。 + */ + class AnimationClip2D extends Resource { + /** + * @en Animation frame filling function + * @zh 动画补帧函数 + */ + static tween: { + Linear: (t: number, b: number, c: number, d: number) => number; + Quad_EaseIn: (t: number, b: number, c: number, d: number) => number; + Quad_EaseOut: (t: number, b: number, c: number, d: number) => number; + Quad_EaseInOut: (t: number, b: number, c: number, d: number) => number; + Cubic_EaseIn: (t: number, b: number, c: number, d: number) => number; + Cubic_EaseOut: (t: number, b: number, c: number, d: number) => number; + Cubic_EaseInOut: (t: number, b: number, c: number, d: number) => number; + Quart_EaseIn: (t: number, b: number, c: number, d: number) => number; + Quart_EaseOut: (t: number, b: number, c: number, d: number) => number; + Quart_EaseInOut: (t: number, b: number, c: number, d: number) => number; + Quint_EaseIn: (t: number, b: number, c: number, d: number) => number; + Quint_EaseOut: (t: number, b: number, c: number, d: number) => number; + Quint_EaseInOut: (t: number, b: number, c: number, d: number) => number; + Sine_EaseIn: (t: number, b: number, c: number, d: number) => number; + Sine_EaseOut: (t: number, b: number, c: number, d: number) => number; + Sine_EaseInOut: (t: number, b: number, c: number, d: number) => number; + Expo_EaseIn: (t: number, b: number, c: number, d: number) => number; + Expo_EaseOut: (t: number, b: number, c: number, d: number) => number; + Expo_EaseInOut: (t: number, b: number, c: number, d: number) => number; + Circ_EaseIn: (t: number, b: number, c: number, d: number) => number; + Circ_EaseOut: (t: number, b: number, c: number, d: number) => number; + Circ_EaseInOut: (t: number, b: number, c: number, d: number) => number; + Elastic_EaseIn: (t: number, b: number, c: number, d: number, a: number, p: number) => number; + Elastic_EaseOut: (t: number, b: number, c: number, d: number, a: number, p: number) => number; + Elastic_EaseInOut: (t: number, b: number, c: number, d: number, a: number, p: number) => number; + Back_EaseIn: (t: number, b: number, c: number, d: number, s?: number) => number; + Back_EaseOut: (t: number, b: number, c: number, d: number, s?: number) => number; + Back_EaseInOut: (t: number, b: number, c: number, d: number, s?: number) => number; + Bounce_EaseIn: (t: number, b: number, c: number, d: number) => number; + Bounce_EaseOut: (t: number, b: number, c: number, d: number) => number; + Bounce_EaseInOut: (t: number, b: number, c: number, d: number) => number; + hermiteInterpolate: (outTangent: number, inTangent: number, startValue: number, endValue: number, t: number, dur: number) => number; + }; + /** + * @en Is it a loop? + * @zh 是否循环 + */ + islooping: boolean; + /** + * @en Constructor method. ctructs a AnimationClip2D object. + * @zh 构造方法,创建AnimationClip2D对象。 + */ + constructor(); + /** + * @en Animation duration + * @zh 动画时长 + */ + duration(): number; + /** + * @en hermite interpolation algorithm + * @param frameValue The value of the previous keyframe. + * @param frametime The time point of the previous keyframe. + * @param frameOutWeight The weight of the outgoing tangent for the previous keyframe. + * @param frameOutTangent The outgoing tangent value for the previous keyframe. + * @param nextframeValue The value of the next keyframe. + * @param nextframetime The time point of the next keyframe. + * @param nextframeInweight The weight of the incoming tangent for the next keyframe. + * @param nextframeIntangent The incoming tangent value for the next keyframe. + * @param time The current time. + * @returns The interpolated value at the specified time. + * @zh hermite插值算法 + * @param frameValue 上一帧值 + * @param frametime 上一帧时间 + * @param frameOutWeight 上一帧权重 + * @param frameOutTangent 上一帧切线 + * @param nextframeValue 下一帧值 + * @param nextframetime 下一帧时间 + * @param nextframeInweight 下一帧权重 + * @param nextframeIntangent 下一帧切线 + * @param time 时间 + * @returns 指定时间的插值。 + */ + hermiteCurveSplineWeight(frameValue: number, frametime: number, frameOutWeight: number, frameOutTangent: number, nextframeValue: number, nextframetime: number, nextframeInweight: number, nextframeIntangent: number, time: number): number; + /** + * @en Adds an animation event to the animation timeline. + * @param event The animation event to be added. + * @zh 添加动画事件 + * @param event 动画事件 + */ + addEvent(event: Animation2DEvent): void; + } + /** + * @en Class for AnimationClip resource parsing + * @zh 用于AnimationClip资源解析 + */ + class AnimationClip2DParse01 { + } + /** + * @en 2D animation components + * @zh 2D动画组件 + */ + class Animator2D extends Component { + /** + * @en Constructor method of Animator2D Component. + * @zh 2D动画组件构造方法。 + */ + constructor(); + /** + * @en The 2D animation controller. + * @zh 2D动画控制器。 + */ + get controller(): AnimatorController2D; + set controller(val: AnimatorController2D); + /** + * @en The current 2D animation controller. + * @zh 动画参数 + */ + get parameters(): Record; + set parameters(val: Record); + /** + * @en The playback speed of the animation. + * @zh 播放速度 + */ + get speed(): number; + set speed(num: number); + /** + * @en If the animation is currently playing. + * @zh 动画是否正在播放。 + */ + get isPlaying(): boolean; + /** + * @en Assigns data to a Node. + * @param stateInfo The animation state information. + * @param additive Indicates if it is additive. + * @param weight The weight of the state. + * @param isFirstLayer Indicates if it is the first layer. + * @zh 赋值Node数据。 + * @param stateInfo 动画状态信息。 + * @param additive 是否为加法。 + * @param weight 状态的权重。 + * @param isFirstLayer 是否是第一层。 + */ + private _setClipDatasToNode; + /** + * @en Jump to the specified frame and stop playing the animation. + * @param name The name of the animation. + * @param layerIndex The index of the animation layer. + * @param frame The specified frame to jump to. + * @zh 跳转到指定帧并停止播放动画。 + * @param name 动画名称 + * @param layerIndex 动画层 + * @param frame 指定帧 + */ + gotoAndStopByFrame(name: string, layerIndex: number, frame: number): void; + /** + * @en Gets the controller layer. + * @param layerIndex The layer index. Defaults to 0. + * @returns The AnimatorControllerLayer at the specified index. + * @zh 获取控制器层。 + * @param layerIndex 层索引。 + * @return 指定索引处的AnimatorControllerLayer。 + */ + getControllerLayer(layerIndex?: number): AnimatorControllerLayer2D; + /** + * @en Jump to the specified time and stop playing the animation. + * @param name The name of the animation. + * @param layerIndex The index of the layer. + * @param normalizedTime The normalized playback time of the animation. + * @zh 跳转到指定时间并停止播放动画。 + * @param name 动画名称 + * @param layerIndex 层索引 + * @param normalizedTime 归一化播放动画时间 + */ + gotoAndStop(name: string, layerIndex: number, normalizedTime: number): void; + /** + * @en Play animation + * @param name The name of the animation. + * @param layerIndex The index of the layer. + * @param normalizedTime The normalized time. + * @zh 播放动画 + * @param name 动画名称 + * @param layerIndex 层索引 + * @param normalizedTime 归一化时间 + */ + play(name?: string, layerIndex?: number, normalizedTime?: number): void; + /** + * @en Stop playing animation. + * @zh 停止播放动画 + */ + stop(): void; + /** + * @en Frame Loop + * @zh 帧循环 + */ + onUpdate(): void; + /** + * @en Adds an animator controller layer. + * @param controllerLayer The animator controller layer to be added. + * @zh 增加一个动画控制器层。 + * @param controllerLayer 动画控制器层. + */ + addControllerLayer(controllerLayer: AnimatorControllerLayer2D): void; + /** + * @en Cross-fades between the current and target animation states. + * @param name The name of the target animation state. + * @param layerIndex The index of the layer. + * @param normalizedTime The normalized start time for playback. + * @param transitionDuration The duration of the transition in normalized time (between 0.0 and 1.0). + * @zh 在当前动画状态和目标动画状态之间进行融合过渡播放。 + * @param name 目标动画状态。 + * @param layerIndex 层索引。 + * @param normalizedTime 归一化的播放起始时间。 + * @param transitionDuration 过渡时间,该值为当前动画状态的归一化时间,值在0.0~1.0之间。 + */ + crossFade(name: string, layerIndex: number, normalizedTime: number, transitionDuration: number): boolean; + /** + * @en Cross-fades between the current and target animation states with an optional transition duration. + * @param name The name of the target animation state. + * @param layerIndex The index of the layer. + * @param normalizedTime The normalized start time for playback. + * @zh 在当前动画状态和目标动画状态之间进行融合过渡播放。 + * @param name 目标动画状态的名称。 + * @param layerIndex 层的索引。 + * @param normalizedTime 归一化的播放起始时间。 + */ + crossFade(name: string, layerIndex: number, normalizedTime: number): boolean; + /** + * @en Get the default State Machine + * @param layerIndex The index of the layer. + * @zh 获取默认状态机 + * @param layerIndex 层索引 + */ + getDefaultState(layerIndex?: number): AnimatorState2D; + /** + * @en Set a parameter's trigger value. + * @param name The name of the parameter. + * @zh 设置参数Trigger值 + * @param name 名字 + */ + setParamsTrigger(name: string): void; + /** + * @en Set a parameter's float value. + * @param name The name of the parameter. + * @param value The value of the parameter. + * @zh 设置参数Number值 + * @param name 名字 + * @param value 值 + */ + setParamsNumber(name: string, value: number): void; + /** + * @en Set a parameter's bool value. + * @param name The name of the parameter. + * @param value The value of the parameter. + * @zh 设置参数Bool值 + * @param name 名字 + * @param value 值 + */ + setParamsBool(name: string, value: boolean): void; + /** + * @en Get a parameter's trigger value. + * @param name The name of the parameter. + * @zh 得到参数值 + * @param name 名字 + */ + getParamsvalue(name: number): number | boolean; + } + /** + * @en 2D animation controller + * @zh 2D动画控制器 + */ + class AnimatorController2D extends Resource { + /** + * @en Constructor method of 2D animation controller + * @zh 2D动画控制器的构造方法 + */ + constructor(data: any); + private _getAnimatorTransition2D; + } + /** + * @en Layer of 2D animation controllers + * @zh 2D动画控制器层 + */ + class AnimatorControllerLayer2D implements IClone { + /** + * @en Mixed Mode: Overwrite + * @zh 混合模式_覆盖。 + */ + static BLENDINGMODE_OVERRIDE: number; + /** + * @en Mixed Mode: Stacking + * @zh 混合模式_叠加。 + */ + static BLENDINGMODE_ADDTIVE: number; + /** + * @en layer name + * @zh 层的名字 + */ + name: string; + /** + * @en Whether to play when the layer is started. + * @zh 是否开始时播放 + */ + playOnWake: boolean; + /** + * @en Default weight + * @zh 默认权重 + */ + defaultWeight: number; + /** + * @en Mixed Mode + * @zh 混合模式 + */ + blendingMode: number; + /** + * @en Is it enabled + * @zh 是否开启 + */ + enable: boolean; + /** + * @en Constructor method of 2D animator controller Layer. + * @zh 2D动画控制器层的构造方法 + */ + constructor(name: string); + /** + * @en State machine + * @zh 状态机 + */ + get states(): ReadonlyArray; + set states(states: ReadonlyArray); + /** + * @en The default state name. + * @zh 默认状态名称。 + */ + get defaultStateName(): string; + set defaultStateName(str: string); + /** + * @en Default animation state machine + * @zh 默认动画状态机。 + */ + get defaultState(): AnimatorState2D; + set defaultState(value: AnimatorState2D); + /** + * 移除Clip + * @param clipStateInfos + * @param index + * @param state + */ + private _removeClip; + /** + * @en Gets the current play state of the animator. + * @returns The play state of the animation. + * @zh 获取当前的动画播放状态。 + * @returns 动画的播放状态。 + */ + getCurrentPlayState(): AnimatorPlayState2D; + /** + * @en Gets an animator state by its name. + * @param str The name of the state to retrieve. + * @returns The AnimatorState2D object if found, otherwise null. + * @zh 通过状态机名称获取动画状态对象。 + * @param str 要检索的状态名称。 + * @returns 如果找到,返回 AnimatorState2D 对象,否则返回 null。 + */ + getStateByName(str: string): AnimatorState2D; + /** + * @en Adds an animation state to the animator. + * @param state The AnimatorState2D to add. + * @zh 向动画机添加动画状态。 + * @param state 要添加的 AnimatorState2D。 + */ + addState(state: AnimatorState2D): void; + /** + * @en Removes an animation state. + * @param state The AnimatorState2D to remove. + * @zh 移除动画状态。 + * @param state 要移除的 AnimatorState2D。 + */ + removeState(state: AnimatorState2D): void; + /** + * @en Clones the current animator controller layer. + * @returns A clone of the current animator controller layer. + * @zh 克隆当前的动画控制器层。 + * @returns 当前动画控制器层的克隆副本。 + */ + clone(): AnimatorControllerLayer2D; + /** + * @en Clones the current animator controller layer to a destination object. + * @param destObject The destination object to clone to. + * @zh 克隆当前的动画控制器层到目标对象。 + * @param destObject 克隆到的目标对象。 + */ + cloneTo(destObject: AnimatorControllerLayer2D): void; + /** + * @en Destroys the animator controller layer and all its states. + * @zh 销毁动画控制器层及其所有状态。 + */ + destroy(): void; + } + interface TypeAnimatorControllerData { + layerW: number; + controllerLayers: TypeAnimatorLayer[]; + cullingMode?: number; + enable?: boolean; + animatorParams?: TypeAnimatorParams[]; + } + interface TypeAnimatorParams { + id: number; + name: string; + type: AniParmType; + val: number | boolean; + } + interface TypeAnimatorLayer { + defaultStateName?: string; + name: string; + blendingMode: number; + states: TypeAnimatorState[]; + playOnWake: boolean; + defaultWeight: number; + avatarMask?: any; + stageX?: number; + stageY?: number; + stageScale?: number; + } + enum AniParmType { + Float = 0, + Bool = 1, + Trigger = 2 + } + /** + * @en Animation state condition types + * @zh 动画状态条件类型 + */ + enum AniStateConditionType { + Number = 0, + Bool = 1, + Trigger = 2 + } + interface TypeAnimatorState { + x: number; + y: number; + /**-1代表enter,-2代表exit,-3代表anyState */ + id: string; + name: string; + speed?: number; + clipStart?: number; + clipEnd?: number; + loop?: number; + yoyo?: boolean; + soloTransitions?: TypeAnimatorTransition[]; + clip?: { + _$uuid: string; + }; + scripts?: string[]; + states?: TypeAnimatorState[]; + defaultStateName?: string; + stageX?: number; + stageY?: number; + stageScale?: number; + } + interface TypeAnimatorTransition { + id: string; + name?: string; + mute?: boolean; + solo?: boolean; + exitTime?: number; + transduration?: number; + transstartoffset?: number; + exitByTime?: boolean; + conditions?: TypeAnimatorConditions[]; + } + interface TypeAnimatorConditions { + id?: number; + type?: AniStateConditionNumberCompressType; + checkValue?: number | boolean; + name?: string; + } + enum AniStateConditionNumberCompressType { + Less = 0, + Greater = 1 + } + /** + * @en Animation controller parsing and processing utility class. + * @zh 解析和处理动画控制器数据的工具类。 + */ + class AnimatorControllerParse { + /** + * @en Parses the provided data to create a structured TypeAnimatorControllerData object.. + * @zh 解析提供的数据以创建结构化的 TypeAnimatorControllerData 对象。 + */ + static parse(data: TypeAnimatorControllerData): { + ret: TypeAnimatorControllerData; + clipsID: string[]; + }; + private static checkStates; + private static checkNext; + private static checkConditions; + private static checkDefault; + private static getStateByID; + } + /** + * @en 2D Animator Play State. + * @zh 2D 动画播放状态。 + */ + class AnimatorPlayState2D { + _finish: boolean; + /** + * @en Total play time, not affected by negative speed values. + * @zh 总播放时间,不受速度为负数的影响。 + */ + _playAllTime: number; + /** + * @en Indicates if the playback is in forward direction. + * @zh 表示播放是否为正向。 + */ + _frontPlay: boolean; + /** + * @en The duration of the current animation, in seconds. + * @zh 当前动画的持续时间,以秒为单位。 + */ + get duration(): number; + /** + * @en Animation state machine + * @zh 动画状态机。 + */ + get animatorState(): AnimatorState2D; + /** + * @en Constructor method of AnimatorPlayState2D class. + * @zh AnimatorPlayState2D类的构造方法 + */ + constructor(); + } + /** + * @en The Animator class is used to create animation components. + * @zh Animator 类用于创建动画组件。 + */ + class AnimatorState2D extends EventDispatcher implements IClone { + /** + * @en Play on awake start offset + * @zh 启动时播放偏移 + */ + cycleOffset: number; + /** + * @en name + * @zh 名称 + */ + name: string; + /** + * @en Animation playback speed + * @zh 动画播放速度 + */ + speed: number; + /** + * @en Action playback start time. + * @zh 动作播放起始时间 + */ + clipStart: number; + /** + * @en The end time of the action playback. + * @zh 动作播放结束时间。 + */ + clipEnd: number; + /** + * @en The number of animation loops. -1 or less than -1 to use the loop state of the clip, 1 for playing once, 2 for playing twice, 0 for infinite looping. + * @zh 动画循环次数,-1或小于-1使用clip的循环状态,1表示播放一次,2表示播放两次,0表示无限循环。 + */ + loop: number; + /** + * @en Is it a one-time forward playback and one-time reverse playback mode + * @zh 是否为一次正播放,一次倒播放模式 + */ + yoyo: boolean; + /** + * @en Animation Clip + * @zh 动画剪辑 + */ + get clip(): AnimationClip2D | null; + set clip(value: AnimationClip2D | null); + /** + * @en Dispatches the transition event and checks for transitions based on normalized time and parameters. + * @param normalizeTime The normalized time for transition checking. + * @param paramsMap The map of parameters for transition checking. + * @param isReplay Whether to repeat playback. + * @zh 派发过渡事件并根据归一化时间和参数检查过渡。 + * @param normalizeTime 用于检查过渡的归一化时间。 + * @param paramsMap 用于检查过渡的参数映射。 + * @param isReplay 是否重复播放 + */ + _eventtransition(normalizeTime: number, paramsMap: Record, isReplay: boolean): AnimatorTransition2D; + /** + * @en Adds a script of the specified type to the animator state. + * @param type The type of the script to be added. + * @returns The added script instance. + * @zh 向动画状态添加指定类型的脚本。 + * @param type 要添加的脚本类型。 + * @returns 添加的脚本实例。 + */ + addScript(type: typeof AnimatorState2DScript): AnimatorState2DScript; + /** + * @en Get the script of the specified type. + * @param type The type of the script to retrieve. + * @returns The script instance if found, or null if not found. + * @zh 获取指定类型的脚本。 + * @param type 要检索的脚本类型。 + * @returns 如果找到则返回脚本实例,如果没有找到则返回 null。 + */ + getScript(type: typeof AnimatorState2DScript): AnimatorState2DScript | null; + /** + * @en Get the collection of scripts of the specified type. + * @param type The type of scripts to retrieve. + * @returns An array of scripts if found, or null if no scripts match the type. + * @zh 获取指定类型的脚本集合。 + * @param type 要检索的脚本类型。 + * @returns 如果找到则返回脚本数组,如果没有找到匹配类型的脚本则返回 null。 + */ + getScripts(type: typeof AnimatorState2DScript): AnimatorState2DScript[] | null; + /** + * @en Clone of the current instance. + * @returns A new instance of AnimatorState2D that is a clone of the current instance. + * @zh 当前实例的克隆 + * @returns 一个新的 AnimatorState2D 实例,是当前实例的克隆。 + */ + clone(): AnimatorState2D; + /** + * @en Copies the properties of the current animator state to a target object. + * @param destObject The target object to which the properties are copied. + * @zh 将当前动画状态的属性拷贝到目标对象。 + * @param destObject 要拷贝属性的目标对象。 + */ + cloneTo(destObject: AnimatorState2D): void; + /** + * @en Destroys . + * @zh 销毁。 + */ + destroy(): void; + } + /** + * @en The AnimatorStateScript class is used as the parent class for animation state scripts. This class is abstract and does not allow instances. + * @zh AnimatorStateScript 类用于动画状态脚本的父类,该类为抽象类,不允许实例。 + */ + class AnimatorState2DScript { + /** + * @en Constructor method of AnimatorStateScript. + * @zh AnimatorStateScript的构造方法 + */ + constructor(); + /** + * @en Executed when the animation state starts. + * @zh 动画状态开始时执行。 + */ + onStateEnter(): void; + /** + * @en Called during the execution of the animation state, providing the normalized play time. + * @param normalizeTime The normalized play time of the animation, ranging from 0 to 1. + * @zh 在动画状态运行中调用,提供归一化的播放时间。 + * @param normalizeTime 动画的归一化播放时间,范围从0到1。 + */ + onStateUpdate(normalizeTime: number): void; + /** + * @en Executed when the animation state is about to exit. + * @zh 动画状态退出时执行。 + */ + onStateExit(): void; + /** + * @en Executed at the end of each loop cycle if the animation is set to loop. + * @zh 如果动画设置为循环,在每次循环结束时执行。 + */ + onStateLoop(): void; + } + /** + * @en Animation state machine transition condition + * @zh 动画状态机过渡条件 + */ + class AnimatorStateCondition { + /** + * @en Gets the unique ID associated with a name. + * @param name The unique name. + * @return The unique ID. + * @zh 根据名称获取唯一的ID。 + * @param name 唯一的名称。 + * @return 唯一ID。 + */ + static conditionNameToID(name: string): number; + /** + * @en Gets the unique name associated with an ID. + * @param id The condition ID. + * @returns The unique name. + * @zh 根据ID获取唯一的名称。 + * @param id 条件ID。 + * @returns 唯一名称。 + */ + static conditionIDToName(id: number): string; + /** + * @en Constructor method of AnimatorStateCondition. + * @zh 动画状态机过渡条件的构造方法 + */ + constructor(name?: string); + /** + * @en The unique identifier of the condition. + * @zh 条件的唯一标识符。 + */ + get id(): number; + /** + * @en The name of the condition. + * @zh 条件的名称。 + */ + get name(): string; + set name(value: string); + /** + * @en The type of the condition. + * @zh 条件的类型。 + */ + get type(): AniStateConditionType; + } + /** + * @en Numerical condition class. Used to handle conditions based on numerical comparisons. + * @zh 数值条件类。用于处理基于数值比较的条件。 + */ + class AnimatorStateNumberCondition extends AnimatorStateCondition { + /** + * @en Constructor method of AnimatorStateNumberCondition. + * @zh 创建number比较条件类的构造方法 + */ + constructor(name: string); + /** + * @en The number value. + * @zh 数字值。 + */ + get numberValue(): number; + set numberValue(value: number); + /** + * @en Determine type + * @zh 判断类型 + */ + get compareFlag(): AniStateConditionNumberCompressType; + set compareFlag(value: AniStateConditionNumberCompressType); + /** + * @en Checks if the state is triggered based on the comparison of the provided value with the number value. + * @param value The value to compare. + * @zh 根据提供的值与数值的比较结果检查状态是否触发。 + * @param value 要比较的值。 + */ + checkState(value: number): boolean; + } + /** + * @en Boolean conditional class. Used to handle Boolean based conditions. + * @zh 布尔条件类。用于处理基于布尔值的条件。 + */ + class AnimatorStateBoolCondition extends AnimatorStateCondition { + /** + * @en Constructor method. + * @zh 构造方法 + */ + constructor(name: string); + /** + * @en Determine type + * @zh 判断类型 + */ + get compareFlag(): boolean; + set compareFlag(value: boolean); + /** + * @en Checks if the state is triggered based on the comparison of the provided boolean value with the comparison flag. + * @param value The boolean value to compare. + * @zh 根据提供的布尔值与比较标志的比较结果检查状态是否触发。 + * @param value 要比较的布尔值。 + */ + checkState(value: boolean): boolean; + } + /** + * @en Trigger condition class. Used to handle trigger type conditions. + * @zh 触发器条件类。用于处理触发器类型的条件。 + */ + class AnimatorStateTriggerCondition extends AnimatorStateCondition { + /** + * @en Constructor method. + * @zh 触发器条件类的构造方法 + */ + constructor(name: string); + /** + * @en Check if the state is triggered. If the trigger is true, the condition is met. + * @param value Boolean value. + * @zh 检查状态是否触发,tigger 如果是true,就算条件达成 + * @param value 布尔值。 + */ + checkState(value: boolean): boolean; + } + /** + * @en 2D animation transition + * @zh 2D动画过渡 + */ + class AnimatorTransition2D { + /** + * @en Whether the state is muted. + * @zh 状态是否被禁用。 + */ + mute: boolean; + /** + * @en The exit time of the state. + * @zh 状态的退出时间。 + */ + exitTime: number; + /** + * @en Is the effective time set. + * @zh 是否设置生效时间。 + */ + exitByTime: boolean; + /** + * @en The normalized playback position of the next state in the transition. + * @zh 过渡中下一个状态的归一化播放位置。 + */ + transstartoffset: number; + /** + * @en The normalized transition duration. + * @zh 归一化的过渡持续时间。 + */ + transduration: number; + /** + * @en Transition conditions + * @zh 过渡条件。 + */ + conditions: AnimatorStateCondition[]; + /** + * @en The destination state for the transition. + * @zh 过渡的目标状态。 + */ + destState: AnimatorState2D; + /** + * @en Whether to use and operate when there are multiple conditions + * @zh 当有多个条件的时候是否使用与操作 + */ + isAndOperEnabled: boolean; + /** + * @en Constructor method of Animatortransition2D. + * @zh Animatortransition2D的构造方法 + */ + constructor(); + /** + * @en Adds a state transition condition to the list of conditions. + * @param condition The AnimatorStateCondition to be added. + * @zh 向条件列表中添加一个状态转换条件。 + * @param condition 要添加的状态转换条件。 + */ + addCondition(condition: AnimatorStateCondition): void; + /** + * @en Removes a state transition condition from the list of conditions. + * @param condition The AnimatorStateCondition to be removed. + * @zh 从条件列表中删除一个状态转换条件。 + * @param condition 要删除的状态转换条件。 + */ + removeCondition(condition: AnimatorStateCondition): void; + /** + * @en Checks whether the transition is enabled based on the normalized time, condition parameters, and replay status. + * @param normalizeTime The current normalized time (between 0 and 1) in the animation. + * @param paramsMap Condition group + * @param isReplay Whether to repeat playback. + * @zh 根据归一化时间、条件参数和重播状态检查过渡是否启用。 + * @param normalizeTime 动画中当前的归一化时间(0到1之间)。 + * @param paramsMap 条件组 + * @param isReplay 是否重复播放 + */ + check(normalizeTime: number, paramsMap: Record, isReplay: boolean): boolean; + } + /** + * @en Animation update modes + * @zh 动画更新模式 + */ + enum AnimatorUpdateMode { + /** + * @en Normal update mode + * @zh 正常更新。 + */ + Normal = 0, + /** + * @en Low frame rate update mode + * @zh 低频率更新。 + */ + LowFrame = 1, + /** + * @en Do not update thes animations based on time + * @zh 不更新。 + */ + UnScaleTime = 2 + } + /** + * @en The Component class is used to create the base class for components. + * @zh Component 类用于创建组件的基类。 + */ + class Component { + /**@private */ + private _hideFlags; + /**@private */ + private _enableState; + /** + * @en Gets the owner Node to which the component belongs. + * @zh 获取组件所属的 Node 节点。 + */ + owner: Node; + /** + * @en Extra data of the node. + * @zh 组件的额外数据。IDE内部使用。 + */ + _extra: IComponentExtra; + /** + * @en The hide flags that determine the hiding behavior of the component. + * @zh 确定组件隐藏行为的标志。 + */ + get hideFlags(): number; + set hideFlags(value: number); + /** + * @en Constructor method of Component. + * @zh 组件的构造方法 + */ + constructor(); + /** + * @en Checks if the component has a specific hide flag set. + * @param flag The hide flag to check for. + * @zh 检查组件是否设置了特定的隐藏标志。 + * @param flag 要检查的隐藏标志。 + */ + hasHideFlag(flag: number): boolean; + /** + * @en The unique identifier for the component. + * @zh 组件的唯一标识。 + */ + get id(): number; + /** + * @en whether the component is enabled. + * @zh 是否启用组件。 + */ + get enabled(): boolean; + set enabled(value: boolean); + /** + * @en whether the component has been awakened. + * @zh 组件是否已经被唤醒。 + */ + get awaked(): boolean; + /** + * @en whether the component has been destroyed. + * @zh 组件是否已经被销毁。 + */ + get destroyed(): boolean; + /** + * @en Destroy components + * @zh 销毁组件 + */ + destroy(): void; + /** + * @en Called after the component is added to a node. Unlike Awake, onAdded is called even if the node is not active. + * @zh 组件被添加到节点后调用,与 onAwake 不同的是,即使节点未激活也会调用 onAdded。 + */ + onAdded(): void; + /** + * @en Resets the component's parameters to their default values. If this function is implemented, the component will be reset and automatically recycled for future use. + * If not reset, it will not be recycled for reuse. + * @zh 将组件的参数重置为默认值。如果实现了这个函数,组件将被重置并自动回收到对象池,方便下次复用。 + * 如果没有重置,则不会进行回收复用。 + */ + onReset?(): void; + /** + * @en Executed after the component is activated. At this point, all nodes and components have been created. This method is executed only once. + * @zh 组件被激活后执行,此时所有节点和组件均已创建完毕,此方法只执行一次。 + */ + onAwake(): void; + /** + * @en Executed after the component is enabled, such as when the node is added to the stage. + * @zh 组件被启用后执行,比如节点被添加到舞台后。 + */ + onEnable(): void; + /** + * @en Executed once, before the first update. + * @zh 在第一次执行 update 之前执行,只会执行一次。 + */ + onStart?(): void; + /** + * @en Executed every frame during the update phase. Avoid writing complex loop logic or using the getComponent method here. + * @zh 每帧更新时执行,在 update 阶段。尽量不要在这里写大循环逻辑或使用 getComponent 方法。 + */ + onUpdate?(): void; + /** + * @en Executed every frame during the late update phase, after the update phase. + * @zh 每帧更新时执行,在 late update 阶段,update 阶段之后。 + */ + onLateUpdate?(): void; + /** + * @en Executed before rendering. + * @zh 渲染之前执行。 + */ + onPreRender?(): void; + /** + * @en Executed after rendering. + * @zh 渲染之后执行。 + */ + onPostRender?(): void; + /** + * @en Executed when the component is disabled, such as when the node is removed from the stage. + * @zh 组件被禁用时执行,比如从节点从舞台移除后。 + */ + onDisable(): void; + /** + * @en Executed when the node is destroyed manually. + * @zh 手动调用节点销毁时执行。 + */ + onDestroy(): void; + } + interface IComponentExtra { + } + /** + * @en Core classes for managing and driving the lifecycle of components + * @zh 用于管理和驱动组件生命周期的核心类 + */ + class ComponentDriver { + private _onUpdates; + private _onLateUpdates; + private _onPreRenders; + private _onPostRenders; + private _toStarts; + readonly _toDestroys: Set; + /** + * @en Error handling. + * @zh 错误处理。 + */ + onError(err: any): void; + } + interface TypeAniKey { + /** + * @en The frame index. + * @zh 第几帧 + */ + f: number; + val: number | string | boolean; + /** + * @en Currently used for 2D animation, it is used to record the types of animation gaps, for example (Linear|Quad_EaseIn)... + * @zh 目前用于2D动画,用于记录动画补间的类型,比如(Linear|Quad_EaseIn)... + */ + tweenType?: string; + /** + * @en Extension + * @zh 扩展,如果有一些其它数据需要加入到关键帧中可以写在这里 + */ + extend?: any; + /** + * @en The tween information. + * @zh tween的信息 + */ + tweenInfo?: TypeTweenInfo; + } + interface TypeTweenInfo { + outTangent?: number; + outWeight?: number; + inTangent?: number; + inWeight?: number; + inWeightLock?: boolean; + outWeightLock?: boolean; + broken?: boolean; + } + /** + * @en Class used to represent 2D animation keyframes + * @zh 用于表示2D动画关键帧的类 + */ + class Keyframe2D implements IClone { + static defaultWeight: number; + /** + * @en time + * @zh 时间。 + */ + time: number; + /** + * @en Specific data within the frame + * @zh 帧里面的具体数据 + */ + data: TypeAniKey; + /** + * @en Creates a clone of the current keyframe. + * @returns A new instance of Keyframe2D that is a clone of the current keyframe. + * @zh 创建当前关键帧的克隆。 + * @returns 一个新实例的 Keyframe2D,是当前关键帧的克隆。 + */ + clone(): Keyframe2D; + /** + * @en Copies the properties of the current keyframe to another Keyframe2D instance. + * @param destObject The Keyframe2D instance to which the properties are copied. + * @zh 将当前关键帧的属性复制到另一个 Keyframe2D 实例。 + * @param destObject 要复制属性的 Keyframe2D 实例。 + */ + cloneTo(destObject: Keyframe2D): void; + } + /** + * @en 2D animation keyframe nodes. + * @zh 2D 动画关键帧节点的类。 + */ + class KeyframeNode2D { + _ownerPath: string[]; + _propertys: string[]; + fullPath: string; + nodePath: string; + _indexInList: number; + _keyFrames: Keyframe2D[]; + /** + * @en Number of frames + * @zh 帧个数。 + */ + get keyFramesCount(): number; + _setOwnerPathCount(value: number): void; + _setOwnerPathByIndex(index: number, value: string): void; + _setPropertyCount(value: number): void; + _setPropertyByIndex(index: number, value: string): void; + _setKeyframeCount(value: number): void; + _joinOwnerPath(sep: string): string; + _joinProperty(sep: string): string; + /** + * @en Gets a keyframe by its index in the animation timeline. + * @param index The index of the keyframe to retrieve. + * @zh 通过索引获取动画时间线上的关键帧。 + * @param index 要检索的关键帧的索引。 + */ + getKeyframeByIndex(index: number): Keyframe2D; + /** + * @en The number of owner paths in the animation. + * @zh 动画中的精灵路径个数。 + */ + get ownerPathCount(): number; + /** + * @en The number of property paths in the animation. + * @zh 动画中的属性路径个数。 + */ + get propertyCount(): number; + /** + * @en Gets an owner path by its index in the list of owner paths. + * @param index The index of the owner path to retrieve. + * @zh 通过索引获取精灵路径列表中的精灵路径。 + * @param index 要检索的精灵路径的索引。 + */ + getOwnerPathByIndex(index: number): string; + /** + * @en Gets a property path by its index in the list of property paths. + * @param index The index of the property path to retrieve. + * @zh 通过索引获取属性路径列表中的属性路径。 + * @param index 要检索的属性路径的索引。 + */ + getPropertyByIndex(index: number): string; + } + /** + * @en A class used to manage 2D keyframe nodes list. + * @zh 用于管理2D关键帧节点的列表类。 + */ + class KeyframeNodeList2D { + private _nodes; + /** + * @en The number of nodes in the list. + * @zh 列表中的节点个数。 + */ + get count(): number; + set count(value: number); + /** + * @en Retrieves node by its index in the list. + * @param index The index of the node to retrieve. + * @returns The node at the specified index. + * @zh 通过索引获取列表中的节点。 + * @param index 要检索的节点的索引。 + * @returns 指定索引处的节点。 + */ + getNodeByIndex(index: number): KeyframeNode2D; + /** + * @en Sets a node by its index in the list. + * @param index The index at which to set the node. + * @param node The node to set at the specified index. + * @zh 通过索引设置列表中的节点。 + * @param index 要设置节点的索引。 + * @param node 要设置的节点。 + */ + setNodeByIndex(index: number, node: KeyframeNode2D): void; + } + /** + * @en The Script class is used to create the parent class of a script, which is an abstract class and does not allow instances. + * @zh Script 类用于创建脚本的父类,该类为抽象类,不允许实例。 + */ + class Script extends Component { + /** + * @en Script belonging to sprite + * @zh 脚本所属精灵 + */ + owner: Sprite | Sprite3D; + /** + * @en Called when a 3D physics trigger event or a 2D physics collision event begins. + * @param other The collider component or base of the other object in the collision. + * @param self The collider component or base of the object itself. + * @param contact The contact point information. + * @zh 开始碰撞时执行的3D物理触发器事件或2D物理碰撞事件。 + * @param other 其他对象的碰撞器组件。 + * @param self 自身的碰撞器组件。 + * @param contact 接触点信息。 + */ + onTriggerEnter?(other: PhysicsColliderComponent | ColliderBase, self?: ColliderBase, contact?: any): void; + /** + * @en Called during the frame a 3D physics trigger event or a 2D physics collision event stays collided. + * @param other The collider component or base of the other object in the collision. + * @param self The collider component or base of the object itself, if not provided it's assumed to be the owner of the script. + * @param contact The contact point information, can be any type depending on the physics engine used. + * @zh 持续碰撞时执行的3D物理触发器事件或2D物理碰撞事件。 + * @param other 其他对象的碰撞器组件。 + * @param self 自身的碰撞器组件。 + * @param contact 接触点信息。 + */ + onTriggerStay?(other: PhysicsColliderComponent | ColliderBase, self?: ColliderBase, contact?: any): void; + /** + * @en Called when a 3D physics trigger event or a 2D physics collision event ends. + * @param other The collider component or base of the other object in the collision. + * @param self The collider component or base of the object itself. + * @param contact The contact point information. + * @zh 结束碰撞时执行的3D物理触发器事件或2D物理碰撞事件。 + * @param other 其他对象的碰撞器组件或基类。 + * @param self 自身的碰撞器组件或基类。 + * @param contact 接触点信息。 + */ + onTriggerExit?(other: PhysicsColliderComponent | ColliderBase, self?: ColliderBase, contact?: any): void; + /** + * @en Called when a 3D physics collider event begins (not applicable to 2D). + * @param collision The collision. + * @zh 3D物理碰撞器事件开始时调用(不适用于2D)。 + * @param collision 碰撞器。 + */ + onCollisionEnter?(collision: Collision): void; + /** + * @en Called during the frame a 3D physics collider event stays collided (not applicable to 2D). + * @param collision The collision. + * @zh 3D物理碰撞器事件持续碰撞时调用(不适用于2D)。 + * @param collision 碰撞器。 + */ + onCollisionStay?(collision: Collision): void; + /** + * @en Called when a 3D physics collider event ends (not applicable to 2D). + * @param collision The collision. + * @zh 3D物理碰撞器事件结束碰撞时调用(不适用于2D)。 + * @param collision 碰撞器。 + */ + onCollisionExit?(collision: Collision): void; + /** + * @en Called when a joint is broken in the physics simulation. + * @zh 物理模拟中关节断裂时调用。 + */ + onJointBreak?(): void; + /** + * @en Called when the mouse button is pressed down on the node. + * @param evt The mouse event. + * @zh 鼠标按下时执行。 + * @param evt 鼠标事件。 + */ + onMouseDown?(evt: Event): void; + /** + * @en Called when the mouse button is released from the node. + * @param evt The mouse event. + * @zh 鼠标抬起时执行。 + * @param evt 鼠标事件。 + */ + onMouseUp?(evt: Event): void; + /** + * @en Called when the right or middle mouse button is pressed down. + * @param evt The mouse event. + * @zh 鼠标右键或中键按下时执行。 + * @param evt 鼠标事件。 + */ + onRightMouseDown?(evt: Event): void; + /** + * @en Called when the right or middle mouse button is released. + * @param evt The mouse event. + * @zh 鼠标右键或中键抬起时执行。 + * @param evt 鼠标事件。 + */ + onRightMouseUp?(evt: Event): void; + /** + * @en Called when the mouse moves over the node. + * @param evt The mouse event. + * @zh 鼠标在节点上移动时执行。 + * @param evt 鼠标事件。 + */ + onMouseMove?(evt: Event): void; + /** + * @en Called when the mouse enters the node boundaries. + * @param evt The mouse event. + * @zh 鼠标进入节点时执行。 + * @param evt 鼠标事件。 + */ + onMouseOver?(evt: Event): void; + /** + * @en Called when the mouse leaves the node boundaries. + * @param evt The mouse event. + * @zh 鼠标离开节点时执行。 + * @param evt 鼠标事件。 + */ + onMouseOut?(evt: Event): void; + /** + * @en Called when the mouse is held down and an object is dragged. + * @param evt The mouse event. + * @zh 鼠标按住一个物体后,拖拽时执行。 + * @param evt 鼠标事件。 + */ + onMouseDrag?(evt: Event): void; + /** + * @en Called when the mouse button is released after dragging an object. + * @param evt The mouse event. + * @zh 鼠标按住一个物体,拖拽一定距离,释放鼠标按键后执行。 + * @param evt 鼠标事件。 + */ + onMouseDragEnd?(evt: Event): void; + /** + * @en Called when the mouse button is clicked (pressed and released) on the node. + * @param evt The mouse event. + * @zh 鼠标点击时执行。 + * @param evt 鼠标事件。 + */ + onMouseClick?(evt: Event): void; + /** + * @en Called when the mouse button is double-clicked on the node. + * @param evt The mouse event. + * @zh 鼠标双击时执行。 + * @param evt 鼠标事件。 + */ + onMouseDoubleClick?(evt: Event): void; + /** + * @en Called when the right mouse button is clicked on the node. + * @param evt The mouse event. + * @zh 鼠标右键点击时执行。 + * @param evt 鼠标事件。 + */ + onMouseRightClick?(evt: Event): void; + /** + * @en Called when a key is pressed down. + * @param evt The keyboard event. + * @zh 键盘按下时执行。 + * @param evt 键盘事件。 + */ + onKeyDown?(evt: Event): void; + /** + * @en Called when a key is pressed and holds long enough to generate a character. + * @param evt The keyboard event. + * @zh 键盘产生一个字符时执行。 + * @param evt 键盘事件。 + */ + onKeyPress?(evt: Event): void; + /** + * @en Called when a key is released. + * @param evt The keyboard event. + * @zh 键盘抬起时执行。 + * @param evt 键盘事件。 + */ + onKeyUp?(evt: Event): void; + } + /** + * @en Relative layout Component. + * @zh 相对布局组件 + */ + class Widget extends Component { + /** + * @en An static instance of a Widget that has been initialized. + * @zh 一个已初始化的 Widget 静态实例。 + */ + static EMPTY: Widget; + private _top; + private _bottom; + private _left; + private _right; + private _centerX; + private _centerY; + constructor(); + /** + * @en Resets the boundaries and center coordinates of the object to null. + * @zh 将对象的边界和中心坐标重置为 null。 + */ + onReset(): void; + protected _onEnable(): void; + protected _onDisable(): void; + protected _onAdded(): void; + /** + * 父容器的 Event.RESIZE 事件侦听处理函数。 + */ + protected _onParentResize(): void; + /** + * @private + * @en Resets the object's layout along the X-axis (horizontal direction). + * @zh 重置对象的水平布局(X轴方向)。 + */ + resetLayoutX(): boolean; + /** + * @private + * @en Resets the object's layout along the Y-axis (vertical direction). + * @zh 重置对象的垂直布局(Y轴方向)。 + */ + resetLayoutY(): boolean; + /** + * @en Recalculate layout + * @zh 重新计算布局 + */ + resetLayout(): void; + /** + * @en The distance from the top edge, in pixels. + * @zh 距顶边的距离(以像素为单位)。 + */ + get top(): number; + set top(value: number); + /** + * @en The distance from the bottom edge, in pixels. + * @zh 距底边的距离(以像素为单位)。 + */ + get bottom(): number; + set bottom(value: number); + /** + * @en The distance from the left edge, in pixels. + * @zh 距左边的距离(以像素为单位)。 + */ + get left(): number; + set left(value: number); + /** + * @en The distance from the right edge, in pixels. + * @zh 距右边的距离(以像素为单位)。 + */ + get right(): number; + set right(value: number); + /** + * @en The distance from the horizontal center axis, in pixels. + * @zh 距水平方向中心轴的距离(以像素为单位)。 + */ + get centerX(): number; + set centerX(value: number); + /** + * @en The distance from the vertical center axis, in pixels. + * @zh 距垂直方向中心轴的距离(以像素为单位)。 + */ + get centerY(): number; + set centerY(value: number); + } + /** + * @private + * 静态常量集合 + */ + class Const { + static ENUM_TEXTALIGN_DEFAULT: number; + static ENUM_TEXTALIGN_CENTER: number; + static ENUM_TEXTALIGN_RIGHT: number; + static INDEX_BYTES: number; + static MAX_CLIP_SIZE: number; + } + /** + * 节点标志 + */ + class NodeFlags { + static NOT_ACTIVE: number; + static ACTIVE_INHIERARCHY: number; + static AWAKED: number; + static NOT_READY: number; + static DISPLAY: number; + static HAS_ZORDER: number; + static HAS_MOUSE: number; + static DISPLAYED_INSTAGE: number; + static DRAWCALL_OPTIMIZE: number; + static PROCESS_COLLISIONS: number; + static PROCESS_TRIGGERS: number; + static HAS_SCRIPT: number; + static ESCAPE_DRAWING_TO_TEXTURE: number; + static DISABLE_INNER_CLIPPING: number; + static DISABLE_OUTER_CLIPPING: number; + static DISABLE_VISIBILITY: number; + static EDITING_NODE: number; + static HIDE_BY_EDITOR: number; + static LOCK_BY_EDITOR: number; + } + class HideFlags { + static HideInHierarchy: number; + static HideInInspector: number; + static DontSave: number; + static HideAndDontSave: number; + } + /** + * @en The AnimationClip class is used for animation clip resources. + * @zh AnimationClip 类用于动画片段资源。 + */ + class AnimationClip extends Resource { + /** + * @deprecated 请使用Loader.load(url:string, type: ILaya.Loader.ANIMATIONCLIP) + * @en Load animation clip. + * @param url The URL of the animation clip. + * @param complete Callback function when loading is complete. + * @zh 加载动画片段。 + * @param url 动画片段地址。 + * @param complete 加载完成回调。 + */ + static load(url: string, complete: Handler): void; + /** + * @en Whether the animation is looping. + * @zh 是否循环。 + */ + islooping: boolean; + /** + * @en Get the duration of the animation. + * @returns The duration of the animation. + * @zh 动画持续时间。 + * @returns 返回动画持续时间。 + */ + duration(): number; + /** + * @ignore + * @en Creates an instance of AnimationClip. + * @zh 创建一个AnimationClip实例。 + */ + constructor(); + /** + * @en Whether is Weight mode. + * @param weightMode The current weight mode. + * @param nextweightMode The next weight mode. + * @returns True if this animation segment uses Hermite interpolation. + * @zh 是否是Weight模式。 + * @param weightMode 当前的权重模式。 + * @param nextweightMode 下一个权重模式。 + * @returns 返回true,表示此段动画插值使用埃尔米特插值。 + */ + private _weightModeHermite; + private _hermiteInterpolateVector4; + private _hermiteInterpolateVector2; + private _hermiteCurveSplineWeight; + private _curveInterpolate; + private _evaluateFrameNodeVector3DatasRealTime; + private _evaluateFrameNodeVector2DatasRealTime; + private _evaluateFrameNodeVector4DatasRealTime; + private _evaluateFrameNodeQuaternionDatasRealTime; + private _binarySearchEventIndex; + /** + * @en Add an animation event. + * @param event The animation event to be added. + * @zh 添加动画事件。 + * @param event 动画事件。 + */ + addEvent(event: AnimationEvent): void; + } + /** + * @en The AnimationEvent class is used to implement animation events. + * @zh AnimationEvent 类用于实现动画事件。 + */ + class AnimationEvent { + /** + * @en The time at which the event is triggered. + * @zh 事件触发的时间。 + */ + time: number; + /** + * @en The name of the triggered event. + * @zh 触发的事件名称。 + */ + eventName: string; + /** + * @en The parameters of the triggered event. + * @zh 触发事件的参数。 + */ + params: any[]; + /** + * @ignore + */ + constructor(); + } + /** + * @en The AnimatorStateScript class is the base class for animation state scripts. This is an abstract class and cannot be instantiated. + * @zh AnimatorStateScript 类用于动画状态脚本的父类,该类为抽象类,不允许实例。 + */ + class AnimatorStateScript { + /** + * @ignore + * @en Creates an instance of AnimatorStateScript. + * @zh 创建 AnimatorStateScript 实例。 + */ + constructor(); + /** + * @en Executed when the animation state begins. + * @zh 动画状态开始时执行。 + */ + onStateEnter(): void; + /** + * @en Executed when the animation state is running. + * @param normalizeTime The animation playback state (0-1). + * @zh 动画状态运行中。 + * @param normalizeTime 0-1动画播放状态。 + */ + onStateUpdate(normalizeTime: number): void; + /** + * @en Executed when the animation state exits. + * @zh 动画状态退出时执行。 + */ + onStateExit(): void; + /** + * @en Executed at the end of each loop if the animation is set to loop. + * @zh 如果动画设置了循环,则在每次循环结束时执行。 + */ + onStateLoop(): void; + } + /** + * @en The KeyframeNode class is used for animation keyframes. + * @zh KeyframeNode 类用于动画关键帧。 + */ + class KeyframeNode { + private _ownerPath; + private _propertys; + /** + * @en The number of sprite paths. + * @zh 精灵路径个数。 + */ + get ownerPathCount(): number; + /** + * @en The number of property paths. + * @zh 属性路径个数。 + */ + get propertyCount(): number; + /** + * @en The number of keyframes. + * @zh 帧个数。 + */ + get keyFramesCount(): number; + /** + * @en Get the sprite path by index. + * @param index The index of the sprite path. + * @returns The sprite path at the specified index. + * @zh 通过索引获取精灵路径。 + * @param index 索引。 + * @returns 指定索引处的精灵路径。 + */ + getOwnerPathByIndex(index: number): string; + /** + * @en Get the property path by index. + * @param index The index of the property path. + * @returns The property path at the specified index. + * @zh 通过索引获取属性路径。 + * @param index 索引。 + * @returns 指定索引处的属性路径。 + */ + getPropertyByIndex(index: number): string; + /** + * @en Get the keyframe by index. + * @param index The index of the keyframe. + * @returns The keyframe at the specified index. + * @zh 通过索引获取帧。 + * @param index 索引。 + * @returns 指定索引处的关键帧。 + */ + getKeyframeByIndex(index: number): Keyframe; + } + /** + * @en The KeyframeNodeList class is used to create a queue of KeyframeNode nodes. + * @zh KeyframeNodeList 类用于创建 KeyframeNode 节点队列。 + */ + class KeyframeNodeList { + /** + * @en The number of nodes. + * @zh 节点个数。 + */ + get count(): number; + set count(value: number); + /** + * @ignore + * @en Creates an instance of KeyframeNodeList. + * @zh 创建一个KeyframeNodeList实例。 + */ + constructor(); + /** + * @en Get a node by its index. + * @param index The index of the node. + * @returns The KeyframeNode at the specified index. + * @zh 通过索引获取节点。 + * @param index 索引。 + * @returns 指定索引处的 KeyframeNode 节点。 + */ + getNodeByIndex(index: number): KeyframeNode; + /** + * @en Set a node at the specified index. + * @param index The index at which to set the node. + * @param node The KeyframeNode to set. + * @zh 通过索引设置节点。 + * @param index 索引。 + * @param node 要设置的 KeyframeNode 节点。 + */ + setNodeByIndex(index: number, node: KeyframeNode): void; + } + type AnimatorParams = { + [key: number]: number | boolean; + }; + /** + * @en The `Animator` class is used to create 3D animation components. + * @zh `Animator` 类用于创建3D动画组件。 + */ + class Animator extends Component { + /** + * @en Culling mode: Always animate. + * @zh 裁剪模式:始终播放动画。 + */ + static CULLINGMODE_ALWAYSANIMATE: number; + /** + * @en Culling mode: Don't animate when not visible. + * @zh 裁剪模式:不可见时完全不播放动画。 + */ + static CULLINGMODE_CULLCOMPLETELY: number; + /** + * @en Culling mode,By default, when set to invisible, the animation will not play at all. + * @zh 裁剪模式,默认为不可见时完全不播放动画。 + */ + cullingMode: number; + private _LateUpdateEvents; + /** + * @en The animation controller. + * @zh 动画控制器。 + */ + get controller(): AnimatorController; + set controller(val: AnimatorController); + /** + * @en The playback speed of the animation. 1.0 is the normal playback speed. + * @zh 动画的播放速度。1.0 为正常播放速度。 + */ + get speed(): number; + set speed(value: number); + /** + * @en The update mode for the animator. + * @zh 动画更新模式。 + */ + set updateMode(value: AnimatorUpdateMode); + /** + * @en Low update mode + * @zh 低更新模式 + */ + set lowUpdateDelty(value: number); + /** + * @en The number of layers in the state machine animation. + * @zh 状态机动画层的数量。 + */ + get controllerLayerCount(): number; + /** + * @en The map of animator parameters. + * @zh 状态机参数map。 + */ + get animatorParams(): AnimatorParams; + set animatorParams(values: AnimatorParams); + /** + * @en Whether to stop updating after the animation is completed. + * @zh 动画完成后是否停止更新。 + */ + get sleep(): boolean; + set sleep(value: boolean); + /** + * @en The constructor of Animator. + * @zh 构造方法,创建动画组件。 + */ + constructor(); + /** + * 启用过渡 + * @param layerindex + * @param transition + * @returns + */ + private _applyTransition; + private _applyVec2; + private _applyVec3; + private _applyVec4; + private _applyColor; + /** + * 赋值Node数据 + * @param stateInfo 动画状态 + * @param additive 是否为addtive + * @param weight state权重 + * @param isFirstLayer 是否是第一层 + */ + private _setClipDatasToNode; + private _applyUpdateMode; + /** + * @en Gets the default animation state. + * @param layerIndex The layer index. + * @returns The default animation state. + * @zh 获取默认动画状态。 + * @param layerIndex 层索引。 + * @return 默认动画状态。 + */ + getDefaultState(layerIndex?: number): AnimatorState; + /** + * @en Adds an animation state. + * @param state The animation state to add. + * @param layerIndex The layer index. + * @zh 添加动画状态。 + * @param state 动画状态。 + * @param layerIndex 层索引。 + */ + addState(state: AnimatorState, layerIndex?: number): void; + /** + * @en Removes an animation state. + * @param state The animation state to remove. + * @param layerIndex The layer index. + * @zh 移除动画状态。 + * @param state 动画状态。 + * @param layerIndex 层索引。 + */ + removeState(state: AnimatorState, layerIndex?: number): void; + /** + * @en Adds a controller layer. + * @param controllerLayer The animation controller layer to add. + * @zh 添加控制器层。 + * @param controllerLayer 动画控制层。 + */ + addControllerLayer(controllerLayer: AnimatorControllerLayer): void; + /** + * @en Gets the controller layer. + * @param layerIndex The layer index. Defaults to 0. + * @returns The AnimatorControllerLayer at the specified index. + * @zh 获取控制器层。 + * @param layerIndex 层索引。 + * @return 指定索引处的AnimatorControllerLayer。 + */ + getControllerLayer(layerIndex?: number): AnimatorControllerLayer; + /** + * @en Plays an animation. + * @param name If null, plays the default animation; otherwise, plays the animation clip with the specified name. + * @param layerIndex The layer index. Defaults to 0. + * @param normalizedTime The normalized start time of the animation. Defaults to Number.NEGATIVE_INFINITY. + * @zh 播放动画。 + * @param name 如果为null则播放默认动画,否则按名字播放动画片段。 + * @param layerIndex 层索引。 + * @param normalizedTime 归一化的播放起始时间。 + */ + play(name?: string | null, layerIndex?: number, normalizedTime?: number): void; + /** + * @en Performs a crossfade transition between the current animation state and the target animation state. + * @param name The name of the target animation state. + * @param transitionDuration The transition duration, normalized to the current animation state's duration. Value should be between 0.0 and 1.0. + * @param layerIndex The layer index. Defaults to 0. + * @param normalizedTime The normalized start time of the animation. Defaults to Number.NEGATIVE_INFINITY. + * @zh 在当前动画状态和目标动画状态之间进行融合过渡播放。 + * @param name 目标动画状态。 + * @param transitionDuration 过渡时间,该值为当前动画状态的归一化时间,值在0.0~1.0之间。 + * @param layerIndex 层索引。 + * @param normalizedTime 归一化的播放起始时间。 + */ + crossFade(name: string, transitionDuration: number, layerIndex?: number, normalizedTime?: number): void; + /** + * @en Enables a trigger parameter. + * @param name The name or index of the trigger parameter. + * @zh 启用触发条件参数。 + * @param name 触发条件的名字或者索引 + */ + setParamsTrigger(name: number): void; + setParamsTrigger(name: string): void; + /** + * @en Sets the value of a number parameter. + * @param name The name or index of the parameter. + * @param value The value to set. + * @zh 设置数值类型参数的值。 + * @param name 属性的名字或者索引 + * @param value 属性值 + */ + setParamsNumber(name: number, value: number): void; + setParamsNumber(name: string, value: number): void; + /** + * @en Sets the value of a boolean parameter. + * @param name The name or index of the parameter. + * @param value The value to set. + * @zh 设置布尔类型参数的值。 + * @param name 属性的名字或者索引 + * @param value 属性值 + */ + setParamsBool(name: number, value: boolean): void; + setParamsBool(name: string, value: boolean): void; + /** + * @en Gets the value of a parameter. + * @param name The name or index of the parameter. + * @returns The value of the parameter. + * @zh 获取参数的值。 + * @param name 属性的名字或者索引 + * @return 属性值 + */ + getParamsvalue(name: number): number | boolean; + getParamsvalue(name: string): number | boolean; + /** + * @deprecated 请使用animator.getControllerLayer(layerIndex).getCurrentPlayState()替换。use animator.getControllerLayer(layerIndex).getCurrentPlayState() instead + * 获取当前的播放状态。 + * @param layerIndex 层索引。 + * @return 动画播放状态。 + */ + getCurrentAnimatorPlayState(layerIndex?: number): AnimatorPlayState; + } + /** + * @en Represents an animator controller resource that manages animation states and transitions. + * @zh 管理动画状态和转换的动画控制器资源。 + */ + class AnimatorController extends Resource { + /** + * @en The parsed data of the animator controller. + * @zh 解析后的动画控制器数据。 + */ + data: TypeAnimatorControllerData; + /** + * @en An array of clip IDs associated with this animator controller. + * @zh 与此动画控制器关联的剪辑ID数组。 + */ + clipsID: string[]; + /** + * @en The constructor of AnimatorController, initialize a new AnimatorController object. + * @param data The animator controller data. + * @zh 构造函数,初始化一个新的 AnimatorController 对象。 + * @param data 动画控制器数据。 + */ + constructor(data: any); + private getLayers; + /** + * @en Updates the given Animator with the current AnimatorController's data. + * This method updates the controller layers and animator parameters. + * @param a The Animator to update. + * @zh 使用当前AnimatorController的数据更新给定的Animator。 + * 此方法更新控制器层和动画参数。 + * @param a 要更新的Animator。 + */ + updateTo(a: Animator): void; + private createState; + private setExitTransition; + private setTransitions; + private getState; + private addConditions; + } + /** + * @en The `AnimatorControllerLayer` class is used to create animation controller layers. + * @zh `AnimatorControllerLayer` 类用于创建动画控制器层。 + */ + class AnimatorControllerLayer implements IClone { + /** + * @en Blending mode: Override. + * @zh 混合模式:覆盖。 + */ + static BLENDINGMODE_OVERRIDE: number; + /** + * @en Blending mode: Additive. + * @zh 混合模式:叠加。 + */ + static BLENDINGMODE_ADDTIVE: number; + /** + * @en The name of the layer. + * @zh 层的名称。 + */ + name: string; + /** + * @en The blending mode of the layer. + * @zh 层的混合模式。 + */ + blendingMode: number; + /** + * @en The default weight of the layer. + * @zh 层的默认权重。 + */ + defaultWeight: number; + /** + * @en Whether to automatically play when activated. + * @zh 激活时是否自动播放。 + */ + playOnWake: boolean; + /** + * @en Whether the layer is enabled. + * @zh 层是否启用。 + */ + enable: boolean; + /** + * @en Default animation state machine. + * @zh 默认动画状态机。 + */ + get defaultState(): AnimatorState; + set defaultState(value: AnimatorState); + /** + * @en The avatar mask of the layer. + * @zh 层的骨骼遮罩。 + */ + get avatarMask(): AvatarMask; + set avatarMask(value: AvatarMask); + private _defaultStateNameCatch; + set defaultStateName(value: string); + /** + * @en The AnimatorStates in this layer. + * @zh 此层中动画状态 + */ + get states(): ReadonlyArray; + set states(states: ReadonlyArray); + /** + * @en Constructor method. + * @param name 动画层名称 + * @zh 构造方法 + * @param name 动画层名称 + */ + constructor(name: string); + /** + * @en Gets the current play state of the animation. + * @returns The current AnimatorPlayState. + * @zh 获取当前的动画播放状态。 + * @return 动画播放状态。 + */ + getCurrentPlayState(): AnimatorPlayState; + /** + * @en Gets an animator state by its name. + * @param name The name of the animator state to find. + * @returns The AnimatorState if found, or null if not found. + * @zh 通过名称获取动画状态。 + * @param name 要查找的动画状态的名称。 + * @returns 如果找到则返回AnimatorState,否则返回null。 + */ + getAnimatorState(name: string): AnimatorState | null; + /** + * @en Adds an animation state to the layer. + * @param state The AnimatorState to add. + * @zh 向层中添加动画状态。 + * @param state 要添加的AnimatorState。 + */ + addState(state: AnimatorState): void; + /** + * @en Removes an animation state from the layer. + * @param state The AnimatorState to remove. + * @zh 从层中移除动画状态。 + * @param state 要移除的动画状态。 + */ + removeState(state: AnimatorState): void; + /** + * @en Destroys the AnimatorControllerLayer and clears all references. + * @zh 销毁AnimatorControllerLayer并清除所有引用。 + */ + destroy(): void; + /** + * @en Clones the properties of this AnimatorControllerLayer to another object. + * @param destObject The target object to clone to. + * @zh 将此AnimatorControllerLayer的属性克隆到另一个对象。 + * @param destObject 要克隆到的目标对象。 + */ + cloneTo(destObject: AnimatorControllerLayer): void; + /** + * @en Creates and returns a clone of this AnimatorControllerLayer. + * @returns A new AnimatorControllerLayer instance with properties copied from this one. + * @zh 创建并返回此AnimatorControllerLayer的克隆副本。 + * @returns 一个新的AnimatorControllerLayer实例,其属性从当前实例复制。 + */ + clone(): any; + } + /** + * @en The AnimatorPlayState class is used to create animation play state information. + * @zh AnimatorPlayState 类用于创建动画播放状态信息。 + */ + class AnimatorPlayState { + /** + * @en The current AnimatorState. + * @zh 当前的动画状态。 + */ + get currentState(): AnimatorState | null; + set currentState(value: AnimatorState | null); + /** + * @en The normalized time of the play state. The integer part represents the number of loops, and the fractional part represents the time of a single play. + * @returns The normalized time of the animation. + * @zh 播放状态的归一化时间。整数部分表示循环次数,小数部分表示单次播放时间。 + * @returns 动画的归一化时间。 + */ + get normalizedTime(): number; + /** + * @en The duration of the current animation in seconds. + * @zh 当前动画的持续时间,以秒为单位。 + */ + get duration(): number; + /** + * @en The current animator state. + * @zh 当前的动画状态机。 + */ + get animatorState(): AnimatorState; + /** + * @en constructor + * @zh 构造函数 + */ + constructor(); + } + /** + * @en Animator resource class for handling animation-related resources. + * @zh 动画资源类,用于处理与动画相关的资源。 + */ + class AnimatorResource { + /** + * @en Get the animator resource component from a Sprite3D object. + * @param sprite The Sprite3D object to get the component from. + * @param propertyKey The key of the property to get the component for. + * @zh 从Sprite3D对象获取动画资源组件。 + * @param sprite 要获取组件的Sprite3D对象。 + * @param propertyKey 要获取组件的属性键。 + */ + static getAnimatorResource(sprite: Sprite3D, propertyKey: string): Component; + } + /** + * @en The AnimatorState class is used to create animation states. + * @zh AnimatorState 类用于创建动画状态。 + */ + class AnimatorState extends EventDispatcher implements IClone { + /** + * @en Animation event called when the state is entered. + * @zh 动画事件,在进入状态时调用。 + */ + static EVENT_OnStateEnter: string; + /** + * @en Animation event called when the state is updated. + * @zh 动画事件,在更新状态时调用。 + */ + static EVENT_OnStateUpdate: string; + /** + * @en Animation event called when a loop is completed. + * @zh 动画事件,在循环完成时调用。 + */ + static EVENT_OnStateLoop: string; + /** + * @en Animation event called when the state is exited. + * @zh 动画事件,在离开状态时调用。 + */ + static EVENT_OnStateExit: string; + /** + * @en Current transition content. + * @zh 当前过渡内容。 + */ + curTransition: AnimatorTransition; + /** + * @en Name of the animator state. + * @zh 动画状态的名称。 + */ + name: string; + /** + * @en Animation playback speed. 1.0 is normal playback speed. + * @zh 动画播放速度。1.0为正常播放速度。 + */ + speed: number; + /** + * @en Start time of animation playback. + * @zh 动画播放的起始时间。 + */ + clipStart: number; + /** + * @en End time of animation playback. + * @zh 动画播放的结束时间。 + */ + clipEnd: number; + /** + * @en Play on awake start offset. + * @zh 唤醒时播放的起始偏移量。 + */ + cycleOffset: number; + /** + * @en The animation clip. + * @zh 动画片段。 + */ + get clip(): AnimationClip | null; + set clip(value: AnimationClip | null); + /** + * @en Whether the animation is looping. + * @zh 动画是否循环播放。 + */ + get islooping(): boolean; + /** + * @en The animation transition content (used by IDE). + * @zh 动画过渡内容(IDE使用)。 + */ + get transitions(): AnimatorTransition[]; + set transitions(value: AnimatorTransition[]); + /** + * @en The priority animation transition content (used by IDE). + * @zh 优先动画过渡内容(IDE使用)。 + */ + get soloTransitions(): AnimatorTransition[]; + set soloTransitions(value: AnimatorTransition[]); + /** + * @en consrtuctor of AnimatorState + * @zh 动画状态的构造方法 + */ + constructor(); + /** + * @en Add a script to the animator state. + * @param type The type of the script to add. + * @returns The added script instance. + * @zh 向动画状态添加脚本。 + * @param type 要添加的脚本类型。 + * @returns 添加的脚本实例。 + */ + addScript(type: typeof AnimatorStateScript): AnimatorStateScript; + /** + * @en Get a script of the specified type from the animator state. + * @param type The type of the script to get. + * @returns The script of the specified type, or null if not found. + * @zh 从动画状态获取指定类型的脚本。 + * @param type 要获取的脚本类型。 + * @returns 指定类型的脚本,如果未找到则返回null。 + */ + getScript(type: typeof AnimatorStateScript): AnimatorStateScript | null; + /** + * @en Get all scripts of the specified type from the animator state. + * @param type The type of the scripts to get. + * @returns An array of scripts of the specified type, or null if none found. + * @zh 从动画状态获取所有指定类型的脚本。 + * @param type 要获取的脚本类型。 + * @returns 指定类型的脚本数组,如果未找到则返回null。 + */ + getScripts(type: typeof AnimatorStateScript): AnimatorStateScript[] | null; + /** + * @en Clone the current AnimatorState to another object. + * @param destObject The target object to clone to. + * @zh 将当前AnimatorState克隆到另一个对象。 + * @param destObject 克隆的目标对象。 + */ + cloneTo(destObject: AnimatorState): void; + /** + * @en Create a clone of the current AnimatorState. + * @returns A new AnimatorState object with the same properties as the current one. + * @zh 创建当前AnimatorState的克隆。 + * @returns 一个新的AnimatorState对象,具有与当前对象相同的属性。 + */ + clone(): any; + } + /** + * @en The AnimatorTransition class represents a transition between two AnimatorStates. + * @zh AnimatorTransition 类表示两个 AnimatorState 之间的过渡。 + */ + class AnimatorTransition { + /** + * 创建一个新的Animatortransition + */ + constructor(); + /** + * @en The name of the transition. + * @zh 过渡的名称。 + */ + get name(): string; + set name(value: string); + /** + * @en Whether the transition is disabled. + * @zh 过渡是否被禁用。 + */ + get mute(): boolean; + set mute(value: boolean); + /** + * @en The destination state of the transition. + * @zh 过渡的目标状态。 + */ + get destState(): AnimatorState; + set destState(value: AnimatorState); + /** + * @en The conditions array for the transition. Used by IDE. + * @zh 过渡的条件数组。由IDE使用。 + */ + get conditions(): AnimatorStateCondition[]; + set conditions(value: AnimatorStateCondition[]); + /** + * @en Whether the transition is triggered by time. + * @zh 过渡是否由时间触发。 + */ + get exitByTime(): boolean; + set exitByTime(value: boolean); + /** + * @en The normalized transition duration (relative to the target state). + * @zh 过渡的归一化持续时间(相对于目标状态)。 + */ + set transduration(value: number); + get transduration(): number; + /** + * @en The playback time offset of the target state (normalized time). + * @zh 目标状态的播放时间偏移(归一化时间)。 + */ + set transstartoffset(value: number); + get transstartoffset(): number; + /** + * @en The trigger time (normalized time). + * @zh 触发时间(归一化时间)。 + */ + get exitTime(): number; + set exitTime(value: number); + /** + * @en Adds a condition to the transition. + * @zh 增加一个条件到过渡中。 + */ + addCondition(condition: AnimatorStateCondition): void; + /** + * @en Removes a condition from the transition. + * @param condition The condition to remove. + * @zh 从过渡中删除一个条件。 + * @param condition 要删除的条件。 + */ + removeCondition(condition: AnimatorStateCondition): void; + /** + * @en Whether to use AND operation when there are multiple conditions. + * @zh 当有多个条件时是否使用与(AND)操作。 + */ + get isAndOperEnabled(): boolean; + set isAndOperEnabled(vlaue: boolean); + /** + * @en Checks if the transition should be enabled based on the current conditions and time. + * @param normalizeTime The normalized time of the current animation state. + * @param paramsMap A map of condition parameters, where the key is the condition ID and the value is the condition state. + * @returns True if the transition should be enabled, false otherwise. + * @zh 检查是否应该根据当前条件和时间启用过渡。 + * @param normalizeTime 当前动画状态的归一化时间。 + * @param paramsMap 条件参数的映射,其中键是条件ID,值是条件状态。 + * @returns 如果应该启用过渡则返回true,否则返回false。 + */ + check(normalizeTime: number, paramsMap: { + [key: number]: number | boolean; + }): boolean; + } + /** + * @en Describes the animation layer mask. + * @zh 用来描述动画层遮罩。 + */ + class AvatarMask { + /** + * @en Constructor, initialize mask information. + * @param data Mask information. + * @zh 构造函数,初使化遮罩信息。 + * @param data 遮罩信息 + */ + constructor(data?: any); + /** + * @en Checks if the transform at the given path is active in the mask. + * @param path The node path. + * @returns Whether the transform is active. + * @zh 查找节点路径遮罩。 + * @param path 节点路径 + * @returns 节点路径是否启用 + */ + getTransformActive(path: string): boolean; + /** + * @en Sets the mask for a specific transform path. + * @param path The node path. + * @param value Whether to enable the mask. + * @zh 设置遮罩。 + * @param path 节点路径 + * @param value 是否启用遮罩 + */ + setTransformActive(path: string, value: boolean): void; + /** + * @en Gets all mask information. + * @returns The mask information. + * @zh 获得遮罩信息。 + * @returns 遮罩信息 + */ + getAllTranfromPath(): Record; + /** + * @en Clones the AvatarMask. + * @returns A clone of the AvatarMask. + * @zh 克隆。 + * @returns 克隆的AvatarMask。 + */ + clone(): any; + /** + * @en Clones the AvatarMask to another object. + * @param destObject The target object to clone to. + * @zh 克隆到目标对象。 + * @param destObject 目标对象 + */ + cloneTo(destObject: AvatarMask): void; + } + enum KeyFrameValueType { + None = -1, + Float = 0, + Position = 1, + Rotation = 2, + Scale = 3, + RotationEuler = 4, + Vector2 = 5, + Vector3 = 6, + Vector4 = 7, + Color = 8 + } + /** + * @en HLOD (Hierarchical Level of Detail) component for optimizing rendering performance. + * @zh HLOD(分层细节层次)组件,用于优化渲染性能。 + */ + class HLOD extends Component { + constructor(); + /** + * @en The bounds of the HLOD. + * @zh HLOD 的边界。 + */ + get bounds(): Bounds; + set bounds(value: Bounds); + /** + * @en The LOD resources for the HLOD. + * @zh HLOD 的 LOD 资源。 + */ + get lodResource(): HLODResourceGroup[]; + set lodResource(value: HLODResourceGroup[]); + /** + * @en The LOD culling rate array. The array will be sorted in descending order. + * @zh LOD 裁剪率数组。数组将按降序排列。 + */ + get lodCullRateArray(): number[]; + set lodCullRateArray(value: number[]); + private _applyLODResource; + private _releaseGroupRender; + /** + * @ignore + * @en Executed every frame during the update phase. + * @zh 每帧更新时执行。 + */ + onUpdate(): void; + /** + * @en Applies the specified HLOD resource. + * @param resource The HLOD resource group to apply. + * @zh 应用指定的 HLOD 资源。 + * @param resource 要应用的 HLOD 资源组。 + */ + applyResource(resource: HLODResourceGroup): void; + } + /** + * @en a batched mesh for hierarchical level of detail (HLOD) in 3D rendering. This class optimizes rendering performance by combining multiple sub-meshes into a single rendering unit, reducing draw calls. + * @zh 用于层次化细节级别(HLOD)的批处理网格。该类通过合并多个子网格为单一的渲染单元来优化渲染性能,减少绘制调用。 + */ + class HLODBatchMesh extends GeometryElement { + /** + * @en construct method of HLODBatchMesh. + * @zh HLODBatchMesh的构造方法。 + */ + constructor(); + /** + * @en The batched mesh. + * @zh 合批后的网格。 + */ + get batchMesh(): Mesh; + set batchMesh(mesh: Mesh); + /** + * @en The batch sub-mesh information. + * @zh 合批子网格信息。 + */ + get batchSubMeshInfo(): HLODBatchSubMesh[]; + set batchSubMeshInfo(value: HLODBatchSubMesh[]); + set drawSubMeshs(value: HLODBatchSubMesh[]); + /** + * @en Destroy the HLODBatchMesh. + * @zh 销毁 HLODBatchMesh。 + */ + destroy(): void; + } + /** + * @en Handles the rendering of a hierarchical level of detail (HLOD) element. This class is responsible for managing LODs for objects to achieve better performance by rendering simpler meshes when objects are further from the camera. + * @zh HLOD渲染处理类,负责管理场景中对象的层级细节层次(HLOD),以提高渲染性能。通过在相机较远时渲染更简单的网格来实现。 + */ + class HLODRender extends BaseRender { + constructor(); + /** + * @en The current HLOD rendering state. + * @zh 当前的 HLOD 渲染状态。 + */ + get curHLODRS(): HLODElement; + set curHLODRS(value: HLODElement); + /** + * @en Set the geometry and material of the RenderElement based on the given HLODElement resource. + * @param source The HLODElement containing mesh and material information. + * @param out The RenderElement to be set. + * @zh 根据给定的 HLOD 资源设置渲染节点的几何体和材质。 + * @param source 包含网格和材料信息的 HLODElement。 + * @param out 要设置的 RenderElement。 + */ + private _createRenderelementByHLODElement; + /** + * @en Change the current rendering mesh to a new LOD mesh. + * @param lodMesh The new LOD mesh for rendering. + * @zh 将当前渲染网格更改为新的 LOD 网格。 + * @param lodMesh 新的 LOD 网格,用于渲染。 + */ + private _changeMesh; + /** + * @en re caculate BoundBox + * @zh 重新计算包围盒 + */ + _calculateBoundingBox(): void; + /** + * @en Update rendering data. + * @zh 更新渲染数据。 + */ + _renderUpdate(context: IRenderContext3D): void; + /** + * @en Determine if the object needs to be rendered based on its visibility within the bounding frustum. + * @param boundFrustum The bounding frustum used for culling. + * @param context The rendering context. + * @returns True if the object needs to be rendered, false otherwise. + * @zh 根据对象在边界视锥体内的可见性确定是否需要渲染该对象。 + * @param boundFrustum 用于裁剪的边界视锥体。 + * @param context 渲染上下文。 + * @returns 如果对象需要被渲染则返回 true,否则返回 false。 + */ + _needRender(boundFrustum: BoundFrustum, context: RenderContext3D): boolean; + /** + * @ignore + * @en Called when the component is being destroyed. + * @zh 当组件被销毁时调用。 + */ + onDestroy(): void; + } + /** + * @en Configuration for Hierarchical Level of Detail (HLOD) settings. + * @zh 分层细节层次(HLOD)的配置设置。 + */ + class HLODConfig { + releaseCallTime: number; + releaseTime: number; + } + /** + * @en Represents a sub-mesh within an HLOD batch resource, describing geometric bounds and render parameters. + * @zh 在 HLOD 批处理资源中表示一个子网格,包括几何边界和渲染参数。 + */ + class HLODBatchSubMesh { + bounds: Bounds; + drawPramas: Vector2; + } + /** + * @en An element representing a set of HLOD renderable resources. + * @zh 表示一组 HLOD 可渲染资源的元素。 + */ + class HLODElement { + /** + * @en The batch mesh for this HLOD element. + * @zh 此 HLOD 元素的批处理网格。 + */ + HLODMesh: HLODBatchMesh; + /**material */ + private _material; + /** + * @en The material for this HLOD element. + * @zh 此 HLOD 元素的材质。 + */ + get material(): Material; + set material(value: Material); + /**lightmap */ + private _lightmap; + /** + * @en The lightmap for this HLOD element. + * @zh 此 HLOD 元素的光照贴图。 + */ + get lightmap(): Lightmap; + set lightmap(value: Lightmap); + /** + * @en Release resources associated with this HLOD element. + * Lightmap is directly destroyed. + * @zh 释放与此 HLOD 元素关联的资源。 + * 光照贴图会被直接销毁。 + */ + release(): void; + } + /** + * @en A resource group for managing the lifecycle of HLOD resources, handling their load and release state. + * @zh 用于管理 HLOD 资源生命周期的资源组,处理其加载和释放状态。 + */ + class HLODResourceGroup { + /** + * @en The URL of the HLOD resource. + * @zh HLOD 资源的 URL。 + */ + url: string; + /** + * @en Update marker for the resource group. + * @zh 资源组的更新标记。 + */ + updateMark: number; + /** + * @en Array of HLOD elements in this resource group. + * @zh 此资源组中的 HLOD 元素数组。 + */ + resources: HLODElement[]; + /** + * @en Indicates whether the resource group is loaded. + * @zh 资源组是否已加载。 + */ + loaded: boolean; + /** + * @en Load the HLOD resource group. + * @param callFun The callback function to be called after loading. + * @param hlod The HLOD instance. + * @zh 加载 HLOD 资源组。 + * @param callFun 加载完成后要调用的回调函数。 + * @param hlod HLOD 实例。 + */ + load(callFun: Function, hlod: any): void; + /** + * @en Releases all the resources of the HLOD group, marking the group as unloaded. + * @zh 释放 HLOD 组的所有资源,并标记组为未加载。 + */ + release(): void; + } + /** + * @en The `LODInfo` class describes Level of Detail (LOD) data. + * @zh `LODInfo` 类描述了细节层次(LOD)数据。 + */ + class LODInfo { + /** + * @en Constructor method of LODInfo. + * @zh 细节层次数据的构造方法 + */ + constructor(mincullRate: number); + /** + * @en Minimum culling ratio for LOD. + * @zh LOD的最小剔除率。 + */ + get mincullRate(): number; + set mincullRate(value: number); + /** + * @en The node information for the LODInfo. + * @zh LODInfo的节点信息。 + */ + get renders(): Sprite3D[]; + set renders(value: Sprite3D[]); + /** + * @en Adds a rendering node to the LODInfo. + * @param node The Sprite3D node to be added as a rendering node. + * @zh 在LODInfo中增加渲染节点。 + * @param node 要作为渲染节点添加的Sprite3D节点。 + */ + addNode(node: Sprite3D): void; + /** + * @en Removes a LOD node from the LODInfo. + * @param node The Sprite3D node to be removed from the LOD. + * @zh 从LODInfo中删除某个LOD节点。 + * @param node 要从LOD中删除的Sprite3D节点。 + */ + removeNode(node: Sprite3D): void; + /** + * @en Releases all render node cull flags in the LODInfo. + * @zh 释放LODInfo中的所有渲染节点的剔除标记。 + */ + removeAllRender(): void; + } + /** + * @en The `LODGroup` class is used to build LOD components. + * @zh SpotLight 类用于构建LOD组件 + */ + class LODGroup extends Component { + /** + * @en Indicates whether the LOD bounds radius and bounds need to be recalculated. Recalculation is needed when there is a relative change in the LOD values. + * @zh 是否需要重新计算 _lodBoundsRadius 和 _bounds。当 LOD 值的位置有相对改动时,需要重新计算。 + */ + private _needcaculateBounds; + /** + * @en The bounds calculation for all rendering nodes in the LOD group. + * @zh lodGroup 所有的渲染节点的包围盒计算 + */ + private _bounds; + /** + * @en The size of the LOD group. + * @zh LOD组大小 + */ + private _size; + /** + * @en The center position of the bounding box. + * @zh 包围盒中心位置 + */ + private _lodPosition; + /** + * @en The number of LOD levels. + * @zh LOD 等级数量 + */ + private _lodCount; + /** + * @en The information of LOD levels. + * @zh LOD 等级信息 + */ + private _lods; + /** + * @en The index of the visible node. + * @zh 显示节点 + */ + private _visialIndex; + /** + * @en The ratio of the LOD node. + * @zh LOD节点比例 + */ + private _nowRate; + /** + * @en Constructor method of LODGroup. + * @zh LOD组的构造方法 + */ + constructor(); + /** + * @en Shadow culling pass + * @zh 阴影裁剪pass + */ + shadowCullPass(): boolean; + /** + * @en Currently displayed LOD node index + * @zh 当前显示的LOD节点下标 + */ + get visialIndex(): number; + /** + * @en The array of LODInfo objects + * @zh LODInfo数组 + */ + get lods(): LODInfo[]; + set lods(data: LODInfo[]); + /** + * @en Proportion of lod nodes + * @zh lod节点比例 + */ + get nowRate(): number; + /** + * @en LOD bounds + * @zh LOD包围盒 + */ + get bounds(): Bounds; + /** + * 设置显示隐藏组 + * @param rate + * @returns + */ + private _applyVisibleRate; + /** + * 设置某一级LOD显示 + * @param index + */ + private _setLODvisible; + /** + * 设置某一级LOD不显示 + * @param index + */ + private _setLODinvisible; + } + /** + * @en The `PostProcess` class is used to create post-processing components. + * @zh `PostProcess` 类用于创建后期处理组件。 + */ + class PostProcess { + /** + * 重新计算CameraFlag + */ + private recaculateCameraFlag; + /** + * @en Add a post-process effect. + * @zh 构造方法,添加后期处理效果。 + */ + constructor(); + /** + * @en The enable property of the post-process. + * @zh 启用后期处理。 + */ + get enable(): boolean; + set enable(value: boolean); + /** + * @en Set the array of post-process effects.IDE main + * @zh 设置后期处理效果数组。 + */ + get effects(): PostProcessEffect[]; + set effects(value: PostProcessEffect[]); + /** + * @en The camera depth texture mode required for post-processing. + * @zh 后期处理所需的相机深度纹理模式。 + */ + get cameraDepthTextureMode(): DepthTextureMode; + /** + * @en Add a post-processing effect. + * @param effect The post-processing effect to add. + * @zh 添加后期处理效果。 + * @param effect 后期处理效果 + */ + addEffect(effect: PostProcessEffect): void; + /** + * @en Get a post-processing instance based on its type. + * @param classReg The registered post-processing class type. + * @returns The post-processing effect instance, or null if not found. + * @zh 根据类型获取后期处理实例。 + * @param classReg 注册的后期处理类型 + * @returns 后期处理效果实例,如果没有找到则返回null + */ + getEffect(classReg: any): any; + /** + * @en Remove a post-processing effect. + * @param effect The post-processing effect to remove. + * @zh 移除后期处理效果。 + * @param effect 后期处理效果 + */ + removeEffect(effect: PostProcessEffect): void; + /** + * @en Clear all post-processing effects. + * @zh 清理所有后期处理效果。 + */ + clearEffect(): void; + } + /** + * @en Maintain compatibility with 2.0. The new script supports the use of scripts. + * @zh 保持对2.0的兼容。新脚本支持使用Script即可。 + */ + var Script3D: typeof Script; + type Script3D = Script; + /** + * @en Represents a static batch mesh for efficient rendering of multiple static meshes. + * @zh 用于高效渲染多个静态网格的静态批处理网格。 + */ + class StaticBatchMesh { + /** + * @en Creates a new StaticBatchMesh instance based on the provided merge information. + * @param info The static mesh merge information. + * @returns A new StaticBatchMesh instance. + * @zh 根据提供的合并信息创建一个新的静态合批实例。 + * @param info 静态网格合并信息。 + * @returns 一个新的静态合批实例。 + */ + static create(info: StaticMeshMergeInfo): StaticBatchMesh; + /** + * @en The bounding volume of the static batch mesh. + * @zh 静态批处理网格的边界体积。 + */ + bounds: Bounds; + /** + * @en Constructs, initializes a new static batch mesh. + * @zh 构造方法,初始化静态网格合批。 + */ + constructor(); + /** + * @en Sets the vertex and index buffers for this static batch mesh. + * @param vertex The vertex buffer to set. + * @param index The index buffer to set. + * @zh 为此静态批处理网格设置顶点和索引缓冲区。 + * @param vertex 要设置的顶点缓冲区。 + * @param index 要设置的索引缓冲区。 + */ + setBuffer(vertex: VertexBuffer3D, index: IndexBuffer3D): void; + /** + * @en Destroys this static batch mesh and releases all associated resources. + * @zh 销毁此静态批处理网格并释放所有相关资源。 + */ + destroy(): void; + } + /** + * @en StaticBatchMeshRender class, extends BaseRender for static batch mesh rendering. + * @zh StaticBatchMeshRender 类,继承自 BaseRender,用于静态批处理网格渲染。 + */ + class StaticBatchMeshRender extends BaseRender { + /** + * @en Creates a new StaticBatchMeshRender instance. + * @param info The static mesh merge information. + * @returns A new StaticBatchMeshRender instance. + * @zh 创建一个新的 StaticBatchMeshRender 实例。 + * @param info 静态网格合并信息。 + * @returns 新的 StaticBatchMeshRender 实例。 + */ + static create(info: StaticMeshMergeInfo): StaticBatchMeshRender; + private _staticMesh; + /** + * @en The static batch mesh. + * @zh 静态批处理网格。 + */ + get staticMesh(): StaticBatchMesh; + private _mergeInfo; + /** + * @en The static mesh merge information. + * @zh 静态网格合并信息。 + */ + get mergeInfo(): StaticMeshMergeInfo; + set mergeInfo(value: StaticMeshMergeInfo); + _singleton: boolean; + private constructor(); + _calculateBoundingBox(): void; + _renderUpdate(context: IRenderContext3D): void; + /** + * @en Gets mesh defines based on vertex elements. + * @param mesh The static batch mesh. + * @param out Array to store the resulting shader defines. + * @zh 根据顶点元素获取网格定义。 + * @param mesh 静态批处理网格。 + * @param out 用于存储结果着色器定义的数组。 + */ + _getMeshDefine(mesh: StaticBatchMesh, out: Array): void; + /** + * @en Determines if the mesh needs to be rendered based on frustum culling. + * @param boundFrustum The bounding frustum for culling. + * @param context The 3D render context.(Not used) + * @returns True if the mesh needs to be rendered, false otherwise. + * @zh 根据视锥体剔除确定是否需要渲染网格。 + * @param boundFrustum 用于剔除的边界视锥体。 + * @param context 3D渲染上下文。(未使用) + * @returns 如果需要渲染网格则返回true,否则返回false。 + */ + _needRender(boundFrustum: BoundFrustum, context: RenderContext3D): boolean; + /** + * @ignore + * @en Called when the component is enabled. + * Sets the batch render flag for all renders in the merge info. + * @zh 当组件启用时调用。 + * 为合并信息中的所有渲染器设置批处理渲染标志。 + */ + onEnable(): void; + /** + * @ignore + * @en Called when the component is disabled. + * Unsets the batch render flag for all renders in the merge info. + * @zh 当组件禁用时调用。 + * 为合并信息中的所有渲染器取消设置批处理渲染标志。 + */ + onDisable(): void; + /** + * @ignore + * @en Called when the component is being destroyed. + * Cleans up resources including render elements and static mesh. + * @zh 当组件被销毁时调用。 + * 清理资源,包括渲染元素和静态网格。 + */ + onDestroy(): void; + /** + * @en Clones the current StaticBatchMeshRender to another instance. + * @param dest The destination StaticBatchMeshRender instance. + * @zh 将当前 StaticBatchMeshRender 克隆到另一个实例。 + * @param dest 目标 StaticBatchMeshRender 实例。 + */ + _cloneTo(dest: StaticBatchMeshRender): void; + } + /** + * @en represents information for a sub-batch in static batch rendering. + * @zh 静态批处理渲染中子批次的信息。 + */ + class StaticBatchSubInfo { + /** + * @en The starting index of the sub-batch in the index buffer. + * @zh 子批次在索引缓冲区中的起始索引。 + */ + indexStart: number; + /** + * @en The number of indices in the sub-batch. + * @zh 子批次中的索引数量。 + */ + indexCount: number; + /** + * @en The bounding volume of the sub-batch mesh. + * @zh 子批次网格的边界体积。 + */ + meshBounds: Bounds; + /** + * @en Indicates whether this sub-batch needs to be rendered. + * @zh 指示是否需要渲染此子批次。 + */ + needRender: boolean; + /** + * @en Constructor method, initializes data. + * @zh 构造方法,初始化数据 + */ + constructor(); + } + /** + * @en static batch sub-mesh rendering. + * @zh 用于静态批处理子网格渲染。 + */ + class StaticBatchSubMesh extends GeometryElement { + /** + * @en Array of StaticBatchSubInfo objects representing sub-mesh information. + * @zh StaticBatchSubInfo 对象数组,表示子网格信息。 + */ + subInfos: StaticBatchSubInfo[]; + /** + * @en The byte count of indices in the sub-mesh. + * @zh 子网格中索引的字节数。 + */ + indexByteCount: number; + constructor(); + /** + * @en Adds a sub-mesh to the StaticBatchSubMesh. + * @param indexCount The number of indices in the sub-mesh. + * @param indexStart The starting index of the sub-mesh. + * @param bounds The bounding volume of the sub-mesh. + * @zh 向 StaticBatchSubMesh 添加一个子网格。 + * @param indexCount 子网格中的索引数量。 + * @param indexStart 子网格的起始索引。 + * @param bounds 子网格的边界体积。 + */ + addSubMesh(indexCount: number, indexStart: number, bounds: Bounds): void; + /** + * @en Gets the type of the StaticBatchSubMesh. + * @zh 获取 StaticBatchSubMesh 的类型。 + */ + _getType(): number; + /** + * @en Updates render parameters based on the current render context. + * @param state The current render context. + * @zh 根据当前渲染上下文更新渲染参数。 + * @param state 当前渲染上下文。 + */ + _updateRenderParams(state: RenderContext3D): void; + /** + * @en Prepares the sub-mesh for rendering. + * @param state The current render context.(Not used) + * @returns True if any sub-info needs rendering, false otherwise. + * @zh 准备子网格进行渲染。 + * @param state 当前渲染上下文。(未使用) + * @returns 如果有任何子信息需要渲染则返回 true,否则返回 false。 + */ + _prepareRender(state: RenderContext3D): boolean; + /** + * @en Destroys the StaticBatchSubMesh and its resources. + * @zh 销毁 StaticBatchSubMesh 及其资源。 + */ + destroy(): void; + } + /** + * @en StaticMeshMergeInfo class represents information for merging static meshes. + * @zh StaticMeshMergeInfo 类表示用于合并静态网格的信息。 + */ + class StaticMeshMergeInfo { + /** + * @en Creates a new StaticMeshMergeInfo instance from a MeshRenderer. + * @param render The MeshRenderer to create the merge info from. + * @returns A new StaticMeshMergeInfo instance. + * @zh 从 MeshRenderer 创建新的 StaticMeshMergeInfo 实例。 + * @param render 用于创建合并信息的 MeshRenderer。 + * @returns 新的 StaticMeshMergeInfo 实例。 + */ + static create(render: MeshRenderer): StaticMeshMergeInfo; + /** + * @en Indicates whether the object receives shadows. + * @zh 表示对象是否接收阴影。 + */ + receiveShadow: boolean; + /** + * @en The index of the lightmap used by this object. + * @zh 此对象使用的光照贴图索引。 + */ + lightmapIndex: number; + /** + * @en The vertex declaration describing the structure of vertex data. + * @zh 描述顶点数据结构的顶点声明。 + */ + vertexDec: VertexDeclaration; + private _renders; + /** + * @en The array of MeshRenderer components attached to this object. + * @zh 附加到此对象的 MeshRenderer 组件数组。 + */ + get renders(): MeshRenderer[]; + /** + * @en The total number of vertices in this batch. + * @zh 此批次中的顶点总数。 + */ + vertexCount: number; + /** + * @en The total number of indices in this batch. + * @zh 此批次中的索引总数。 + */ + indexCount: number; + private constructor(); + /** + * @en Checks if a MeshRenderer matches the criteria for this batch. + * @param render The MeshRenderer to check. + * @returns True if the renderer matches, false otherwise. + * @zh 检查 MeshRenderer 是否符合此批次的条件。 + * @param render 要检查的 MeshRenderer。 + * @returns 如果渲染器匹配则返回 true,否则返回 false。 + */ + match(render: MeshRenderer): boolean; + /** + * @en Adds a MeshRenderer to this batch. + * @param render The MeshRenderer to add. + * @zh 将 MeshRenderer 添加到此批次。 + * @param render 要添加的 MeshRenderer。 + */ + addElement(render: MeshRenderer): void; + /** + * @en Destroys this batch and releases its resources. + * @zh 销毁此批次并释放其资源。 + */ + destroy(): void; + } + /** + * @en Class used to describe batched rendering nodes. + * @zh 类用来描述合批的渲染节点。 + */ + class BatchRender extends BaseRender { + /** + * @en constructor, initialize the batch rendering node. + * @zh 构造方法, 初始化合批渲染节点。 + */ + constructor(); + /** + * @en Whether to batch based on LOD (Level of Detail). + * @zh 是否根据 LOD(细节层次)来进行合批。 + */ + get checkLOD(): boolean; + set checkLOD(value: boolean); + /** + * @en Sets the LOD culling rate array for filtering. + * @zh 设置 LOD 裁剪率数组用于过滤。 + */ + get lodCullRateArray(): number[]; + set lodCullRateArray(value: number[]); + /** + * @en Called before rendering. Handles LOD (Level of Detail) calculations and changes. + * @zh 渲染前调用。处理 LOD(细节级别)计算和变更。 + */ + onPreRender(): void; + /** + * @en Adds a list of render nodes to the batch queue. + * @param renderNode An array of BaseRender objects to be added to the batch. + * @zh 将渲染节点队列添加到合批队列中。 + * @param renderNode 要添加到合批的 BaseRender 对象数组。 + */ + addList(renderNode: BaseRender[]): void; + /** + * @en Performs batching based on the _batchList. + * This method iterates through the _batchList and batches each render node. + * @zh 根据 _batchList 执行合批操作。 + * 此方法遍历 _batchList 并对每个渲染节点进行合批。 + */ + reBatch(): void; + } + /** + * @en Class used to describe the volume of a mergeable render node. + * @zh 用来描述一个可合并渲染节点的体积。 + */ + class StaticBatchVolume extends Volume { + /** + * @en Whether LOD (Level of Detail) is considered in batching. + * @zh 合批是否考虑 LOD(细节层次)。 + */ + get checkLOD(): boolean; + set checkLOD(value: boolean); + /** + * @en Whether static instance batching is enabled. + * @zh 是否启用静态实例合批渲染。 + */ + get enableStaticInstanceBatchRender(): boolean; + set enableStaticInstanceBatchRender(value: boolean); + /** + * @en Whether static vertex merge batching is enabled. + * @zh 是否启用静态顶点合并合批。 + */ + get enableMergeBatchRender(): boolean; + set enableMergeBatchRender(value: boolean); + /** + * @en Whether custom batching is enabled. + * @zh 是否启用自定义合批。 + */ + get enableCustomBatchRender(): boolean; + set enableCustomBatchRender(value: boolean); + /** + * @en The custom batch renderers. + * @zh 自定义的合批渲染器。 + */ + get customBatchRenders(): BatchRender[]; + set customBatchRenders(value: BatchRender[]); + /** + * @en Constructor method,initialize rendering related settings. + * @zh 构造方法,初始化渲染相关的设置。 + */ + constructor(); + /** + * Restoring the Batch Render State + */ + private _restorRenderNode; + /** + * add one RenderNode + * @param renderNode + * @returns + */ + private __addRenderNodeToBatch; + /** + * remove one RenderNode + * @param renderNode + */ + private __removeRenderNodeFromBatch; + /** + * @en Rebatches the render nodes, clearing previous states. + * This method should be called manually when necessary. Performs batching based on the values in the Volume. + * @zh 重新合批渲染节点,清理先前的状态。 + * 必要时需要手动调用此方法。根据 Volume 中的值执行合批。 + */ + reBatch(): void; + } + /** + * @en used to create static instance batch rendering. + * @zh 用于创建静态实例批处理渲染。 + */ + class StaticInstanceBatchRender extends BatchRender { + /** + * @en constructor, initialize static instance batch rendering. + * @zh 构造方法, 初始化静态实例批处理渲染。 + */ + constructor(); + /** + * @en Determines whether this render supports instance batching. + * @param render The render object to be checked. + * @returns A boolean value indicating whether instance batching is supported. + * @zh 判断这个 Render 是否支持 InstanceBatch。 + * @param render 要检查的渲染对象。 + * @returns 一个布尔值,指示是否支持实例批处理。 + */ + private _isRenderNodeAllCanInstanceBatch; + /** + * @en Calculates the number of instances to be batched. + * @param render The render object containing the elements to be batched. + * @zh 计算实例合并的数量。 + * @param render 包含要合并元素的渲染对象。 + */ + private _sumInstanceBatch; + /** + * batch one element + * @param element + * @param render + * @returns + */ + private _batchOneElement; + /** + * remove one element + * @param element + * @param render + * @returns + */ + private _removeOneElement; + /** + * update one element + * @param element + * @param render + * @returns + */ + private _updateOneElement; + /** + * create instanceElement + * @param element + * @param render + * @param batchMark + * @returns + */ + private _createInstanceElement; + /** + * @en Add a list of renders to the batch queue + * @param renderNodes The render queue to be added + * @zh 将渲染队列添加到批处理队列 + * @param renderNodes 要添加的渲染队列 + */ + addList(renderNodes: BaseRender[]): void; + /** + * @en Rebatch based on the _batchList + * @zh 根据_batchList重新进行批处理 + */ + reBatch(): void; + } + /** + * @en The batch rendering of the static vertex merge. + * @zh 静态顶点合并的批量渲染。 + */ + class StatiVertexMergeBatchRender extends BatchRender { + _addList(renderNodes: BaseRender[]): void; + } + /** + * @en The `VolumeManager` class is used to manage volume components. + * @zh `VolumeManager` 类用于管理体积组件。 + */ + interface IVolumeManager { + } + /** + * @en Reflective probe mode + * @zh 反射探针模式 + */ + enum ReflectionProbeMode { + /** + * @en Baking mode. Currently, only Back baking is supported. + * @zh 烘培模式。现在仅仅支持Back烘培 + */ + off = 0, + /** + * @en Real time simple sampling mode, not supported yet. + * @zh 实时简单采样模式 还未支持*/ + simple = 1 + } + /** + * @en used to implement reflection probe components + * @zh 用于实现反射探针组件 + */ + class ReflectionProbe extends Volume { + /** + * @en Number of reflection probes + * @zh 反射探针数量 + */ + static reflectionCount: number; + /** + * @en Get a globally unique ID + * @zh 获取一个全局唯一ID + */ + static getID(): number; + /** + * @en Default HDR decode values + * @zh 默认的 HDR 解码数据 + */ + static defaultTextureHDRDecodeValues: Vector4; + /**漫反射顔色 */ + private _ambientColor; + /**漫反射SH */ + private _ambientSH; + constructor(); + /** + * @en Whether to enable orthogonal reflection + * @zh 是否开启正交反射 + */ + get boxProjection(): boolean; + set boxProjection(value: boolean); + /** + * @en The importance of the reflection probe + * @zh 反射探针的重要度 + */ + get importance(): number; + set importance(value: number); + /** + * @en The intensity of ambient diffuse reflection + * @zh 环境漫反射的强度 + */ + get ambientIntensity(): number; + set ambientIntensity(value: number); + /** + * @en The intensity of the reflection probe + * @zh 反射探针的强度 + */ + get reflectionIntensity(): number; + set reflectionIntensity(value: number); + _reCaculateBoundBox(): void; + /** + * @en The bounding box of the reflection probe + * @zh 反射探针的包围盒 + */ + get bounds(): Bounds; + /** + * @en The maximum point of the bounding box + * @zh 包围盒的最大点 + */ + get boundsMax(): Vector3; + set boundsMax(value: Vector3); + /** + * @en The minimum point of the bounding box + * @zh 包围盒的最小点 + */ + get boundsMin(): Vector3; + set boundsMin(value: Vector3); + /** + * @en The position of the probe + * @zh 探针的位置 + */ + get probePosition(): Vector3; + /** + * @en The ambient diffuse color + * @zh 环境漫反射颜色 + */ + get ambientColor(): Color; + set ambientColor(value: Color); + /** + * @en The spherical harmonics coefficients for ambient color + * @zh 环境颜色的球谐系数 + */ + get ambientSH(): Float32Array; + set ambientSH(value: Float32Array); + /** + * @en Get or set the ambient light mode + * If the value is AmbientMode.SolidColor, ambientColor is generally used as the ambient light source + * If the value is AmbientMode.SphericalHarmonics, ambientSphericalHarmonics is generally used as the ambient light source + * @zh 获取或设置环境光模式 + * 如果值为AmbientMode.SolidColor,一般使用ambientColor作为环境光源 + * 如果值为AmbientMode.SphericalHarmonics,一般使用ambientSphericalHarmonics作为环境光源 + */ + get ambientMode(): AmbientMode; + set ambientMode(value: AmbientMode); + private _iblTex; + /** + * @en The Image-Based Lighting (IBL) texture + * @zh 基于图像的照明(IBL)纹理 + */ + get iblTex(): TextureCube; + set iblTex(value: TextureCube); + /** + * @en Whether the Image-Based Lighting texture is compressed using RGBD format + * @zh 基于图像的照明纹理是否使用RGBD格式压缩 + */ + get iblTexRGBD(): boolean; + set iblTexRGBD(value: boolean); + } + /** + * @en The `ReflectionProbeManager` class is used for managing reflection probes. + * @zh `ReflectionProbeManager` 类用于管理反射探针。 + */ + class ReflectionProbeManager implements IVolumeManager { + /** + * @en The constructor of the `ReflectionProbeManager` class. + * @zh `ReflectionProbeManager` 类构造函数。 + */ + constructor(); + /** + * @en The scene reflection probe + * @zh 场景反射探针 + */ + get sceneReflectionProbe(): ReflectionProbe; + set sceneReflectionProbe(value: ReflectionProbe); + /** + * @en Update the reflection probe for the base render. + * @param baseRender The base render object to update. + * @zh 更新基础渲染对象的反射探针。 + * @param baseRender 要更新的基础渲染对象。 + */ + _updateRenderObject(baseRender: BaseRender): void; + } + /** + * @en Enum representing the types of intersection between volumes. + * @zh 表示体积之间相交类型的枚举。 + */ + enum volumeIntersectType { + /** + * @en One volume contains the other. + * @zh 一个体积包含另一个体积。 + */ + contain = 0, + /** + * @en Volumes intersect but do not fully contain each other. + * @zh 体积相交但不完全包含彼此。 + */ + intersect = 1, + /** + * @en Volumes are disjoint (do not intersect). + * @zh 体积不相交(互不相交)。 + */ + Disjoint = 2 + } + /** + * @en Represents the intersection properties between volume. + * @zh 表示物体的相交属性。 + */ + class volumeIntersectInfo { + /** + * @en Intersection Type + * @zh 相交类型 + */ + type: volumeIntersectType; + /** + * @en Intersection ratio + * @zh 相交比例 + */ + intersectRate: number; + } + /** + * @en Represents a volume component in the scene. + * @zh 表示场景中的体积组件。 + */ + class Volume extends Component { + /** + * @en constractor of Volume + * @zh 体积组件的构造函数。 + */ + constructor(); + /** + * @en The volume type. + * @zh 体积类型。 + */ + get type(): number; + /** + * @en The maximum point of the volume component's own bounding box. + * @zh 体积组件自身包围盒的最大点。 + */ + get boundsMax(): Vector3; + set boundsMax(value: Vector3); + /** + * @en The minimum point of the volume component's own bounding box. + * @zh 体积组件自身包围盒的最小点。 + */ + get boundsMin(): Vector3; + set boundsMin(value: Vector3); + /** + * @en The probe position of the volume. + * @zh 体积的探针位置。 + */ + get probePosition(): Vector3; + /** + * @en The importance value of the volume probe. + * @zh 体积探针的重要度。 + */ + get importance(): number; + set importance(value: number); + } + /** + * @en The `VolumeManager` class is used to manage volume components in a scene. + * @zh `VolumeManager` 类用于管理场景中的体积组件。 + */ + class VolumeManager implements IVolumeManager { + /** + * @en Type identifier for Reflection Probe Volume. + * @zh 反射探针体积的类型标识符。 + */ + static ReflectionProbeVolumeType: number; + /** + * @en Type identifier for Volumetric Global Illumination. + * @zh 体积全局光照的类型标识符。 + */ + static VolumetricGIType: number; + /** + * @en Dictionary of specialized volume managers for different volume types. + * @zh 不同体积类型的专门体积管理器字典。 + */ + _regVolumeManager: { + [key: number]: IVolumeManager; + }; + /** + * @en Volumetric Global Illumination manager. + * @zh 体积全局光照管理器。 + */ + _volumetricGIManager: VolumetricGIManager; + constructor(); + /** + * @en The reflection probe manager. + * @zh 反射探针管理器。 + */ + get reflectionProbeManager(): ReflectionProbeManager; + /** + * @en The volumetric global illumination manager. + * @zh 体积全局光照管理器。 + */ + get volumetricGIManager(): VolumetricGIManager; + /** + * @en Add a volume component to the manager. + * @zh 向管理器添加一个体积组件。 + */ + add(volume: Volume): void; + /** + * @en Remove a volume component from the manager. + * @zh 从管理器中移除一个体积组件。 + */ + remove(volume: Volume): void; + /** + * @en Add a motion object to the handle list. + * @zh 将运动对象添加到处理列表中。 + */ + addMotionObject(renderObj: BaseRender): void; + /** + * @en Remove a motion object from the handle list. + * @zh 从处理列表中移除运动对象。 + */ + removeMotionObject(renderObj: BaseRender): void; + /** + * @en Update one RenderNode Volume info + * @param baseRender The BaseRender object to update + * @zh 更新一个RenderNode的Volume信息 + * @param baseRender 要更新的BaseRender对象 + */ + _updateRenderObject(baseRender: BaseRender): void; + /** + * @en Recalculate and update all Volume information for render objects + * @zh 重新计算并更新所有渲染对象的Volume信息 + */ + reCaculateAllRenderObjects(baseRenders: SingletonList): void; + /** + * @en Check if all render objects need to be recalculated + * @zh 检查是否需要重新计算所有渲染对象 + */ + needreCaculateAllRenderObjects(): boolean; + } + /** + * @en The VolumetricGI class represents volumetric global illumination in the scene. + * @zh VolumetricGI 类表示场景中的体积全局光照。 + */ + class VolumetricGI extends Volume { + /** + * @en The count of volumetric global illumination probes. + * @zh 体积全局光照探针的数量。 + */ + static volumetricCount: number; + /** + * @en Get a globally unique ID. + * @zh 获取一个全局唯一的ID。 + */ + static getID(): number; + /** + * @en construct method, initialize VolumetricGI object. + * @zh 构造方法,初始化VolumetricGI对象。 + */ + constructor(); + private _irradiance; + /** + * @en Light probe irradiance texture. + * @zh 光照探针辐照度纹理。 + */ + get irradiance(): Texture2D; + set irradiance(value: Texture2D); + private _distance; + /** + * @en Distance texture for light probe. + * @zh 光照探针的距离纹理。 + */ + get distance(): Texture2D; + set distance(value: Texture2D); + /** + * @en Normal bias for volumetric global illumination. + * @zh 体积全局光照的法线偏移。 + */ + get normalBias(): number; + set normalBias(value: number); + /** + * @en View bias for volumetric global illumination. + * @zh 体积全局光照的视图偏移。 + */ + get viewBias(): number; + set viewBias(value: number); + /** + * @en Number of texels per probe in the irradiance texture. + * @zh 辐照度纹理中每个探针的纹素数量。 + */ + get irradianceTexel(): number; + /** + * @en Number of texels per probe in the distance texture. + * @zh 距离纹理中每个探针的纹素数量。 + */ + get distanceTexel(): number; + /** + * @en The intensity of the reflection probe. + * @zh 反射探针的强度。 + */ + get intensity(): number; + set intensity(value: number); + /** + * @en The number of probes for volumetric global illumination. + * @zh 体积全局光照的探针数量。 + */ + get probeCounts(): Vector3; + set probeCounts(value: Vector3); + /** + * @en The step size between probes for volumetric global illumination. + * @zh 体积全局光照探针之间的间隔。 + */ + get probeStep(): Vector3; + set probeStep(value: Vector3); + _reCaculateBoundBox(): void; + } + /** + * @en The `BaseCamera` class is used to create the parent class of cameras. + * @zh `BaseCamera` 类用于创建摄像机的父类。 + */ + class BaseCamera extends Sprite3D { + /**渲染模式,延迟光照渲染,暂未开放。*/ + static RENDERINGTYPE_DEFERREDLIGHTING: string; + /** + * @en Rendering mode: Forward rendering. + * @zh 渲染模式:前向渲染。 + */ + static RENDERINGTYPE_FORWARDRENDERING: string; + /** + * @en Initialize the Camera + * @zh 初始化相机 + */ + static __init__(): void; + /** + * @en Near clipping plane. + * @zh 近裁剪面。 + */ + protected _nearPlane: number; + /** + * @en Far clipping plane. + * @zh 远裁剪面。 + */ + protected _farPlane: number; + /** + * @en Render engine. + * @zh 渲染引擎。 + */ + protected _renderEngine: IRenderEngine; + /** + * @en Field of view. + * @zh 视野。 + */ + protected _fieldOfView: number; + /** + * @en Vertical size of orthographic projection. + * @zh 正交投影的垂直尺寸。 + */ + private _orthographicVerticalSize; + private _skyRenderElement; + /** + * @en Forward vector. + * @zh 前向量。 + */ + _forward: Vector3; + /** + * @en Up vector. + * @zh 上向量。 + */ + _up: Vector3; + /** + * @en Whether the camera uses orthographic projection. + * @zh 是否使用正交投影。 + */ + protected _orthographic: boolean; + /** + * @en The clear color of the camera. The default color is CornflowerBlue. + * @zh 摄像机的清除颜色。默认颜色为CornflowerBlue。 + */ + private _clearColor; + get clearColor(): Color; + set clearColor(value: Color); + /** + * @en The culling mask value for visible layers, supporting mixed values. For example, cullingMask = Math.pow(2,0) | Math.pow(2,1) means layers 0 and 1 are visible. + * @zh 可视层位标记遮罩值,支持混合 例:cullingMask=Math.pow(2,0)|Math.pow(2,1)为第0层和第1层可见。 + */ + private _cullingMask; + /** + * @en Whether to use occlusion culling during rendering. + * @zh 渲染时是否使用遮挡剔除。 + */ + useOcclusionCulling: boolean; + /** + * @en Sky renderer element. + * @zh 天空渲染器。 + */ + get skyRenderElement(): SkyRenderElement; + /** + * @en Field of view. + * @zh 视野。 + */ + get fieldOfView(): number; + set fieldOfView(value: number); + /** + * @en Maximum local distance. + * @zh 最大本地距离。 + */ + get maxlocalYDistance(): number; + /** + * @en Near clipping plane. + * @zh 近裁剪面。 + */ + get nearPlane(): number; + set nearPlane(value: number); + /** + * @en Far clipping plane. + * @zh 远裁剪面。 + */ + get farPlane(): number; + set farPlane(vaule: number); + /** + * @en Whether to use orthographic projection matrix. + * @zh 是否使用正交投影矩阵。 + */ + get orthographic(): boolean; + set orthographic(vaule: boolean); + /** + * @en Vertical size of the orthographic projection. + * @zh 正交投影的垂直尺寸。 + */ + get orthographicVerticalSize(): number; + set orthographicVerticalSize(vaule: number); + /** + * @en Culling mask. + * @zh 剔除遮罩。 + */ + get cullingMask(): number; + set cullingMask(value: number); + /** + * @en Rendering order. + * @zh 渲染顺序。 + */ + get renderingOrder(): number; + set renderingOrder(value: number); + /** + * @en Constructor function. + * @param nearPlane The near clipping plane. Default value is 0.3. + * @param farPlane The far clipping plane. Default value is 1000. + * @zh 构造函数。 + * @param nearPlane 近裁剪面。默认值为 0.3。 + * @param farPlane 远裁剪面。默认值为 1000。 + */ + constructor(nearPlane?: number, farPlane?: number); + private _caculateMaxLocalYRange; + /** + * @en Add a visible layer, layer value ranges from 0 to 31. + * @param layer The layer to add. + * @zh 增加可视图层,layer值为0到31层。 + * @param layer 要添加的图层。 + */ + addLayer(layer: number): void; + /** + * @en Remove a visible layer, layer value ranges from 0 to 31. + * @param layer The layer to remove. + * @zh 移除可视图层,layer值为0到31层。 + * @param layer 要移除的图层。 + */ + removeLayer(layer: number): void; + /** + * @en Add all layers. + * @zh 增加所有图层。 + */ + addAllLayers(): void; + /** + * @en Remove all layers. + * @zh 移除所有图层。 + */ + removeAllLayers(): void; + /** + * @en Recalculate the projection matrix. + * @zh 重新计算投影矩阵。 + */ + resetProjectionMatrix(): void; + /** + * @inheritDoc + * @override + */ + protected _onActive(): void; + /** + * @inheritDoc + * @override + */ + protected _onInActive(): void; + /** + * @inheritDoc + * @override + * @en Destroy the camera. + * @param destroyChild Whether to destroy child nodes. + * @zh 销毁相机。 + * @param destroyChild 是否销毁子节点。 + */ + destroy(destroyChild?: boolean): void; + } + /** + * @en Camera clear flags. + * @zh 相机清除标记。 + */ + enum CameraClearFlags { + /** + * @en Solid color. + * @zh 固定颜色。 + */ + SolidColor = 0, + /** + * @en Sky. + * @zh 天空。 + */ + Sky = 1, + /** + * @en Depth only. + * @zh 仅深度。 + */ + DepthOnly = 2, + /** + * @en Do not clear. + * @zh 不清除。 + */ + Nothing = 3, + /** + * @en Clear color only. + * @zh 只清理颜色。 + */ + ColorOnly = 4 + } + /** + * @en Camera event flags. + * @zh 相机事件标记。 + */ + enum CameraEventFlags { + /** + * @en Before rendering opaque objects. + * @zh 在渲染非透明物体之前。 + */ + BeforeForwardOpaque = 0, + /** + * @en Before rendering the skybox. + * @zh 在渲染天空盒之前。 + */ + BeforeSkyBox = 2, + /** + * @en Before rendering transparent objects. + * @zh 在渲染透明物体之前。 + */ + BeforeTransparent = 4, + /** + * @en Before applying image effects. + * @zh 在后期处理之前。 + */ + BeforeImageEffect = 6, + /** + * @en After all rendering is complete. + * @zh 所有渲染之后。 + */ + AfterEveryThing = 8 + } + /** + * @en The Camera class is used to create cameras. + * @zh Camera 类用于创建摄像机。 + */ + class Camera extends BaseCamera { + static set _updateMark(value: number); + /** + * @en Get the rendering result of a certain position in the scene based on camera and scene information. + * @param camera The camera + * @param scene The scene to be rendered + * @param renderTexture The render texture to draw to + * @returns The rendered texture + * @zh 根据相机、场景信息获得场景中某一位置的渲染结果。 + * @param camera 相机 + * @param scene 需要渲染的场景 + * @param renderTexture 要绘制到的渲染纹理 + * @returns 渲染后的纹理 + */ + static drawRenderTextureByScene(camera: Camera, scene: Scene3D, renderTexture: RenderTexture): RenderTexture; + /** + * @deprecated 请使用getTexturePixelAsync函数代替 + * get PixelTexture + * 获得纹理的像素 + * @param texture 纹理 + * @returns + */ + static getTexturePixel(texture: Texture2D): ArrayBufferView; + /** + * @en Get the pixels of a texture asynchronously + * @param texture The texture + * @returns A promise that resolves with the pixel data + * @zh 获得纹理的像素 + * @param texture 纹理 + * @returns 解析为像素数据的 Promise + */ + static getTexturePixelAsync(texture: Texture2D): Promise; + /** + * @en Draw scene content based on the camera's position in the scene and return it + * @param camera The camera + * @param scene The scene + * @param renderCubeSize The pixel size of the cube texture + * @param format The color format + * @param cullingMask The culling mask + * @returns Output texture pixels in order: back, front, left, right, up, down + * @zh 根据场景中相机的位置绘制场景内容并返回 + * @param camera 相机 + * @param scene 场景 + * @param renderCubeSize 立方体纹理像素大小 + * @param format 颜色格式 + * @param cullingMask 剔除遮罩 + * @returns 输出纹理像素顺序:后、前、左、右、上、下 + */ + static drawTextureCubePixelByScene(camera: Camera, scene: Scene3D, renderCubeSize: number, format: TextureFormat, cullingMask: number): ArrayBufferView[]; + /** + * @en Draw the content of a specified scene to a cube map texture. + * @param camera The camera used for rendering. + * @param position The position of the camera. + * @param scene The specified scene to render. + * @param renderCubeSize The size of the cube map texture. + * @param format The format of the cube map texture. + * @param cullingMask The culling mask for the camera. Default is 0. + * @returns The created cube map texture. + * @zh 绘制指定场景的内容到立方体贴图。 + * @param camera 用于渲染的相机。 + * @param position 相机的位置。 + * @param scene 要渲染的指定场景。 + * @param renderCubeSize 立方体贴图的大小。 + * @param format 立方体贴图的格式。 + * @param cullingMask 相机的剔除遮罩。默认值为0。 + * @returns 创建的立方体贴图。 + */ + static drawTextureCubeByScene(camera: Camera, position: Vector3, scene: Scene3D, renderCubeSize: number, format: TextureFormat, cullingMask?: number): TextureCube; + /** + * @en Depth texture + * @zh 深度贴图 + */ + private _depthTexture; + /** + * @en Depth normals texture + * @zh 深度法线贴图 + */ + private _depthNormalsTexture; + /** + * @en Whether to enable the opaque objects pass + * @zh 是否开启非透明物体通道 + */ + private _opaquePass; + /** + * @en Whether rendering is allowed. + * @zh 是否允许渲染。 + */ + enableRender: boolean; + /** + * @en Clear flag. + * @zh 清除标记。 + */ + clearFlag: CameraClearFlags; + _renderDataModule: ICameraNodeData; + private _Render3DProcess; + /** + * @en The near clipping plane of the camera. + * @param value The distance to the near clipping plane. + * @zh 相机的近裁剪平面。 + * @param value 近裁剪平面的距离。 + */ + set nearPlane(value: number); + get nearPlane(): number; + /** + * @en The far clipping plane of the camera. + * @param value The distance to the far clipping plane. + * @zh 相机的远裁剪平面。 + * @param value 远裁剪平面的距离。 + */ + set farPlane(value: number); + get farPlane(): number; + /** + * @en Set the field of view of the camera. + * @param value The field of view in degrees. + * @zh 设置相机的视野。 + * @param value 单位为度。 + */ + set fieldOfView(value: number); + get fieldOfView(): number; + /** + * @en The aspect ratio of the camera. + * @zh 相机的横纵比。 + */ + get aspectRatio(): number; + set aspectRatio(value: number); + /** + * @en The viewport in screen pixel coordinates. + * @zh 屏幕像素坐标的视口。 + */ + get viewport(): Viewport; + set viewport(value: Viewport); + /** + * @en The display width of the camera. + * @zh 相机显示宽度。 + */ + get clientWidth(): number; + /** + * @en The display height of the camera. + * @zh 相机显示高度。 + */ + get clientHeight(): number; + /** + * @en Multi-sample anti-aliasing. + * @zh 多重采样抗锯齿。 + */ + set msaa(value: boolean); + get msaa(): boolean; + /** + * @en Space anti-aliasing. + * @zh 空间抗锯齿 + */ + set fxaa(value: boolean); + get fxaa(): boolean; + /** + * @en The viewport in clip space. + * @zh 裁剪空间的视口。 + */ + get normalizedViewport(): Viewport; + set normalizedViewport(value: Viewport); + /** + * @en Get the view matrix. + * @zh 视图矩阵。 + */ + get viewMatrix(): Matrix4x4; + /** + * @en The projection matrix. + * @zh 投影矩阵。 + */ + get projectionMatrix(): Matrix4x4; + set projectionMatrix(value: Matrix4x4); + /** + * @en The projection view matrix. + * @zh 视图投影矩阵。 + */ + get projectionViewMatrix(): Matrix4x4; + /** + * @en The bound frustum of the camera. + * @zh 摄像机视锥。 + */ + get boundFrustum(): BoundFrustum; + /** + * @en Customize the rendering target for the scene. + * @zh 自定义渲染场景的渲染目标。 + */ + get renderTarget(): RenderTexture; + set renderTarget(value: RenderTexture); + /** + * @en Post processing. + * @zh 后期处理。 + */ + get postProcess(): PostProcess; + set postProcess(value: PostProcess); + /** + * @en Whether to enable HDR. Enabling it has a certain impact on performance. + * @zh 是否开启HDR。开启后对性能有一定影响。 + */ + get enableHDR(): boolean; + set enableHDR(value: boolean); + /** + * @en Whether to use the RenderTexture being rendered for CommandBuffer service. Set to true when used with CommandBuffer. + * @zh 是否使用正在渲染的 RenderTexture 为 CommandBuffer 服务。通常与 CommandBuffer 一起使用时设置为 true。 + */ + get enableBuiltInRenderTexture(): boolean; + set enableBuiltInRenderTexture(value: boolean); + /** + * @en The depth texture mode for the camera. + * @zh 相机的深度纹理模式。 + */ + get depthTextureMode(): DepthTextureMode; + set depthTextureMode(value: DepthTextureMode); + /** + * @en Set the Opaque Pass mode for the camera. + * @zh 相机的不透明通道模式。 + */ + set opaquePass(value: boolean); + get opaquePass(): boolean; + opaqueTextureSize: number; + /** + * @en The format of the depth texture. + * @zh 深度纹理的格式。 + */ + get depthTextureFormat(): RenderTargetFormat; + set depthTextureFormat(value: RenderTargetFormat); + /** + * @en Enable or disable the use of built-in depth texture (TODO: If enabled, the depth texture can only be used in post-processing, not in the rendering process). + * @zh 设置是否使用内置的深度纹理(TODO:如果开启,深度纹理只能在后期处理中使用,不能在渲染流程中使用)。 + */ + set enableBlitDepth(value: boolean); + get enableBlitDepth(): boolean; + /** + * @en Whether the camera can blit (draw) the depth texture. + * @zh 相机是否可以绘制深度纹理。 + */ + get canblitDepth(): boolean; + /** + * @en Creates an instance of the Camera. + * @param aspectRatio The aspect ratio of the camera view. + * @param nearPlane The near clipping plane distance. + * @param farPlane The far clipping plane distance. + * @zh 创建一个Camera实例。 + * @param aspectRatio 横纵比。 + * @param nearPlane 近裁面。 + * @param farPlane 远裁面。 + */ + constructor(aspectRatio?: number, nearPlane?: number, farPlane?: number); + /** + * @en Clone the camera. + * @zh 克隆相机。 + */ + clone(): Camera; + set depthTexture(value: BaseTexture); + set depthNormalTexture(value: RenderTexture); + /** + * @override + * @en Render the scene. + * @param scene The scene to render. + * @zh 渲染场景。 + * @param scene 要渲染的场景。 + */ + render(scene: Scene3D): void; + /** + * @en Calculate a ray from screen space. + * @param point The position in screen space. + * @param out The output ray. + * @zh 计算从屏幕空间生成的射线。 + * @param point 屏幕空间的位置位置。 + * @param out 输出射线。 + */ + viewportPointToRay(point: Vector2, out: Ray): void; + /** + * @en Calculate a ray from normalized viewport space. + * @param point The position in normalized viewport space. + * @param out The output ray. + * @zh 计算从归一化视口空间生成的射线。 + * @param point 裁切空间的位置。 + * @param out 输出射线。 + */ + normalizedViewportPointToRay(point: Vector2, out: Ray): void; + /** + * @en Transform a point from world space to viewport space. + * @param position The coordinate in world space. + * @param out x, y, z are viewport space coordinates, w is the z-axis coordinate relative to the camera. + * @zh 将一个点从世界空间转换到视口空间。 + * @param position 世界空间的坐标。 + * @param out x、y、z为视口空间坐标,w为相对于摄像机的z轴坐标。 + */ + worldToViewportPoint(position: Vector3, out: Vector4): void; + /** + * @en Transform a point from world space to normalized viewport space. + * @param position The coordinate in world space. + * @param out x, y, z are normalized viewport space coordinates, w is the z-axis coordinate relative to the camera. + * @zh 将一个点从世界空间转换到归一化视口空间。 + * @param position 世界空间的坐标。 + * @param out x、y、z为归一化视口空间坐标,w为相对于摄像机的z轴坐标。 + */ + worldToNormalizedViewportPoint(position: Vector3, out: Vector4): void; + /** + * @en Convert 2D screen coordinate system to 3D orthographic projection coordinate system. Note: Only valid under orthographic model. + * @param source The source coordinate. + * @param out The output coordinate. + * @returns Whether the conversion was successful. + * @zh 转换2D屏幕坐标系统到3D正交投影下的坐标系统,注:只有正交模型下有效。 + * @param source 源坐标。 + * @param out 输出坐标。 + * @return 是否转换成功。 + */ + convertScreenCoordToOrthographicCoord(source: Vector3, out: Vector3): boolean; + /** + * @override + * @inheritDoc + * @en Destroy the Camera node. + * @param destroyChild Whether to destroy child nodes. + * @zh 删除Camera节点。 + * @param destroyChild 是否删除子节点 + */ + destroy(destroyChild?: boolean): void; + /** + * @en Add a command buffer to the camera's rendering pipeline. + * @param event The camera event flag. + * @param commandBuffer The rendering command buffer. + * @zh 增加camera渲染节点渲染缓存。 + * @param event 相机事件标志 + * @param commandBuffer 渲染命令流 + */ + addCommandBuffer(event: CameraEventFlags, commandBuffer: CommandBuffer): void; + /** + * @en Remove a command buffer from the camera's rendering pipeline. + * @param event The camera event flag. + * @param commandBuffer The rendering command buffer to remove. + * @zh 移除camera渲染节点渲染缓存。 + * @param event 相机事件标志 + * @param commandBuffer 渲染命令流 + */ + removeCommandBuffer(event: CameraEventFlags, commandBuffer: CommandBuffer): void; + /** + * @en Remove all command buffers for a specific camera event. + * @param event The camera event flag. + * @zh 移除camera相机节点的所有渲染缓存。 + * @param event 相机事件标志 + */ + removeCommandBuffers(event: CameraEventFlags): void; + } + /** + * @en The `FloatKeyframe` class is used to create floating-point keyframe instances. + * @zh `FloatKeyframe` 类用于创建浮点关键帧实例。 + */ + class FloatKeyframe extends Keyframe { + /** + * @en The in-tangent of the keyframe. + * @zh 关键帧的内切线。 + */ + inTangent: number; + /** + * @en The out-tangent of the keyframe. + * @zh 关键帧的外切线。 + */ + outTangent: number; + /** + * @en The value of the keyframe. + * @zh 关键帧的值。 + */ + value: number; + /** + * @en The in-weight of the keyframe. Default is Keyframe.defaultWeight. + * @zh 关键帧的内权重。默认值为 Keyframe.defaultWeight。 + */ + inWeight: number; + /** + * @en The out-weight of the keyframe. Default is Keyframe.defaultWeight. + * @zh 关键帧的外权重。默认值为 Keyframe.defaultWeight。 + */ + outWeight: number; + /** + * @en The weighted mode of the keyframe. Default is WeightedMode.None. + * @zh 关键帧的权重模式。默认值为 WeightedMode.None。 + */ + weightedMode: number; + /** + * @ignore + * @en Creates an instance of `FloatKeyframe`. + * @zh 创建一个 `FloatKeyframe` 的实例。 + */ + constructor(); + /** + * @en Clones the data to another object. + * @param destObject The target object to clone to. + * @zh 克隆数据到目标对象。 + * @param destObject 拷贝数据结构 + */ + cloneTo(destObject: FloatKeyframe): void; + /** + * @en Clones. + * @zh 克隆 + */ + clone(): FloatKeyframe; + } + /** + * @en The `GeometryElement` class is used to implement geometric elements. This class is abstract. + * @zh `GeometryElement` 类用于实现几何体元素,该类为抽象类。 + */ + class GeometryElement { + protected _owner: any; + static _typeCounter: number; + _geometryElementOBj: IRenderGeometryElement; + protected _bufferState: BufferState; + /** + * @en VAO (Vertex Array Object) instance + * @zh VAO (顶点数组对象) 实例 + */ + set bufferState(value: BufferState); + get bufferState(): BufferState; + /** + * @en Mesh topology type + * @zh 网格拓扑类型 + */ + set mode(value: MeshTopology); + get mode(): MeshTopology; + /** + * @en Draw type + * @zh 绘制类型 + */ + set drawType(value: number); + get drawType(): number; + /** + * @en Set parameters for drawing arrays + * @param first The starting index in the array + * @param count The number of indices to be rendered + * @zh 设置绘制数组的参数。 + * @param first 数组起始索引。 + * @param count 要渲染的索引数量。 + */ + setDrawArrayParams(first: number, count: number): void; + /** + * @en Set parameters for drawing elements + * @param count The number of elements to be rendered + * @param offset The starting offset in the element array + * @zh 设置绘制元素的参数。 + * @param count 要渲染的元素数量。 + * @param offset 元素数组的起始偏移。 + */ + setDrawElemenParams(count: number, offset: number): void; + /** + * @en Number of instances to draw + * @zh 要绘制的实例数量 + */ + set instanceCount(value: number); + get instanceCount(): number; + /** + * @en Index buffer format + * @zh 索引缓冲区格式 + */ + set indexFormat(value: IndexFormat); + get indexFormat(): IndexFormat; + /** + * @en Get whether the object is destroyed + * @zh 获取是否已销毁 + */ + get destroyed(): boolean; + /** + * @ignore + * @en Creates an instance of GeometryElement. + * @param mode The topology used by the mesh. + * @param drawType The draw type used for rendering. + * @zh 创建一个 GeometryElement 的实例。 + * @param mode 网格使用的拓扑结构。 + * @param drawType 用于渲染的绘制类型。 + */ + constructor(mode: MeshTopology, drawType: DrawType); + /** + * @en Get the geometry type + * @zh 获取几何体类型 + */ + _getType(): number; + /** + * @en Destroy the object + * @zh 销毁对象 + */ + destroy(): void; + /** + * @en Clear render parameters + * @zh 清除渲染参数 + */ + clearRenderParams(): void; + } + /** + * @en The `Gradient` class is used to create color gradients. + * @zh `Gradient` 类用于创建颜色渐变。 + */ + class Gradient implements IClone { + private _mode; + private _maxColorRGBKeysCount; + get maxColorRGBKeysCount(): number; + private _colorRGBKeysCount; + /** + * @en Get the count of color RGB keys. + * @returns The count of color RGB keys. + * @zh 获取颜色 RGB 数量。 + * @returns 颜色 RGB 数量。 + */ + get colorRGBKeysCount(): number; + private _maxColorAlphaKeysCount; + get maxColorAlphaKeysCount(): number; + private _colorAlphaKeysCount; + /** + * 获取颜色Alpha数量。 + * @return 颜色Alpha数量。 + */ + get colorAlphaKeysCount(): number; + get maxColorKeysCount(): number; + /** + * @en Get the gradient mode. + * @returns The gradient mode. + * @zh 获取梯度模式。 + * @returns 梯度模式。 + */ + get mode(): number; + /** + * @en Set the gradient mode. + * @param value The gradient mode. + * @zh 设置梯度模式。 + * @param value 梯度模式。 + */ + set mode(value: number); + /** + * @ignore + */ + constructor(); + /** + * @en Add a color RGB key. + * @param key The lifetime, ranging from 0 to 1. + * @param value The RGB value. + * @zh 增加颜色 RGB 帧。 + * @param key 生命周期,范围为 0 到 1。 + * @param value RGB 值。 + */ + addColorRGB(key: number, value: Color): void; + /** + * @en Add a color Alpha key. + * @param key The lifetime, ranging from 0 to 1. + * @param value The Alpha value. + * @zh 增加颜色 Alpha 帧。 + * @param key 生命周期,范围为 0 到 1。 + * @param value Alpha 值。 + */ + addColorAlpha(key: number, value: number): void; + /** + * @en Update a color RGB key. + * @param index The index. + * @param key The lifetime, ranging from 0 to 1. + * @param value The RGB value. + * @zh 更新颜色 RGB 帧。 + * @param index 索引。 + * @param key 生命周期,范围为 0 到 1。 + * @param value RGB 值。 + */ + updateColorRGB(index: number, key: number, value: Color): void; + /** + * @en Update a color Alpha key. + * @param index The index. + * @param key The lifetime, ranging from 0 to 1. + * @param value The Alpha value. + * @zh 更新颜色 Alpha 帧。 + * @param index 索引。 + * @param key 生命周期,范围为 0 到 1。 + * @param value Alpha 值。 + */ + updateColorAlpha(index: number, key: number, value: number): void; + /** + * @en Get RGB color through interpolation. + * @param lerpFactor Interpolation factor, clamped between 0 and 1. + * @param out The resulting color. + * @param startSearchIndex The starting search index. Default is 0. + * @param reverseSearch Whether to perform reverse interpolation. Default is false. + * @returns The current index after interpolation. + * @zh 通过插值获取RGB颜色。 + * @param lerpFactor 插值因子,取值范围在0到1之间。 + * @param out 颜色结果。 + * @param startSearchIndex 开始查找索引。默认为0。 + * @param reverseSearch 是否进行反向插值。默认为false。 + * @returns 插值后的当前索引。 + */ + evaluateColorRGB(lerpFactor: number, out: Color, startSearchIndex?: number, reverseSearch?: boolean): number; + /** + * @en Get the alpha value through interpolation. + * @param lerpFactor The interpolation factor. + * @param outColor The resulting color. + * @param startSearchIndex The starting search index. Default is 0. + * @param reverseSearch Whether to perform reverse interpolation. Default is false. + * @returns The resulting index. + * @zh 通过插值获取透明值。 + * @param lerpFactor 插值因子。 + * @param outColor 颜色结果。 + * @param startSearchIndex 开始查找索引。默认为0。 + * @param reverseSearch 是否反向插值。默认为false。 + * @returns 结果索引。 + */ + evaluateColorAlpha(lerpFactor: number, outColor: Color, startSearchIndex?: number, reverseSearch?: boolean): number; + /** + * 更新 GPU data array + * @param data GPU data array + * @param elements 原始数据 + */ + private _updateGpuData; + private _fixGPUAlphaData; + private _fixGPURGBData; + private _gpuRGBData4; + private _gpuRGBData8; + private _gpuAlphaData4; + private _gpuAlphaData8; + /** + * @en Clone. + * @param destObject The destination object to clone to. + * @zh 克隆。 + * @param destObject 克隆的目标对象。 + */ + cloneTo(destObject: Gradient): void; + /** + * @en Clone the gradient. + * @returns A clone of the gradient. + * @zh 克隆渐变。 + * @returns 克隆的副本。 + */ + clone(): any; + } + /** + * @en The gradient mode. + * @zh 渐变模式 + */ + class GradientMode { + /** + * @en Finds the two keys adjacent to the requested evaluation time and linearly interpolates between them to obtain a blended color. + * @zh 找到与请求的评估时间相邻的两个键,并线性插值在他们之间,以获得一种混合的颜色。 + */ + static Blend: number; + /** + * @en Returns a fixed color by finding the first key with a time value greater than the requested evaluation time. + * @zh 返回一个固定的颜色,通过查找第一个键的时间值大于所请求的评估时间。 + */ + static Fixed: number; + } + /** + * @en Animation weight mode + * @zh 动画权重模式 + */ + enum WeightedMode { + None = 0, + In = 1, + Out = 2, + Both = 3 + } + /** + * @en The `Keyframe` class is used to create keyframe instances. + * @zh `Keyframe` 类用于创建关键帧实例。 + */ + class Keyframe implements IClone { + /** + * @en The default weight value for keyframes. + * @zh 关键帧的默认权重值。 + */ + static defaultWeight: number; + /** + * @en The time of the keyframe. + * @zh 关键帧的时间。 + */ + time: number; + /** @ignore */ + constructor(); + /** + * @en Source of the keyframe. + * @param destObject The target object to clone to. + * @zh 克隆到另一个对象。 + * @param destObject 克隆源。 + */ + cloneTo(destObject: Keyframe): void; + /** + * @en Creates a clone of the current keyframe. + * @returns A clone of the current keyframe. + * @zh 克隆。 + * @returns 克隆副本。 + */ + clone(): any; + } + enum AreaShape { + rectangle = 0, + ellipse = 1 + } + /** + * @en The AreaLightCom class is used to create area lights. + * @zh AreaLightCom 类用于创建区域光。 + */ + class AreaLightCom extends Light { + /** + * @ignore + * @en Creates an instance of AreaLightCom. + * @zh 创建一个 AreaLightCom 的实例。 + */ + constructor(); + protected _creatModuleData(): void; + /** + * @en The lightmap baked type. + * @zh 灯光烘焙类型。 + */ + get lightmapBakedType(): LightMode; + set lightmapBakedType(value: LightMode); + /** + * @en The area light shape. + * @zh 区域光的形状。 + */ + get shape(): AreaShape; + set shape(value: AreaShape); + /** + * @en The light intensity. + * @zh 光照强度。 + */ + get power(): number; + set power(value: number); + /** + * @en The size of the area light. + * @zh 区域光大小。 + */ + get size(): Vector2; + set size(value: Vector2); + /** + * @en The spread angle of the area light. + * @zh 区域光的辐射角度。 + */ + get spread(): number; + set spread(value: number); + /** + * @en The maximum number of light bounces. + * @zh 区域光的最大反弹次数。 + */ + get maxBounces(): number; + set maxBounces(value: number); + } + /** + * @en DirectionLight used to create parallel light. + * @zh DirectionLight 类用于创建方向光。 + */ + class DirectionLightCom extends Light { + /** + * @en The direction of the directional light. + * @zh 方向光的方向。 + */ + get direction(): Vector3; + set direction(value: Vector3); + /** + * @en The number of shadow cascades. + * @zh 阴影级联数量。 + */ + get shadowCascadesMode(): ShadowCascadesMode; + set shadowCascadesMode(value: ShadowCascadesMode); + /** + * @en The split ratio for two cascade shadows. + * @zh 二级级联阴影分割比例。 + */ + get shadowTwoCascadeSplits(): number; + set shadowTwoCascadeSplits(value: number); + /** + * @en The split ratios for four cascade shadows. X, Y, Z represent the split ratios in order. Z must be greater than Y, and Y must be greater than X. + * @zh 四级级联阴影分割比例。X、Y、Z依次为其分割比例,Z必须大于Y,Y必须大于X。 + */ + get shadowFourCascadeSplits(): Vector3; + set shadowFourCascadeSplits(value: Vector3); + /** + * @ignore + * @en Creates an instance of DirectionLight. + * @zh 创建一个 DirectionLight 的实例。 + */ + constructor(); + protected _creatModuleData(): void; + } + /** + * @en Light type. + * @zh 灯光类型。 + */ + enum LightType { + Directional = 0, + Spot = 1, + Point = 2, + Area = 3 + } + /** + * @en Light mode. + * @zh 灯光模式。 + */ + enum LightMode { + mix = 0, + realTime = 1, + bakeOnly = 2 + } + /** + * @en LightSprite is the base class for creating light sources. + * @zh LightSprite 类用于创建灯光的父类。 + */ + class Light extends Component { + /** + * @en The light color. + * @zh 灯光颜色。 + */ + color: Color; + /** + * @en The light intensity. + * @zh 灯光强度。 + */ + get intensity(): number; + set intensity(value: number); + /** + * @en Shadow mode. + * @zh 阴影模式。 + */ + get shadowMode(): ShadowMode; + set shadowMode(value: ShadowMode); + /** + * @en The maximum shadow distance. + * @zh 最大阴影距离。 + */ + get shadowDistance(): number; + set shadowDistance(value: number); + /** + * @en The shadow map resolution. + * @zh 阴影贴图分辨率。 + */ + get shadowResolution(): number; + set shadowResolution(value: number); + /** + * @en The shadow depth bias. + * @zh 阴影深度偏差。 + */ + get shadowDepthBias(): number; + set shadowDepthBias(value: number); + /** + * @en The shadow normal bias. + * @zh 阴影法线偏差。 + */ + get shadowNormalBias(): number; + set shadowNormalBias(value: number); + /** + * @en The shadow strength. + * @zh 阴影强度。 + */ + get shadowStrength(): number; + set shadowStrength(value: number); + /** + * @en The near cut surface of the shadow cone. + * @zh 阴影视锥的近裁面。 + */ + get shadowNearPlane(): number; + set shadowNearPlane(value: number); + /** + * @en Light baking type + * @zh 灯光烘培类型。 + */ + get lightmapBakedType(): LightMode; + set lightmapBakedType(value: LightMode); + /** + * @en The light world matrix. + * @zh 灯光世界矩阵 + */ + get lightWorldMatrix(): Matrix4x4; + /** + * @en The light type. + * @zh 灯光类型 + */ + get lightType(): LightType; + /** + * @ignore + * @en Creates an instance of Light. + * @zh 创建一个 Light 的实例。 + */ + constructor(); + protected _creatModuleData(): void; + } + /** + * @ignore + * @deprecated + * LightSprite 类用于创建灯光的父类。 + */ + class LightSprite extends Sprite3D { + /** + * 灯光颜色。 + */ + get color(): Color; + set color(value: Color); + /** + * 灯光烘焙模式 + */ + get mode(): LightMode; + set mode(value: LightMode); + /** + * 灯光强度。 + */ + get intensity(): number; + set intensity(value: number); + /** + * 阴影模式。 + */ + get shadowMode(): ShadowMode; + set shadowMode(value: ShadowMode); + /** + * 最大阴影距离。 + */ + get shadowDistance(): number; + set shadowDistance(value: number); + /** + * 阴影贴图分辨率。 + */ + get shadowResolution(): number; + set shadowResolution(value: number); + /** + * 阴影深度偏差。 + */ + get shadowDepthBias(): number; + set shadowDepthBias(value: number); + /** + * 阴影法线偏差。 + */ + get shadowNormalBias(): number; + set shadowNormalBias(value: number); + /** + * 阴影强度。 + */ + get shadowStrength(): number; + set shadowStrength(value: number); + /** + * 阴影视锥的近裁面。 + */ + get shadowNearPlane(): number; + set shadowNearPlane(value: number); + /** + * 灯光烘培类型。 + */ + get lightmapBakedType(): number; + set lightmapBakedType(value: number); + /** + * 获取灯光世界矩阵 + */ + get lightWorldMatrix(): Matrix4x4; + /** + * 创建一个 LightSprite 实例。 + */ + constructor(); + } + /** + * @en The `PointLightCom` class represents a point light source in the scene. + * @zh `PointLightCom` 类表示场景中的点光源。 + */ + class PointLightCom extends Light { + /** + * @en Declares the data module for point light. + * @zh 声明点光源的数据模块。 + */ + _dataModule: IPointLightData; + /** + * @en The range of the point light. + * @zh 点光的范围。 + */ + get range(): number; + set range(value: number); + /** + * @ignore + * @en Creates an instance of PointLightCom. + * @zh 创建一个 PointLightCom 的实例。 + */ + constructor(); + protected _creatModuleData(): void; + } + /** + * @en Shadow cascade mode. + * @zh 阴影的级联模式。 + */ + enum ShadowCascadesMode { + /** + * @en No cascades. + * @zh 无级联。 + */ + NoCascades = 0, + /** + * @en Two-level cascades. + * @zh 二级级联。 + */ + TwoCascades = 1, + /** + * @en Four-level cascades. + * @zh 四级级联。 + */ + FourCascades = 2 + } + /** + * @en The shadow mode. + * @zh 阴影模式。 + */ + enum ShadowMode { + /** + * @en No shadows are produced. + * @zh 不产生阴影。 + */ + None = 0, + /** + * @en Hard shadows with lower performance requirements. + * @zh 硬阴影,对性能要求较低。 + */ + Hard = 1, + /** + * @en Soft shadows with low intensity, moderate performance requirements. + * @zh 低强度软阴影,对性能要求一般。 + */ + SoftLow = 2, + /** + * @en Soft shadows with high intensity, higher performance requirements. + * @zh 高强度软阴影,对性能要求较高。 + */ + SoftHigh = 3 + } + /** + * @en Enum representing the format of the shadow map. + * @zh 表示阴影贴图格式的枚举。 + */ + enum ShadowMapFormat { + bit16 = 0, + bit24_8 = 1, + bit32 = 2 + } + /** + * @en The `SpotLightCom` class is used to create a spotlight. + * @zh `SpotLightCom` 类用于创建聚光。 + */ + class SpotLightCom extends Light { + /** + * @en Declares the data module for the spotlight. + * @zh 声明聚光灯的数据模块。 + */ + _dataModule: ISpotLightData; + /** + * @en The direction of the spotlight. + * @zh 聚光的方向。 + */ + get direction(): Vector3; + set direction(value: Vector3); + /** + * @en The cone angle of the spotlight. + * @zh 聚光灯的锥形角度。 + */ + get spotAngle(): number; + set spotAngle(value: number); + /** + * @en The range of the spotlight. + * @zh 聚光灯的范围。 + */ + get range(): number; + set range(value: number); + /** + * @ignore + * @en Creats an instance of SpotLightCom. + * @zh 创建一个 SpotLightCom 的实例。 + */ + constructor(); + protected _creatModuleData(): void; + } + /** + * @en The BlinnPhongMaterial class is used to implement Blinn-Phong materials. + * @zh BlinnPhongMaterial 类用于实现Blinn-Phong材质。 + */ + class BlinnPhongMaterial extends Material { + /** + * @en Specular intensity data source: Alpha channel of the diffuse map. + * @zh 高光强度数据源:漫反射贴图的 Alpha 通道。 + */ + static SPECULARSOURCE_DIFFUSEMAPALPHA: number; + /** + * @en Specular intensity data source: RGB channels of the specular map. + * @zh 高光强度数据源:高光贴图的 RGB 通道。 + */ + static SPECULARSOURCE_SPECULARMAP: number; + /** + * @en Render mode: Opaque. + * @zh 渲染状态:不透明。 + */ + static RENDERMODE_OPAQUE: number; + /** + * @en Render mode: Alpha test. + * @zh 渲染状态:Alpha 测试。 + */ + static RENDERMODE_CUTOUT: number; + /** + * @en Render mode: Transparent blend. + * @zh 渲染状态:透明混合。 + */ + static RENDERMODE_TRANSPARENT: number; + /** + * @en The default material, prohibit modification. + * @zh 默认材质,禁止修改。 + */ + static defaultMaterial: BlinnPhongMaterial; + /** + * @en The render mode. + * @zh 渲染模式。 + */ + set renderMode(value: number); + /** + * @en Whether to support vertex color. + * @zh 是否支持顶点色。 + */ + get enableVertexColor(): boolean; + set enableVertexColor(value: boolean); + /** + * @en Texture tiling and offsetting. + * @zh 纹理平铺和偏移。 + */ + get tilingOffset(): Vector4; + set tilingOffset(value: Vector4); + /** + * @en Albedo color. + * @zh 漫反射颜色。 + */ + get albedoColor(): Color; + set albedoColor(value: Color); + /** + * @en Albedo intensity + * @zh 漫反射强度。 + */ + get albedoIntensity(): number; + set albedoIntensity(value: number); + /** + * @en Specular color. + * @zh 高光颜色。 + */ + get specularColor(): Color; + set specularColor(value: Color); + /** + * @en Specular intensity, ranging from 0 to 1. + * @zh 高光强度,范围为0到1。 + */ + get shininess(): number; + set shininess(value: number); + /** + * @en Albedo texture. + * @zh 漫反射贴图。 + */ + get albedoTexture(): BaseTexture; + set albedoTexture(value: BaseTexture); + /** + * @en Normal texture. + * @zh 法线贴图。 + */ + get normalTexture(): BaseTexture; + set normalTexture(value: BaseTexture); + /** + * @en Specular texture. + * @zh 高光贴图。 + */ + get specularTexture(): BaseTexture; + set specularTexture(value: BaseTexture); + /** + * @en Does it support transparency. + * @zh 是否支持透光。 + */ + get enableTransmission(): boolean; + set enableTransmission(value: boolean); + /** + * @en Transmittance, which affects diffuse reflection and transmittance intensity + * @zh 透光率,会影响漫反射以及透光强度 + */ + get transmissionRata(): number; + set transmissionRata(value: number); + /** + * @en Transmission influence range index + * @zh 透射影响范围指数 + */ + get backDiffuse(): number; + set backDiffuse(value: number); + /** + * @en Transmitted light intensity + * @zh 透射光强度 + */ + get backScale(): number; + set backScale(value: number); + /** + * @en Thickness texture, which affects the perspective light. The thicker the material, the weaker the transmitted light. + * @zh 厚度贴图,会影响透射光。材质越厚,透射光越弱。 + */ + get thinknessTexture(): BaseTexture; + set thinknessTexture(value: BaseTexture); + /** + * @en Transmission color. Simulates the internal color absorption rate of translucent materials. + * @zh 透光颜色。模拟透光物质内部颜色吸收率。 + */ + get transmissionColor(): Color; + set transmissionColor(value: Color); + /** + * 请使用transmissionRata + * @deprecated + */ + get transmissionRate(): number; + /** + * @ignore + * @en Creates an instance of BlinnPhongMaterial. + * @zh 创建一个 BlinnPhongMaterial 的实例。 + */ + constructor(); + /** + * @override + * @en Clone. + * @returns Clone Copy. + * @zh 克隆。 + * @returns 克隆的副本。 + */ + clone(): any; + /** + * @override + * @inheritDoc + * @en Clone the properties of this material to another material. + * @param destObject The target material to clone to. + * @zh 将此材质的属性克隆到另一个材质。 + * @param destObject 要克隆到的目标材质。 + */ + cloneTo(destObject: BlinnPhongMaterial): void; + } + /** + * @en The AffectMaterial class is used to implement Mesh effect materials. + * @zh EffectMaterial 类用于实现Mesh特效材质。 + */ + class EffectMaterial extends Material { + /** + * @en Default material, no modification allowed + * @zh 默认材质,禁止修改 + */ + static defaultMaterial: EffectMaterial; + /** + * @en The color of the material. + * @zh 材质的颜色。 + */ + get color(): Color; + set color(value: Color); + /** + * @en The texture of the material. + * @zh 材质的贴图。 + */ + get texture(): BaseTexture; + set texture(value: BaseTexture); + /** + * @en The tiling and offset values for the material's textures. + * @zh 材质纹理的平铺和偏移值。 + */ + get tilingOffset(): Vector4; + set tilingOffset(value: Vector4); + /** + * @ignore + * @en Creates an instance of EffectMaterial. + * @zh 创建EffectMaterial实例。 + */ + constructor(); + /** + * @override + * @en Clone the material. + * @returns A clone of the material. + * @zh 克隆材质。 + * @returns 克隆的材质副本。 + */ + clone(): any; + /** + * @deprecated + * 渲染状态_加色法混合。 + */ + static RENDERMODE_ADDTIVE: number; + /** + * @deprecated + * 渲染状态_透明混合。*/ + static RENDERMODE_ALPHABLENDED: number; + /** + * @deprecated + * 设置渲染模式。 + * 可以使用新的渲染状态 + */ + set renderMode(value: number); + } + /** + * @en Enum representing the different render modes used in PBR (Physically Based Rendering) materials. + * @zh 表示 PBR(基于物理的渲染)材质中使用的不同渲染模式的枚举。 + */ + enum PBRRenderMode { + /** + * @en Opaque render mode. + * @zh 不透明渲染模式。 + */ + Opaque = 0, + /** + * @en Cutout render mode. + * @zh 裁剪透明渲染模式。 + */ + Cutout = 1, + /** + * @en Transparent Mixing: Transparent commonly used in games + * @zh 透明混合_游戏中经常使用的透明。 + */ + Fade = 2, + /** + * @en Transparent Mixing: Physically Seemingly Reasonable Transparency + * @zh 透明混合_物理上看似合理的透明。 + */ + Transparent = 3 + } + /** + * @en The parent class of PBR material, which is an abstract class. + * @zh PBR材质的父类,该类为抽象类。 + */ + class PBRMaterial extends Material { + /** + * @en render quality + * @zh 渲染质量。 + * */ + static renderQuality: PBRRenderQuality; + /** + * @private + */ + static __init__(): void; + /** + * @en Albedo color + * @zh 漫反射颜色。 + */ + get albedoColor(): Color; + set albedoColor(value: Color); + /** + * @en Albedo texture + * @zh 漫反射贴图。 + */ + get albedoTexture(): BaseTexture; + set albedoTexture(value: BaseTexture); + /** + * @en Normal texture + * @zh 法线贴图。 + */ + get normalTexture(): BaseTexture; + set normalTexture(value: BaseTexture); + /** + * @en Normal texture scaling factor. + * @zh 法线贴图缩放系数。 + */ + get normalTextureScale(): number; + set normalTextureScale(value: number); + /** + * @en Parallax texture + * @zh 视差贴图。 + */ + get parallaxTexture(): BaseTexture; + set parallaxTexture(value: BaseTexture); + /** + * @en Parallax texture scaling factor. + * @zh 视差贴图缩放系数。 + */ + get parallaxTextureScale(): number; + set parallaxTextureScale(value: number); + /** + * @en Occlusion texture + * @zh 遮挡贴图。 + */ + get occlusionTexture(): BaseTexture; + set occlusionTexture(value: BaseTexture); + /** + * @en Occlusion texture strength, the range is from 0 to 1. + * @zh 遮挡贴图强度,范围为0到1。 + */ + get occlusionTextureStrength(): number; + set occlusionTextureStrength(value: number); + /** + * @en The smoothness of the material, the range is from 0 to 1. + * @zh 材质的光滑度,范围为0到1。 + */ + get smoothness(): number; + set smoothness(value: number); + /** + * @en Whether to support vertex color. + * @zh 是否支持顶点色。 + */ + get enableVertexColor(): boolean; + set enableVertexColor(value: boolean); + /** + * @en Whether to enable emission. + * @zh 是否开启自发光。 + */ + get enableEmission(): boolean; + set enableEmission(value: boolean); + /** + * @en Emission color. + * @zh 自发光颜色。 + */ + get emissionColor(): Color; + set emissionColor(value: Color); + /** + * @en Emission intensity + * @zh 自发光强度 + */ + get emissionIntensity(): number; + set emissionIntensity(value: number); + /** + * @en Emission texture. + * @zh 自发光贴图。 + */ + get emissionTexture(): BaseTexture; + set emissionTexture(value: BaseTexture); + /** + * @en Texture tiling and offsetting. + * @zh 纹理平铺和偏移。 + */ + get tilingOffset(): Vector4; + set tilingOffset(value: Vector4); + /** + * @en Detail texture. + * @zh 细节贴图。 + */ + get detailAlbedoTexture(): BaseTexture; + set detailAlbedoTexture(value: BaseTexture); + /** + * @en Detail normal texture. + * @zh 细节法线贴图。 + */ + get detailNormalTexture(): BaseTexture; + set detailNormalTexture(value: BaseTexture); + /** + * @en The tiling and offset values for the detail textures. + * @zh 细节图纹理平铺和偏移。 + */ + get detailTilingOffset(): Vector4; + set detailTilingOffset(value: Vector4); + /** + * @en The scale factor for the detail normal textures. + * @zh 细节法线贴图缩放系数。 + */ + get detailNormalScale(): number; + set detailNormalScale(value: number); + /** + * @en Render mode. + * @zh 渲染模式。 + */ + set renderMode(value: number); + /** + * @en Whether to enable anisotropy + * @zh 是否开启各向异性 + */ + get anisotropyEnable(): boolean; + set anisotropyEnable(value: boolean); + /** + * @en The strength of the anisotropy effect. + * @zh 各向异性强度 + */ + get anisotropy(): number; + set anisotropy(value: number); + /** + * @en Anisotropy strength texture. + * @zh 各向异性强度贴图。 + */ + get anisotropyTexture(): Texture2D; + set anisotropyTexture(value: Texture2D); + /** + * @en Anisotropy rotation in tangent space. + * @zh 各向异性在切线空间中的旋转。 + */ + get anisotropyRotation(): number; + set anisotropyRotation(value: number); + /** + * @en Whether to enable clear coat + * @zh 是否开启透明涂层 + */ + get clearCoatEnable(): boolean; + set clearCoatEnable(value: boolean); + /** + * @en The strength of the clear coat effect. + * @zh 透明涂层强度 + */ + get clearCoat(): number; + set clearCoat(value: number); + /** + * @en Clear coat strength texture. + * @zh 透明涂层强度贴图 + */ + get clearCoatTexture(): BaseTexture; + set clearCoatTexture(value: BaseTexture); + /** + * @en Clear coat roughness. + * @zh 透明涂层粗糙度。 + */ + get clearCoatRoughness(): number; + set clearCoatRoughness(value: number); + /** + * @en Clear coat roughness texture. + * @zh 透明涂层粗糙度贴图。 + */ + get clearCoatRoughnessTexture(): BaseTexture; + set clearCoatRoughnessTexture(value: BaseTexture); + /** + * @en Clear coat normal texture. + * @zh 透明涂层法线贴图。 + */ + get clearCoatNormalTexture(): BaseTexture; + set clearCoatNormalTexture(value: BaseTexture); + constructor(); + /** + * @deprecated + * 光滑度缩放系数,范围为0到1。 + */ + get smoothnessTextureScale(): number; + set smoothnessTextureScale(value: number); + } + /** + * @en PBR material rendering quality. + * @zh PBR材质渲染质量。 + */ + enum PBRRenderQuality { + /** + * @en High quality. + * @zh 高质量。 + */ + High = 0, + /** + * @en Low quality. + * @zh 低质量 + */ + Low = 1 + } + /** + * @en Metallic PBR material smoothness data source. + * @zh 金属度PBR材质光滑度数据源。 + */ + enum PBRMetallicSmoothnessSource { + /** + * @en Alpha channel for metallicity mapping. + * @zh 金属度贴图的Alpha通道。 + */ + MetallicGlossTextureAlpha = 0, + /** + * @en Alpha channel of albedo texture. + * @zh 漫反射贴图的Alpha通道。 + */ + AlbedoTextureAlpha = 1 + } + /** + * @en The PBRStandardMaterial class is used to implement PBR materials. + * @zh PBRStandardMaterial 类用于实现PBR材质。 + */ + class PBRStandardMaterial extends PBRMaterial { + /** + * @en Default material, no modification allowed + * @zh 默认材质,禁止修改 + */ + static defaultMaterial: PBRStandardMaterial; + /** + * @en Metallic gloss texture. + * @zh 金属光滑度贴图。 + */ + get metallicGlossTexture(): BaseTexture; + set metallicGlossTexture(value: BaseTexture); + /** + * @en The metallic value, ranging from 0 to 1. + * @zh 金属度,范围为0到1。 + */ + get metallic(): number; + set metallic(value: number); + /** + * @en The smoothness data source, 0 or 1. + * @zh 光滑度数据源,0或1。 + */ + get smoothnessSource(): PBRMetallicSmoothnessSource; + set smoothnessSource(value: PBRMetallicSmoothnessSource); + /** + * @ignore + * @en Creates an instance of PBRStandardMaterial. + * @zh 创建一个 PBRStandardMaterial 的实例。 + */ + constructor(); + /** + * @override + * @en Clone. + * @returns Clone copy. + * @zh 克隆。 + * @returns 克隆副本。 + */ + clone(): any; + } + /** + * @en The SkyBoxMaterial class is used to implement the SkyBoxMaterial material. + * @zh SkyBoxMaterial 类用于实现天空盒材质。 + */ + class SkyBoxMaterial extends Material { + static TINTCOLOR: number; + static EXPOSURE: number; + static ROTATION: number; + static TEXTURECUBE: number; + /** + * @en Default material, no modification allowed + * @zh 默认材质,禁止修改 + */ + static defaultMaterial: SkyBoxMaterial; + /** + * @en Tint color of the skybox. + * @zh 天空盒的颜色。 + */ + get tintColor(): Color; + set tintColor(value: Color); + /** + * @en Exposure intensity of the skybox. + * @zh 天空盒的曝光强度。 + */ + get exposure(): number; + set exposure(value: number); + /** + * @en Rotation angle of the skybox. + * @zh 天空盒的旋转角度。 + */ + get rotation(): number; + set rotation(value: number); + /** + * @en Texture of the skybox. + * @zh 天空盒的纹理。 + */ + get textureCube(): TextureCube; + set textureCube(value: TextureCube); + /** + * @override + * @en Clone. + * @returns Clone copy. + * @zh 克隆。 + * @returns 克隆副本。 + */ + clone(): any; + /** + * @ignore + * @en Creates an instance of SkyBoxMaterial. + * @zh 创建一个 SkyBoxMaterial 实例。 + */ + constructor(); + } + /** + * @en The SkyPanoramicMaterial class is used to implement SkyPanoramicMaterial material. + * @zh SkyPanoramicMaterial 类用于实现全景天空材质。 + */ + class SkyPanoramicMaterial extends Material { + static TINTCOLOR: number; + static EXPOSURE: number; + static ROTATION: number; + static TEXTURE: number; + static TEXTURE_HDR_PARAMS: number; + /** + * @en Tint color of the panoramic sky. + * @zh 全景天空的颜色。 + */ + get tintColor(): Color; + set tintColor(value: Color); + /** + * @en Exposure intensity of the panoramic sky. + * @zh 全景天空的曝光强度。 + */ + get exposure(): number; + set exposure(value: number); + /** + * @en Rotation angle of the panoramic sky. + * @zh 全景天空的旋转角度。 + */ + get rotation(): number; + set rotation(value: number); + /** + * @en Panoramic sky texture. + * @zh 全景天空纹理。 + */ + get panoramicTexture(): Texture2D; + set panoramicTexture(value: Texture2D); + /** + * @ignore + * @en Creates an instance of SkyPanoramicMaterial. + * @zh 创建一个 SkyPanoramicMaterial 的实例。 + */ + constructor(); + } + /** + * @en The SkyProceduralMaterial class is used to implement the SkyProceduralMaterial material. + * @zh SkyProceduralMaterial 类用于实现程序化天空材质。 + */ + class SkyProceduralMaterial extends Material { + /** + * @en Sun: None + * @zh 太阳:无 + */ + static SUN_NODE: number; + /** + * @en Sun: Simple + * @zh 太阳:简单 + */ + static SUN_SIMPLE: number; + /** + * @en Sun: High quality + * @zh 太阳:高质量 + */ + static SUN_HIGH_QUALITY: number; + /** 默认材质,禁止修改*/ + static defaultMaterial: SkyProceduralMaterial; + /** + * @en Sun state. + * @zh 太阳状态。 + */ + get sunDisk(): number; + set sunDisk(value: number); + /** + * @en Sun size, range is 0 to 1. + * @zh 太阳尺寸,范围是0到1。 + */ + get sunSize(): number; + set sunSize(value: number); + /** + * @en Sun size convergence, range is 0 to 20. + * @zh 太阳尺寸收缩,范围是0到20。 + */ + get sunSizeConvergence(): number; + set sunSizeConvergence(value: number); + /** + * @en Atmosphere thickness, range is 0 to 5. + * @zh 大气厚度,范围是0到5。 + */ + get atmosphereThickness(): number; + set atmosphereThickness(value: number); + /** + * @en Sky color. + * @zh 天空颜色。 + */ + get skyTint(): Color; + set skyTint(value: Color); + /** + * @en Ground color. + * @zh 地面颜色。 + */ + get groundTint(): Color; + set groundTint(value: Color); + /** + * @en Exposure intensity, range is 0 to 8. + * @zh 曝光强度,范围是0到8。 + */ + get exposure(): number; + set exposure(value: number); + /** + * @ignore + * @en Creates an instance of SkyProceduralMaterial. + * @zh 创建一个 SkyProceduralMaterial 的实例。 + */ + constructor(); + /** + * @override + * @en Clone. + * @returns Clone copy. + * @zh 克隆。 + * @returns 克隆副本。 + */ + clone(): any; + } + /** + * @en The UnlitMaterial class is used to implement materials that are not affected by lighting. + * @zh UnlitMaterial 类用于实现不受光照影响的材质。 + */ + class UnlitMaterial extends Material { + static SHADERDEFINE_ALBEDOTEXTURE: ShaderDefine; + static SHADERDEFINE_ENABLEVERTEXCOLOR: ShaderDefine; + static ALBEDOTEXTURE: number; + static ALBEDOCOLOR: number; + static TILINGOFFSET: number; + static defaultMaterial: UnlitMaterial; + private _albedoIntensity; + /** + * @en Albedo color + * @zh 漫反射颜色。 + */ + get albedoColor(): Color; + set albedoColor(value: Color); + /** + * @en Albedo intensity + * @zh 漫反射强度。 + */ + get albedoIntensity(): number; + set albedoIntensity(value: number); + /** + * @en Albedo texture + * @zh 漫反射贴图。 + */ + get albedoTexture(): BaseTexture; + set albedoTexture(value: BaseTexture); + /** + * @en Texture tiling and offsetting. + * @zh 纹理平铺和偏移。 + */ + get tilingOffset(): Vector4; + set tilingOffset(value: Vector4); + /** + * @en Whether to support vertex color. + * @zh 是否支持顶点色。 + */ + get enableVertexColor(): boolean; + set enableVertexColor(value: boolean); + /** + * @ignore + * @en Creates an instance of UnlitMaterial. + * @zh 创建一个 UnlitMaterial 的实例。 + */ + constructor(); + /** + * @override + * @en Clone. + * @returns Clone copy. + * @zh 克隆。 + * @returns 克隆副本。 + */ + clone(): any; + /** + * @deprecated + * 渲染状态_不透明。 + */ + static RENDERMODE_OPAQUE: number; + /** + * @deprecated + * 渲染状态_阿尔法测试。 + */ + static RENDERMODE_CUTOUT: number; + /** + * @deprecated + * 渲染状态__透明混合。 + */ + static RENDERMODE_TRANSPARENT: number; + /** + * @deprecated + * 渲染状态__加色法混合。 + */ + static RENDERMODE_ADDTIVE: number; + /** + * @deprecated + * 渲染模式。 + */ + set renderMode(value: number); + } + /** + * @en The `MeshFilter` class is used to create mesh filters. + * @zh `MeshFilter` 类用于创建网格过滤器。 + */ + class MeshFilter extends Component { + constructor(); + /** + * @en The shared mesh of the MeshFilter. + * @zh 共享网格。 + */ + get sharedMesh(): Mesh; + set sharedMesh(value: Mesh); + } + /** + * @en The `MeshRenderer` class is used for mesh rendering. + * @zh `MeshRenderer` 类用于网格渲染器。 + */ + class MeshRenderer extends BaseRender { + private morphTargetActiveCount; + private morphTargetActiveData; + private morphtargetChannels; + private _morphWeightChange; + private _moduleData; + /** + * @ignore + * @en Creates an instance of MeshRenderer. + * @zh 创建一个 MeshRenderer 的实例。 + */ + constructor(); + /** + * override it + * @returns + */ + protected _createBaseRenderNode(): IMeshRenderNode; + private _morphTargetValues; + /** + * @en Set the weight of a morph target channel. + * @param channelName The name of the morph target channel. + * @param weight The weight value to set for the channel. + * @zh 设置变形目标通道的权重。 + * @param channelName 变形目标通道的名称。 + * @param weight 要设置的通道权重值。 + */ + setMorphChannelWeight(channelName: string, weight: number): void; + _setBelongScene(scene: any): void; + protected _statAdd(): void; + protected _statRemove(): void; + protected _meshChange: boolean; + /** + * @en Update the rendering state of the mesh renderer. + * @param context The 3D render context. + * @zh 更新网格渲染器的渲染状态。 + * @param context 3D渲染上下文。 + */ + renderUpdate(context: RenderContext3D): void; + } + /** + * @deprecated + * MeshSprite3D 类用于创建网格。 + */ + class MeshSprite3D extends RenderableSprite3D { + private _meshFilter; + /** + * 网格过滤器。 + */ + get meshFilter(): MeshFilter; + /** + * 网格渲染器。 + */ + get meshRenderer(): MeshRenderer; + /** + * 创建一个 MeshSprite3D 实例。 + * @param mesh 网格,同时会加载网格所用默认材质。 + * @param name 名字。 + */ + constructor(mesh?: Mesh, name?: string); + } + /** + * @en Class used to record sprite data macros + * @zh 类用来记录精灵数据宏 + */ + class MeshSprite3DShaderDeclaration { + /** + * @en Shader define for UV0 channel vertex data + * @zh UV0通道顶点数据宏 + */ + static SHADERDEFINE_UV0: ShaderDefine; + /** + * @en Shader define for vertex color data + * @zh 顶点色顶点数据宏 + */ + static SHADERDEFINE_COLOR: ShaderDefine; + /** + * @en Shader define for UV1 channel vertex data + * @zh UV1通道顶点数据宏 + */ + static SHADERDEFINE_UV1: ShaderDefine; + /** + * @en Shader define for Tangent channel vertex data + * @zh Tangent 通道顶点数据宏 + */ + static SHADERDEFINE_TANGENT: ShaderDefine; + /** + * @en Using instance + * @zh instance调用宏 + */ + static SHADERDEFINE_GPU_INSTANCE: ShaderDefine; + } + /** + * @en The Burst class is used to describe the burst of particles. + * @zh Burst 类用于粒子的爆发描述。 + */ + class Burst implements IClone { + /** 爆发时间,单位为秒。*/ + private _time; + /** 爆发的最小数量。*/ + private _minCount; + /** 爆发的最大数量。*/ + private _maxCount; + /** + * @en The burst time in seconds. + * @zh 爆发时间,单位为秒。 + */ + get time(): number; + /** + * @en The minimum count of particles in a burst. + * @zh 爆发的最小粒子数量。 + */ + get minCount(): number; + /** + * @en The maximum count of particles in a burst. + * @zh 爆发的最大粒子数量。 + */ + get maxCount(): number; + /** + * @en Creates an instance of the Burst class. + * @param time Burst time in seconds. Default is 0. + * @param minCount Minimum count of particles in a burst. Default is 0. + * @param maxCount Maximum count of particles in a burst. Default is 0. + * @zh 创建Burst类的实例。 + * @param time 爆发时间,单位为秒。 + * @param minCount 爆发的最小数量。 + * @param time 爆发的最大数量。 + */ + constructor(time?: number, minCount?: number, maxCount?: number); + /** + * @en Clones to a target object. + * @param destObject The target object to clone to. + * @zh 克隆到目标对象。 + * @param destObject 要克隆到的目标对象。 + */ + cloneTo(destObject: Burst): void; + /** + * @en Clone. + * @returns Clone copy. + * @zh 克隆。 + * @returns 克隆副本。 + */ + clone(): any; + } + /** + * @en The ColorOverLifetime class is used for the lifecycle color of particles. + * @zh ColorOverLifetime 类用于粒子的生命周期颜色。 + */ + class ColorOverLifetime { + private _color; + /** + * @en Whether to enable. + * @zh 是否启用。 + */ + enable: boolean; + /** + * @en The color. + * @zh 颜色。 + */ + get color(): GradientColor; + /** + * @ignore + * @en creates an instance of the ColorOverLifetime class. + * @param color gradient color. + * @zh 创建ColorOverLifetime类的实例。 + * @param color 渐变颜色。 + */ + constructor(color: GradientColor); + /** + * @en Clones to a target object. + * @param destObject The target object to clone to. + * @zh 克隆到目标对象。 + * @param destObject 要克隆到的目标对象。 + */ + cloneTo(destObject: ColorOverLifetime): void; + /** + * @en Clone. + * @returns Clone copy. + * @zh 克隆。 + * @returns 克隆副本。 + */ + clone(): any; + } + /** + * @en The Emission class is used for particle emitters. + * @zh Emission 类用于粒子发射器。 + */ + class Emission implements IClone { + private _emissionRateOverDistance; + /** + * @en Whether the emission is enabled. + * @zh 是否启用。 + */ + enable: boolean; + /** + * @en The particle emission rate. + * @zh 粒子发射速率。 + */ + get emissionRate(): number; + set emissionRate(value: number); + /** + * @en Particle emission rate based on distance (particles/meter). + * @zh 粒子基于距离的发射速率(个/米)。 + */ + get emissionRateOverDistance(): number; + set emissionRateOverDistance(value: number); + /** + * @en Whether the object has been destroyed. + * @zh 是否已销毁。 + */ + get destroyed(): boolean; + /** + * @ignore + * @en Creates an instance of the Emission class. + * @zh 创建Emission类的实例。 + */ + constructor(); + /** + * @private + * @en Destroy the object. + * @zh 销毁对象。 + */ + destroy(): void; + /** + * @en Get the number of particle bursts. + * @zh 获取粒子爆发个数。 + */ + getBurstsCount(): number; + /** + * @en Get a particle burst by index. + * @param index The burst index. + * @returns The particle burst. + * @zh 通过索引获取粒子爆发。 + * @param index 粒子爆发索引。 + * @return 粒子爆发。 + */ + getBurstByIndex(index: number): Burst; + /** + * @en Add a particle burst. + * @param burst The burst to add. + * @zh 增加粒子爆发。 + * @param burst 要添加的爆发。 + */ + addBurst(burst: Burst): void; + /** + * @en Remove a particle burst. + * @param burst The burst to remove. + * @zh 移除粒子爆发。 + * @param burst 要移除的爆发。 + */ + removeBurst(burst: Burst): void; + /** + * @en Remove a particle burst by index. + * @param index The burst index to remove. + * @zh 通过索引移除粒子爆发。 + * @param index 爆发索引。 + */ + removeBurstByIndex(index: number): void; + /** + * @en Clear all particle bursts. + * @zh 清空粒子爆发。 + */ + clearBurst(): void; + /** + * @en Clones to a target object. + * @param destObject The target object to clone to. + * @zh 克隆到目标对象。 + * @param destObject 要克隆到的目标对象。 + */ + cloneTo(destObject: Emission): void; + /** + * @en Clone. + * @returns Clone copy. + * @zh 克隆。 + * @returns 克隆副本。 + */ + clone(): any; + } + /** + * @en The FrameOverTime class is used to create time frames. + * @zh FrameOverTime 类用于创建时间帧。 + */ + class FrameOverTime implements IClone { + /** + * @en Create a FrameOverTime instance with a constant frame. + * @param constant The constant frame. + * @returns The time frame. + * @zh 通过固定帧创建一个 FrameOverTime 实例。 + * @param constant 固定帧。 + * @return 时间帧。 + */ + static createByConstant(constant?: number): FrameOverTime; + /** + * @en Create a FrameOverTime instance with a time frame. + * @param overTime The time frame. + * @returns The time frame. + * @zh 通过时间帧创建一个 FrameOverTime 实例。 + * @param overTime 时间帧。 + * @return 时间帧。 + */ + static createByOverTime(overTime: GradientDataInt): FrameOverTime; + /** + * @en Create a FrameOverTime instance with random two constant frames. + * @param constantMin The minimum constant frame. + * @param constantMax The maximum constant frame. + * @returns The time frame. + * @zh 通过随机双固定帧创建一个 FrameOverTime 实例。 + * @param constantMin 最小固定帧。 + * @param constantMax 最大固定帧。 + * @return 时间帧。 + */ + static createByRandomTwoConstant(constantMin?: number, constantMax?: number): FrameOverTime; + /** + * @en Create a FrameOverTime instance with random two time frames. + * @param gradientFrameMin The minimum time frame. + * @param gradientFrameMax The maximum time frame. + * @returns The time frame. + * @zh 通过随机双时间帧创建一个 FrameOverTime 实例。 + * @param gradientFrameMin 最小时间帧。 + * @param gradientFrameMax 最大时间帧。 + * @return 时间帧。 + */ + static createByRandomTwoOverTime(gradientFrameMin: GradientDataInt, gradientFrameMax: GradientDataInt): FrameOverTime; + private _type; + private _constant; + private _overTime; + private _constantMin; + private _constantMax; + private _overTimeMin; + private _overTimeMax; + /** + * @en Lifecycle rotation type, 0: constant mode, 1: curve mode, 2: random double constant mode, 3: random double curve mode. + * @zh 生命周期旋转类型,0:常量模式,1:曲线模式,2:随机双常量模式,3:随机双曲线模式。 + */ + get type(): number; + /** + * @en Constant frame. + * @zh 固定帧。 + */ + get constant(): number; + /** + * @en Time frame. + * @zh 时间帧。 + */ + get frameOverTimeData(): GradientDataInt; + /** + * @en Minimum constant frame. + * @zh 最小固定帧。 + */ + get constantMin(): number; + /** + * @en Maximum constant frame. + * @zh 最大固定帧。 + */ + get constantMax(): number; + /** + * @en Minimum time frame. + * @zh 最小时间帧。 + */ + get frameOverTimeDataMin(): GradientDataInt; + /** + * @en Maximum time frame. + * @zh 最大时间帧。 + */ + get frameOverTimeDataMax(): GradientDataInt; + /** + * @ignore + * @en Creation via `new` is not allowed; please use the static creation function. + * @zh 不允许new,请使用静态创建函数。 + */ + constructor(); + /** + * @en Clones to a target object. + * @param destFrameOverTime The target object to clone to. + * @zh 克隆到目标对象。 + * @param destFrameOverTime 要克隆到的目标对象。 + */ + cloneTo(destFrameOverTime: FrameOverTime): void; + /** + * @en Clone. + * @returns Clone copy. + * @zh 克隆。 + * @returns 克隆副本。 + */ + clone(): any; + } + /** + * @en The GradientAngularVelocity class is used to create gradient angular velocities. + * @zh GradientAngularVelocity 类用于创建渐变角速度。 + */ + class GradientAngularVelocity implements IClone { + /** + * @en Create a `GradientAngularVelocity` instance with a constant angular velocity. + * @param constant The constant angular velocity. + * @return The gradient angular velocity. + * @zh 通过固定角速度创建一个 `GradientAngularVelocity` 实例。 + * @param constant 固定角速度。 + * @return 渐变角速度。 + */ + static createByConstant(constant: number): GradientAngularVelocity; + /** + * @en Create a `GradientAngularVelocity` instance with separate constant angular velocities for each axis. + * @param separateConstant The separate constant angular velocities for each axis. + * @return The gradient angular velocity instance. + * @zh 通过分轴固定角速度创建一个 `GradientAngularVelocity` 实例。 + * @param separateConstant 分轴固定角速度。 + * @return 渐变角速度实例。 + */ + static createByConstantSeparate(separateConstant: Vector3): GradientAngularVelocity; + /** + * @en Create a `GradientAngularVelocity` instance with a gradient angular velocity. + * @param gradient The gradient angular velocity. + * @return The gradient angular velocity instance. + * @zh 通过渐变角速度创建一个 `GradientAngularVelocity` 实例。 + * @param gradient 渐变角速度。 + * @return 渐变角速度实例。 + */ + static createByGradient(gradient: GradientDataNumber): GradientAngularVelocity; + /** + * @en Create a `GradientAngularVelocity` instance with separate gradient angular velocities for each axis. + * @param gradientX The gradient angular velocity for the X-axis. + * @param gradientY The gradient angular velocity for the Y-axis. + * @param gradientZ The gradient angular velocity for the Z-axis. + * @returns The gradient angular velocity instance. + * @zh 通过分轴渐变角速度创建一个 `GradientAngularVelocity` 实例。 + * @param gradientX X轴渐变角速度。 + * @param gradientY Y轴渐变角速度。 + * @param gradientZ Z轴渐变角速度。 + * @returns 渐变角速度实例。 + */ + static createByGradientSeparate(gradientX: GradientDataNumber, gradientY: GradientDataNumber, gradientZ: GradientDataNumber): GradientAngularVelocity; + /** + * @en Create a `GradientAngularVelocity` instance with random constant angular velocities between two values. + * @param constantMin The minimum constant angular velocity. + * @param constantMax The maximum constant angular velocity. + * @returns The gradient angular velocity instance. + * @zh 通过随机双固定角速度创建一个 `GradientAngularVelocity` 实例。 + * @param constantMin 最小固定角速度。 + * @param constantMax 最大固定角速度。 + * @returns 渐变角速度实例。 + */ + static createByRandomTwoConstant(constantMin: number, constantMax: number): GradientAngularVelocity; + /** + * @en Create a `GradientAngularVelocity` instance with random separate constant angular velocities between two values for each axis. + * @param separateConstantMin The minimum separate constant angular velocities for each axis. + * @param separateConstantMax The maximum separate constant angular velocities for each axis. + * @returns The gradient angular velocity instance. + * @zh 通过随机分轴双固定角速度创建一个 `GradientAngularVelocity` 实例。 + * @param separateConstantMin 最小分轴固定角速度。 + * @param separateConstantMax 最大分轴固定角速度。 + * @returns 渐变角速度实例。 + */ + static createByRandomTwoConstantSeparate(separateConstantMin: Vector3, separateConstantMax: Vector3): GradientAngularVelocity; + /** + * @en Create a `GradientAngularVelocity` instance with random gradient angular velocities between two gradients. + * @param gradientMin The minimum gradient angular velocity. + * @param gradientMax The maximum gradient angular velocity. + * @returns The gradient angular velocity instance. + * @zh 通过随机双渐变角速度创建一个 `GradientAngularVelocity` 实例。 + * @param gradientMin 最小渐变角速度。 + * @param gradientMax 最大渐变角速度。 + * @returns 渐变角速度实例。 + */ + static createByRandomTwoGradient(gradientMin: GradientDataNumber, gradientMax: GradientDataNumber): GradientAngularVelocity; + /** + * @en Create a `GradientAngularVelocity` instance with random separate gradient angular velocities between two gradients for each axis. + * @param gradientXMin The minimum gradient angular velocity for the X-axis. + * @param gradientXMax The maximum gradient angular velocity for the X-axis. + * @param gradientYMin The minimum gradient angular velocity for the Y-axis. + * @param gradientYMax The maximum gradient angular velocity for the Y-axis. + * @param gradientZMin The minimum gradient angular velocity for the Z-axis. + * @param gradientZMax The maximum gradient angular velocity for the Z-axis. + * @param gradientWMin Reserved data. + * @param gradientWMax Reserved data. + * @returns The gradient angular velocity instance. + * @zh 通过分轴随机双渐变角速度创建一个 `GradientAngularVelocity` 实例。 + * @param gradientXMin 最小X轴渐变角速度。 + * @param gradientXMax 最大X轴渐变角速度。 + * @param gradientYMin 最小Y轴渐变角速度。 + * @param gradientYMax 最大Y轴渐变角速度。 + * @param gradientZMin 最小Z轴渐变角速度。 + * @param gradientZMax 最大Z轴渐变角速度。 + * @param gradientWMin 预留数据。 + * @param gradientWMax 预留数据。 + * @returns 渐变角速度实例。 + */ + static createByRandomTwoGradientSeparate(gradientXMin: GradientDataNumber, gradientXMax: GradientDataNumber, gradientYMin: GradientDataNumber, gradientYMax: GradientDataNumber, gradientZMin: GradientDataNumber, gradientZMax: GradientDataNumber, gradientWMin: GradientDataNumber, gradientWMax: GradientDataNumber): GradientAngularVelocity; + private _type; + private _separateAxes; + private __constantSeparate; + /** + * @en The separate constant angular velocities for each axis. + * @zh 分轴固定角速度。 + */ + get _constantSeparate(): Vector3; + set _constantSeparate(value: Vector3); + private _gradient; + private _gradientX; + private _gradientY; + private _gradientZ; + private _gradientW; + private __constant; + private __constantMin; + private __constantMax; + private __constantMinSeparate; + private __constantMaxSeparate; + /** + * @en The minimum constant separate vector. + * @zh 最小常量分离向量。 + */ + get _constantMinSeparate(): Vector3; + set _constantMinSeparate(value: Vector3); + /** + * @en The maximum constant separate vector. + * @zh 最大常量分离向量。 + */ + get _constantMaxSeparate(): Vector3; + set _constantMaxSeparate(value: Vector3); + private _gradientMin; + private _gradientMax; + private _gradientXMin; + private _gradientXMax; + private _gradientYMin; + private _gradientYMax; + private _gradientZMin; + private _gradientZMax; + private _gradientWMin; + private _gradientWMax; + /** + * @en The type of lifetime angular velocity. 0: Constant mode, 1: Curve mode, 2: Random between two constants mode, 3: Random between two curves mode. + * @zh 生命周期角速度类型。0:常量模式,1:曲线模式,2:随机双常量模式,3:随机双曲线模式。 + */ + get type(): number; + /** + * @en Whether the axes are separated. + * @zh 是否分轴。 + */ + get separateAxes(): boolean; + /** + * @en The constant angular velocity. + * @zh 固定角速度。 + */ + get constant(): number; + /** + * @en The constant angular velocity for separate axes. + * @zh 分轴固定角速度。 + */ + get constantSeparate(): Vector3; + /** + * @en The gradient angular velocity. + * @zh 渐变角速度。 + */ + get gradient(): GradientDataNumber; + /** + * @en The gradient angular velocity for X axis. + * @zh X轴渐变角速度。 + */ + get gradientX(): GradientDataNumber; + /** + * @en The gradient angular velocity for Y axis. + * @zh Y轴渐变角速度。 + */ + get gradientY(): GradientDataNumber; + /** + * @en The gradient angular velocity for Z axis. + * @zh Z轴渐变角速度。 + */ + get gradientZ(): GradientDataNumber; + /** + * @en The gradient angular velocity for W component. + * @zh W分量渐变角速度。 + */ + get gradientW(): GradientDataNumber; + /** + * @en The minimum constant angular velocity for random between two constants mode. + * @zh 随机双固定角速度的最小值。 + */ + get constantMin(): number; + /** + * @en The maximum constant angular velocity for random between two constants mode. + * @zh 随机双固定角速度的最大值。 + */ + get constantMax(): number; + /** + * @en The minimum constant angular velocity for separate axes in random between two constants mode. + * @zh 分轴随机双固定角速度的最小值。 + */ + get constantMinSeparate(): Vector3; + /** + * @en The maximum constant angular velocity for separate axes in random between two constants mode. + * @zh 分轴随机双固定角速度的最大值。 + */ + get constantMaxSeparate(): Vector3; + /** + * @en The minimum gradient angular velocity. + * @zh 最小渐变角速度。 + */ + get gradientMin(): GradientDataNumber; + /** + * @en The maximum gradient angular velocity. + * @zh 最大渐变角速度。 + */ + get gradientMax(): GradientDataNumber; + /** + * @en The minimum gradient angular velocity for X axis. + * @zh X轴最小渐变角速度。 + */ + get gradientXMin(): GradientDataNumber; + /** + * @en The maximum gradient angular velocity for X axis. + * @zh X轴最大渐变角速度。 + */ + get gradientXMax(): GradientDataNumber; + /** + * @en The minimum gradient angular velocity for Y axis. + * @zh Y轴最小渐变角速度。 + */ + get gradientYMin(): GradientDataNumber; + /** + * @en The maximum gradient angular velocity for Y axis. + * @zh Y轴最大渐变角速度。 + */ + get gradientYMax(): GradientDataNumber; + /** + * @en The minimum gradient angular velocity for Z axis. + * @zh Z轴最小渐变角速度。 + */ + get gradientZMin(): GradientDataNumber; + /** + * @en The maximum gradient angular velocity for Z axis. + * @zh Z轴最大渐变角速度。 + */ + get gradientZMax(): GradientDataNumber; + /** + * @en The minimum gradient angular velocity for W axis. + * @zh W轴最小渐变角速度。 + */ + get gradientWMin(): GradientDataNumber; + /** + * @en The maximum gradient angular velocity for W axis. + * @zh W轴最大渐变角速度。 + */ + get gradientWMax(): GradientDataNumber; + /** + * @ignore + * @en Creating an instance via `new` is not allowed; please use the static creation function. + * @zh 不允许new,请使用静态创建函数。 + */ + constructor(); + /** + * @en Clones to a target object. + * @param destObject The target object to clone to. + * @zh 克隆到目标对象。 + * @param destObject 要克隆到的目标对象。 + */ + cloneTo(destObject: GradientAngularVelocity): void; + /** + * @en Clone. + * @returns Clone copy. + * @zh 克隆。 + * @returns 克隆副本。 + */ + clone(): any; + } + /** + * @en The GradientColor class is used to create gradient colors. + * @zh GradientColor 类用于创建渐变颜色。 + */ + class GradientColor implements IClone { + /** + * @en Create a GradientColor instance with a constant color. + * @param constant The constant color. + * @returns A new GradientColor instance. + * @zh 通过固定颜色创建一个 GradientColor 实例。 + * @param constant 固定颜色。 + * @returns 一个新的 GradientColor 实例。 + */ + static createByConstant(constant: Vector4): GradientColor; + /** + * @en Create a GradientColor instance with a gradient color. + * @param gradient The gradient color. + * @returns A new GradientColor instance. + * @zh 通过渐变颜色创建一个 GradientColor 实例。 + * @param gradient 渐变色。 + * @returns 一个新的 GradientColor 实例。 + */ + static createByGradient(gradient: Gradient): GradientColor; + /** + * @en Create a GradientColor instance with two random constant colors. + * @param minConstant The minimum constant color. + * @param maxConstant The maximum constant color. + * @returns A new GradientColor instance. + * @zh 通过随机双固定颜色创建一个 GradientColor 实例。 + * @param minConstant 最小固定颜色。 + * @param maxConstant 最大固定颜色。 + * @returns 一个新的 GradientColor 实例。 + */ + static createByRandomTwoConstant(minConstant: Vector4, maxConstant: Vector4): GradientColor; + /** + * @en Create a GradientColor instance with two random gradient colors. + * @param minGradient The minimum gradient color. + * @param maxGradient The maximum gradient color. + * @returns A new GradientColor instance. + * @zh 通过随机双渐变颜色创建一个 GradientColor 实例。 + * @param minGradient 最小渐变颜色。 + * @param maxGradient 最大渐变颜色。 + * @returns 一个新的 GradientColor 实例。 + */ + static createByRandomTwoGradient(minGradient: Gradient, maxGradient: Gradient): GradientColor; + private _type; + private _constant; + private _constantMin; + private _constantMax; + private _gradient; + private _gradientMin; + private _gradientMax; + /** + * @en The type of lifetime color. 0 for constant color mode, 1 for gradient mode, 2 for random two constant colors mode, 3 for random two gradients mode. + * @zh 生命周期颜色类型。0为固定颜色模式,1为渐变模式,2为随机双固定颜色模式,3为随机双渐变模式。 + */ + get type(): number; + /** + * @en The constant color. + * @zh 固定颜色。 + */ + get constant(): Vector4; + /** + * @en The minimum constant color. + * @zh 最小固定颜色。 + */ + get constantMin(): Vector4; + /** + * @en The maximum constant color. + * @zh 最大固定颜色。 + */ + get constantMax(): Vector4; + /** + * @en The gradient color. + * @zh 渐变颜色。 + */ + get gradient(): Gradient; + /** + * @en The minimum gradient color. + * @zh 最小渐变颜色。 + */ + get gradientMin(): Gradient; + /** + * @en The maximum gradient color. + * @zh 最大渐变颜色。 + */ + get gradientMax(): Gradient; + /** + * @ignore + * @en Creating an instance via `new` is not allowed; please use the static creation function. + * @zh 不允许new,请使用静态创建函数。 + */ + constructor(); + /** + * @en Clones to a target object. + * @param destObject The target object to clone to. + * @zh 克隆到目标对象。 + * @param destObject 要克隆到的目标对象。 + */ + cloneTo(destObject: GradientColor): void; + /** + * @en Clone. + * @returns Clone copy. + * @zh 克隆。 + * @returns 克隆副本。 + */ + clone(): any; + } + /** + * @en The GradientDataInt class is used to create integer gradients. + * @zh GradientDataInt 类用于创建整形渐变。 + */ + class GradientDataInt implements IClone { + private _currentLength; + /** + * @en The number of integer gradients. + * @zh 整形渐变数量。 + */ + get gradientCount(): number; + /** + * @ignore + * @en creates an instance of the GradientDataInt class. + * @zh 创建一个 GradientDataInt 类的实例。 + */ + constructor(); + /** + * @en Add an integer gradient. + * @param key - The lifecycle key, ranging from 0 to 1. + * @param value - The integer value. + * @zh 增加整形渐变。 + * @param key - 生命周期,范围为0到1。 + * @param value - 整形值。 + */ + add(key: number, value: number): void; + /** + * @en Clones to a target object. + * @param destObject The target object to clone to. + * @zh 克隆到目标对象。 + * @param destObject 要克隆到的目标对象。 + */ + cloneTo(destObject: GradientDataInt): void; + /** + * @en Clone. + * @returns Clone copy. + * @zh 克隆。 + * @returns 克隆副本。 + */ + clone(): any; + } + /** + * @en The `GradientDataNumber` class is used to create floating-point gradients. + * @zh `GradientDataNumber` 类用于创建浮点渐变。 + */ + class GradientDataNumber implements IClone { + private _currentLength; + /** + * @en The number of gradient floats. + * @zh 渐变浮点数量。 + */ + get gradientCount(): number; + /** + * @ignore + * @en creates an instance of the GradientDataNumber class. + * @zh 创建一个 GradientDataNumber 类的实例。 + */ + constructor(); + /** + * @en Add a floating-point gradient. + * @param key Lifecycle, ranging from 0 to 1. + * @param value The float value. + * @zh 增加浮点渐变。 + * @param key 生命周期,范围为 0 到 1。 + * @param value 浮点值。 + */ + add(key: number, value: number): void; + /** + * @en Get the key by index. + * @param index The index. + * @returns The key. + * @zh 通过索引获取键。 + * @param index 索引。 + * @returns 键。 + */ + getKeyByIndex(index: number): number; + /** + * @en Get the value by index. + * @param index The index. + * @returns The value. + * @zh 通过索引获取值。 + * @param index 索引。 + * @returns 值。 + */ + getValueByIndex(index: number): number; + /** + * @en Get the average value. + * @returns The average value of the gradient. + * @zh 获取平均值。 + * @returns 渐变的平均值。 + */ + getAverageValue(): number; + /** + * @en Clones to a target object. + * @param destObject The target object to clone to. + * @zh 克隆到目标对象。 + * @param destObject 要克隆到的目标对象。 + */ + cloneTo(destObject: GradientDataNumber): void; + /** + * @en Clone. + * @returns Clone copy. + * @zh 克隆。 + * @returns 克隆副本。 + */ + clone(): any; + } + /** + * @en The `GradientDataVector2` class is used to create two-dimensional vector gradients. + * @zh `GradientDataVector2` 类用于创建二维向量渐变。 + */ + class GradientDataVector2 implements IClone { + private _currentLength; + /** + * @en The number of two-dimensional vector gradients. + * @zh 二维向量渐变数量。 + */ + get gradientCount(): number; + /** + * @ignore + * @en creates an instance of the `GradientDataVector2` class. + * @zh 创建一个 `GradientDataVector2` 实例。 + */ + constructor(); + /** + * @en Add a two-dimensional vector gradient. + * @param key Lifecycle, ranging from 0 to 1. + * @param value The two-dimensional vector value. + * @zh 增加二维向量渐变。 + * @param key 生命周期,范围为 0 到 1。 + * @param value 二维向量值。 + */ + add(key: number, value: Vector2): void; + /** + * @en Clones to a target object. + * @param destObject The target object to clone to. + * @zh 克隆到目标对象。 + * @param destObject 要克隆到的目标对象。 + */ + cloneTo(destObject: GradientDataVector2): void; + /** + * @en Clone. + * @returns Clone copy. + * @zh 克隆。 + * @returns 克隆副本。 + */ + clone(): any; + } + /** + * @en The `GradientSize` class is used to create gradient sizes. + * @zh `GradientSize` 类用于创建渐变尺寸。 + */ + class GradientSize implements IClone { + /** + * @en Create a `GradientSize` instance by gradient size. + * @param gradient The gradient size. + * @returns The gradient size instance. + * @zh 通过渐变尺寸创建一个 `GradientSize` 实例。 + * @param gradient 渐变尺寸。 + * @returns 渐变尺寸实例。 + */ + static createByGradient(gradient: GradientDataNumber): GradientSize; + /** + * @en Create a `GradientSize` instance by separate axis gradient sizes. + * @param gradientX The gradient size for X axis. + * @param gradientY The gradient size for Y axis. + * @param gradientZ The gradient size for Z axis. + * @returns The gradient size instance. + * @zh 通过分轴渐变尺寸创建一个 `GradientSize` 实例。 + * @param gradientX 渐变尺寸X。 + * @param gradientY 渐变尺寸Y。 + * @param gradientZ 渐变尺寸Z。 + * @returns 渐变尺寸实例。 + */ + static createByGradientSeparate(gradientX: GradientDataNumber, gradientY: GradientDataNumber, gradientZ: GradientDataNumber): GradientSize; + /** + * @en Create a `GradientSize` instance by random two constant sizes. + * @param constantMin The minimum constant size. + * @param constantMax The maximum constant size. + * @returns The gradient size instance. + * @zh 通过随机双固定尺寸创建一个 `GradientSize` 实例。 + * @param constantMin 最小固定尺寸。 + * @param constantMax 最大固定尺寸。 + * @returns 渐变尺寸实例。 + */ + static createByRandomTwoConstant(constantMin: number, constantMax: number): GradientSize; + /** + * @en Create a `GradientSize` instance by separate axis random two constant sizes. + * @param constantMinSeparate The minimum constant size for separate axes. + * @param constantMaxSeparate The maximum constant size for separate axes. + * @returns The gradient size instance. + * @zh 通过分轴随机双固定尺寸创建一个 `GradientSize` 实例。 + * @param constantMinSeparate 分轴最小固定尺寸。 + * @param constantMaxSeparate 分轴最大固定尺寸。 + * @returns 渐变尺寸实例。 + */ + static createByRandomTwoConstantSeparate(constantMinSeparate: Vector3, constantMaxSeparate: Vector3): GradientSize; + /** + * @en Create a `GradientSize` instance by random two gradient sizes. + * @param gradientMin The minimum gradient size. + * @param gradientMax The maximum gradient size. + * @returns The gradient size instance. + * @zh 通过随机双渐变尺寸创建一个 `GradientSize` 实例。 + * @param gradientMin 最小渐变尺寸。 + * @param gradientMax 最大渐变尺寸。 + * @returns 渐变尺寸实例。 + */ + static createByRandomTwoGradient(gradientMin: GradientDataNumber, gradientMax: GradientDataNumber): GradientSize; + /** + * @en Create a `GradientSize` instance by separate axis random two gradient sizes. + * @param gradientXMin The minimum gradient size for X axis. + * @param gradientXMax The maximum gradient size for X axis. + * @param gradientYMin The minimum gradient size for Y axis. + * @param gradientYMax The maximum gradient size for Y axis. + * @param gradientZMin The minimum gradient size for Z axis. + * @param gradientZMax The maximum gradient size for Z axis. + * @returns The gradient size instance. + * @zh 通过分轴随机双渐变尺寸创建一个 `GradientSize` 实例。 + * @param gradientXMin X轴最小渐变尺寸。 + * @param gradientXMax X轴最大渐变尺寸。 + * @param gradientYMin Y轴最小渐变尺寸。 + * @param gradientYMax Y轴最大渐变尺寸。 + * @param gradientZMin Z轴最小渐变尺寸。 + * @param gradientZMax Z轴最大渐变尺寸。 + * @returns 渐变尺寸实例。 + */ + static createByRandomTwoGradientSeparate(gradientXMin: GradientDataNumber, gradientXMax: GradientDataNumber, gradientYMin: GradientDataNumber, gradientYMax: GradientDataNumber, gradientZMin: GradientDataNumber, gradientZMax: GradientDataNumber): GradientSize; + private _type; + private _separateAxes; + private _gradient; + private _gradientX; + private _gradientY; + private _gradientZ; + private _constantMin; + private _constantMax; + private _constantMinSeparate; + private _constantMaxSeparate; + private _gradientMin; + private _gradientMax; + private _gradientXMin; + private _gradientXMax; + private _gradientYMin; + private _gradientYMax; + private _gradientZMin; + private _gradientZMax; + /** + * @en The type of lifecycle size. 0: Curve mode, 1: Random double constant mode, 2: Random double curve mode. + * @zh 生命周期尺寸类型,0:曲线模式,1:随机双常量模式,2:随机双曲线模式。 + */ + get type(): number; + /** + * @en Whether to separate axes. + * @zh 是否分轴。 + */ + get separateAxes(): boolean; + /** + * @en The gradient size. + * @zh 渐变尺寸。 + */ + get gradient(): GradientDataNumber; + /** + * @en The gradient size for X axis. + * @zh 渐变尺寸X。 + */ + get gradientX(): GradientDataNumber; + /** + * @en The gradient size for Y axis. + * @zh 渐变尺寸Y。 + */ + get gradientY(): GradientDataNumber; + /** + * @en The gradient size for Z axis. + * @zh 渐变尺寸Z。 + */ + get gradientZ(): GradientDataNumber; + /** + * @en The minimum random double constant size. + * @zh 最小随机双固定尺寸。 + */ + get constantMin(): number; + /** + * @en The maximum random double constant size. + * @zh 最大随机双固定尺寸。 + */ + get constantMax(): number; + /** + * @en The minimum separate axis random double constant size. + * @zh 最小分轴随机双固定尺寸。 + */ + get constantMinSeparate(): Vector3; + /** + * @en The maximum separate axis random double constant size. + * @zh 最大分轴随机双固定尺寸。 + */ + get constantMaxSeparate(): Vector3; + /** + * @en The minimum gradient size. + * @zh 渐变最小尺寸。 + */ + get gradientMin(): GradientDataNumber; + /** + * @en The maximum gradient size. + * @zh 渐变最大尺寸。 + */ + get gradientMax(): GradientDataNumber; + /** + * @en The minimum gradient size for X axis. + * @zh 渐变最小尺寸X。 + */ + get gradientXMin(): GradientDataNumber; + /** + * @en The maximum gradient size for X axis. + * @zh 渐变最大尺寸X。 + */ + get gradientXMax(): GradientDataNumber; + /** + * @en The minimum gradient size for Y axis. + * @zh 渐变最小尺寸Y。 + */ + get gradientYMin(): GradientDataNumber; + /** + * @en The maximum gradient size for Y axis. + * @zh 渐变最大尺寸Y。 + */ + get gradientYMax(): GradientDataNumber; + /** + * @en The minimum gradient size for Z axis. + * @zh 渐变最小尺寸Z。 + */ + get gradientZMin(): GradientDataNumber; + /** + * @en The maximum gradient size for Z axis. + * @zh 渐变最大尺寸Z。 + */ + get gradientZMax(): GradientDataNumber; + /** + * @ignore + * @en Constructor, not allowed to use "new", please use the static creation function. + * @zh 构造方法。不允许new,请使用静态创建函数。 + */ + constructor(); + /** + * @en Retrieves the maximum size within a gradient, based on the specified parameters and mode. + * @param meshMode Indicates whether the calculation is for mesh mode. + * @returns The maximum size found in the gradient. + * @zh 获取渐变中的最大尺寸。 + * @param meshMode 是否是网格模式 + * @returns 返回渐变中找到的最大尺寸。 + */ + getMaxSizeInGradient(meshMode?: boolean): number; + /** + * @en Clones to a target object. + * @param destObject The target object to clone to. + * @zh 克隆到目标对象。 + * @param destObject 要克隆到的目标对象。 + */ + cloneTo(destObject: GradientSize): void; + /** + * @en Clone. + * @returns Clone copy. + * @zh 克隆。 + * @returns 克隆副本。 + */ + clone(): any; + } + /** + * @en The `GradientVelocity` class is used to create gradient velocities. + * @zh `GradientVelocity` 类用于创建渐变速度。 + */ + class GradientVelocity implements IClone { + /** + * @en Create a `GradientVelocity` instance with constant velocity. + * @param constant The constant velocity. + * @returns The gradient velocity instance. + * @zh 通过固定速度创建一个 `GradientVelocity` 实例。 + * @param constant 固定速度。 + * @returns 渐变速度实例。 + */ + static createByConstant(constant: Vector3): GradientVelocity; + /** + * @en Create a `GradientVelocity` instance with gradient velocities. + * @param gradientX Gradient velocity for X axis. + * @param gradientY Gradient velocity for Y axis. + * @param gradientZ Gradient velocity for Z axis. + * @returns The gradient velocity instance. + * @zh 通过渐变速度创建一个 `GradientVelocity` 实例。 + * @param gradientX 渐变速度X。 + * @param gradientY 渐变速度Y。 + * @param gradientZ 渐变速度Z。 + * @returns 渐变速度实例。 + */ + static createByGradient(gradientX: GradientDataNumber, gradientY: GradientDataNumber, gradientZ: GradientDataNumber): GradientVelocity; + /** + * @en Create a `GradientVelocity` instance with random two constant velocities. + * @param constantMin The minimum constant velocity. + * @param constantMax The maximum constant velocity. + * @returns The gradient velocity instance. + * @zh 通过随机双固定速度创建一个 `GradientVelocity` 实例。 + * @param constantMin 最小固定速度。 + * @param constantMax 最大固定速度。 + * @returns 渐变速度实例。 + */ + static createByRandomTwoConstant(constantMin: Vector3, constantMax: Vector3): GradientVelocity; + /** + * @en Create a `GradientVelocity` instance with random two gradient velocities. + * @param gradientXMin Minimum gradient velocity for X axis. + * @param gradientXMax Maximum gradient velocity for X axis. + * @param gradientYMin Minimum gradient velocity for Y axis. + * @param gradientYMax Maximum gradient velocity for Y axis. + * @param gradientZMin Minimum gradient velocity for Z axis. + * @param gradientZMax Maximum gradient velocity for Z axis. + * @returns The gradient velocity instance. + * @zh 通过随机双渐变速度创建一个 `GradientVelocity` 实例。 + * @param gradientXMin X轴最小渐变速度。 + * @param gradientXMax X轴最大渐变速度。 + * @param gradientYMin Y轴最小渐变速度。 + * @param gradientYMax Y轴最大渐变速度。 + * @param gradientZMin Z轴最小渐变速度。 + * @param gradientZMax Z轴最大渐变速度。 + * @returns 渐变速度实例。 + */ + static createByRandomTwoGradient(gradientXMin: GradientDataNumber, gradientXMax: GradientDataNumber, gradientYMin: GradientDataNumber, gradientYMax: GradientDataNumber, gradientZMin: GradientDataNumber, gradientZMax: GradientDataNumber): GradientVelocity; + private _type; + private __constant; + /** + * @en The constant velocity. + * @zh 固定速度。 + */ + get _constant(): Vector3; + set _constant(value: Vector3); + private __constantMin; + /** + * @en The minimum constant velocity. + * @zh 最小固定速度。 + */ + get _constantMin(): Vector3; + set _constantMin(value: Vector3); + private __constantMax; + /** + * @en The maximum constant velocity. + * @zh 最大固定速度。 + */ + get _constantMax(): Vector3; + set _constantMax(value: Vector3); + private _gradientConstantX; + private _gradientConstantY; + private _gradientConstantZ; + private _gradientConstantXMin; + private _gradientConstantXMax; + private _gradientConstantYMin; + private _gradientConstantYMax; + private _gradientConstantZMin; + private _gradientConstantZMax; + private _gradientX; + private _gradientY; + private _gradientZ; + private _gradientXMin; + private _gradientXMax; + private _gradientYMin; + private _gradientYMax; + private _gradientZMin; + private _gradientZMax; + /** + * @en The lifecycle velocity type. 0: constant mode, 1: curve mode, 2: random double constant mode, 3: random double curve mode. + * @zh 生命周期速度类型。0:常量模式,1:曲线模式,2:随机双常量模式,3:随机双曲线模式。 + */ + get type(): number; + /** + * @en The constant velocity. + * @zh 固定速度。 + */ + get constant(): Vector3; + /** + * @en The gradient velocity for X axis. + * @zh X轴渐变速度。 + */ + get gradientX(): GradientDataNumber; + /** + * @en The gradient velocity for Y axis. + * @zh Y轴渐变速度。 + */ + get gradientY(): GradientDataNumber; + /** + * @en The gradient velocity for Z axis. + * @zh Z轴渐变速度。 + */ + get gradientZ(): GradientDataNumber; + /** + * @en The minimum constant velocity. + * @zh 最小固定速度。 + */ + get constantMin(): Vector3; + /** + * @en The maximum constant velocity. + * @zh 最大固定速度。 + */ + get constantMax(): Vector3; + /** + * @en The minimum gradient velocity for X axis. + * @zh X轴最小渐变速度。 + */ + get gradientXMin(): GradientDataNumber; + /** + * @en The maximum gradient velocity for X axis. + * @zh X轴最大渐变速度。 + */ + get gradientXMax(): GradientDataNumber; + /** + * @en The minimum gradient velocity for Y axis. + * @zh Y轴最小渐变速度。 + */ + get gradientYMin(): GradientDataNumber; + /** + * @en The maximum gradient velocity for Y axis. + * @zh Y轴最大渐变速度。 + */ + get gradientYMax(): GradientDataNumber; + /** + * @en The minimum gradient velocity for Z axis. + * @zh Z轴最小渐变速度。 + */ + get gradientZMin(): GradientDataNumber; + /** + * @en The maximum gradient velocity for Z axis. + * @zh Z轴最大渐变速度。 + */ + get gradientZMax(): GradientDataNumber; + /** + * @ignore + * @en Constructor, not allowed to use "new", please use the static creation function. + * @zh 构造方法。不允许new,请使用静态创建函数。 + */ + constructor(); + /** + * @en Clones to a target object. + * @param destObject The target object to clone to. + * @zh 克隆到目标对象。 + * @param destObject 要克隆到的目标对象。 + */ + cloneTo(destObject: GradientVelocity): void; + /** + * @en Clone. + * @returns Clone copy. + * @zh 克隆。 + * @returns 克隆副本。 + */ + clone(): any; + } + /** + * @en The `RotationOverLifetime` class is used for particle rotation over its lifecycle. + * @zh `RotationOverLifetime` 类用于控制粒子在其生命周期内的旋转。 + */ + class RotationOverLifetime implements IClone { + private _angularVelocity; + /** + * @en Indicates whether the rotation over lifetime is enabled. + * @zh 是否启用生命周期旋转。 + */ + enable: boolean; + /** + * @en The angular velocity of the particle. + * @zh 粒子的角速度。 + */ + get angularVelocity(): GradientAngularVelocity; + /** + * @ignore + * @en Constructor, not allowed to use "new", please use the static creation function. + * @zh 构造方法。不允许new,请使用静态创建函数。 + */ + constructor(angularVelocity: GradientAngularVelocity); + /** + * @en Clones to a target object. + * @param destObject The target object to clone to. + * @zh 克隆到目标对象。 + * @param destObject 要克隆到的目标对象。 + */ + cloneTo(destObject: RotationOverLifetime): void; + /** + * @en Clone. + * @returns Clone copy. + * @zh 克隆。 + * @returns 克隆副本。 + */ + clone(): any; + } + /** + * @en Enumeration of particle system shape types. + * @zh 粒子系统形状类型枚举。 + */ + enum ParticleSystemShapeType { + /** + * @en Box shape. + * @zh 盒子形状。 + */ + Box = 0, + /** + * @en Circle shape. + * @zh 环形形状。 + */ + Circle = 1, + /** + * @en Cone shape. + * @zh 锥体形状。 + */ + Cone = 2, + /** + * @en Hemisphere shape. + * @zh 半球体形状。 + */ + Hemisphere = 3, + /** + * @en Sphere shape. + * @zh 球体形状。 + */ + Sphere = 4 + } + /** + * @en BaseShape class for particle shapes. + * @zh BaseShape类用于粒子形状。 + */ + class BaseShape implements IClone { + /** + * @en Whether the shape is enabled. + * @zh 是否启用。 + */ + enable: boolean; + /** + * @en Random direction. + * @zh 随机方向,默认0为不随机。 + */ + randomDirection: number; + /** + * @en Particle shape type. + * @zh 粒子形状类型。 + */ + shapeType: ParticleSystemShapeType; + /** + * @ignore + * @en Creates an instance of the BaseShape class. + * @zh 创建一个BaseShape实例。 + */ + constructor(); + /** + * @en Generates initial position and direction for particles. + * @param position The particle position. + * @param direction The particle direction. + * @param rand Random number. + * @param randomSeeds Random seeds. + * @zh 用于生成粒子初始位置和方向。 + * @param position 粒子位置。 + * @param direction 粒子方向。 + * @param rand 随机数。 + * @param randomSeeds 随机种子。 + */ + generatePositionAndDirection(position: Vector3, direction: Vector3, rand?: Rand, randomSeeds?: Uint32Array): void; + /** + * @en Clones to a target object. + * @param destObject The target object to clone to. + * @zh 克隆到目标对象。 + * @param destObject 要克隆到的目标对象。 + */ + cloneTo(destObject: BaseShape): void; + /** + * @en Clone. + * @returns Clone copy. + * @zh 克隆。 + * @returns 克隆副本。 + */ + clone(): any; + } + /** + * @en BoxShape class for creating box-shaped particle emitters. + * @zh BoxShape 类用于创建盒形粒子发射器。 + */ + class BoxShape extends BaseShape { + /** + * @en Length of the emitter along the X-axis. + * @zh 发射器X轴长度。 + */ + x: number; + /** + * @en Length of the emitter along the Y-axis. + * @zh 发射器Y轴长度。 + */ + y: number; + /** + * @en Length of the emitter along the Z-axis. + * @zh 发射器Z轴长度。 + */ + z: number; + /** + * @ignore + * @en Creates an instance of the BoxShape class. + * @zh 创建一个BoxShape实例。 + */ + constructor(); + /** + * @en Generates initial position and direction for particles. + * @param position The particle position. + * @param direction The particle direction. + * @param rand Random number. + * @param randomSeeds Array of random seeds. + * @zh 用于生成粒子初始位置和方向。 + * @param position 粒子位置。 + * @param direction 粒子方向。 + * @param rand 随机数。 + * @param randomSeeds 随机种子数组。 + */ + generatePositionAndDirection(position: Vector3, direction: Vector3, rand?: Rand, randomSeeds?: Uint32Array): void; + /** + * @override + * @en Clones to a target object. + * @param destObject The target object to clone to. + * @zh 克隆到目标对象。 + * @param destObject 要克隆到的目标对象。 + */ + cloneTo(destObject: BoxShape): void; + /** + * @override + * @en Clone. + * @returns Clone copy. + * @zh 克隆。 + * @returns 克隆副本。 + */ + clone(): any; + } + /** + * @en CircleShape class for creating circular particle emitters. + * @zh CircleShape 类用于创建环形粒子发射器。 + */ + class CircleShape extends BaseShape { + /** + * @en Emitter radius. + * @zh 发射器半径。 + */ + radius: number; + /** + * @en Arc angle. + * @zh 环形弧度。 + */ + arc: number; + /** + * @en Whether to emit from the edge. + * @zh 是否从边缘发射。 + */ + emitFromEdge: boolean; + /** + * @ignore + * @en Creates an instance of the CircleShape class. + * @zh 创建一个CircleShape实例。 + */ + constructor(); + /** + * @en Emission angle 0-360 + * @zh 发射角度 0-360 + */ + get arcDEG(): number; + set arcDEG(deg: number); + /** + * @en Generates initial position and direction for particles. + * @param position The particle position. + * @param direction The particle direction. + * @param rand Random number. + * @param randomSeeds Array of random seeds. + * @zh 用于生成粒子初始位置和方向。 + * @param position 粒子位置。 + * @param direction 粒子方向。 + * @param rand 随机数。 + * @param randomSeeds 随机种子数组。 + */ + generatePositionAndDirection(position: Vector3, direction: Vector3, rand?: Rand, randomSeeds?: Uint32Array): void; + /** + * @override + * @en Clones to a target object. + * @param destObject The target object to clone to. + * @zh 克隆到目标对象。 + * @param destObject 要克隆到的目标对象。 + */ + cloneTo(destObject: CircleShape): void; + /** + * @en Clone. + * @returns Clone copy. + * @zh 克隆。 + * @returns 克隆副本。 + */ + clone(): any; + } + /** + * @en ConeShape class is used to create cone-shaped particle emitters. + * @zh ConeShape类用于创建锥形粒子发射器。 + */ + class ConeShape extends BaseShape { + /** + * @en The emission angle in radians. + * @zh 发射角度,单位为弧度。 + */ + angle: number; + /** + * @en The radius of the emitter. + * @zh 发射器的半径。 + */ + radius: number; + /** + * @en The length of the cone. + * @zh 锥体的长度。 + */ + length: number; + /** + * @en The emission type. 0 for Base, 1 for BaseShell, 2 for Volume, 3 for VolumeShell. + * @zh 发射类型:0 表示基础发射,1 表示基础外壳发射,2 表示体积发射,3 表示体积外壳发射。 + */ + emitType: number; + /** + * @ignore + * @en Creates an instance of the ConeShape class. + * @zh 创建一个ConeShape实例。 + */ + constructor(); + /** + * @en Emission angle 0-360 + * @zh 发射角度0-360 + */ + get angleDEG(): number; + set angleDEG(deg: number); + /** + * @en Generates initial position and direction for particles. + * @param position The particle position. + * @param direction The particle direction. + * @param rand Random number. + * @param randomSeeds Array of random seeds. + * @zh 用于生成粒子初始位置和方向。 + * @param position 粒子位置。 + * @param direction 粒子方向。 + * @param rand 随机数。 + * @param randomSeeds 随机种子数组。 + */ + generatePositionAndDirection(position: Vector3, direction: Vector3, rand?: Rand, randomSeeds?: Uint32Array): void; + /** + * @override + * @en Clones to a target object. + * @param destObject The target object to clone to. + * @zh 克隆到目标对象。 + * @param destObject 要克隆到的目标对象。 + */ + cloneTo(destObject: ConeShape): void; + /** + * @override + * @en Clone. + * @returns Clone copy. + * @zh 克隆。 + * @returns 克隆副本。 + */ + clone(): any; + } + /** + * @en The HemisphereShape class is used to create hemispherical particle shapes emitters. + * @zh HemisphereShape 类用于创建半球形粒子形状发射器。 + */ + class HemisphereShape extends BaseShape { + /** + * @en The radius of the hemisphere. + * @zh 发射器半径。 + */ + radius: number; + /** + * @en Whether to emit from the shell. + * @zh 是否从外壳发射。 + */ + emitFromShell: boolean; + /** + * @ignore + * @en Creats an instance of the HemisphereShape class. + * @zh 创建一个HemisphereShape实例。 + */ + constructor(); + /** + * @override + * @en Generates initial position and direction for particles. + * @param position The particle position. + * @param direction The particle direction. + * @param rand Random number. + * @param randomSeeds Array of random seeds. + * @zh 用于生成粒子初始位置和方向。 + * @param position 粒子位置。 + * @param direction 粒子方向。 + * @param rand 随机数。 + * @param randomSeeds 随机种子数组。 + */ + generatePositionAndDirection(position: Vector3, direction: Vector3, rand?: Rand, randomSeeds?: Uint32Array): void; + /** + * @override + * @en Clones to a target object. + * @param destObject The target object to clone to. + * @zh 克隆到目标对象。 + * @param destObject 要克隆到的目标对象。 + */ + cloneTo(destObject: HemisphereShape): void; + /** + * @override + * @en Clone. + * @returns Clone copy. + * @zh 克隆。 + * @returns 克隆副本。 + */ + clone(): any; + } + /** + * @en SphereShape class is used to create spherical particle shapes. + * @zh SphereShape 类用于创建球形粒子发射器。 + */ + class SphereShape extends BaseShape { + /** + * @en Emitter radius. + * @zh 发射器半径。 + */ + radius: number; + /** + * @en Whether to emit from the shell. + * @zh 是否从外壳发射。 + */ + emitFromShell: boolean; + /** + * @ignore + * @en Creates an instance of the SphereShape class. + * @zh 创建一个 SphereShape 实例。 + */ + constructor(); + /** + * @en Generates initial position and direction for particles. + * @param position The particle position. + * @param direction The particle direction. + * @param rand Random number. + * @param randomSeeds Array of random seeds. + * @zh 用于生成粒子初始位置和方向。 + * @param position 粒子位置。 + * @param direction 粒子方向。 + * @param rand 随机数。 + * @param randomSeeds 随机种子数组。 + */ + generatePositionAndDirection(position: Vector3, direction: Vector3, rand?: Rand, randomSeeds?: Uint32Array): void; + /** + * @override + * @en Clones to a target object. + * @param destObject The target object to clone to. + * @zh 克隆到目标对象。 + * @param destObject 要克隆到的目标对象。 + */ + cloneTo(destObject: SphereShape): void; + /** + * @override + * @en Clone. + * @returns Clone copy. + * @zh 克隆。 + * @returns 克隆副本。 + */ + clone(): any; + } + /** + * @en The `SizeOverLifetime` class is used to control the size of particles over their lifetime. + * @zh `SizeOverLifetime` 类用于控制粒子在其生命周期内的尺寸变化。 + */ + class SizeOverLifetime implements IClone { + private _size; + /** + * @en Whether to enable. + * @zh 是否启用 + */ + enable: boolean; + /** + * @en The size. + * @zh 尺寸。 + */ + get size(): GradientSize; + /** + * @ignore + * @en Creates an instance of the `SizeOverLifetime` class. + * @param size gradient size. + * @zh 创建一个 `SizeOverLifetime` 实例。 + * @param size 渐变尺寸 + */ + constructor(size: GradientSize); + /** + * @en Clones to a target object. + * @param destObject The target object to clone to. + * @zh 克隆到目标对象。 + * @param destObject 要克隆到的目标对象。 + */ + cloneTo(destObject: SizeOverLifetime): void; + /** + * @en Clone. + * @returns Clone copy. + * @zh 克隆。 + * @returns 克隆副本。 + */ + clone(): any; + } + /** + * @en The `StartFrame` class is used to create start frames. + * @zh `StartFrame` 类用于创建起始帧。 + */ + class StartFrame implements IClone { + /** + * @en Create a `StartFrame` instance with a constant frame value. + * @param constant The fixed frame value. Default is 0. + * @returns A new StartFrame instance. + * @zh 通过固定帧值创建一个 `StartFrame` 实例。 + * @param constant 固定帧值。默认为0。 + * @returns 新的 StartFrame 实例。 + */ + static createByConstant(constant?: number): StartFrame; + /** + * @en Create a `StartFrame` instance with a random range between two constant frame values. + * @param constantMin The minimum fixed frame value. Default is 0. + * @param constantMax The maximum fixed frame value. Default is 0. + * @returns A new StartFrame instance. + * @zh 通过随机范围在两个固定帧值之间创建一个 `StartFrame` 实例。 + * @param constantMin 最小固定帧值。默认为0。 + * @param constantMax 最大固定帧值。默认为0。 + * @returns 新的 StartFrame 实例。 + */ + static createByRandomTwoConstant(constantMin?: number, constantMax?: number): StartFrame; + private _type; + private _constant; + private _constantMin; + private _constantMax; + /** + * @en The start frame type. 0 for constant mode, 1 for random between two constants mode. + * @zh 起始帧类型。0表示常量模式,1表示随机双常量模式。 + */ + get type(): number; + /** + * @en The constant frame value. + * @zh 固定帧值。 + */ + get constant(): number; + /** + * @en The minimum constant frame value. + * @zh 最小固定帧值。 + */ + get constantMin(): number; + /** + * @en The maximum constant frame value. + * @zh 最大固定帧值。 + */ + get constantMax(): number; + /** + * @ignore + * @en Constructor, not allowed to use "new", please use the static creation function. + * @zh 构造方法。不允许new,请使用静态创建函数。 + */ + constructor(); + /** + * @en Clones to a target object. + * @param destObject The target object to clone to. + * @zh 克隆到目标对象。 + * @param destObject 要克隆到的目标对象。 + */ + cloneTo(destObject: StartFrame): void; + /** + * @en Clone. + * @returns Clone copy. + * @zh 克隆。 + * @returns 克隆副本。 + */ + clone(): any; + } + /** + * @en The `TextureSheetAnimation` class is used to create particle frame animations. + * @zh `TextureSheetAnimation` 类用于创建粒子帧动画。 + */ + class TextureSheetAnimation implements IClone { + /** + * @en Texture tiling. + * @zh 纹理平铺。 + */ + tiles: Vector2; + /** + * @en Type, 0 for whole sheet, 1 for single row. + * @zh 类型,0 表示整个纹理表,1 表示纹理表中的某一行。 + */ + type: number; + /** + * @en Whether to use random row, effective when type is 1. + * @zh 是否随机行,type属性 为 1 时,该属性才会生效。 + */ + randomRow: boolean; + /** + * @en Row index, effective when type is 1. + * @zh 行索引,type属性 为 1 时,该属性才会生效。 + */ + rowIndex: number; + /** + * @en Number of cycles. + * @zh 循环次数。 + */ + cycles: number; + /** + * @en UV channel type, 0 for Nothing, 1 for Everything. + * @zh UV 通道类型,0 表示 Nothing,1 表示 Everything。 + */ + enableUVChannels: number; + /** + * @en Whether enabled. + * @zh 是否启用。 + */ + enable: boolean; + /** + * @en The time frame rate. + * @zh 时间帧率。 + */ + get frame(): FrameOverTime; + /** + * @en The start frame rate. + * @zh 开始帧率。 + */ + get startFrame(): StartFrame; + /** + * @en Creates an instance of the `TextureSheetAnimation` class. + * @param frame Animation frames. + * @param startFrame Start frame. + * @zh 创建一个 `TextureSheetAnimation` 类的实例。 + * @param frame 动画帧。 + * @param startFrame 开始帧。 + */ + constructor(frame: FrameOverTime, startFrame: StartFrame); + /** + * @en Clones to a target object. + * @param destObject The target object to clone to. + * @zh 克隆到目标对象。 + * @param destObject 要克隆到的目标对象。 + */ + cloneTo(destObject: TextureSheetAnimation): void; + /** + * @en Clone. + * @returns Clone copy. + * @zh 克隆。 + * @returns 克隆副本。 + */ + clone(): any; + } + /** + * @en The `VelocityOverLifetime` class is used for particle velocity over its lifetime. + * @zh `VelocityOverLifetime` 类用于控制粒子在生命周期内的速度变化。 + */ + class VelocityOverLifetime implements IClone { + /** + * @en Whether to enable. + * @zh 是否启用*/ + enable: boolean; + /** + * @en Velocity space, 0 for local, 1 for world. + * @zh 速度空间,0 表示局部空间,1 表示世界空间。 + */ + space: number; + /** + * @en The gradient velocity. + * @zh 渐变速度。 + */ + get velocity(): GradientVelocity; + /** + * @ignore + * @en Creates an instance of `VelocityOverLifetime` class. + * @param velocity gradient velocity. + * @zh 创建一个 `VelocityOverLifetime` 类的实例。 + * @param velocity 渐变速度。 + */ + constructor(velocity: GradientVelocity); + /** + * @en Clones to a target object. + * @param destObject The target object to clone to. + * @zh 克隆到目标对象。 + * @param destObject 要克隆到的目标对象。 + */ + cloneTo(destObject: VelocityOverLifetime): void; + /** + * @en Clone. + * @returns Clone copy. + * @zh 克隆。 + * @returns 克隆副本。 + */ + clone(): any; + } + /** + * @en ShuriKenParticle3D is a class of 3D particle system. + * @zh ShuriKenParticle3D 是3D粒子系统的类。 + */ + class ShuriKenParticle3D extends RenderableSprite3D { + /** + * @en The particle system. + * @zh 粒子系统。 + */ + get particleSystem(): ShurikenParticleSystem; + /** + * @en The particle renderer. + * @zh 粒子渲染器。 + */ + get particleRenderer(): ShurikenParticleRenderer; + /** + * @ignore + * @en creates an instance of the ShuriKenParticle3D class. + * @zh 创建Particle3D类的实例。 + */ + constructor(); + /** + * @override + * @en Destroy this object. + * @param destroyChild Whether to destroy the child node. If true, the child node will be destroyed, otherwise it will not be destroyed. + * @zh 销毁此对象。 + * @param destroyChild 是否同时销毁子节点,若值为true,则销毁子节点,否则不销毁子节点。 + */ + destroy(destroyChild?: boolean): void; + } + /** + * @en ShurikenParticleInstanceSystem class is used to implement instanced particle rendering. + * @zh ShurikenParticleInstanceSystem 类用于实现实例化粒子渲染。 + */ + class ShurikenParticleInstanceSystem extends ShurikenParticleSystem { + private _instanceParticleVertexBuffer; + private _instanceVertex; + private _meshIndexCount; + private _meshFloatCountPreVertex; + /** + * 每个粒子数据 float 个数 + */ + private _floatCountPerParticleData; + /** + * @ignore + * @en creates an instance of ShurikenParticleInstanceSystem class. + * @param render The ShurikenParticleRenderer associated with this particle system. + * @zh 创建 ShurikenParticleInstanceSystem 类的实例。 + * @param render 与该粒子系统关联的 ShurikenParticleRenderer。 + */ + constructor(render: ShurikenParticleRenderer); + /*** + * 重排 mesh vb + */ + private _initMeshVertex; + /** + * @en Initialize buffer + * @zh 初始化 buffer + */ + _initBufferDatas(): void; + protected _retireActiveParticles(): void; + protected _freeRetiredParticles(): void; + /** + * @en Add a new particle to the particle system. + * @param position The initial position of the particle. + * @param direction The initial direction of the particle. + * @param time The current simulation time. + * @returns Whether the particle was successfully added. + * @zh 向粒子系统添加一个新粒子。 + * @param position 粒子的初始位置。 + * @param direction 粒子的初始方向。 + * @param time 当前的模拟时间。 + * @returns 粒子是否成功添加。 + */ + addParticle(position: Vector3, direction: Vector3, time: number, elapsedTime: number): boolean; + /** + * @en Update the render parameters for the particle system. + * @param stage The current render context. + * @zh 更新粒子系统的渲染参数。 + * @param stage 当前渲染上下文。 + */ + _updateRenderParams(stage: RenderContext3D): void; + /** + * @en Destroy the particle system and release resources. + * @zh 销毁粒子系统并释放资源。 + */ + destroy(): void; + } + /** + * @en ShurikenParticleMaterial class is used to implement particle materials. + * @zh ShurikenParticleMaterial 类用于实现粒子材质。 + */ + class ShurikenParticleMaterial extends Material { + /** + * @en Render mode for transparent blending. + * @zh 渲染状态_透明混合。 + */ + static RENDERMODE_ALPHABLENDED: number; + /** + * @en Render mode for additive blending. + * @zh 渲染状态_加色法混合。 + */ + static RENDERMODE_ADDTIVE: number; + /** + * @en Default material, modification prohibited. + * @zh 默认材质,禁止修改。 + */ + static defaultMaterial: ShurikenParticleMaterial; + /** + * @en Color of the particle material. + * @zh 粒子材质的颜色。 + */ + get color(): Color; + set color(value: Color); + /** + * @en Texture tiling and offset. + * @zh 纹理平铺和偏移。 + */ + get tilingOffset(): Vector4; + set tilingOffset(value: Vector4); + /** + * @en Diffuse texture. + * @zh 漫反射贴图。 + */ + get texture(): BaseTexture; + set texture(value: BaseTexture); + /** + * @ignore + * @en creates a new instance of the ShurikenParticleMaterial class. + * @zh 创建ShurikenParticleMaterial类的新实例。 + */ + constructor(); + /** + * @override + * @en Clone. + * @returns Clone copy. + * @zh 克隆。 + * @returns 克隆副本。 + */ + clone(): any; + /** + * @deprecated + * 渲染模式。 + */ + set renderMode(value: number); + /** + * @deprecated + * 纹理平铺和偏移X分量。 + */ + get tilingOffsetX(): number; + set tilingOffsetX(x: number); + /** + * @deprecated + * 纹理平铺和偏移Y分量。 + */ + get tilingOffsetY(): number; + set tilingOffsetY(y: number); + /** + * @deprecated + * 纹理平铺和偏移Z分量。 + */ + get tilingOffsetZ(): number; + set tilingOffsetZ(z: number); + /** + * @deprecated + * 纹理平铺和偏移W分量。 + */ + get tilingOffsetW(): number; + set tilingOffsetW(w: number); + /** + * @deprecated + * 颜色R分量。 + */ + get colorR(): number; + set colorR(value: number); + /** + * @deprecated + * 颜色G分量。 + */ + get colorG(): number; + set colorG(value: number); + /** + * @deprecated + * 颜色B分量。 + */ + get colorB(): number; + set colorB(value: number); + /** + * @deprecated + * 颜色Z分量。 + */ + get colorA(): number; + set colorA(value: number); + } + /** + * @en The `ShurikenParticleRenderer` class is used to create 3D particle renderers. + * @zh `ShurikenParticleRenderer` 类用于创建3D粒子渲染器。 + */ + class ShurikenParticleRenderer extends BaseRender { + /** + * @en Gravity value. + * @zh 重力值。 + */ + static gravity: Vector3; + private _dragConstant; + /** + * @en Scale of camera speed in stretched billboard mode (currently not supported). + * @zh 拉伸广告牌模式摄像机速度缩放(暂不支持)。 + */ + stretchedBillboardCameraSpeedScale: number; + /** + * @en Speed scale in stretched billboard mode. + * @zh 拉伸广告牌模式速度缩放。 + */ + stretchedBillboardSpeedScale: number; + /** + * @en Length scale in stretched billboard mode. + * @zh 拉伸广告牌模式长度缩放。 + */ + stretchedBillboardLengthScale: number; + /** + * @en The particle management system. + * @zh 粒子管理系统。 + */ + get particleSystem(): ShurikenParticleSystem; + /** + * @en The render mode. 0: BILLBOARD, 1: STRETCHEDBILLBOARD, 2: HORIZONTALBILLBOARD, 3: VERTICALBILLBOARD, 4: MESH. + * @zh 渲染模式。0:粒子始终面向摄像机。、1:粒子面向摄像机,但会应用各种缩放、2:粒子平面与 XZ“地板”平面平行、3:粒子在世界 Y 轴上直立,但转向面向摄像机、4:从 3D 网格而非从纹理渲染粒子。。 + */ + get renderMode(): number; + set renderMode(value: number); + /** + * @en The Mesh used in mesh render mode. Effective when renderMode is 4. + * @zh 网格渲染模式所使用的Mesh。renderMode为4时生效。 + */ + get mesh(): Mesh; + set mesh(value: Mesh); + /** + * @ignore + * @en Creates a new instance of ShurikenParticleRender class. + * @zh 创建ShurikenParticleRender类的新实例。 + */ + constructor(); + /** + * @override + */ + protected _getcommonUniformMap(): Array; + /** + * @override + */ + protected _onAdded(): void; + /** + * @override + */ + protected _onEnable(): void; + /** + * @override + */ + protected _onDisable(): void; + /** + * @perfTag PerformanceDefine.T_ShurikenUpdate + * @en Update the render state. + * @param context The render context. + * @zh 更新渲染状态。 + * @param context 渲染上下文。 + */ + renderUpdate(context: RenderContext3D): void; + /** + * @override + * @en The bounding box. Read-only, not allowed to modify its value. + * @zh 包围盒。只读,不允许修改其值。 + */ + get bounds(): Bounds; + protected _onDestroy(): void; + protected _statAdd(): void; + protected _statRemove(): void; + } + /** + * @en The ShurikenParticleSystem class is used to create 3D particle data templates. + * @zh ShurikenParticleSystem 类用于创建3D粒子数据模板。 + */ + class ShurikenParticleSystem extends GeometryElement implements IClone { + protected _emissionLastPosition: Vector3; + /** + * @en Total duration of particle system runtime, in seconds. + * @zh 粒子运行的总时长,单位为秒。 + */ + duration: number; + /** + * @en Whether the particle system is looping. + * @zh 是否循环。 + */ + looping: boolean; + /** + * @en Whether to prewarm the particle system. Currently not supported. + * @zh 是否预热。暂不支持。 + */ + prewarm: boolean; + /** + * @en Start delay type. 0 for constant mode, 1 for random between two constants. Cannot be used with prewarm. + * @zh 开始延迟类型,0为常量模式,1为随机双常量模式。不能和prewarm一起使用。 + */ + startDelayType: number; + /** + * @en Start play delay. Cannot be used with prewarm. + * @zh 开始播放延迟。不能和prewarm一起使用。 + */ + startDelay: number; + /** + * @en Minimum start play delay. Cannot be used with prewarm. + * @zh 开始播放最小延迟。不能和prewarm一起使用。 + */ + startDelayMin: number; + /** + * @en Maximum start play delay. Cannot be used with prewarm. + * @zh 开始播放最大延迟。不能和prewarm一起使用。 + */ + startDelayMax: number; + /** + * @en Start speed mode. 0 for constant speed, 2 for random between two constants. Modes 1 and 3 are missing. + * @zh 开始速度模式。0为恒定速度,2为两个恒定速度的随机插值。缺少1、3模式。 + */ + startSpeedType: number; + /** + * @en Start speed for mode 0. + * @zh 开始速度,0模式。 + */ + startSpeedConstant: number; + /** + * @en Minimum start speed for mode 1. + * @zh 最小开始速度,1模式。 + */ + startSpeedConstantMin: number; + /** + * @en Maximum start speed for mode 1. + * @zh 最大开始速度,1模式。 + */ + startSpeedConstantMax: number; + /** + * @en Drag type. 0 for constant speed, 2 for random between two constants. + * @zh 阻力模式。0为恒定速度,2为两个恒定速度的随机插值。 + */ + dragType: number; + /** + * @en Constant drag for mode 0. + * @zh 恒定阻力,0模式。 + */ + dragConstant: number; + /** + * @en Minimum drag speed for mode 1. + * @zh 最小阻力速度,1模式。 + */ + dragSpeedConstantMin: number; + /** + * @en Maximum drag speed for mode 1. + * @zh 最大阻力速度,1模式。 + */ + dragSpeedConstantMax: number; + /** + * @en Whether the start size is in 3D mode. + * @zh 开始尺寸是否为3D模式。 + */ + threeDStartSize: boolean; + /** + * @en Start size mode. 0 for constant size, 2 for random between two constants. Modes 1 and 3 and corresponding 3D modes are missing. + * @zh 开始尺寸模式。0为恒定尺寸,2为两个恒定尺寸的随机插值。缺少1、3模式和对应的两种3D模式。 + */ + startSizeType: number; + /** + * @en Start size for mode 0. + * @zh 开始尺寸,0模式。 + */ + startSizeConstant: number; + /** + * @en Start 3D size for mode 0. + * @zh 开始三维尺寸,0模式。 + */ + startSizeConstantSeparate: Vector3; + /** + * @en Minimum start size for mode 2. + * @zh 最小开始尺寸,2模式。 + */ + startSizeConstantMin: number; + /** + * @en Maximum start size for mode 2. + * @zh 最大开始尺寸,2模式。 + */ + startSizeConstantMax: number; + /** + * @en Minimum 3D start size for mode 2. + * @zh 最小三维开始尺寸,2模式。 + */ + startSizeConstantMinSeparate: Vector3; + /** + * @en Maximum 3D start size for mode 2. + * @zh 最大三维开始尺寸,2模式。 + */ + startSizeConstantMaxSeparate: Vector3; + /** + * @en Whether to use 3D start rotation. + * @zh 是否使用3D开始旋转。 + */ + threeDStartRotation: boolean; + /** + * @en Start rotation mode. 0 for constant rotation, 2 for random between two constants. Two modes and corresponding four 3D modes are missing. + * @zh 开始旋转模式。0为恒定旋转,2为两个恒定旋转的随机插值。缺少2种模式和对应的四种3D模式。 + */ + startRotationType: number; + /** + * @en Start rotation for mode 0. + * @zh 开始旋转,0模式。 + */ + startRotationConstant: number; + /** + * @en Start 3D rotation for mode 0. + * @zh 开始三维旋转,0模式。 + */ + startRotationConstantSeparate: Vector3; + /** + * @en Minimum start rotation for mode 1. + * @zh 最小开始旋转,1模式。 + */ + startRotationConstantMin: number; + /** + * @en Maximum start rotation for mode 1. + * @zh 最大开始旋转,1模式。 + */ + startRotationConstantMax: number; + /** + * @en Minimum start 3D rotation for mode 1. + * @zh 最小开始三维旋转,1模式。 + */ + startRotationConstantMinSeparate: Vector3; + /** + * @en Maximum start 3D rotation for mode 1. + * @zh 最大开始三维旋转,1模式。 + */ + startRotationConstantMaxSeparate: Vector3; + /** + * @en Random rotation direction, range from 0.0 to 1.0. + * @zh 随机旋转方向,范围为0.0到1.0。 + */ + randomizeRotationDirection: number; + /** + * @en Start color mode. 0 for constant color, 2 for random between two constant colors. Two modes are missing. + * @zh 开始颜色模式。0为恒定颜色,2为两个恒定颜色的随机插值。缺少2种模式。 + */ + startColorType: number; + /** + * @en Start color for mode 0. + * @zh 开始颜色,0模式。 + */ + startColorConstant: Vector4; + /** + * @en Minimum start color for mode 1. + * @zh 最小开始颜色,1模式。 + */ + startColorConstantMin: Vector4; + /** + * @en Maximum start color for mode 1. + * @zh 最大开始颜色,1模式。 + */ + startColorConstantMax: Vector4; + /** + * @en Gravity modifier. + * @zh 重力敏感度。 + */ + gravityModifier: number; + /** + * @en Simulation space. 0 for World, 1 for Local. Custom is currently not supported. + * @zh 模拟器空间。0为World,1为Local。暂不支持Custom。 + */ + simulationSpace: number; + /** + * @en Playback speed of particles. + * @zh 粒子的播放速度。 + */ + simulationSpeed: number; + /** + * @en Scale mode. 0 for Hierarchy (world), 1 for Local, 2 for World. + * @zh 缩放模式。0为Hierarchy (world),1为Local,2为World。 + */ + scaleMode: number; + /** + * @en Whether to play automatically when activated. + * @zh 激活时是否自动播放。 + */ + playOnAwake: boolean; + /** + * @en Random seed. Note: Effective when set before play(). + * @zh 随机种子。注:在play()之前设置有效。 + */ + randomSeed: Uint32Array; + /** + * @en Whether to use a random seed. + * @zh 是否使用随机种子。 + */ + autoRandomSeed: boolean; + /** + * @en Whether it's in performance mode. In performance mode, particle release will be delayed. + * @zh 是否为性能模式。性能模式下会延迟粒子释放。 + */ + isPerformanceMode: boolean; + /** + * @en Maximum number of particles + * @zh 最大粒子数。 + */ + get maxParticles(): number; + set maxParticles(value: number); + /** + * @en Emission. + * @zh 发射器。 + */ + get emission(): Emission; + /** + * @en Number of alive particles + * @zh 粒子存活个数。 + */ + get aliveParticleCount(): number; + /** + * @en Accumulated time within one cycle. + * @zh 一次循环内的累计时间。 + */ + get emissionTime(): number; + /** + * @en Particle shape + * @zh 粒子形状。 + */ + get shape(): BaseShape; + set shape(value: BaseShape); + /** + * @en If the particle system is still alive. + * @zh 粒子系统是否仍然存活。 + */ + get isAlive(): boolean; + /** + * @en If the particle system is currently emitting particles. + * @zh 粒子系统是否正在发射粒子。 + */ + get isEmitting(): boolean; + /** + * @en If the particle system is currently playing. + * @zh 粒子系统是否正在播放。 + */ + get isPlaying(): boolean; + /** + * @en If the particle system is currently paused. + * @zh 粒子系统是否已暂停。 + */ + get isPaused(): boolean; + /** + * @en The lifectime mode of particles. 0: Constant, 1: Gradient, 2: Random Between Two Constants, 3: Random Between Two Gradients. + * @zh 粒子的生命周期模式。0: 固定时间, 1: 渐变时间, 2: 两个固定值之间的随机插值, 3: 两个渐变时间的随机插值。 + */ + get startLifetimeType(): number; + set startLifetimeType(value: number); + /** + * @en The lifecycle mode of particles: Constant(0), unit is seconds. + * @zh 粒子生命周期模式:固定时间(模式0),单位为秒。 + */ + get startLifetimeConstant(): number; + set startLifetimeConstant(value: number); + /** + * @en The lifecycle mode of particles: Gradient(1), unit is seconds. + * @zh 粒子生命周期模式:渐变时间(模式1),单位为秒。 + */ + get startLifeTimeGradient(): GradientDataNumber; + set startLifeTimeGradient(value: GradientDataNumber); + /** + * @en The minimum particle lifecycle, the lifecycle mode of particles: Random Between Two Constants(2), unit is seconds. + * @zh 最小粒子生命周期,粒子生命周期模式: 两个固定值之间的随机插值(模式2),单位为秒。 + */ + get startLifetimeConstantMin(): number; + set startLifetimeConstantMin(value: number); + /** + * @en The maximum particle lifecycle, the lifecycle mode of particles: Random Between Two Constants(2), unit is seconds. + * @zh 最大粒子生命周期,粒子生命周期模式: 两个固定值之间的随机插值(模式2),单位为秒。 + */ + get startLifetimeConstantMax(): number; + set startLifetimeConstantMax(value: number); + /** + * @en Minimum value of gradient time, the lifecycle mode of particles: Random Between Two Gradients(3), unit is seconds. + * @zh 渐变时间的最小值,粒子生命周期模式: 两个渐变时间的随机插值(模式3),单位为秒。 + */ + get startLifeTimeGradientMin(): GradientDataNumber; + set startLifeTimeGradientMin(value: GradientDataNumber); + /** + * @en Maximum value of gradient time, the lifecycle mode of particles: Random Between Two Gradients(3), unit is seconds. + * @zh 渐变时间的最大值,粒子生命周期模式: 两个渐变时间的随机插值(模式3),单位为秒。 + */ + get startLifeTimeGradientMax(): GradientDataNumber; + set startLifeTimeGradientMax(value: GradientDataNumber); + /** + * @en The velocity over lifetime. Note: If you modify certain properties of this value, you need to reassign this property for it to take effect. + * @zh 生命周期速度。注意:如修改该值的某些属性,需重新赋值此属性才可生效。 + */ + get velocityOverLifetime(): VelocityOverLifetime; + set velocityOverLifetime(value: VelocityOverLifetime); + /** + * @en The color over lifetime. Note: If you modify certain properties of this value, you need to reassign this property for it to take effect. + * @zh 生命周期颜色。注意:如修改该值的某些属性,需重新赋值此属性才可生效。 + */ + get colorOverLifetime(): ColorOverLifetime; + set colorOverLifetime(value: ColorOverLifetime); + /** + * @en The size over lifetime. Note: If you modify certain properties of this value, you need to reassign this property for it to take effect. + * @zh 生命周期尺寸。注意:如修改该值的某些属性,需重新赋值此属性才可生效。 + */ + get sizeOverLifetime(): SizeOverLifetime; + set sizeOverLifetime(value: SizeOverLifetime); + /** + * @en The rotation over lifetime. Note: If you modify certain properties of this value, you need to reassign this property for it to take effect. + * @zh 生命周期旋转。注意:如修改该值的某些属性,需重新赋值此属性才可生效。 + */ + get rotationOverLifetime(): RotationOverLifetime; + set rotationOverLifetime(value: RotationOverLifetime); + /** + * @en The texture sheet animation over lifetime. Note: If you modify certain properties of this value, you need to reassign this property for it to take effect. + * @zh 生命周期纹理动画。注意:如修改该值的某些属性,需重新赋值此属性才可生效。 + */ + get textureSheetAnimation(): TextureSheetAnimation; + set textureSheetAnimation(value: TextureSheetAnimation); + /** + * @en Creates a new instance of the ParticleSystem class. + * @param render The ShurikenParticleRenderer associated with this particle system. + * @param meshTopology The topology used by the mesh, default is MeshTopology.Triangles. + * @param drawType The draw type used for rendering, default is DrawType.DrawElement. + * @zh 创建ShuriknParticleSystem类的新实例。 + * @param render 与该粒子系统关联的 ShurikenParticleRenderer。 + * @param meshTopology 网格使用的拓扑结构,默认为 MeshTopology.Triangles。 + * @param drawType 用于渲染的绘制类型,默认为 DrawType.DrawElement。 + */ + constructor(render: ShurikenParticleRenderer, meshTopology?: MeshTopology, drawType?: DrawType); + /** + * @en Custom bounds + * @zh 自定义 包围盒 + */ + get customBounds(): Bounds; + set customBounds(value: Bounds); + /** + * @en Emits a particle. + * @zh 发射一个粒子。 + */ + emit(time: number, elapsedTime: number): boolean; + /** + * @en Add a new particle to the particle system. + * @param position The initial position of the particle. + * @param direction The initial direction of the particle. + * @param time The current simulation time. + * @returns Whether the particle was successfully added. + * @zh 向粒子系统添加一个新粒子。 + * @param position 粒子的初始位置。 + * @param direction 粒子的初始方向。 + * @param time 当前的模拟时间。 + * @returns 粒子是否成功添加。 + */ + addParticle(position: Vector3, direction: Vector3, time: number, elapsedTime: number): boolean; + /** + * @en Add new particles to the vertex buffer. + * @zh 将新粒子添加到顶点缓冲区。 + */ + addNewParticlesToVertexBuffer(): void; + /** + * @inheritDoc + * @override + */ + _getType(): number; + /** + * @en Start emitting particles + * @zh 开始发射粒子。 + */ + play(): void; + /** + * @en Pause emitting particles + * @zh 暂停发射粒子。 + */ + pause(): void; + /** + * @en Advance the particle simulation by a specified time and pause playback. + * @param time The time to advance the simulation. If restart is true, the particle playback time will be reset to zero before updating progress. + * @param restart Whether to reset the playback state. Default is true. + * @zh 通过指定时间增加粒子播放进度,并暂停播放。 + * @param time 进度时间。如果restart为true,粒子播放时间会归零后再更新进度。 + * @param restart 是否重置播放状态。默认为true。 + */ + simulate(time: number, restart?: boolean): void; + /** + * @en Stop emitting particles. + * @zh 停止发射粒子。 + */ + stop(): void; + /** + * @en Clones to a target object. + * @param destObject The target object to clone to. + * @zh 克隆到目标对象。 + * @param destObject 要克隆到的目标对象。 + */ + cloneTo(destObject: ShurikenParticleSystem): void; + /** + * @en Clone. + * @returns Clone copy. + * @zh 克隆。 + * @returns 克隆副本。 + */ + clone(): any; + } + /** + * @en The `PixelLineData` class is used to represent line data. + * @zh `PixelLineData` 类用于表示线数据。 + */ + class PixelLineData { + /** + * @en The starting position of the line. + * @zh 线的起始位置。 + */ + startPosition: Vector3; + /** + * @en The ending position of the line. + * @zh 线的结束位置。 + */ + endPosition: Vector3; + /** + * @en The color at the start of the line. + * @zh 线的起始颜色。 + */ + startColor: Color; + /** + * @en The color at the end of the line. + * @zh 线的结束颜色。 + */ + endColor: Color; + /** + * @en Line start normal + * @zh 线开始法线 + */ + startNormal: Vector3; + /** + * @en Line end normal + * @zh 线结束法线 + */ + endNormal: Vector3; + /** + * @en Clones to a target object. + * @param destObject The target object to clone to. + * @zh 克隆到目标对象。 + * @param destObject 要克隆到的目标对象。 + */ + cloneTo(destObject: PixelLineData): void; + } + /** + * @en The `PixelLineFilter` class is used for line filtering. + * @zh `PixelLineFilter` 类用于线过滤器。 + */ + class PixelLineFilter extends GeometryElement { + /** + * @ignore + * @en initialize pixeLineFilter instance. + * @param owner The rendering sprite node. + * @param maxLineCount The maximum line count. + * @zh 初始化pixeLineFilter实例。 + * @param owner 渲染精灵节点。 + * @param maxLineCount 最大线段数量。 + */ + constructor(owner: PixelLineRenderer, maxLineCount: number); + /** + * @en Get the line segment data. + * @param index The index of the line segment. + * @param out The output PixelLineData object. + * @zh 获取线段数据。 + * @param index 线段的索引。 + * @param out 输出的PixelLineData对象。 + */ + _getLineData(index: number, out: PixelLineData): void; + /** + * @inheritDoc + * @override + * @en Destroy the PixelLineFilter instance. + * @zh 销毁PixelLineFilter实例。 + */ + destroy(): void; + } + /** + * @en The PixelLineMaterial class is used to implement pixel line material. + * @zh PixelLineMaterial 类用于实现像素线材质。 + */ + class PixelLineMaterial extends Material { + /** + * @en Default material, no modification allowed + * @zh 默认材质,禁止修改 + */ + static defaultMaterial: Material; + /** + * @en The color of the pixel line. + * @zh 像素线的颜色。 + */ + get color(): Vector4; + set color(value: Vector4); + /** + * @ignore + * @en Initialize PixelLineMaterial instance. + * @zh 初始化PixelLineMaterial实例 + */ + constructor(); + } + /** + * @en PixelLineRenderer class for line rendering. + * @zh PixelLineRenderer 类用于线渲染器。 + */ + class PixelLineRenderer extends BaseRender { + /** @private 是否调用active */ + private _isRenderActive; + /** @private 是否加入渲染队列*/ + private _isInRenders; + private _needUpdatelines; + /** + * @ignore + * @en Initialize PixelLineRenderer instance. + * @zh 初始化PixelLineRenderer实例。 + */ + constructor(); + /** + * @en The bounds of the line renderer. + * @zh 线渲染器的包围盒。 + */ + get bounds(): Bounds; + private _lines; + /** + * @en The line segment data. + * @zh 线段数据。 + */ + get pixelLinesDatas(): PixelLineData[]; + set pixelLinesDatas(value: PixelLineData[]); + /** + * @en The maximum number of lines. + * @zh 最大线数量。 + */ + get maxLineCount(): number; + set maxLineCount(value: number); + /** + * @en The current number of lines. + * @zh 当前线数量。 + */ + get lineCount(): number; + protected _createBaseRenderNode(): IMeshRenderNode; + /** + * @en Update the render context. + * @param context The render context. + * @zh 更新渲染上下文。 + * @param context 渲染上下文。 + */ + renderUpdate(context: RenderContext3D): void; + /** + * @en Add a line. + * @param startPosition Initial point position + * @param endPosition End point position + * @param startColor Initial point color + * @param endColor End point color + * @zh 增加一条线。 + * @param startPosition 初始点位置 + * @param endPosition 结束点位置 + * @param startColor 初始点颜色 + * @param endColor 结束点颜色 + */ + addLine(startPosition: Vector3, endPosition: Vector3, startColor: Color, endColor: Color): void; + /** + * @en Add a line with normal. + * @param startPosition Initial point position + * @param endPosition End point position + * @param startColor Initial point color + * @param endColor End point color + * @param startNormal Initial point normal + * @param endNormal End point normal + * @zh 增加一条带有法线的线。 + * @param startPosition 初始点位置 + * @param endPosition 结束点位置 + * @param startColor 初始点颜色 + * @param endColor 结束点颜色 + * @param startNormal 初始点法线 + * @param endNormal 结束点法线 + */ + addLineWithNormal(startPosition: Vector3, endPosition: Vector3, startColor: Color, endColor: Color, startNormal: Vector3, endNormal: Vector3): void; + /** + * @en Add multiple line segments. + * @param lines Line segment data + * @zh 添加多条线段。 + * @param lines 线段数据 + */ + addLines(lines: PixelLineData[]): void; + /** + * @en Remove a line segment. + * @param index Index of the line to remove + * @zh 移除一条线段。 + * @param index 线段索引。 + */ + removeLine(index: number): void; + /** + * @en Update a line. + * @param index Index of the line to update + * @param startPosition Initial point position + * @param endPosition End point position + * @param startColor Initial point color + * @param endColor End point color + * @zh 更新线。 + * @param index 线段索引。 + * @param startPosition 初始点位置。 + * @param endPosition 结束点位置。 + * @param startColor 初始点颜色。 + * @param endColor 结束点颜色。 + */ + setLine(index: number, startPosition: Vector3, endPosition: Vector3, startColor: Color, endColor: Color): void; + /** + * @en Update a line with normal. + * @param index Index of the line to update + * @param startPosition Initial point position + * @param endPosition End point position + * @param startColor Initial point color + * @param endColor End point color + * @param startNormal Initial point normal + * @param endNormal End point normal + * @zh 更新带有法线的线。 + * @param index 线段索引。 + * @param startPosition 初始点位置。 + * @param endPosition 结束点位置。 + * @param startColor 初始点颜色。 + * @param endColor 结束点颜色。 + * @param startNormal 初始点法线。 + * @param endNormal 结束点法线。 + */ + setLineWithNormal(index: number, startPosition: Vector3, endPosition: Vector3, startColor: Color, endColor: Color, startNormal: Vector3, endNormal: Vector3): void; + /** + * @en Get line segment data. + * @param index Index of the line to get + * @param out Output line segment data + * @zh 获取线段数据。 + * @param index 线段索引。 + * @param out 线段数据。 + */ + getLine(index: number, out: PixelLineData): void; + /** + * @en Clear all line segments. + * @zh 清除所有线段。 + */ + clear(): void; + } + /** + * @en PixelLineSprite3D class is used for pixel line rendering sprites. + * @zh PixelLineSprite3D 类用于像素线渲染精灵。 + */ + class PixelLineSprite3D extends RenderableSprite3D { + _render: PixelLineRenderer; + /** @private 是否调用active */ + private _isRenderActive; + /** @private 是否加入渲染队列*/ + private _isInRenders; + /** + * @en The maximum line count. + * @zh 最大线数量。 + */ + get maxLineCount(): number; + set maxLineCount(value: number); + /** + * @en The current line count. + * @zh 当前线数量。 + */ + get lineCount(): number; + /** + * @en The pixel line renderer. + * @zh 像素线渲染器。 + */ + get pixelLineRenderer(): PixelLineRenderer; + /** + * @ignore + * @en Initaialize pixelLineSprite3D instance. + * @param maxCount Maximum number of line segments. + * @param name Name of the instance. + * @zh 初始化PixeLineSprite3D实例。 + * @param maxCount 最大线段数量。 + * @param name 实例的名称。 + */ + constructor(maxCount?: number, name?: string); + /** + * @en Add a single line. + * @param startPosition Start position of the line. + * @param endPosition End position of the line. + * @param startColor Start color of the line. + * @param endColor End color of the line. + * @zh 增加一条线。 + * @param startPosition 线段起点位置。 + * @param endPosition 线段终点位置。 + * @param startColor 线段起点颜色。 + * @param endColor 线段终点颜色。 + */ + addLine(startPosition: Vector3, endPosition: Vector3, startColor: Color, endColor: Color): void; + /** + * @en Add multiple line segments. + * @param lines Array of line segment data. + * @zh 添加多条线段。 + * @param lines 线段数据 + */ + addLines(lines: PixelLineData[]): void; + /** + * @en Remove a line segment. + * @param index Index of the line to remove. + * @zh 移除一条线段。 + * @param index 要移除的线段索引。 + */ + removeLine(index: number): void; + /** + * @en Update a line segment. + * @param index Index of the line to update. + * @param startPosition New start position of the line. + * @param endPosition New end position of the line. + * @param startColor - New start color of the line. + * @param endColor New end color of the line. + * @zh 更新一条线段。 + * @param index 要更新的线段索引。 + * @param startPosition 新的线段起点位置。 + * @param endPosition 新的线段终点位置。 + * @param startColor 新的线段起点颜色。 + * @param endColor 新的线段终点颜色。 + */ + setLine(index: number, startPosition: Vector3, endPosition: Vector3, startColor: Color, endColor: Color): void; + /** + * @en Get line segment data. + * @param index Index of the line to get. + * @param out Output object to store the line data. + * @zh 获取线段数据。 + * @param index 要获取的线段索引。 + * @param out 输出对象,用于存储线段数据。 + */ + getLine(index: number, out: PixelLineData): void; + /** + * @en Clear all line segments. + * @zh 清除所有线段。 + */ + clear(): void; + } + /** + * @en The `QuaternionKeyframe` class is used to create quaternion keyframe instances. + * @zh `QuaternionKeyframe` 类用于创建四元数关键帧实例。 + */ + class QuaternionKeyframe extends Keyframe { + /** + * @en In-tangent of the keyframe + * @zh 内切线 + */ + inTangent: Vector4; + /** + * @en Out-tangent of the keyframe + * @zh 外切线 + */ + outTangent: Vector4; + /** + * @en Frame data (quaternion value) + * @zh 帧数据(四元数值) + */ + value: Quaternion; + /** + * @en In-weight of the keyframe + * @zh 内权重 + */ + inWeight: Vector4; + /** + * @en Out-weight of the keyframe + * @zh 外权重 + */ + outWeight: Vector4; + /** + * @en Weight mode of the keyframe + * @zh 权重模式 + */ + weightedMode: Vector4; + /** + * @en Creates an instance of `QuaternionKeyframe`. + * @param weightMode Whether to enable weight mode + * @zh 创建一个 `QuaternionKeyframe` 的实例。 + * @param weightMode 是否启用权重模式 + */ + constructor(weightMode?: boolean); + /** + * @override + * @en Clone the QuaternionKeyframe. + * @param dest The target object to clone to + * @zh 克隆。 + * @param dest 克隆源。 + */ + cloneTo(dest: QuaternionKeyframe): void; + } + enum RenderBitFlag { + RenderBitFlag_CullFlag = 0, + RenderBitFlag_Batch = 1, + RenderBitFlag_Editor = 2, + RenderBitFlag_InstanceBatch = 3, + RenderBitFlag_VertexMergeBatch = 4 + } + enum IrradianceMode { + LightMap = 0, + VolumetricGI = 1, + Common = 2 + } + /** + * @en The `BaseRender` class is the parent class for renderers and is an abstract class that should not be instantiated. + * @zh `BaseRender` 类是渲染器的父类,是一个抽象类,不允许实例化。 + */ + class BaseRender extends Component { + /** + * @en Initialize the BaseRender class. + * @zh 初始化 BaseRender 类。 + */ + static __init__(): void; + /** + * @en Change vertex shader definitions based on mesh changes. + * @param oldMesh The old mesh. + * @param mesh The new mesh. + * @param defineDatas The shader data containing definitions. + * @zh 根据网格变化更改顶点着色器宏定义。 + * @param oldMesh 旧的网格。 + * @param mesh 新的网格。 + * @param defineDatas 包含着色器定义的着色器数据。 + */ + static changeVertexDefine(oldMesh: Mesh, mesh: Mesh, defineDatas: ShaderData): void; + /** + * @en Macro definition initialization + * @zh 宏定义初始化 + */ + static shaderValueInit(): void; + /**@interface */ + _receiveShadow: boolean; + _renderElements: RenderElement[]; + /** + * @en Whether to enable the renderer. + * @zh 是否启用。 + */ + get enabled(): boolean; + set enabled(value: boolean); + /** + * @en The sorting fudge value. + * @zh 排序矫正值。 + */ + get sortingFudge(): number; + set sortingFudge(value: number); + /** + * @en The render bit flag of the render node. + * @zh 渲染节点的渲染禁用位。 + */ + get renderbitFlag(): number; + /** + * @en Whether the bounds have changed. + * @zh 包围盒是否更新。 + */ + get boundsChange(): boolean; + set boundsChange(value: boolean); + /** + * 渲染数据 + */ + /** + * @en The render node. + * @zh 渲染节点。 + */ + get renderNode(): IBaseRenderNode; + /** + * @en The distance used for sorting. + * @zh 排序距离。 + */ + get distanceForSort(): number; + set distanceForSort(value: number); + /** + * @en The Geometry Bounds. + * If this bounds is set, the render bounding box will be updated based on geometryBounds and transform, and the native layer will be sunk. + * @zh 几何包围盒, + * 如果设置了此包围盒,渲染包围盒会根据 geometryBounds 和变换来更新,并且原生层会下沉。 + */ + get geometryBounds(): Bounds; + set geometryBounds(value: Bounds); + /** + * @en The lightmap index. + * @zh 光照贴图的索引。 + */ + get lightmapIndex(): number; + set lightmapIndex(value: number); + /** + * @en The irradient mode. + * @zh 间接光照功能。 + */ + get irradientMode(): IrradianceMode; + /** + * @en The lightmap scale and offset. + * @zh 光照贴图的缩放和偏移。 + */ + get lightmapScaleOffset(): Vector4; + set lightmapScaleOffset(value: Vector4); + /** + * @en The first material. + * @zh 第一个材质。 + */ + get sharedMaterial(): Material; + set sharedMaterial(value: Material); + /** + * @en All shared materials. + * @zh 所有渲染材质。 + */ + get sharedMaterials(): Material[]; + set sharedMaterials(value: Material[]); + /** + * @en The bounds. Read-only, do not modify its value. + * @zh 包围盒。只读,不允许修改其值。 + */ + get bounds(): Bounds; + /** + * @en Whether the object receives shadows. + * @zh 是否接收阴影属性。 + */ + get receiveShadow(): boolean; + set receiveShadow(value: boolean); + /** + * @en Whether the object casts shadows. + * @zh 是否产生阴影。 + */ + get castShadow(): boolean; + set castShadow(value: boolean); + /** + * @en The reflection mode. + * @zh 反射模式。 + */ + get reflectionMode(): ReflectionProbeMode; + set reflectionMode(value: ReflectionProbeMode); + /** + * @en The volume light probe. + * @zh 体积光探针。 + */ + get volume(): Volume; + set volume(value: Volume); + set probReflection(value: ReflectionProbe); + /** + * @en The light probe. + * @zh 光照探针。 + */ + get lightProbe(): VolumetricGI; + set lightProbe(volumetricGI: VolumetricGI); + /** + * @ignore + * @en consructor of BaseRender. + * @zh 构造函数,初始化BaseRender。 + */ + constructor(); + /** + * @en The function called by the bounding box calculation for each frame. + * @zh 每一帧计算包围盒会调用的函数 + */ + _calculateBoundingBox?(): void; + /** + * @en Update the calling function of SpriteShaderData before rendering each frame. + * @param context3D The 3D rendering context. + * @zh 每一帧渲染前更新SpriteShaderData的调用函数。 + * @param context3D 3D渲染上下文。 + */ + _renderUpdate?(context3D: IRenderContext3D): void; + /** + * set BaseRenderElement + * @param mesh + */ + protected _setRenderElements(): void; + /** + * @protected + * @param context + */ + renderUpdate(context: RenderContext3D): void; + protected _statAdd(): void; + protected _statRemove(): void; + /** + * @en Sets the rendering flag, where each bit represents a different culling reason, 1 indicates LOD culling. + * @param flag The flag to set, refer to RenderBitFlag for related flags or define custom bit flags. + * @param pass Whether to set the flag. + * @zh 设置渲染标志,每一位都代表不同的淘汰原因,1表示LOD淘汰。 + * @param flag 标记,可以查RenderBitFlag相关,也可以自定义标签位 + * @param pass 设置标签值 + */ + setRenderbitFlag(flag: number, pass: boolean): void; + /** + * @deprecated 请使用shareMaterial接口 + * 返回第一个实例材质,第一次使用会拷贝实例对象。 + */ + get material(): Material; + set material(value: Material); + set materials(value: Material[]); + } + /** + * @en Class used for creating instructions to output from a render source to a render target. + * @zh 类用于创建从渲染源输出到渲染目标的指令。 + */ + class BlitFrameBufferCMD { + /** + * @en Create a render command set. + * @param source The source texture. + * @param dest The destination render texture. + * @param viewport The viewport for rendering. + * @param offsetScale The offset and scale vector. Default is null. + * @param shader The shader to use. Default is null. + * @param shaderData The shader data to use. Default is null. + * @param subShader The sub-shader index. Default is 0. + * @returns The created BlitFrameBufferCMD instance. + * @zh 创建渲染命令集。 + * @param source 源纹理。 + * @param dest 目标渲染纹理。 + * @param viewport 渲染视口。 + * @param offsetScale 偏移和缩放向量。默认为 null。 + * @param shader 要使用的着色器。默认为 null。 + * @param shaderData 要使用的着色器数据。默认为 null。 + * @param subShader 子着色器索引。默认为 0。 + * @returns 创建的 BlitFrameBufferCMD 实例。 + */ + static create(source: BaseTexture, dest: RenderTexture, viewport: Viewport, offsetScale?: Vector4, shader?: Shader3D, shaderData?: ShaderData, subShader?: number): BlitFrameBufferCMD; + constructor(); + /** + * @en The shader data for the command. + * @zh 命令的着色器数据。 + */ + set shaderData(value: ShaderData); + /** + * @en Set the shader, sub-shader, and shader data for the command. + * @param shader The shader to set. If null, uses the default screen shader. + * @param subShader The sub-shader index. Default is 0. + * @param shaderData The shader data to set. + * @zh 设置命令的着色器、子着色器和着色器数据。 + * @param shader 要设置的着色器。如果为 null,则使用默认屏幕着色器。 + * @param subShader 子着色器索引。默认为 0。 + * @param shaderData 要设置的着色器数据。 + */ + setshader(shader: Shader3D, subShader: number, shaderData: ShaderData): void; + /** + * @inheritDoc + * @override + * @en Execute the render command. + * @zh 执行渲染命令。 + */ + run(): void; + /** + * @inheritDoc + * @override + * @en Recycle the command instance. + * @zh 回收命令实例。 + */ + recover(): void; + } + /** + * @en The BlitScreenQuadCMD class is used to create render the source texture to the destination render texture by using the full screen quad command. + * @zh BlitScreenQuadCMD 类用于创建通过全屏四边形将源纹理渲染到目标渲染纹理的指令 + */ + class BlitScreenQuadCMD extends Command { + /** + * @en Create command stream + * @param source The source texture. If set to null, it will use the default RenderTexture from the Camera process. + * @param dest The destination texture. If set to null, it will use the default rendering target of the camera. + * @param offsetScale Offset scaling. + * @param shader The shader to use for rendering. + * @param shaderData The shader data for rendering. + * @param subShader The subShader index. Default is 0. + * @param screenType The screen type for rendering. + * @param commandbuffer The command buffer to use. + * @zh 创建命令流 + * @param source 原始贴图 如果设置为null 将会使用默认的Camera流程中的原RenderTexture + * @param dest 目标贴图 如果设置为null,将会使用默认的camera渲染目标 + * @param offsetScale 偏移缩放 + * @param shader 用于渲染的着色器。。 + * @param shaderData 用于渲染的着色器数据。 + * @param subShader subshader的节点 + * @param screenType 渲染的屏幕类型 + * @param commandbuffer 命令缓冲 + */ + static create(source: BaseTexture, dest: RenderTexture, offsetScale?: Vector4, shader?: Shader3D, shaderData?: ShaderData, subShader?: number, screenType?: number, commandbuffer?: CommandBuffer): BlitScreenQuadCMD; + constructor(); + /** + * @en The offset and scale for rendering. + * @zh 渲染的偏移和缩放。 + */ + get offsetScale(): Vector4; + set offsetScale(value: Vector4); + /** + * @en The destination render texture. + * @zh 目标渲染纹理。 + */ + get dest(): RenderTexture; + set dest(value: RenderTexture); + /** + * @en The shader data for rendering. + * @zh 渲染的着色器数据。 + */ + set shaderData(value: ShaderData); + /** + * @inheritDoc + * @override + * @en Execute the command. + * @zh 执行命令。 + */ + run(): void; + /** + * @inheritDoc + * @override + * @en Recover the command for reuse. + * @zh 回收命令以重复使用。 + */ + recover(): void; + /** + * @en Destroy the command and release resources. + * @zh 销毁命令并释放资源。 + */ + destroy(): void; + } + /** + * @en The `Command` class is used to create commands. + * @zh `Command` 类用于创建指令。 + */ + class Command { + /**@ignore */ + constructor(); + /** + * @en Organizes rendering commands. + * @zh 组织渲染指令。 + */ + run?(): void; + /** + * @en Recycles the rendering command. + * @zh 回收渲染指令。 + */ + recover(): void; + } + /** + * @en The `CommandBuffer` Class used to create command buffer + * @zh `CommandBuffer` 类用于创建命令缓冲区。 + */ + class CommandBuffer { + static instance: CommandBuffer; + /** @ignore */ + constructor(name?: string, shadowCaster?: boolean); + /** + * @en The name of the command buffer. + * @zh 命令缓冲区的名称。 + */ + get name(): string; + /** + * @en Whether the command buffer casts shadows. + * @zh 命令缓冲区是否投射阴影。 + */ + get casterShadow(): boolean; + /** + * @en The rendering context for the command buffer. + * @zh 命令缓冲区的渲染上下文。 + */ + get context(): RenderContext3D; + set context(value: RenderContext3D); + /** + * @en Executes all rendering commands. + * @zh 调用所有渲染指令。 + */ + _apply(render?: boolean): void; + /** + * @en Executes a single command from the command buffer. + * @zh 从命令缓冲区执行单个命令。 + */ + _applyOne(): boolean; + /** + * @en Gets the number of commands contained in the command buffer + * @zh 获取命令缓冲区包含的命令数量 + */ + getCommandsSize(): number; + /** + * @en Sets the texture data for a shader. + * @param shaderData The collection of shader data. + * @param nameID The Uniform ID for the texture. + * @param source The source of the texture. + * @zh 设置着色器的纹理数据。 + * @param shaderData 着色器数据集合。 + * @param nameID 纹理的 Uniform ID。 + * @param source 纹理源。 + */ + setShaderDataTexture(shaderData: ShaderData, nameID: number, source: BaseTexture): void; + /** + * @en Sets the global texture data. + * @param nameID The Uniform ID for the texture. + * @param source The source of the texture. + * @zh 设置全局纹理数据。 + * @param nameID 纹理的 Uniform ID。 + * @param source 纹理源。 + */ + setGlobalTexture(nameID: number, source: BaseTexture): void; + /** + * @en Sets the color data for a shader. + * @param shaderData The collection of shader data. + * @param nameID The ID of the data. + * @param value The color value. + * @zh 设置着色器的颜色数据。 + * @param shaderData 着色器数据集合。 + * @param nameID 数据 ID。 + * @param value 颜色值。 + */ + setShaderDataColor(shaderData: ShaderData, nameID: number, value: Color): void; + /** + * @en Sets the global color. + * @param nameID The ID of the data. + * @param source The color data to be set. + * @zh 设置全局颜色。 + * @param nameID 数据ID。 + * @param source 要设置的颜色数据。 + */ + setGlobalColor(nameID: number, source: Color): void; + /** + * @en Sets the Vector4 data for a shader. + * @param shaderData The collection of shader data. + * @param nameID The ID of the data. + * @param value The Vector4 data to be set. + * @zh 设置着色器的 Vector4 数据。 + * @param shaderData 着色器数据集合。 + * @param nameID 数据ID + * @param value 要设置的Vector4数据。 + */ + setShaderDataVector(shaderData: ShaderData, nameID: number, value: Vector4): void; + /** + * @en Sets the global Vector4 data. + * @param nameID The ID of the data. + * @param source The Vector4 data to be set. + * @zh 设置全局 Vector4 数据。 + * @param nameID 数据ID + * @param source 要设置的Vector4数据。 + */ + setGlobalVector(nameID: number, source: Vector4): void; + /** + * @en Sets the Vector3 data for a shader. + * @param shaderData The collection of shader data. + * @param nameID The ID of the data. + * @param value The Vector3 data to be set. + * @zh 设置着色器的 Vector3 数据。 + * @param shaderData 着色器数据集合。 + * @param nameID 数据ID + * @param value 要设置的Vector3数据。 + */ + setShaderDataVector3(shaderData: ShaderData, nameID: number, value: Vector3): void; + /** + * @en Sets the global Vector3 data. + * @param nameID The ID of the data. + * @param source The Vector3 data to be set. + * @zh 设置全局 Vector3 数据。 + * @param nameID 数据ID + * @param source 要设置的Vector3数据。 + */ + setGlobalVector3(nameID: number, source: Vector3): void; + /** + * @en Sets the Vector2 data for a shader. + * @param shaderData The collection of shader data. + * @param nameID The ID of the data. + * @param value The Vector2 data to be set. + * @zh 设置着色器的 Vector2 数据。 + * @param shaderData 着色器数据集合。 + * @param nameID 数据ID + * @param value 要设置的Vector2数据。 + */ + setShaderDataVector2(shaderData: ShaderData, nameID: number, value: Vector2): void; + /** + * @en Sets the global Vector2 data. + * @param nameID The ID of the data. + * @param source The Vector2 data to be set. + * @zh 设置全局 Vector2 数据。 + * @param nameID 数据ID + * @param source 要设置的Vector2数据。 + */ + setGlobalVector2(nameID: number, source: Vector2): void; + /** + * @en Sets the Number property for a shader. + * @param shaderData The collection of shader data. + * @param nameID The ID of the data. + * @param value The Number data to be set. + * @zh 设置着色器的 Number 属性。 + * @param shaderData 着色器数据集合。 + * @param nameID 数据ID + * @param value 要设置的Number数据。 + */ + setShaderDataNumber(shaderData: ShaderData, nameID: number, value: number): void; + /** + * @en Sets the global Number property. + * @param nameID The ID of the data. + * @param source The Number data to be set. + * @zh 设置全局 Number 属性。 + * @param nameID 数据ID + * @param source 要设置的Number数据。 + */ + setGlobalNumber(nameID: number, source: number): void; + /** + * @en Sets the Int property for a shader. + * @param shaderData The collection of shader data. + * @param nameID The ID of the data. + * @param value The Int data to be set. + * @zh 设置着色器的 Int 属性。 + * @param shaderData 着色器数据集合。 + * @param nameID 数据ID + * @param value 要设置的Int数据。 + */ + setShaderDataInt(shaderData: ShaderData, nameID: number, value: number): void; + /** + * @en Sets the global integer property. + * @param nameID The ID of the data. + * @param source The data to be set. + * @zh 设置全局的整型属性。 + * @param nameID 数据ID + * @param source 要设置的数据。 + */ + setGlobalInt(nameID: number, source: number): void; + /** + * @en Sets the Matrix property for a shader. + * @param shaderData The collection of shader data. + * @param nameID The ID of the data. + * @param value The Matrix data to be set. + * @zh 设置着色器的矩阵属性。 + * @param shaderData 着色器数据集合。 + * @param nameID 数据ID。 + * @param value 要设置的矩阵数据。 + */ + setShaderDataMatrix(shaderData: ShaderData, nameID: number, value: Matrix4x4): void; + /** + * @en Sets a shader define. + * @param shaderData The collection of shader data. + * @param define The shader define to be set. + * @param value A boolean value indicating whether to add (true) or remove (false) the define. + * @zh 设置着色器的定义。 + * @param shaderData 着色器数据集合。 + * @param define 要设置的着色器定义。 + * @param value 布尔值,表示是添加(true)还是移除(false)该定义。 + */ + setShaderDefine(shaderData: ShaderData, define: ShaderDefine, value: boolean): void; + /** + * @en Sets the global Matrix property. + * @param nameID The ID of the data. + * @param source The Matrix data to be set. + * @zh 设置全局的矩阵属性。 + * @param nameID 数据ID + * @param source 要设置的矩阵数据。 + */ + setGlobalMatrix(nameID: number, source: number): void; + /** + * @en Adds a fullscreen quad rendering command to the command buffer. + * @param source The source texture. If null, the previous render result is used as the original texture. + * @param dest The destination texture. If null, it renders directly to the final canvas. + * @param offsetScale Offset scaling + * @param shader The shader. If null, the internal copy shader is used without any processing. + * @param shaderData The shader data. If null, only the sourceTexture is accepted. + * @param subShader The subShader index, defaults to 0. + * @zh 向命令缓冲区添加一条通过全屏四边形渲染命令。 + * @param source 源纹理。如果为null,则使用之前的渲染结果作为原纹理。 + * @param dest 目标纹理。如果为null,直接渲染到最终画布。 + * @param offsetScale 偏移缩放。 + * @param shader 着色器。如果为null,则使用内部拷贝着色器,不进行任何处理。 + * @param shaderData 着色器数据。如果为null,只接受sourceTexture。 + * @param subShader SubShader索引,默认值为0。 + */ + blitScreenQuad(source: BaseTexture, dest: RenderTexture, offsetScale?: Vector4, shader?: Shader3D, shaderData?: ShaderData, subShader?: number): void; + /** + * @en Add a command to render the source texture to the target texture through a full screen quadrilateral. + * @param source The source texture. If null, the previous render result is used as the original texture. + * @param dest The destination texture. If null, it renders directly to the final canvas. + * @param offsetScale Offset scaling. + * @param material The material. + * @param subShader The shader index. + * @zh 添加一条通过全屏四边形将源纹理渲染到目标渲染纹理指令。 + * @param source 源纹理。如果为null,则使用之前的渲染结果作为原纹理。 + * @param dest 目标纹理。如果为null,直接渲染到最终画布。 + * @param offsetScale 偏移缩放。 + * @param material 材质。 + * @param subShader Shader索引。 + */ + blitScreenQuadByMaterial(source: BaseTexture, dest: RenderTexture, offsetScale?: Vector4, material?: Material, subShader?: number): void; + /** + * @en Add a command to render the source texture to the target texture through full screen triangles. + * @param source The source texture. + * @param dest The destination texture. + * @param offsetScale Offset scaling. + * @param shader The shader. If null, the internal copy shader is used without any processing. + * @param shaderData The shader data. If null, only the sourceTexture is accepted. + * @param subShader The subShader index, defaults to 0. + * @zh 添加一条通过全屏三角形将源纹理渲染到目标渲染纹理指令。 + * @param source 源纹理。 + * @param dest 目标纹理。 + * @param offsetScale 偏移缩放。 + * @param shader 着色器。如果为null,则使用内部拷贝着色器,不进行任何处理。 + * @param shaderData 着色器数据。如果为null,只接受sourceTexture。 + * @param subShader SubShader索引,默认值为0。 + */ + blitScreenTriangle(source: BaseTexture, dest: RenderTexture, offsetScale?: Vector4, shader?: Shader3D, shaderData?: ShaderData, subShader?: number): void; + /** + * @en Sets the render target for the command buffer. + * @param renderTexture The render target texture. + * @param clearColor Whether to clear the color buffer. + * @param clearDepth Whether to clear the depth buffer. + * @param backgroundColor The background color when clearing. Defaults to black. + * @param depth The depth value when clearing. Defaults to 1. + * @zh 设置命令缓冲区的渲染目标。 + * @param renderTexture 渲染目标纹理。 + * @param clearColor 是否清除颜色缓冲区。 + * @param clearDepth 是否清除深度缓冲区。 + * @param backgroundColor 清除时的背景颜色,默认为黑色。 + * @param depth 清除时的深度值,默认为1。 + */ + setRenderTarget(renderTexture: RenderTexture, clearColor: boolean, clearDepth: boolean, backgroundColor?: Color, depth?: number): void; + /** + * @en Renders a Mesh. + * @param mesh The original mesh information. + * @param matrix The world matrix of the mesh. + * @param material The material applied to the mesh. + * @param submeshIndex The index of the submesh. + * @param subShaderIndex The index of the sub-shader, generally 0. + * @zh 渲染一个网格。 + * @param mesh 原始网格信息。 + * @param matrix 网格的世界矩阵。 + * @param material 应用到网格的材质。 + * @param submeshIndex 子网格的索引。 + * @param subShaderIndex 子着色器的索引,默认为0。 + */ + drawMesh(mesh: Mesh, matrix: Matrix4x4, material: Material, submeshIndex: number, subShaderIndex: number): void; + /** + * @en Renders a Render object. + * @param render The renderer object to be rendered. + * @param material The material applied to the renderer. + * @param subMeshIndex The index of the sub-shader, defaults to 0. + * @zh 渲染一个渲染对象。 + * @param render 要渲染的渲染器对象。 + * @param material 应用到渲染器的材质。 + * @param subMeshIndex 子着色器的索引,默认为0。 + */ + drawRender(render: BaseRender, material: Material, subMeshIndex?: number): void; + /** + * @en Renders a RenderElement. + * @param renderElement The RenderElement to be rendered. + * @zh 渲染一个渲染元素。 + * @param renderElement 要渲染的渲染元素。 + */ + drawRenderElement(renderElement: RenderElement): void; + /** + * @en Renders a Mesh using instanced rendering for dynamic batching. + * @param mesh The original mesh information. + * @param subMeshIndex The index of the mesh. + * @param matrixs An array of world matrices for rendering, describing the position of each Mesh to be rendered. If null, no world matrix buffer will be created or updated. + * @param material The material used for rendering. + * @param subShaderIndex The shader index of the rendering material. + * @param instanceProperty Custom properties for the instance. + * @param drawnums The number of instances to render. + * @zh 使用实例化渲染动态合批方式渲染网格。 + * @param mesh 原始网格信息。 + * @param subMeshIndex 网格索引。 + * @param matrixs 渲染的世界矩阵数组,描述每个网格需要渲染的位置。如果为null,则不会创建或更新世界矩阵缓冲区。 + * @param material 渲染材质。 + * @param subShaderIndex 渲染材质的着色器索引。 + * @param instanceProperty 实例的自定义属性。 + * @param drawnums 要渲染的实例数量。 + */ + drawMeshInstance(mesh: Mesh, subMeshIndex: number, matrixs: Matrix4x4[], material: Material, subShaderIndex: number, instanceProperty: MaterialInstancePropertyBlock, drawnums: number): any; + /** + * @en Adds a custom render command. + * @param command The custom command to add. + * @zh 添加一个自定义的渲染命令。 + * @param command 要添加的自定义命令。 + */ + addCustomCMD(command: Command): void; + } + /** + * @en DrawMeshInstancedCMD class for instanced mesh drawing command. + * @zh DrawMeshInstancedCMD 类,用于实例化网格绘制命令。 + */ + class DrawMeshInstancedCMD extends Command { + /** + * @en Maximum number of draw instances. + * @zh 设置最大DrawInstance数。 + */ + static maxInstanceCount: number; + constructor(); + /** + * @en The material for the command. + * @zh 命令的材质。 + */ + set material(value: Material); + /** + * @en The buffer state. + * @zh 缓冲状态。 + */ + get bufferState(): VertexBuffer3D; + /** + * @en The mesh of the command. + * @zh 命令的网格。 + */ + get mesh(): Mesh; + set mesh(value: Mesh); + /** + * @en Reset the world matrix array for DrawInstance. + * @param worldMatrixArray Array of world matrices. + * @zh 重置DrawInstance的世界矩阵数组。 + * @param worldMatrixArray 世界矩阵数组 + */ + setWorldMatrix(worldMatrixArray: Matrix4x4[]): void; + /** + * @en Reset the number of instances to draw. + * @param drawNums Number of instances to draw. + * @zh 重置渲染个数。 + * @param drawNums 渲染个数。 + */ + setDrawNums(drawNums: number): void; + /** + * @en Update the render element. + * @param renderElement The render element to update. + * @param context The render context. + * @returns The updated IRenderElement3D. + * @zh 更新渲染元素。 + * @param renderElement 要更新的渲染元素。 + * @param context 渲染上下文。 + * @return 更新后的IRenderElement3D。 + */ + renderUpdateElement(renderElement: RenderElement, context: RenderContext3D): IRenderElement3D; + /** + * @en Execute the command. + * @zh 执行命令。 + */ + run(): void; + /** + * @inheritDoc + * @override + * @en Recycle the command. + * @zh 回收命令。 + */ + recover(): void; + } + /** + * @en Represents a draw render command. + * @zh 表示一个绘制渲染命令。 + */ + class DrawRenderCMD extends Command { + /** + * @en The render object. + * @zh 渲染对象。 + */ + get render(): BaseRender; + set render(render: BaseRender); + /** + * @en The material. + * @zh 材质。 + */ + get material(): Material; + set material(value: Material); + private _subMeshIndex; + /** + * @en The sub-mesh index. + * @zh 子网格索引。 + */ + get subMeshIndex(): number; + set subMeshIndex(value: number); + constructor(); + /** + * @en Gets the render command data. + * @zh 获取渲染命令数据。 + */ + getRenderCMD(): DrawNodeCMDData; + /** + * @en Runs the command. + * @zh 运行命令。 + */ + run(): void; + /** + * @inheritDoc + * @override + * @en Recovers the render command for reuse. + * @zh 回收渲染命令以供重用。 + */ + recover(): void; + /** + * @en Destroys the render command. + * @zh 销毁渲染命令。 + */ + destroy(): void; + } + /** + * @en Represents a draw render element command. + * @zh 表示一个绘制渲染元素命令。 + */ + class DrawRenderElementCMD extends Command { + /** + * @en Creates a new instance of the command or retrieves one from the pool. + * @param renderElement The render element associated with this command. + * @returns A new or pooled instance of `DrawRenderElementCMD`. + * @zh 创建命令的新实例或从池中检索一个实例。 + * @param renderElement 与此命令关联的渲染元素。 + * @return 一个新的或从池中检索到的 `DrawRenderElementCMD` 实例。 + */ + static create(renderElement: RenderElement): DrawRenderElementCMD; + /** + * @en The render element of this command. + * @zh 此命令的渲染元素。 + */ + get renderElement(): RenderElement; + set renderElement(value: RenderElement); + constructor(); + /** + * @inheritDoc + * @override + * @en Recovers the command for reuse. + * @zh 回收命令以供重用。 + */ + recover(): void; + /** + * @en Destroys the command. + * @zh 销毁命令。 + */ + destroy(): void; + } + enum InstanceLocation { + CUSTOME0 = 12, + CUSTOME1 = 13, + CUSTOME2 = 14, + CUSTOME3 = 15 + } + /** + * @en Material instance property block. + * @zh 材质实例属性块。 + */ + class MaterialInstancePropertyBlock { + /**Instance合并方案 */ + /** + * @en Attribute instance rendering scheme. Advantages: High merge quantity, high merge efficiency, good rendering performance. Disadvantages: Few instance variable elements. + * @zh 属性实例渲染方案。优点:合并数量多,合并效率高,渲染性能优。缺点:实例变量元素少。 + */ + static INSTANCETYPE_ATTRIBUTE: number; + /** + * @en Uniform instance rendering scheme. Advantages: Many instance variables, flexible. Disadvantages: Merge quantity affected by WebGLContext._maxUniformFragmentVectors, low merge efficiency. + * @zh 统一实例渲染方案。优点:实例变量多,灵活。缺点:合并数量受 WebGLContext._maxUniformFragmentVectors 的影响,合并效率低。 + */ + static INSTANCETYPE_UNIFORMBUFFER: number; + constructor(); + /** + * 创建instance属性 + * @param attributeName name + * @param arrays data + * @param vertexStride vertex size + * @param vertexformat vertexFormat + * @param attributeLocation attribute location + */ + private _creatProperty; + /** + * @en Set Vector4 material array property. + * @param attributeName The attribute name (should correspond to the Shader). + * @param arrays The data. + * @param attributeLocation The attribute Shader location (needs to correspond one-to-one with the Attribute declaration in the shader). + * @zh 设置 Vector4 材质数组属性。 + * @param attributeName 属性名称(要对应到 Shader 中)。 + * @param arrays 数据。 + * @param attributeLocation 属性 Shader 位置(需要与 shader 中的声明 Attribute 一一对应)。 + */ + setVectorArray(attributeName: string, arrays: Vector4[] | Float32Array, attributeLocation: InstanceLocation): void; + /** + * @en Set Vector3 material array property. + * @param attributeName The attribute name (should correspond to the Shader). + * @param arrays The data. + * @param attributeLocation The attribute Shader location (needs to correspond one-to-one with the Attribute declaration in the shader). + * @zh 设置 Vector3 材质数组属性。 + * @param attributeName 属性名称(要对应到 Shader 中)。 + * @param arrays 数据。 + * @param attributeLocation 属性 Shader 位置(需要与 shader 中的声明 Attribute 一一对应)。 + */ + setVector3Array(attributeName: string, arrays: Vector3[] | Float32Array, attributeLocation: InstanceLocation): void; + /** + * @en Set Vector2 material array property. + * @param attributeName The attribute name (should correspond to the Shader). + * @param arrays The data. + * @param attributeLocation The attribute Shader location (needs to correspond one-to-one with the Attribute declaration in the shader). + * @zh 设置 Vector2 材质数组属性。 + * @param attributeName 属性名称(要对应到 Shader 中)。 + * @param arrays 数据。 + * @param attributeLocation 属性 Shader 位置(需要与 shader 中的声明 Attribute 一一对应)。 + */ + setVector2Array(attributeName: string, arrays: Vector2[] | Float32Array, attributeLocation: InstanceLocation): void; + /** + * @en Set Number material array property. + * @param attributeName The attribute name (should correspond to the Shader). + * @param arrays The data. + * @param attributeLocation The attribute Shader location (needs to correspond one-to-one with the Attribute declaration in the shader). + * @zh 设置 Number 材质数组属性。 + * @param attributeName 属性名称(要对应到 Shader 中)。 + * @param arrays 数据。 + * @param attributeLocation 属性 Shader 位置(需要与 shader 中的声明 Attribute 一一对应)。 + */ + setNumberArray(attributeName: string, arrays: Float32Array, attributeLocation: InstanceLocation): void; + /** + * @en Get property data. + * @param attributeLocation The attribute Shader location. + * @zh 获得属性数据。 + * @param attributeLocation 属性 Shader 位置。 + */ + getPropertyArray(attributeLocation: InstanceLocation): Vector4[] | Vector3[] | Vector2[] | Float32Array; + /** + * @en Clear all properties. + * @zh 清除所有属性。 + */ + clear(): void; + } + class SetDefineCMD extends Command { + constructor(); + /** + * @inheritDoc + * @override + */ + recover(): void; + } + /** + * @en The `InstanceRenderElement` is used for instanced rendering. + * @zh `InstanceRenderElement` 类用于实例化渲染。 + */ + class InstanceRenderElement extends RenderElement { + /** + * @en Creates an instance of `InstanceRenderElement`, reusing from the pool if available. + * @zh 创建 `InstanceRenderElement` 的实例,如果池中有可用的实例则重用。 + */ + static create(): InstanceRenderElement; + constructor(); + set InvertFront(value: boolean); + protected _createRenderElementOBJ(): void; + /** @ignore */ + compileShader(context: IRenderContext3D): void; + /**@ignore */ + _renderUpdatePre(context: RenderContext3D): void; + /**@ignore */ + updateInstanceData(mesh: Mesh): void; + /** + * @en Clears the instance render element. + * @zh 清除实例渲染元素。 + */ + clear(): void; + /** + * @en Recovers the render element to its original state. + * @zh 恢复渲染元素到原始状态。 + */ + recover(): void; + } + /** + * @en The BloomEffect class is used to create a flood effect. + * @zh BloomEffect 类用于创建泛光效果。 + */ + class BloomEffect extends PostProcessEffect { + /** + * @en Bloom resource initialize + * @zh 泛光资源初始化 + */ + static init(): void; + /**泛光颜色。*/ + private _color; + /**是否开启快速模式。该模式通过降低质量来提升性能。*/ + private _fastMode; + /**镜头污渍纹路,用于为泛光特效增加污渍灰尘效果*/ + private _dirtTexture; + /** + * @en The number of the bloom pixel, this value is in gamma space + * @zh 泛光像素的数量,该值在伽马空间 + */ + get clamp(): number; + set clamp(value: number); + /** + * @en Flood color. + * @zh 泛光颜色。 + */ + get color(): Color; + set color(value: Color); + /** + * @en Fast mode. + * @zh 快速模式 + */ + get fastMode(): boolean; + set fastMode(value: boolean); + /** + * @en Dirty texture + * @zh 脏迹贴图 + */ + get dirtTexture(): BaseTexture; + set dirtTexture(value: BaseTexture); + /** + * @en Intensity of floodlight filter, the minimum value is 0. + * @zh 泛光过滤器强度,最小值为0。 + */ + get intensity(): number; + set intensity(value: number); + /** + * @en The flood threshold, below which pixels with brightness will be filtered out, is in gamma space. + * @zh 泛光阈值,在该阈值亮度以下的像素会被过滤掉,该值在伽马空间。 + */ + get threshold(): number; + set threshold(value: number); + /** + * @en Soft knee transition strength. Gradual transition occurs below the threshold (0 for completely hard transition, 1 for completely soft transition). + * @zh 软膝盖过渡强度,在阈值以下进行渐变过渡(0为完全硬过度,1为完全软过度)。 + */ + get softKnee(): number; + set softKnee(value: number); + /** + * @en Diffusion value, changes the bloom spread range. It's best to use integer values for the best effect. This value changes the internal iteration count, range is 1 to 10. + * @zh 扩散值,改变泛光的扩散范围。最好使用整数值以保证效果,该值会改变内部的迭代次数,范围是1到10。 + */ + get diffusion(): number; + set diffusion(value: number); + /** + * @en Anamorphic ratio, distorts the bloom to produce a visual deformation. Negative values for vertical distortion, positive values for horizontal distortion. Range: -1 to 1. + * @zh 形变比,通过扭曲泛光产生视觉上的形变。负值为垂直扭曲,正值为水平扭曲。范围:-1到1。 + */ + get anamorphicRatio(): number; + set anamorphicRatio(value: number); + /** + * @en Dirt intensity. Range: 0 to 1. + * @zh 污渍强度。范围:0到1。 + */ + get dirtIntensity(): number; + set dirtIntensity(value: number); + /** + * @en initializate the bloom effect instance. + * @zh 初始化泛光效果实例。 + */ + constructor(); + /** + * @en Called when added to the post-processing stack. + * @param postprocess The post-processing component. + * @zh 添加到后期处理栈时调用。 + * @param postprocess 后期处理组件。 + */ + effectInit(postprocess: PostProcess): void; + /** + * @inheritDoc + * @override + * @en Get the camera depth texture mode flag according to the post-processing settings. + * @returns The camera depth texture mode flag. + * @zh 根据后期处理设置获取相机深度纹理模式标志。 + * @returns 相机深度纹理模式标志。 + */ + getCameraDepthTextureModeFlag(): number; + /** + * @en Release the Effect. + * @param postprocess The post-processing component. + * @zh 释放Effect。 + * @param postprocess 后期处理组件。 + */ + release(postprocess: PostProcess): void; + } + enum ToneMappingType { + None = 0, + ACES = 1 + } + /** + * @en Class of ColorGradEffect used to create tone mapping effect. + * @zh ColorGradEffect 类用于创建调色效果 + */ + class ColorGradEffect extends PostProcessEffect { + /** + * @en Initialize shader definitions. + * @zh 初始化着色器定义。 + */ + static __initDefine__(): void; + private _needBuildLUT; + private _lutBuilderMat; + private _LUTShader; + private _lutShaderData; + private _blitlutParams; + private _splitShadow; + private _splitBalance; + private _splithighlights; + private _u_SplitShadow; + private _enableSMH; + private _enableLiftGammaGain; + private _enableBalance; + private _tint; + private _temperature; + /** + * @en the tone mapping type. + * @zh 色调映射类型 + */ + get toneMapping(): ToneMappingType; + set toneMapping(value: ToneMappingType); + /** + * @en Whether split tone effect is enabled. + * @zh 是否启用分离色调效果。 + */ + get enableSplitTone(): boolean; + set enableSplitTone(value: boolean); + /** + * @en The color of shadows in split tone effect. + * @zh 分离色调效果中阴影的颜色。 + */ + get splitShadow(): Vector3; + set splitShadow(value: Vector3); + /** + * @en The color of highlights in split tone effect. + * @zh 分离色调效果中高光的颜色。 + */ + get splithighlights(): Vector3; + set splithighlights(value: Vector3); + /** + * @en The balance between shadow and highlight coloring in split tone effect. + * @zh 分离色调效果中阴影和高光着色的平衡。 + */ + get splitBalance(): number; + set splitBalance(value: number); + /** + * @en wheather to enable shadows, midtones, highlights + * @zh 是否启用阴影,中亮,高亮调节 + */ + get enableSMH(): boolean; + set enableSMH(value: boolean); + /** + * @en Shadows value, range 0-5. + * @zh 阴影值,取值范围0-5 + */ + get shadows(): Vector3; + set shadows(value: Vector3); + /** + * @en Midtones value, range 0-5. + * @zh 中亮值,取值范围0-5 + */ + get midtones(): Vector3; + set midtones(value: Vector3); + /** + * @en Highlights value, range 0-5. + * @zh 高亮值,取值范围0-5 + */ + get highlights(): Vector3; + set highlights(value: Vector3); + /** + * @en Shadow limit start 0-1 + * @zh 阴影限界起点,取值范围0-1 + */ + get shadowLimitStart(): number; + set shadowLimitStart(value: number); + /** + * @en Shadow limit end 0-1 + * @zh 阴影限界终点,取值范围0-1 + */ + get shadowLimitEnd(): number; + set shadowLimitEnd(value: number); + /** + * @en HighLight limit start 0-1 + * @zh 高光限界起点,取值范围0-1 + */ + get highLightLimitStart(): number; + set highLightLimitStart(value: number); + /** + * @en HighLight limit end 0-1 + * @zh 高光限界终点,取值范围0-1 + */ + get highLightLimitEnd(): number; + set highLightLimitEnd(value: number); + /** + * @en Whether lift, gamma, gain adjustments are enabled. + * @zh 是否启用暗部、中间调、亮部调整。 + */ + get enableLiftGammaGain(): boolean; + set enableLiftGammaGain(value: boolean); + /** + * @en The lift adjustment value. Primarily affects the shadow areas of the image, with a range of -1-1. + * @zh 暗部调整值。主要影响图像的阴影区域,范围 -1-1 + */ + get lift(): Vector3; + set lift(value: Vector3); + /** + * @en The gamma adjustment value. Affects the midtones of the image, but also influences shadows and highlights. with a range of 999-0.5. + * @zh 中间调调整值。影响图像的中间调,范围 999-0.5 + */ + get gamma(): Vector3; + set gamma(value: Vector3); + /** + * @en The gain adjustment value. Primarily affects the highlight areas of the image, with a range of 0-2. + * @zh 亮部调整值。主要影响图像的高光区域,范围 0-2 + */ + get gain(): Vector3; + set gain(value: Vector3); + private _StandardIlluminantY; + private _CIExyToLMS; + private _ColorBalanceToLMSCoeffs; + /** + * @zh Wheather to enable white balance. + * @zh 白平衡是否开启 + */ + get enableBalance(): boolean; + set enableBalance(value: boolean); + /** + * @en Controls the white balance color to compensate for a green or magenta tint. Range -100-100. + * @zh 白平衡颜色,用于补偿绿色或品红色。范围 -100-100。 + */ + get tint(): number; + set tint(value: number); + /** + * @en White Balance Temperature. Range -100-100. + * @zh 白平衡色温。范围 -100-100. + */ + get temperature(): number; + set temperature(value: number); + /** + * @en Whether color adjust is enabled. + * @zh 是否开启颜色调整 + */ + get enableColorAdjust(): boolean; + set enableColorAdjust(value: boolean); + /** + * @en The overall exposure of the scene. + * @zh 场景的整体曝光 + */ + get postExposure(): number; + set postExposure(value: number); + /** + * @en Color Contrast. Range 0-2. + * @zh 颜色对比度,范围 0-2 + */ + get contrast(): number; + set contrast(value: number); + /** + * @en The color filter. + * @zh 颜色过滤器 + */ + get colorFilter(): Color; + set colorFilter(value: Color); + /** + * @en The Hue Shift. Range -0.5-0.5. + * @zh 色相偏移,范围 -0.5-0.5 + */ + get HueShift(): number; + set HueShift(value: number); + /** + * @en Saturation. + * @zh 饱和度 + */ + get saturation(): number; + set saturation(value: number); + /** + * @en initialize the color grad effect instance. + * @zh 初始化调色效果实例 + */ + constructor(); + private get lutSize(); + private set lutSize(value); + private default_balance; + private default_splitShadow; + private default_splithighlights; + private default_shadow; + private default_midtones; + private default_highlight; + private default_limint; + private default_lift; + private default_gamma; + private default_gain; + private default_ColorFilter; + private default_HueSatCon; + private _postProcess; + /** + * @en Called when added to the post-processing stack. + * @param postprocess The post-processing node. + * @zh 在添加到后期处理栈时调用。 + * @param postprocess 后期处理节点。 + */ + effectInit(postprocess: PostProcess): void; + /** + * @en Release the Effect. + * @param postprocess The post-processing node. + * @zh 释放Effect。 + * @param postprocess 后期处理节点。 + */ + release(postprocess: PostProcess): void; + } + /** + * @en The `GaussianDoF` class is used to create a Gaussian Depth of Field effect. + * Only supports far field blur. + * - start: The depth at which the far field begins to blur. + * - end: The depth at which the far field reaches its maximum blur radius. + * - maxRadius: The maximum blur radius for the far field. + * @zh `GaussianDoF` 类用于创建高斯景深效果。 + * 仅支持远景模糊。 + * - start: 开始远景模糊的深度 + * - end: 达到最大模糊半径的远景深度 + * - maxRadius: 远景模糊最大半径 + */ + class GaussianDoF extends PostProcessEffect { + /** + * @en GaussianDOF resource init + * @zh 高斯DOF资源初始化 + */ + static init(): void; + /** + * @ignore + * @en initialization GaussianDOF effect instance. + * @zh 初始化高斯DOF效果实例 + */ + constructor(); + /** + * @en The depth at which far field blur begins. + * @zh 开始远景模糊的深度。 + */ + get farStart(): number; + set farStart(value: number); + /** + * @en The depth at which maximum blur radius is reached for far field. + * @zh 达到最大模糊半径的远景深度。 + */ + get farEnd(): number; + set farEnd(value: number); + /** + * @en The maximum blur radius. + * @zh 最大模糊半径。 + */ + get maxRadius(): number; + set maxRadius(value: number); + } + /** + * @en Represents lens flare command + * @zh 表示镜头光晕指令 + */ + class LensFlareCMD { + private _instanceCount; + /** + * @en The number of instances drawn + * @zh instance绘制的个数 + */ + get instanceCount(): number; + set instanceCount(value: number); + /** + * @ignore + * @en Constructor method, initialize instance. + * @zh 构造方法,初始化实例 + */ + constructor(); + /** + * init material + */ + private _initMaterial; + set lensFlareElement(value: LensFlareElement); + /** + * @en apply element Data + * @zh 应用元素数据 + */ + applyElementData(): void; + /** + * @inheritDoc + * @override + * @en Execute the command. + * @zh 执行命令 + */ + run(cmd: CommandBuffer): void; + } + /** + * @en lens Flare Element + * @zh 镜头光晕元素 + */ + class LensFlareElement { + private _startPosition; + private _angularOffset; + /** + * @en Whether the element is active. + * @zh 是否激活 + */ + get active(): boolean; + set active(value: boolean); + /** + * @en The tint color of the lens flare. + * @zh 光晕的颜色 + */ + get tint(): Color; + set tint(value: Color); + /** + * @en The intensity of the lens flare. + * @zh 光晕的强度 + */ + get intensity(): number; + set intensity(value: number); + /** + * @en The texture of the lens flare. + * @zh 光晕的贴图 + */ + get texture(): BaseTexture; + set texture(value: BaseTexture); + /** + * @en The position offset of the lens flare in screen space. + * @zh 光晕的位置偏移(屏幕空间下) + */ + get positionOffset(): Vector2; + set positionOffset(value: Vector2); + /** + * @en The scale of the lens flare in each dimension. + * @zh 光晕的缩放(每个轴上) + */ + get scale(): Vector2; + set scale(value: Vector2); + /** + * @en Whether to enable automatic rotation. + * @zh 是否开启自动旋转 + */ + get autoRotate(): boolean; + set autoRotate(value: boolean); + /** + * @en The rotation of the lens flare. + * @zh 光晕的旋转角度 + */ + get rotation(): number; + set rotation(value: number); + /** + * @en The start position of the lens flare. + * @zh 光晕的起始位置 + */ + get startPosition(): number; + set startPosition(value: number); + /** + * @en The angle offset of the lens flare. + * @zh 光晕的角度偏移 + */ + get angularOffset(): number; + set angularOffset(value: number); + } + /** + * @en Lens Flare Data + * @zh 镜头光晕的资源数据 + */ + class LensFlareData extends Resource { + constructor(); + /** + * @en Lens Flare Element Collection + * @zh 镜头光晕元素集合 + */ + elements: LensFlareElement[]; + } + /** + * @en Lens Flare Effect + * @zh 镜头光晕效果 + */ + class LensFlareEffect extends PostProcessEffect { + /** + * @en Initialize Shader and Geometry + * @zh 初始化着色器和几何体 + */ + static init(): void; + /** + * @en LensFlareData + * @zh 镜头光晕数据 + */ + get lensFlareData(): LensFlareData; + set lensFlareData(value: LensFlareData); + /** + * @en Bind light + * @zh 绑定光源 + */ + get bindLight(): Light; + set bindLight(light: Light); + /** + * @en Post-processing effect intensity + * @zh 后处理效果强度 + */ + get effectIntensity(): number; + set effectIntensity(value: number); + /** + * @en Post-processing effect scale + * @zh 后处理效果缩放 + */ + get effectScale(): number; + set effectScale(value: number); + constructor(); + /** + * @en Calculate the center point of directional light + * @param camera The camera + * @zh 计算直射光中心点 + * @param camera 摄像机 + */ + caculateDirCenter(camera: Camera): void; + /** + * @en Calculate point light + * @param camera The camera + * @zh 计算点光源 + * @param camera 相机 + */ + caculatePointCenter(camera: Camera): void; + /** + * @en Calculate spot light + * @param value Screen point + * @zh 计算聚光灯 + * @param value 屏幕点 + */ + caculateSpotCenter(value: Vector2): void; + /** + * @en Render process + * @param context Post-processing render context + * @zh 渲染流程 + * @param context 后期处理渲染上下文 + */ + render(context: PostProcessRenderContext): void; + /** + * @inheritDoc + * @override + * @en Release the effect + * @param postprocess Post-processing node + * @zh 释放效果 + * @param postprocess 后期处理节点 + */ + release(postprocess: PostProcess): void; + } + /** + * @en Represents the geometry of a lens flare element. + * @zh 表示镜头光晕元素的几何体。 + */ + class LensFlareElementGeomtry extends GeometryElement { + /** + * @en Constant representing the position and UV attributes. + * @zh 表示位置和UV属性的常量。 + */ + static PositionUV: number; + /** + * @en Constant representing the position, rotation, and scale attributes. + * @zh 表示位置、旋转和缩放属性的常量。 + */ + static PositionRotationScale: number; + /** + * @en Initializes the data for lens flare element geometry. + * @zh 初始化镜头光晕元素几何体的数据。 + */ + static init(): void; + /** + * @ignore + * @en Constructor method, initialize the instance. + * @zh 构造方法,初始化实例 + */ + constructor(); + /** + * @en Destroys the lens flare element geometry and releases its resources. + * @zh 销毁镜头光晕元素几何体并释放其资源。 + */ + destroy(): void; + } + /** + * @en Initialize the lens flare element shader. + * @zh 初始化镜头光晕元素着色器 + */ + class LensFlareShaderInit { + /** + * @en Initialize the lens flare element shader. + * @zh 初始化镜头光晕元素着色器 + */ + static init(): void; + } + /** + * @en The quality of AO. + * @zh AO质量 + */ + enum AOQUALITY { + /** + * @en High quality. + * @zh 高质量 + */ + High = 0, + /** + * @en Medium quality. + * @zh 中质量 + */ + MEDIUM = 1, + /** + * @en Low quality. + * @zh 低质量 + */ + LOWEST = 2 + } + /** + * @en The ScalableAO class is used to create ambient occlusion effect. + * @zh ScalableAO 类用于创建环境光遮罩效果。 + */ + class ScalableAO extends PostProcessEffect { + /** + * @en ScaleAO resource init + * @zh 初始化AO资源 + */ + static init(): void; + private _aoQuality; + /** + * @ignore + * @en initializes the effect. + * @zh 构造函数, 初始化实例。 + */ + constructor(); + /** + * @en The color of ambient occlusion. + * @zh 环境光遮挡的颜色 + */ + get aoColor(): Color; + set aoColor(value: Color); + /** + * @en The intensity of ambient occlusion. + * @zh 环境光遮挡的强度 + */ + get intensity(): number; + set intensity(value: number); + /** + * @en The influence radius of ambient occlusion. + * @zh 环境光遮挡的影响半径 + */ + get radius(): number; + set radius(value: number); + /** + * @en The quality of ambient occlusion. + * @zh 环境光遮挡的质量 + */ + get aoQuality(): AOQUALITY; + set aoQuality(value: AOQUALITY); + } + /** + * @en Used to create post-processing rendering effects. + * @zh 后期处理渲染效果的基类。 + */ + class PostProcessEffect { + /** + * @ignore + * @en constructor, initialize instance. + * @zh 构造函数, 初始化实例。 + */ + constructor(); + set singleton(value: boolean); + /** + * @en Whether the effect is enabled. + * @zh 效果是否开启。 + */ + get active(): boolean; + set active(value: boolean); + /** + * @inheritDoc + * @override + * @en Gets the camera depth texture mode flag based on post-processing settings. + * @zh 根据后期处理设置获取摄像机深度纹理模式标志。 + */ + getCameraDepthTextureModeFlag?(): number; + /** + * @inheritDoc + * @override + * @en Called when added to the post-processing stack. + * @param postprocess The post-processing component. + * @zh 在添加到后期处理栈时调用。 + * @param postprocess 后期处理组件。 + */ + effectInit?(postprocess: PostProcess): void; + /** + * @inheritDoc + * @override + * @en Releases the effect. + * @param postprocess The post-processing component. + * @zh 释放效果。 + * @param postprocess 后期处理组件。 + */ + release?(postprocess: PostProcess): void; + /** + * @en Renders the effect. + * @param context The post-processing rendering context. + * @zh 渲染效果。 + * @param context 后期处理渲染上下文。 + */ + render?(context: PostProcessRenderContext): void; + } + /** + * @en The `PostProcessRenderContext` class is used to create a post-processing rendering context. + * @zh `PostProcessRenderContext` 类用于创建后期处理渲染上下文。 + */ + class PostProcessRenderContext { + /** + * @en The original RenderTexture that is rendered to initially. Do not modify this RT. + * @zh 原始渲染 RenderTexture (RT),禁止改变此 RT。 + */ + source: RenderTexture | null; + /** + * @en forward effect target + * @zh 上个后期处理的结果 + */ + indirectTarget: RenderTexture | null; + /** + * @en The RenderTexture where the processed result should be drawn to. + * @zh 需要将处理后的结果画入此 RenderTexture。 + */ + destination: RenderTexture | null; + /** + * @en The rendering camera. + * @zh 渲染相机。 + */ + camera: Camera | null; + /** + * @en The composite shader data. + * @zh 合成着色器数据。 + */ + compositeShaderData: ShaderData | null; + /** + * @en The post-processing command buffer. + * @zh 后期处理指令流。 + */ + command: CommandBuffer | null; + /** + * @en Temporary texture array. You can put created textures here or select an RT to use from here to save memory. + * @zh 临时纹理数组。可以将创建的纹理放入此数组,也可以从这里选取要用的 RT 来节省显存。 + */ + deferredReleaseTextures: RenderTexture[]; + /** + * @en Selects an RT from recycled RTs to save memory. + * @param width The width of the RenderTexture. + * @param height The height of the RenderTexture. + * @param colorFormat The color format of the RenderTexture. + * @param depthFormat The depth format of the RenderTexture. + * @param mipmap Whether to generate mipmaps. + * @param multiSamples The number of multisamples. + * @param depthTexture Whether to generate a depth texture. + * @param sRGB Whether the RenderTexture is in sRGB color space. + * @returns The selected RenderTexture or null if no match is found. + * @zh 从回收的 RT 中选择一个 RT 用来节省内存。 + * @param width 纹理的宽度。 + * @param height 纹理的高度。 + * @param colorFormat 纹理的颜色格式。 + * @param depthFormat 纹理的深度格式。 + * @param mipmap 是否生成 mipmap。 + * @param multiSamples 多重采样数。 + * @param depthTexture 是否生成深度纹理。 + * @param sRGB 纹理是否在 sRGB 色彩空间。 + * @returns 选择到的 RenderTexture,如果没有匹配的,则返回 null。 + */ + createRTByContextReleaseTexture(width: number, height: number, colorFormat: RenderTargetFormat, depthFormat: RenderTargetFormat, mipmap?: boolean, multiSamples?: number, depthTexture?: boolean, sRGB?: boolean): RenderTexture; + } + /** + * @en Used to implement rendering states. + * @zh 用于实现渲染状态。 + */ + class RenderContext3D { + /** + * @en The singleton instance of the RenderContext3D. + * @zh RenderContext3D的单例实例。 + */ + static _instance: RenderContext3D; + /** + * @en The width of the rendering area. + * @zh 渲染区域的宽度。 + */ + static clientWidth: number; + /** + * @en The height of the rendering area. + * @zh 渲染区域的高度。 + */ + static clientHeight: number; + private _camera; + get camera(): Camera; + set camera(value: Camera); + /** + * @en The rendering pipeline mode. + * @zh 渲染管线模式 + */ + configPipeLineMode: PipelineMode; + /** + * @en The viewport for rendering. + * @zh 渲染视口。 + */ + set viewport(value: Viewport); + /** + * @en The scissor rectangle for rendering. + * @zh 渲染裁剪矩形。 + */ + set scissor(value: Vector4); + set invertY(value: boolean); + set pipelineMode(value: PipelineMode); + /** + * @en The camera shader data. + * @zh 相机着色器数据。 + */ + get cameraShaderValue(): ShaderData; + set cameraShaderValue(value: ShaderData); + set scene(value: Scene3D); + /** + * @en Changes the viewport. + * @param x The x-coordinate of the viewport. + * @param y The y-coordinate of the viewport. + * @param width The width of the viewport. + * @param height The height of the viewport. + * @zh 更改视口。 + * @param x 视口 x 坐标。 + * @param y 视口 y 坐标。 + * @param width 视口的宽度。 + * @param height 视口的高度。 + */ + changeViewport(x: number, y: number, width: number, height: number): void; + /** + * @en Changes the scissor rectangle. + * @param x The x-coordinate of the scissor rectangle. + * @param y The y-coordinate of the scissor rectangle. + * @param width The width of the scissor rectangle. + * @param height The height of the scissor rectangle. + * @zh 更改裁剪矩形。 + * @param x 裁剪矩形的 x 坐标。 + * @param y 裁剪矩形的 y 坐标。 + * @param width 裁剪矩形的宽度。 + * @param height 裁剪矩形的高度。 + */ + changeScissor(x: number, y: number, width: number, height: number): void; + /** + * @en Applies the context with the given camera update mark. + * @param cameraUpdateMark The camera update mark. + * @zh 应用具有给定相机更新标记的上下文。 + * @param cameraUpdateMark 相机更新标记。 + */ + applyContext(cameraUpdateMark: number): void; + /** + * @en Draws a single render element. + * @param renderelemt The render element to draw. + * @zh 渲染单个渲染元素。 + * @param renderelemt 要绘制的渲染元素。 + */ + drawRenderElement(renderelemt: IRenderElement3D): void; + /**@ignore */ + constructor(); + } + /** + * @en RenderElement class is used to implement rendering elements. + * @zh RenderElement 类用于实现渲染元素。 + */ + class RenderElement { + /** + * @en Can submit underlying rendering nodes + * @zh 可提交底层的渲染节点 + */ + _renderElementOBJ: IRenderElement3D; + set transform(value: Transform3D); + /** + * @en The material of the render element. + * @zh 渲染元素的材质。 + */ + get material(): Material; + set material(value: Material); + /** + * @en The SubShader of the render element. + * @zh 渲染元素的 SubShader。 + */ + get renderSubShader(): SubShader; + set renderSubShader(value: SubShader); + /** + * @en The SubShader index of the render element. + * @zh 渲染元素的 SubShader 索引。 + */ + get subShaderIndex(): number; + set subShaderIndex(value: number); + set render(value: BaseRender); + /**@ignore */ + constructor(); + protected _createRenderElementOBJ(): void; + /** + * @en Set the transform of the render element. + * @param transform The transform to set. + * @zh 设置渲染元素的位置变换。 + * @param transform 要设置的变换。 + */ + setTransform(transform: Transform3D): void; + /** + * @en Set the geometry information of the render element. + * @param geometry The geometry to set. + * @zh 设置渲染元素的几何信息。 + * @param geometry 要设置的几何信息。 + */ + setGeometry(geometry: GeometryElement): void; + } + /** + * @en The `ScreenQuad` class is used to create a fullscreen quad. + * @zh `ScreenQuad` 类用于创建全屏四边形。 + */ + class ScreenQuad extends GeometryElement { + static InvertInstance: ScreenQuad; + /** + * @ignore + * @en Construcutor method, do not use. + * @zh 构造方法,禁止使用。 + */ + constructor(); + /** + * @en Sets whether to invert the Y-axis and selects the corresponding buffer state. + * @param value Whether to invert the Y-axis + * @zh 设置Y轴是否反转,并选择相应的缓冲状态。 + * @param value 是否反转Y轴 + */ + set invertY(value: boolean); + /** + * @inheritDoc + * @override + * @en Destroys the ScreenQuad instance. + * @zh 销毁ScreenQuad实例。 + */ + destroy(): void; + } + /** + * @en The `SkyRenderElement` class is a render element that represents the sky. + * @zh `SkyRenderElement` 类表示天空渲染元素。 + */ + class SkyRenderElement extends RenderElement { + /** + * @en The render element object that is declared for rendering. + * @zh 声明用于渲染的渲染元素对象。 + */ + _renderElementOBJ: IRenderElement3D; + private _viewMatrix; + private _projectionMatrix; + private _projectViewMatrix; + constructor(); + /** + * @en Calculates the view matrix based on the camera's view matrix. + * @param cameraViewMat The camera's view matrix. + * @zh 根据摄像机的视图矩阵计算视图矩阵。 + * @param cameraViewMat 摄像机的视图矩阵。 + */ + calculateViewMatrix(cameraViewMat: Matrix4x4): void; + /** + * @en Calculates the projection matrix based on the camera's projection matrix and other parameters. + * @param cameraProjMat The camera's projection matrix. + * @param aspectRatio The aspect ratio of the projection. + * @param nearPlane The near plane distance of the projection. + * @param farPlane The far plane distance of the projection. + * @param fov The field of view for the perspective projection. + * @param orthographic Whether to use an orthographic projection. + * @zh 根据摄像机的投影矩阵和其他参数计算投影矩阵。 + * @param cameraProjMat 摄像机的投影矩阵。 + * @param aspectRatio 投影的纵横比。 + * @param nearPlane 投影的近平面距离。 + * @param farPlane 投影的远平面距离。 + * @param fov 透视投影的视场角。 + * @param orthographic 是否使用正交投影。 + */ + caluclateProjectionMatrix(cameraProjMat: Matrix4x4, aspectRatio: number, nearPlane: number, farPlane: number, fov: number, orthographic: boolean): void; + /** + * @en Prepares for rendering by setting up matrices and lighting information for sky rendering. + * @param context The rendering context. + * @zh 渲染前的准备工作,设置天空渲染所需的矩阵和光照信息。 + * @param context 渲染上下文。 + */ + renderpre(context: RenderContext3D): void; + } + /** + * @en The `Sprite3DRenderDeclaration` class contains shader defines used in 3D sprite rendering. + * @zh `Sprite3DRenderDeclaration` 类包含了3D精灵渲染中使用的着色器定义。 + */ + class Sprite3DRenderDeclaration { + /** + * @en Box reflection macro + * @zh 盒子反射宏 */ + static SHADERDEFINE_SPECCUBE_BOX_PROJECTION: ShaderDefine; + /** + * @en Volumetric Global Illumination macro + * @zh 体积全局光照宏 + */ + static SHADERDEFINE_VOLUMETRICGI: ShaderDefine; + } + /** + * @deprecated + * RenderableSprite3D 类用于可渲染3D精灵的父类,抽象类不允许实例。 + */ + class RenderableSprite3D extends Sprite3D { + /**精灵级着色器宏定义,接收阴影。*/ + static SHADERDEFINE_RECEIVE_SHADOW: ShaderDefine; + /**精灵级着色器宏定义,光照贴图。*/ + static SAHDERDEFINE_LIGHTMAP: ShaderDefine; + /**精灵级着色器宏定义,光照贴图方向。 */ + static SHADERDEFINE_LIGHTMAP_DIRECTIONAL: ShaderDefine; + /**着色器变量名,光照贴图缩放和偏移。*/ + static LIGHTMAPSCALEOFFSET: number; + /**着色器变量名,光照贴图。*/ + static LIGHTMAP: number; + /**着色器变量名,光照贴图方向。*/ + static LIGHTMAP_DIRECTION: number; + /**拾取颜色。*/ + static PICKCOLOR: number; + /** 反射探针位置 最大、最小值*/ + static REFLECTIONCUBE_PROBEPOSITION: number; + static REFLECTIONCUBE_PROBEBOXMAX: number; + static REFLECTIONCUBE_PROBEBOXMIN: number; + /** volumetric GI */ + static VOLUMETRICGI_PROBECOUNTS: number; + static VOLUMETRICGI_PROBESTEPS: number; + static VOLUMETRICGI_PROBESTARTPOS: number; + static VOLUMETRICGI_PROBEPARAMS: number; + static VOLUMETRICGI_IRRADIANCE: number; + static VOLUMETRICGI_DISTANCE: number; + static SHADERDEFINE_MORPHTARGET: ShaderDefine; + static SHADERDEFINE_MORPHTARGET_POSITION: ShaderDefine; + static SHADERDEFINE_MORPHTARGET_NORMAL: ShaderDefine; + static SHADERDEFINE_MORPHTARGET_TANGENT: ShaderDefine; + /** + * @deprecated + * 反射贴图 + */ + static REFLECTIONTEXTURE: number; + /** + * @deprecated + * 反射贴图参数 + */ + static REFLECTIONCUBE_HDR_PARAMS: number; + /** + * @deprecated + * 创建一个 RenderableSprite3D 实例。 + */ + constructor(name: string); + } + /** + * @en Environment light mode. + * @zh 环境光模式。 + */ + enum AmbientMode { + /** + * @en Fixed color + * @zh 固定颜色。 + */ + SolidColor = 0, + /** + * @en Spherical harmonic illumination generates spherical harmonic data through the sky box. + * @zh 球谐光照, 通过天空盒生成的球谐数据。 + */ + SphericalHarmonics = 1 + } + /** + * @en Interface for the overall management of a type of component within a 3D scene. + * @zh 用于3D场景中某类型组件的全面管理的接口。 + */ + interface IElementComponentManager { + /** + * @en An internal identifier used to find the manager by Scene3D. + * @zh 由Scene3D用来查找管理器的内部名称。 + */ + name: string; + /** + * @en Initialization method called during Scene3D initialization. + * @zh 在Scene3D初始化期间调用的方法。 + */ + Init(data: any): void; + /** + * @en Update method called every frame in the render loop. + * @zh 在渲染循环中每帧调用的更新方法。 + */ + update(dt: number): void; + } + /** + * @en Lightmap. + * @zh 光照贴图。 + */ + class Lightmap { + private _lightmapColor; + /** + * @en The color of the lightmap. + * @zh 光照贴图的颜色。 + */ + get lightmapColor(): Texture2D; + set lightmapColor(value: Texture2D); + /** 光照贴图方向。 */ + private _lightmapDirection; + /** + * @en The direction of the lightmap. + * @zh 光照贴图的方向。 + */ + get lightmapDirection(): Texture2D; + set lightmapDirection(value: Texture2D); + } + enum FogMode { + Linear = 0, + EXP = 1, + EXP2 = 2 + } + /** + * @en The Scene3D class is used to create a 3D scene. + * @zh Scene3D类用于实现3D场景。 + */ + class Scene3D extends Sprite { + /**Scene3D UniformMap */ + static sceneUniformMap: CommandUniformMap; + /** + * @en Scene component management table + * @zh 场景组件管理表 + */ + static componentManagerMap: Map; + /** + * @en The update mark of the scene. + * @zh 场景更新标记。 + */ + static get _updateMark(): number; + /** + * @en Registers a manager within the scene. + * @param type The type of the manager to register. + * @param cla The instance of the manager. + * @zh 注册场景内的管理器。 + * @param type 要注册的管理器类型。 + * @param cla 管理器实例。 + */ + static regManager(type: string, cla: any): void; + /** + * @en init shaderData + * @zh 着色器数据初始化 + */ + static shaderValueInit(): void; + /** + * @en Initializes legacy lighting values for the ShaderData. + * This function sets up the uniform mappings between the shader and the scene for various types of lights, + * including directional lights, point lights, and spotlights. + * @zh 初始化 ShaderData 的传统光照值。 + * 此函数为各种类型的灯光(包括方向光、点光源和聚光灯)设置着色器与场景之间的统一映射。 + */ + static legacyLightingValueInit(): void; + /** + * @deprecated 请使用Loader.load(url:string, type: ILaya.Loader.HIERARCHY) + * @en Loads the scene, note: not cached. + * @param url The template address. + * @param complete The completion callback. + * @zh 加载场景,注意:不缓存。 + * @param url 模板地址。 + * @param complete 完成回调。 + */ + static load(url: string, complete: Handler): void; + /** + * @en The mask layer to which the sprite belongs is currently being created. + * @zh 当前创建精灵所属遮罩层。 + */ + currentCreationLayer: number; + /** + * @en Whether to enable lighting. + * @zh 是否启用灯光。 + */ + enableLight: boolean; + /** + * @en The 2D scene to which the Scene3D belongs, used when the scene is loaded by the IDE editor. + * @zh Scene3D所属的2D场景,使用IDE编辑的场景载入后具有此属性。 + */ + get scene2D(): Scene; + /** + * @en The SceneRenderableManager. + * @zh 场景渲染管理器。 + */ + get sceneRenderableManager(): SceneRenderManager; + set sceneRenderableManager(manager: SceneRenderManager); + /** + * @en Whether fog is enabled. + * @zh 是否启用雾化效果。 + */ + get enableFog(): boolean; + set enableFog(value: boolean); + /** + * @en The fog mode. + * @zh 雾化模式。 + */ + get fogMode(): FogMode; + set fogMode(value: FogMode); + /** + * @en The fog color. + * @zh 雾化颜色。 + */ + get fogColor(): Color; + set fogColor(value: Color); + /** + * @en The fog start position. + * @zh 雾化起始位置。 + */ + get fogStart(): number; + set fogStart(value: number); + /** + * @en The fog end range. + * @zh 雾化结束范围。 + */ + get fogEnd(): number; + set fogEnd(value: number); + /** + * @en The fog density. + * @zh 雾化密度。 + */ + get fogDensity(): number; + set fogDensity(value: number); + set fogParams(value: Vector4); + /** + * @en The GI rotation value. The value should be between 0 and 2PI. + * @zh 全局光照旋转值。 值应在 0 到 2PI 之间。 + */ + get GIRotate(): number; + set GIRotate(value: number); + /** + * @en The ambient light mode. + * If the value is AmbientMode.SolidColor, the ambientColor is generally used as the ambient light source. If the value is AmbientMode.SphericalHarmonics, the ambientSphericalHarmonics is generally used as the ambient light source. + * @zh 环境光模式。 + * 如果值为 AmbientMode.SolidColor,则通常使用 ambientColor 作为环境光源。如果值为 AmbientMode.SphericalHarmonics,则通常使用 ambientSphericalHarmonics 作为环境光源。 + */ + get ambientMode(): AmbientMode; + set ambientMode(value: AmbientMode); + /** + * @en The scene reflection probe. + * @zh 场景反射探针。 + */ + get sceneReflectionProb(): ReflectionProbe; + /** + * @en The fixed color ambient light. + * @zh 固定颜色环境光。 + */ + get ambientColor(): Color; + set ambientColor(value: Color); + /** + * @en The ambient light intensity. + * @zh 环境漫反射的强度。 + */ + get ambientIntensity(): number; + set ambientIntensity(value: number); + /** + * @en The reflection probe intensity. + * @zh 反射探针强度。 + */ + get reflectionIntensity(): number; + set reflectionIntensity(value: number); + /** + * @en The ambient spherical harmonics coefficients. + * @zh 环境光球谐系数。 + */ + get ambientSH(): Float32Array; + set ambientSH(value: Float32Array); + /** + * @en The IBL texture . + * @zh IBL纹理。 + */ + get iblTex(): TextureCube; + set iblTex(value: TextureCube); + /** + * @en Checks if the ambient IBL texture is using RGBD compression. + * @zh 检查环境光贴图是否使用 RGBD 压缩。 + */ + get iblTexRGBD(): boolean; + set iblTexRGBD(value: boolean); + /** + * @en The sky renderer. + * @zh 天空渲染器。 + */ + get skyRenderer(): SkyRenderer; + /** + * @en The physics simulation. + * @zh 物理模拟器。 + */ + get physicsSimulation(): IPhysicsManager; + /** + * @override + * @en The scene timer. + * @zh 场景时钟。 + */ + get timer(): Timer; + set timer(value: Timer); + /** + * @en The array of lightmaps. The returned value is a shallow copy of the array. + * @zh 光照贴图数组。返回的是一个浅拷贝数组。 + */ + get lightmaps(): Lightmap[]; + set lightmaps(value: Lightmap[]); + /** + * @en The shadow map update frequency. Increasing the frequency can optimize performance if there are no self-shadows. + * @zh 阴影图更新频率。如果没有自阴影,增加频率可以优化性能。 + */ + get shadowMapFrequency(): number; + set shadowMapFrequency(value: number); + /** + * @ignore + * @en Creates an instance of the Scene3D class. + * @zh 创建一个Scene3D的实例。 + */ + constructor(); + /** + * @en The component element data map. + * @zh 组件元素数据映射表。 + */ + get componentElementDatasMap(): any; + private _cullInfoCamera; + /** + * @en The culling camera used for determining the visibility of scene elements. + * @zh 用于确定场景元素可见性的剔除摄像机。 + */ + get cullInfoCamera(): Camera; + /** + * @en Recalculate the culling camera. + * @zh 重新计算剔除摄像机。 + */ + recaculateCullCamera(): void; + /** + * @inheritDoc + * @override + * @en Destroys the scene. + * @param destroyChild Whether to destroy the child node. + * @zh 销毁场景。 + * @param destroyChild 是否删除子节点 + */ + destroy(destroyChild?: boolean): void; + /** + * @en Gets the manager for a specific component type. + * @param type The type of the component manager. + * @zh 根据组件类型获取对应的管理器。 + * @param type 组件管理器的类型。 + */ + getComponentElementManager(type: string): IElementComponentManager; + /** + * @en The rendering entry. + * @zh 渲染入口 + */ + renderSubmit(): void; + /** + * @en Sets a global shader value for rendering. + * @param name The name corresponding to the shader. + * @param type The type of the shader data. + * @param value The value of the rendering data. + * @zh 设置全局渲染着色器值。 + * @param name 数据对应着色器名字 + * @param type 渲染数据类型 + * @param value 渲染数据值 + */ + setGlobalShaderValue(name: string, type: ShaderDataType, value: ShaderDataItem): void; + /** + * @deprecated + * 雾效范围 + */ + get fogRange(): number; + set fogRange(value: number); + /** + * @deprecated + * 设置光照贴图。 + * @param value 光照贴图。 + */ + setlightmaps(value: Texture2D[]): void; + /** + * @deprecated + * 获取光照贴图浅拷贝列表。 + * @return 获取光照贴图浅拷贝列表。 + */ + getlightmaps(): Texture2D[]; + } + /** + * @en The class is used to implement scene rendering node management. + * @zh 该类用于实现场景渲染节点的管理。 + */ + class SceneRenderManager { + /** + * @ignore + * @en Creates an instance of SceneRenderManager. + * @zh 创建一个 SceneRenderManager 的实例。 + */ + constructor(); + /** + * @en The render list. + * @zh 渲染列表。 + */ + get list(): SingletonList; + set list(value: SingletonList); + /** + * @en Adds a render node to the manager. + * @param object The render object to add. + * @zh 向管理器添加渲染节点。 + * @param object 要添加的渲染对象。 + */ + addRenderObject(object: BaseRender): void; + /** + * @en Removes a render node from the manager. + * @param object The render object to remove. + * @zh 从管理器移除渲染节点。 + * @param object 要移除的渲染对象。 + */ + removeRenderObject(object: BaseRender): void; + /** + * @en Removes a motion object from the manager. + * @param object The motion object to remove. + * @zh 从管理器移除运动对象。 + * @param object 要移除的运动对象。 + */ + removeMotionObject(object: BaseRender): void; + /** + * @en Updates all motion render data. + * @zh 更新所有运动渲染数据。 + */ + updateMotionObjects(): void; + /** + * @en Updates the scene render. + * @zh 更新场景渲染。 + */ + renderUpdate(): void; + /** + * @en Adds motion render data to the manager. + * @param object The motion render object to add. + * @zh 向管理器添加运动渲染数据。 + * @param object 要添加的运动渲染对象。 + */ + addMotionObject(object: BaseRender): void; + /** + * @en Destroys and cleans up the manager resources. + * @zh 销毁并清理管理器资源。 + */ + destroy(): void; + } + class SimpleSkinnedMeshRenderer extends SkinnedMeshRenderer { + private _ownerSimpleRenderNode; + protected _isISkinRenderNode(): any; + /** + * @ignore + * @en Creates an instance of SimpleSkinnedMeshRenderer. + * @zh 创建一个 SimpleSkinnedMeshRenderer 的实例。 + */ + constructor(); + protected _computeSkinnedData(): void; + /** + * @perfTag PerformanceDefine.T_SkinBoneUpdate + * @en Update the render state of the skinned mesh. + * @param context The 3D render context + * @zh 更新蒙皮网格的渲染状态。 + * @param context 3D 渲染上下文。 + */ + renderUpdate(context: RenderContext3D): void; + /** + * @en Set custom data + * @param value1 Custom data 1 + * @param value2 Custom data 2 + * @zh 自定义数据 + * @param value1 自定义数据1 + * @param value2 自定义数据1 + */ + setCustomData(value1: number, value2?: number): void; + } + /** + * @en The `SimpleSkinnedMeshSprite3D` class is used to create a simple skinned mesh. + * @zh `SimpleSkinnedMeshSprite3D` 类用于创建简单网格。 + */ + class SimpleSkinnedMeshSprite3D extends RenderableSprite3D { + /** */ + static SIMPLE_SIMPLEANIMATORTEXTURE: number; + static SIMPLE_SIMPLEANIMATORPARAMS: number; + static SIMPLE_SIMPLEANIMATORTEXTURESIZE: number; + /** + * @en The mesh filter component. + * @zh 网格过滤器。 + */ + get meshFilter(): MeshFilter; + /** + * @en The simple skinned mesh renderer component. + * @zh 网格渲染器。 + */ + get simpleSkinnedMeshRenderer(): SimpleSkinnedMeshRenderer; + /** + * @en Constructor function. + * @param mesh The mesh to use. The default material for the mesh will also be loaded. + * @param name The name of the instance. + * @zh 构造函数。 + * @param mesh 网格,同时会加载网格所用默认材质。 + * @param name 名字。 + */ + constructor(mesh?: Mesh, name?: string); + /** + * @inheritDoc + * @override + */ + destroy(destroyChild?: boolean): void; + } + /** + * @en The `SkinnedMeshRenderer` class is used for skinned mesh rendering. + * @zh `SkinnedMeshRenderer` 类用于蒙皮网格渲染。 + */ + class SkinnedMeshRenderer extends MeshRenderer { + owner: Sprite3D; + private _ownerSkinRenderNode; + /** + * @en Local bounds. + * @zh 局部边界。 + */ + get localBounds(): Bounds; + set localBounds(value: Bounds); + /** + * @en Root node. + * @zh 根节点。 + */ + get rootBone(): Sprite3D; + set rootBone(value: Sprite3D); + /** + * @en The bones used for skinning. + * @zh 用于蒙皮的骨骼。 + */ + get bones(): Sprite3D[]; + set bones(value: Sprite3D[]); + /** + * @ignore + * @en Creates an instance of SkinnedMeshRenderer. + * @zh 创建一个 SkinnedMeshRenderer 的实例。 + */ + constructor(); + /** + * override it + * @returns + */ + protected _createBaseRenderNode(): IBaseRenderNode; + protected _isISkinRenderNode(): any; + protected _statAdd(): void; + protected _statRemove(): void; + /** + * @perfTag PerformanceDefine.T_SkinBoneUpdate + * @en Updates the render state of the skinned mesh renderer. + * @param context The 3D render context. + * @zh 更新蒙皮网格渲染器的渲染状态。 + * @param context 3D渲染上下文。 + */ + renderUpdate(context: RenderContext3D): void; + /** + * @override + * @param dest + */ + _cloneTo(dest: SkinnedMeshRenderer): void; + } + /** + * @en The `SkinnedMeshSprite3D` class is used for sprite with skinned mesh and bone nodes. + * @zh `SkinnedMeshSprite3D` 类用于绑点骨骼节点精灵。 + */ + class SkinnedMeshSprite3D extends RenderableSprite3D { + /** + * @en Shader variable name for skinned animation. + * @zh 着色器变量名,用于蒙皮动画。 + */ + static BONES: number; + /** + * @en Mesh filter component. + * @zh 网格过滤器。 + */ + get meshFilter(): MeshFilter; + /** + * @en Skinned mesh renderer component. + * @zh 网格渲染器。 + */ + get skinnedMeshRenderer(): SkinnedMeshRenderer; + /** + * @ignore + * @en Creates an instance of SkinnedMeshSprite3D. + * @param mesh The mesh to be used. The default material for the mesh will also be loaded. + * @param name The name of the sprite. + * @zh 创建一个 SkinnedMeshSprite3D 的实例。 + * @param mesh 网格,同时会加载网格所用默认材质。 + * @param name 名字。 + */ + constructor(mesh?: Mesh, name?: string); + /** + * @inheritDoc + * @override + * @en Destroy the SkinnedMeshSprite3D instance. + * @param destroyChild Whether to destroy child nodes. + * @zh 销毁 SkinnedMeshSprite3D 实例。 + * @param destroyChild 是否销毁子节点。 + */ + destroy(destroyChild?: boolean): void; + } + /** + * @en Class for Skinned Mesh Sprite3D Shader Declarations + * @zh 蒙皮网格3D精灵着色器声明类 + */ + class SkinnedMeshSprite3DShaderDeclaration { + /** + * @en Sprite-level shader macro definition for skinned animation. + * @zh 精灵级着色器宏定义,用于蒙皮动画。 + */ + static SHADERDEFINE_BONE: ShaderDefine; + /** + * @en Sprite-level shader macro definition for simple bone animation. + * @zh 精灵级着色器宏定义,用于简单骨骼动画。 + */ + static SHADERDEFINE_SIMPLEBONE: ShaderDefine; + } + /** + * @en The `Sprite3D` class is used to implement 3D sprites. + * @zh `Sprite3D` 类用于实现3D精灵。 + */ + class Sprite3D extends Node { + /** + * @en Indicates the front face direction. -1 for inverted back face, 1 for normal situation. + * @zh -1 表示翻转了背面,1 表示正常情况。 + */ + static WORLDINVERTFRONT: number; + /** + * @en Create a clone instance of the sprite. + * @param original The original sprite. + * @param parent The parent node. Default is null. + * @param worldPositionStays Whether to maintain its own world transformation. Default is true. + * @param position World position, effective when worldPositionStays is false. Default is null. + * @param rotation World rotation, effective when worldPositionStays is false. Default is null. + * @returns The cloned instance. + * @zh 创建精灵的克隆实例。 + * @param original 原始精灵。 + * @param parent 父节点。默认为 null。 + * @param worldPositionStays 是否保持自身世界变换。默认为 true。 + * @param position 世界位置,worldPositionStays 为 false 时生效。默认为 null。 + * @param rotation 世界旋转,worldPositionStays 为 false 时生效。默认为 null。 + * @returns 克隆实例。 + */ + static instantiate(original: Sprite3D, parent?: Node, worldPositionStays?: boolean, position?: Vector3, rotation?: Quaternion): Sprite3D; + /** + * @deprecated 请使用Loader.load(url:string, type: ILaya.Loader.HIERARCHY) + * @en Load mesh template. + * @param url The template URL. + * @param complete The completion callback. + * @zh 加载网格模板。 + * @param url 模板地址。 + * @param complete 完成回调。 + */ + static load(url: string, complete: Handler): void; + /** + * @en Unique identifier ID. + * @zh 唯一标识ID。 + */ + get id(): number; + /** + * @en Mask layer. + * @zh 蒙版层。 + */ + get layer(): number; + set layer(value: number); + /** + * @en Whether the sprite is static. + * @zh 是否为静态。 + */ + get isStatic(): boolean; + /** + * @en Sprite transformation. + * @zh 精灵变换。 + */ + get transform(): Transform3D; + /** + * @en Get the scene to which the sprite belongs. + * @zh 获取精灵所属的场景。 + */ + get scene(): Scene3D; + /** + * @en Creates an instance of the Sprite3D class. + * @param name Sprite name. + * @param isStatic Whether it is static. + * @zh 创建 Sprite3D 类的实例。 + * @param name 精灵名称。 + * @param isStatic 是否为静态。 + */ + constructor(name?: string, isStatic?: boolean); + /** + * @en clone. + * @returns clone instance. + * @zh 克隆。 + * @returns 克隆副本。 + */ + clone(): Node; + /** + * @en destroy + * @param destroyChild whether to destroy the child node. + * @zh 销毁 + * @param destroyChild 是否销毁子节点 + */ + destroy(destroyChild?: boolean): void; + } + /** + * @en Enum for trail alignment options. + * @zh 拖尾对齐方式枚举。 + */ + enum TrailAlignment { + /** + * @en Align the trail to face the camera. + * @zh 使拖尾面向摄像机。 + */ + View = 0, + /** + * @en Align the trail with the direction of the component + * @zh 使拖尾与组件的方向对齐。 + */ + TransformZ = 1 + } + /** + * @en The TrailFilter class is used to create a trailing filter. + * @zh TrailFilter 类用于创建拖尾过滤器。 + */ + class TrailFilter { + /** + * @en The trail alignment. + * @zh 轨迹准线。 + */ + alignment: TrailAlignment; + /** + * @en Fade out time. + * @zh 淡出时间。 + */ + get time(): number; + set time(value: number); + /** + * @en Minimum distance between new and old vertices + * @zh 新旧顶点之间最小距离。 + */ + get minVertexDistance(): number; + set minVertexDistance(value: number); + /** + * @en The width multiplier. + * @zh 宽度倍数。 + */ + get widthMultiplier(): number; + set widthMultiplier(value: number); + /** + * @en The width curve. The maximum number is 10. + * @zh 宽度曲线。最多10个。 + */ + get widthCurve(): FloatKeyframe[]; + set widthCurve(value: FloatKeyframe[]); + /** + * @en The color gradient. + * @zh 颜色梯度。 + */ + get colorGradient(): Gradient; + set colorGradient(value: Gradient); + /** + * @en The texture mode. + * @zh 纹理模式。 + */ + get textureMode(): TrailTextureMode; + set textureMode(value: TrailTextureMode); + /** @ignore */ + constructor(owner: TrailRenderer); + /** + * @en Clears the trail. + * @zh 清除拖尾。 + */ + clear(): void; + } + /** + * @en The `TrailGeometry` class is used to create trail rendering elements. + * @zh `TrailGeometry` 类用于创建拖尾渲染单元。 + */ + class TrailGeometry extends GeometryElement { + /** + * @en Alignment of the trail ti j wq e o face the camera. + * @zh 轨迹准线_面向摄像机。 + */ + static ALIGNMENT_VIEW: number; + /** + * @en Alignment of the trail to face the direction of movement. + * @zh 轨迹准线_面向运动方向。 + */ + static ALIGNMENT_TRANSFORM_Z: number; + /** @private */ + private _disappearBoundsMode; + constructor(owner: TrailFilter); + /** + * @inheritDoc + * @override + * @en Get the type. + * @zh 获取类型。 + */ + _getType(): number; + /** + * @inheritDoc + * @override + * @en Destroys the instance and releases resources. + * @zh 销毁实例并释放资源。 + */ + destroy(): void; + /** + * @en Clear. + * @zh 清除。 + */ + clear(): void; + } + /** + * @en The `TrailMaterial` class is used to implement trail materials. + * @zh `TrailMaterial` 类用于实现拖尾材质。 + */ + class TrailMaterial extends Material { + /** + * @en The default material, do not modify. + * @zh 默认材质,禁止修改。 + */ + static defaultMaterial: TrailMaterial; + /** + * @en The color of the material. + * @zh 材质的颜色。 + */ + get color(): Color; + set color(value: Color); + /** + * @en The texture of the material. + * @zh 材质贴图。 + */ + get texture(): BaseTexture; + set texture(value: BaseTexture); + /** + * @en The tiling and offset of the texture. + * @zh 纹理的平铺和偏移。 + */ + get tilingOffset(): Vector4; + set tilingOffset(value: Vector4); + /**@ignore */ + constructor(); + /** + * @inheritdoc + * @override + * @en Clones the material. + * @returns A cloned instance of the material. + * @zh 克隆材质。 + * @returns 材质的一个克隆实例。 + */ + clone(): any; + /** + * @deprecated + * 渲染状态_透明混合。 + */ + static RENDERMODE_ALPHABLENDED: number; + /** + * @deprecated + * 渲染状态_加色法混合。 + */ + static RENDERMODE_ADDTIVE: number; + /** + * @deprecated + * 渲染模式。现在可以直接使用materialRenderMode + */ + set renderMode(value: number); + } + /** + * @en The `TrailRenderer` class is used to create a trail renderer. + * @zh `TrailRenderer` 类用于创建拖尾渲染器。 + */ + class TrailRenderer extends BaseRender { + /** @ignore */ + constructor(); + protected _getcommonUniformMap(): Array; + protected _createBaseRenderNode(): IBaseRenderNode; + /** + * @en Fade out time. Unit: s. + * @zh 淡出时间。单位: 秒。 + */ + get time(): number; + set time(value: number); + /** + * @en Minimum distance between new and old vertices. + * @zh 新旧顶点之间最小距离。 + */ + get minVertexDistance(): number; + set minVertexDistance(value: number); + /** + * @en The width multiplier. + * @zh 宽度倍数。 + */ + get widthMultiplier(): number; + set widthMultiplier(value: number); + /** + * @en The width curve. Maximum 10. + * @zh 宽度曲线。最多10个。 + */ + get widthCurve(): FloatKeyframe[]; + set widthCurve(value: FloatKeyframe[]); + /** + * @en The color gradient. + * @zh 颜色梯度。 + */ + get colorGradient(): Gradient; + set colorGradient(value: Gradient); + /** + * @en The texture mode. + * @zh 纹理模式。 + */ + get textureMode(): TrailTextureMode; + set textureMode(value: TrailTextureMode); + /** + * @en The trail alignment. + * @zh 拖尾轨迹准线 + */ + get alignment(): TrailAlignment; + set alignment(value: TrailAlignment); + /** + * @en Render update. + * @param context 3D rendering context. + * @zh 渲染更新。 + * @param context 3D渲染上下文 + */ + renderUpdate(context: RenderContext3D): void; + /** + * @en The bounding box. Read-only, do not modify its value. + * @zh 包围盒,只读,不允许修改其值。 + */ + get bounds(): Bounds; + /** + * @en Clear the trail. + * @zh 清除拖尾 + */ + clear(): void; + } + /** + * @en Trail Texture Mode + * @zh 拖尾纹理模式 + */ + class TrailTextureMode { + /** + * @en Stretch mode. + * @zh 拉伸模式。 + */ + static Stretch: number; + /** + * @en Tile mode. + * @zh 平铺模式。 + */ + static Tile: number; + } + /** + * @en The `Transform3D` class is used to implement 3D transformations. + * @zh `Transform3D` 类用于实现3D变换。 + */ + class Transform3D extends EventDispatcher { + /** + * @en Whether it is the default matrix. If `true`, it indicates that there is no change relative to the parent node, and calculations will be skipped based on this parameter. + * @zh 是否为默认矩阵,如果为true,表示自身相对于父节点并无任何改变,将通过这个参数忽略计算。 + */ + get isDefaultMatrix(): boolean; + /** + * @en Whether the front face is clockwise. + * @zh 获取是否前向顺时针面。 + */ + getFrontFaceValue(): number; + /** + * @en The sprite to which this transform belongs. + * @zh 所属精灵。 + */ + get owner(): Sprite3D; + /** + * @en Whether the world matrix needs to be updated. + * @zh 世界矩阵是否需要更新。 + */ + get worldNeedUpdate(): boolean; + /** + * @en The X component of the local position. + * @zh 局部位置X轴分量。 + */ + get localPositionX(): number; + set localPositionX(x: number); + /** + * @en The Y component of the local position. + * @zh 局部位置Y轴分量。 + */ + get localPositionY(): number; + set localPositionY(y: number); + /** + * @en The Z component of the local position. + * @zh 局部位置Z轴分量。 + */ + get localPositionZ(): number; + set localPositionZ(z: number); + /** + * @en The local position. + * @zh 局部位置。 + */ + get localPosition(): Vector3; + set localPosition(value: Vector3); + /** + * @en The X component of the local rotation quaternion. + * @zh 局部旋转四元数X分量。 + */ + get localRotationX(): number; + set localRotationX(x: number); + /** + * @en The Y component of the local rotation quaternion. + * @zh 局部旋转四元数Y分量。 + */ + get localRotationY(): number; + set localRotationY(y: number); + /** + * @en The Z component of the local rotation quaternion. + * @zh 局部旋转四元数Z分量。 + */ + get localRotationZ(): number; + set localRotationZ(z: number); + /** + * @en The W component of the local rotation quaternion. + * @zh 局部旋转四元数W分量。 + */ + get localRotationW(): number; + set localRotationW(w: number); + /** + * @en The local rotation. + * @zh 局部旋转。 + */ + get localRotation(): Quaternion; + set localRotation(value: Quaternion); + /** + * @en The X component of the local scale. + * @zh 局部缩放X。 + */ + get localScaleX(): number; + set localScaleX(value: number); + /** + * @en The Y component of the local scale. + * @zh 局部缩放Y。 + */ + get localScaleY(): number; + set localScaleY(value: number); + /** + * @en The Z component of the local scale. + * @zh 局部缩放Z。 + */ + get localScaleZ(): number; + set localScaleZ(value: number); + /** + * @en The local scale of the transform. + * @zh 局部缩放。 + */ + get localScale(): Vector3; + set localScale(value: Vector3); + /** + * @en The X component of the local rotation euler angles. + * @zh 局部空间的X轴欧拉角。 + */ + get localRotationEulerX(): number; + set localRotationEulerX(value: number); + /** + * @en The Y component of the local rotation euler angles. + * @zh 局部空间的Y轴欧拉角。 + */ + get localRotationEulerY(): number; + set localRotationEulerY(value: number); + /** + * @en The Z component of the local rotation euler angles. + * @zh 局部空间的Z轴欧拉角。 + */ + get localRotationEulerZ(): number; + set localRotationEulerZ(value: number); + /** + * @en The local rotation euler angles of the transform. + * @zh 局部空间欧拉角。 + */ + get localRotationEuler(): Vector3; + set localRotationEuler(value: Vector3); + /** + * @en The local matrix. + * @zh 局部矩阵。 + */ + get localMatrix(): Matrix4x4; + set localMatrix(value: Matrix4x4); + /** + * @en World position. + * @zh 世界位置。 + */ + get position(): Vector3; + set position(value: Vector3); + /** + * @en World rotation. + * @zh 世界旋转。 + */ + get rotation(): Quaternion; + set rotation(value: Quaternion); + /** + * @en Rotation angles in world space, in the order of x, y, z. + * @zh 世界空间的旋转角度,顺序为x、y、z。 + */ + get rotationEuler(): Vector3; + set rotationEuler(value: Vector3); + /** + * @en World matrix. + * @zh 世界矩阵。 + */ + get worldMatrix(): Matrix4x4; + set worldMatrix(value: Matrix4x4); + protected _initProperty(): void; + /** + * @en Perform translation transformation. + * @param translation The distance to move. + * @param isLocal Whether to use local space. Default is true. + * @zh 平移变换。 + * @param translation 移动距离。 + * @param isLocal 是否局部空间。默认为 true。 + */ + translate(translation: Vector3, isLocal?: boolean): void; + /** + * @en Perform rotation transformation. + * @param rotation The rotation amount. + * @param isLocal Whether to use local space. Default is true. + * @param isRadian Whether the rotation is in radians. Default is true. + * @zh 旋转变换。 + * @param rotation 旋转幅度。 + * @param isLocal 是否局部空间。默认为 true。 + * @param isRadian 是否弧度制。默认为 true。 + */ + rotate(rotation: Vector3, isLocal?: boolean, isRadian?: boolean): void; + /** + * @en Get the forward direction. + * @param forward The vector to the forward direction. + * @zh 获取向前方向。 + * @param forward 前方向。 + */ + getForward(forward: Vector3): void; + /** + * @en Get the up direction. + * @param up The vector to the up direction. + * @zh 获取向上方向。 + * @param up 上方向。 + */ + getUp(up: Vector3): void; + /** + * @en Get the right direction. + * @param right The vector to the right direction. + * @zh 获取向右方向。 + * @param right 右方向。 + */ + getRight(right: Vector3): void; + /** + * @en Look at a target position. + * @param target The target to look at. + * @param up The up vector. + * @param isLocal Whether to use local space. Default is false. + * @param isCamera Whether it's a camera. Default is true. + * @zh 观察目标位置。 + * @param target 观察目标。 + * @param up 向上向量。 + * @param isLocal 是否局部空间。默认为 false。 + * @param isCamera 是否为相机。默认为 true。 + */ + lookAt(target: Vector3, up: Vector3, isLocal?: boolean, isCamera?: boolean): void; + /** + * @en Make the object face towards a target. + * @param target The target position to face. + * @param up The up vector. + * @param isLocal Whether to use local space. Default is false. + * @zh 对象朝向目标。 + * @param target 朝向目标位置。 + * @param up 向上向量。 + * @param isLocal 是否局部空间。默认为 false。 + */ + objLookat(target: Vector3, up: Vector3, isLocal?: boolean): void; + /** + * @en The world scale. + * Under certain conditions, obtaining this value may not be accurate (e.g., when the parent node has scaling and the child node has rotation). + * The scaling may be skewed and cannot be correctly represented using Vector3. A Matrix3x3 matrix must be used for correct representation. + * @returns The world scale. + * @zh 世界缩放。 + * 某种条件下获取该值可能不正确(例如:父节点有缩放,子节点有旋转)。 + * 缩放会倾斜,无法使用Vector3正确表示,必须使用Matrix3x3矩阵才能正确表示。 + * @returns 世界缩放。 + */ + getWorldLossyScale(): Vector3; + /** + * @en Set the world scale. + * Under certain conditions, setting this value may not be accurate (e.g., when the parent node has scaling and the child node has rotation). + * The scaling may be skewed and cannot be correctly represented using Vector3. A Matrix3x3 matrix must be used for correct representation. + * @param value The world scale to set. + * @return The world scale. + * @zh 设置世界缩放。 + * 某种条件下设置该值可能不正确(例如:父节点有缩放,子节点有旋转)。 + * 缩放会倾斜,无法使用Vector3正确表示,必须使用Matrix3x3矩阵才能正确表示。 + * @param value 要设置的世界缩放。 + * @return 世界缩放。 + */ + setWorldLossyScale(value: Vector3): void; + /** + * @en Transform a local vector to global space. + * @param value The local vector to transform. + * @param out The output global vector. + * @zh 将局部向量转换为全局向量。 + * @param value 要转换的局部向量。 + * @param out 输出的全局向量。 + */ + localToGlobal(value: Vector3, out: Vector3): void; + /** + * @en Transform a global position to local space. + * @param pos The world position to transform. + * @param out The output local position. + * @zh 将世界坐标转换为局部坐标。 + * @param pos 要转换的世界坐标。 + * @param out 输出的局部坐标。 + */ + globalToLocal(pos: Vector3, out: Vector3): void; + /** + * @en Transform a global normal vector to local space. + * @param pos The global normal vector to transform. + * @param out The output local normal vector. + * @zh 将全局法线向量转换为局部空间。 + * @param pos 要转换的全局法线向量。 + * @param out 输出的局部法线向量。 + */ + toLocalNormal(pos: Vector3, out: Vector3): void; + /** + * @en Rotate to face a specified direction. + * @param forward The forward vector. + * @param dir The target direction to face. + * @zh 朝向指定方向。 + * @param forward 前向向量。 + * @param dir 目标朝向方向。 + */ + toDir(forward: Vector3, dir: Vector3): void; + /** + * @en This is a function from glmatrix. Sets a quaternion to represent the shortest rotation from one vector to another. + * Both vectors are assumed to be unit length. + * @param out The receiving quaternion. + * @param a The initial vector (normalized). + * @param b The destination vector (normalized). + * @returns {boolean} True if a rotation was applied, false if the vectors are already aligned. + * @zh 这是一个 glmatrix 中的函数。设置一个四元数来表示从一个向量到另一个向量的最短旋转。 + * 假设两个向量都是单位长度。 + * @param out 接收结果的四元数。 + * @param a 初始向量(已归一化)。 + * @param b 目标向量(已归一化)。 + * @returns {boolean} 如果应用了旋转则返回 true,如果向量已经对齐则返回 false。 + */ + rotationTo(out: Quaternion, a: Vector3, b: Vector3): boolean; + /** + * 世界坐标系缩放。 + * @deprecated + */ + get scale(): Vector3; + /** + * @deprecated + */ + set scale(value: Vector3); + } + /** + * @en UI3D class, used to create 3D UI components. + * @zh UI3D类,用于创建3D UI组件。 + */ + class UI3D extends BaseRender { + /** + * @en The Sprite3D owner of this UI3D component. + * @zh 3D UI组件所属的3D节点。 + */ + owner: Sprite3D; + private _shellSprite; + protected _worldParams: Vector4; + /** + * @en UI nodes for 3D rendering + * @zh 3D渲染的UI节点 + */ + get sprite(): Sprite; + set sprite(value: Sprite); + /** + * IDE + * @en The 3D rendering UI prefab. + * @zh 3D渲染的UI预制体。 + */ + get prefab(): Prefab; + set prefab(value: Prefab); + /** + * @en Mesh scale for 3D UI. + * @zh 3D UI的网格缩放。 + */ + get scale(): Vector2; + set scale(value: Vector2); + /** + * @en The UI render mode. + * @zh UI渲染模式。 + */ + get renderMode(): MaterialRenderMode; + set renderMode(value: MaterialRenderMode); + /** + * @en The UI culling mode. + * @zh UI剔除模式。 + */ + get cull(): number; + set cull(value: number); + /** + * @en The resolution rate. + * @zh 分辨率比例。 + */ + get resolutionRate(): number; + set resolutionRate(value: number); + /** + * @en The UI3D component is billboard mode. + * @zh 面向相机模式 + */ + get billboard(): boolean; + set billboard(value: boolean); + /** + * @en Detect mouse events, disable optimization performance, enable to trigger mouse events. + * @zh 检测鼠标事件,关闭优化性能,开启可以触发鼠标事件 + */ + get enableHit(): boolean; + set enableHit(value: boolean); + /** @ignore + * @en constructor method, initialize 3D UI. + * @zh 构造方法,初始化3D UI。 + */ + constructor(); + private _creatDefaultMat; + /** + * 分析碰撞点 + * @param hit + */ + private _parseHit; + /** + * @en Get the UI rendering texture. + * @zh 获得ui渲染图 + */ + getUITexture(): BaseTexture; + private _transByRotate; + } + /** + * @en UI3DGeometry class is used to create and manage the geometry structure of 3D UI elements. + * @zh UI3DGeometry 类用于创建和管理 3D UI元素的几何结构的类。 + */ + class UI3DGeometry extends GeometryElement { + private _changeVertex; + /** + * @inheritDoc + * @override + * @en Destroys the instance and releases resources. + * @zh 销毁实例并释放资源。 + */ + destroy(): void; + } + /** + * @en UI3DManager calss is used to create 3D UI manager, which manages all 3D UI objects. + * @zh UI3DManager 类用于创建3D-UI管理器,管理所有3D-UI对象。 + */ + class UI3DManager { + /** + * @en A list to store 3D UI elements. + * @zh 存储3D-UI元素的列表。 + */ + _UI3Dlist: FastSinglelist; + /** @ignore */ + constructor(); + /** + * @en Adds a 3D UI element to the manager. + * @param value The 3D UI element to add. + * @zh 向管理器添加一个3D-UI元素。 + * @param value 要添加的3D-UI元素。 + */ + add(value: UI3D): void; + /** + * @en Removes a 3D UI element from the manager. + * @param value The 3D UI element to remove. + * @zh 从管理器中移除一个3D-UI元素。 + * @param value 要移除的3D-UI元素。 + */ + remove(value: UI3D): void; + /** + * @en Updates the 3D UI elements in the scene. + * @zh 更新场景中的3D-UI元素。 + */ + update(): void; + /** + * @en Performs a ray cast to determine if there is a collision with any 3D UI elements. + * @param ray The ray for the ray casting. + * @returns The hit result or null if no collision occurs. + * @zh 执行射线投射以判断是否与任何3D-UI元素发生碰撞。 + * @param ray 射线投射的射线。 + * @returns 返回碰撞结果或如果没有碰撞发生则返回null。 + */ + rayCast(ray: Ray): any; + /** + * @en Destroys the 3D UI elements managed by the list. + * @zh 销毁列表中存储的3D-UI元素。 + */ + destory(): void; + } + /** + * @en The `Vector2Keyframe` class is used to create instances of two-dimensional vector keyframes. + * @zh `Vector2Keyframe` 类用于创建二维向量关键帧实例。 + */ + class Vector2Keyframe extends Keyframe { + /** + * @en In tangent. + * @zh 内切线。 + */ + inTangent: Vector2; + /** + * @en Out tangent. + * @zh 外切线。 + */ + outTangent: Vector2; + /** + * @en Frame data. + * @zh 帧数据。 + */ + value: Vector2; + /** + * @en In weight. + * @zh 内权重。 + */ + inWeight: Vector2; + /** + * @en Out weight. + * @zh 外权重。 + */ + outWeight: Vector2; + /** + * @en Weight mode. + * @zh 权重模式。 + */ + weightedMode: Vector2; + /** + * @en Creates an instance of Vector2Keyframe. + * @param weightMode Whether to use weight mode. Default is false. + * @zh 创建 Vector2Keyframe 的实例。 + * @param weightMode 是否使用权重模式。默认为 false。 + */ + constructor(weightMode?: boolean); + /** + * @override + * @en Clone + * @param dest The target object to clone to. + * @zh 克隆 + * @param dest 克隆源。 + */ + cloneTo(dest: Vector2Keyframe): void; + } + /** + * @en The `Vector3Keyframe` class is used to create instances of three-dimensional vector keyframes. + * @zh `Vector3Keyframe` 类用于创建三维向量关键帧实例。 + */ + class Vector3Keyframe extends Keyframe { + /** + * @en In tangent. + * @zh 内切线。 + */ + inTangent: Vector3; + /** + * @en Out tangent. + * @zh 外切线。 + */ + outTangent: Vector3; + /** + * @en Frame data. + * @zh 帧数据。 + */ + value: Vector3; + /** + * @en In weight. + * @zh 内权重。 + */ + inWeight: Vector3; + /** + * @en Out weight. + * @zh 外权重。 + */ + outWeight: Vector3; + /** + * @en Weight mode. + * @zh 权重模式。 + */ + weightedMode: Vector3; + /** + * @en Creates an instance of Vector3Keyframe. + * @param weightMode Whether to use weight mode. Default is false. + * @zh 创建一个Vector3Keyframe实例。 + * @param weightMode 是否使用权重模式。默认为 false。 + */ + constructor(weightMode?: boolean); + /** + * @override + * @en Clone + * @param dest The target object to clone to. + * @zh 克隆 + * @param dest 克隆源。 + */ + cloneTo(dest: Vector3Keyframe): void; + } + /** + * @en The `Vector4Keyframe` class is used to create instances of four-dimensional vector keyframes. + * @zh `Vector4Keyframe` 类用于创建四维向量关键帧实例。 + */ + class Vector4Keyframe extends Keyframe { + /** + * @en In tangent. + * @zh 内切线。 + */ + inTangent: Vector4; + /** + * @en Out tangent. + * @zh 外切线。 + */ + outTangent: Vector4; + /** + * @en Frame data. + * @zh 帧数据。 + */ + value: Vector4; + /** + * @en In weight. + * @zh 内权重。 + */ + inWeight: Vector4; + /** + * @en Out weight. + * @zh 外权重。 + */ + outWeight: Vector4; + /** + * @en Out weight. + * @zh 外权重。 + */ + weightedMode: Vector4; + /** + * @en Creates an instance of the `Vector4Keyframe` class. + * @param weightMode Whether to use weight mode. Default is false. + * @zh 创建 `Vector4Keyframe` 类的实例。 + * @param weightMode 是否使用权重模式。默认为 false。 + */ + constructor(weightMode?: boolean); + /** + * @override + * @en Clone + * @param dest The target object to clone to. + * @zh 克隆 + * @param dest 克隆源。 + */ + cloneTo(dest: Vector4Keyframe): void; + } + /** + * @en DepthCasterData class for managing depth casting data. + * @zh DepthCasterData 类,用于管理深度投射数据。 + */ + class DepthCasterData { + /** + * @en Stores the uniform buffer data for the depth caster + * @zh 存储深度投射器的统一缓冲数据 + */ + static DepthCasterUBOData: UnifromBufferData; + } + /** + * @en The `DepthPass` class is responsible for handling depth rendering and shadow mapping in a 3D scene. + * @zh `DepthPass` 类负责处理3D场景中的深度渲染和阴影映射。 + */ + class DepthPass { + static SHADOW_BIAS: Vector4; + private _zBufferParams; + static __init__(): void; + /** @ignore */ + constructor(); + /** + * @en Creates and assigns the appropriate render texture for capturing depth information based on the specified depth texture mode. This method configures the camera's properties to hold newly created textures prepared for depth or depth normals rendering. + * @param camera The camera for which the depth texture is being prepared. + * @param depthType The type of depth texture to create, which determines the kind of data the texture will capture (e.g., depth only, depth and normals). + * @param depthTextureFormat The format of the depth texture, defining how the data is represented. + * @zh 根据指定的深度纹理模式创建并分配相应的渲染纹理,用于捕捉深度信息。 + * 此方法配置相机的属性,以保存为深度或深度法线渲染准备的新创建的纹理。 + * @param camera 准备深度纹理的相机。 + * @param depthType 要创建的深度纹理类型,决定纹理将捕捉的数据种类(如仅深度,深度加法线等)。 + * @param depthTextureFormat 深度纹理的格式,定义数据的表示方式。 + */ + getTarget(camera: Camera, depthType: DepthTextureMode, depthTextureFormat: RenderTargetFormat): void; + } + /** + * @en IndexBuffer3D class is used to create index buffer. Please use LayaGL.RenderOBJCreate.createIndexBuffer3D to create. + * @zh IndexBuffer3D 类用于创建索引缓冲。请使用LayaGL.RenderOBJCreate.createIndexBuffer3D来创建。 + */ + class IndexBuffer3D { + private _indexType; + _byteLength: number; + _buffer: Float32Array | Uint16Array | Uint8Array | Uint32Array; + bufferUsage: BufferUsage; + /** + * @en The index type. + * @zh 索引类型。 + */ + get indexType(): IndexFormat; + /** + * @en The byte count of the index type. + * @zh 索引类型字节数量。 + */ + get indexTypeByteCount(): number; + /** + * @en The number of indices. + * @zh 索引个数。 + */ + get indexCount(): number; + /** + * @en Whether the buffer can be read. + * @zh 是否可读。 + */ + get canRead(): boolean; + /** + * @en Constructor method, create index buffer. + * @param indexType Index type. + * @param indexCount Index count. + * @param bufferUsage IndexBuffer3D usage type. + * @param canRead Whether the buffer can be read. + * @zh 构造方法,创建索引缓冲。 + * @param indexType 索引类型。 + * @param indexCount 索引个数。 + * @param bufferUsage IndexBuffer3D用途类型。 + * @param canRead 是否可读。 + */ + constructor(indexType: IndexFormat, indexCount: number, bufferUsage?: BufferUsage, canRead?: boolean); + /** + * @en Sets the data for the index buffer. + * @param data The index data. + * @param bufferOffset The offset within the index buffer. + * @param dataStartIndex The offset within the data. + * @param dataCount The number of indices to set. + * @zh 设置索引缓冲区的数据。 + * @param data 索引数据。 + * @param bufferOffset 索引缓冲中的偏移。 + * @param dataStartIndex 索引数据的偏移。 + * @param dataCount 索引数据的数量。 + */ + setData(data: any, bufferOffset?: number, dataStartIndex?: number, dataCount?: number): void; + /** + * @en Gets the index data. + * @returns The index data. + * @zh 获取索引数据。 + * @returns 返回索引数据。 + */ + getData(): Uint16Array | Uint32Array; + /** + * @inheritDoc + * @override + * @en Destroys this IndexBuffer3D. + * @zh 销毁此索引缓冲。 + */ + destroy(): void; + } + /** + * @en The IVertex interface is used to create vertex declarations. + * @zh IVertex 接口用于实现创建顶点声明。 + */ + interface IVertex { + /** + * @en The vertex declaration. + * @zh 顶点声明 + */ + vertexDeclaration: VertexDeclaration; + } + /** + * @en Second-order spherical harmonics function. + * @zh 二阶球谐函数。 + */ + class SphericalHarmonicsL2 { + /** + * @en Gets the coefficient for a specific color channel. + * @param i The channel index, ranging from 0 to 2. + * @param j The coefficient index, ranging from 0 to 8. + * @returns The coefficient value. + * @zh 获取特定颜色通道的系数。 + * @param i 通道索引,范围0到2。 + * @param j 系数索引,范围0到8。 + * @returns 系数值。 + */ + getCoefficient(i: number, j: number): number; + /** + * @en Sets the coefficient for a specific color channel. + * @param i The channel index, ranging from 0 to 2. + * @param j The coefficient index, ranging from 0 to 8. + * @param coefficient The coefficient value to set. + * @zh 设置特定颜色通道的系数。 + * @param i 通道索引,范围0到2。 + * @param j 系数索引,范围0到8。 + * @param coefficient 要设置的系数值。 + */ + setCoefficient(i: number, j: number, coefficient: number): void; + /** + * @en Sets the coefficients for a specific color channel. + * @param i The channel index, ranging from 0 to 2. + * @param coefficient0 Coefficient 0 + * @param coefficient1 Coefficient 1 + * @param coefficient2 Coefficient 2 + * @param coefficient3 Coefficient 3 + * @param coefficient4 Coefficient 4 + * @param coefficient5 Coefficient 5 + * @param coefficient6 Coefficient 6 + * @param coefficient7 Coefficient 7 + * @param coefficient8 Coefficient 8 + * @zh 设置颜色通道的系数。 + * @param i 通道索引,范围0到2。 + * @param coefficient0 系数0 + * @param coefficient1 系数1 + * @param coefficient2 系数2 + * @param coefficient3 系数3 + * @param coefficient4 系数4 + * @param coefficient5 系数5 + * @param coefficient6 系数6 + * @param coefficient7 系数7 + * @param coefficient8 系数8 + */ + setCoefficients(i: number, coefficient0: number, coefficient1: number, coefficient2: number, coefficient3: number, coefficient4: number, coefficient5: number, coefficient6: number, coefficient7: number, coefficient8: number): void; + /** + * @en Clones the spherical harmonics data to another instance. + * @param dest The destination instance to which the data is cloned. + * @zh 克隆球谐函数数据到另一个实例。 + * @param dest 克隆数据的目标实例。 + */ + cloneTo(dest: SphericalHarmonicsL2): void; + } + /** + * @en The `VertexBuffer3D` class is used to create vertex buffers. To create an instance of `VertexBuffer3D`, use `LayaGL.RenderOBJCreate.createIndexBuffer3D`. + * @zh `VertexBuffer3D` 类用于创建顶点缓冲。要创建 `VertexBuffer3D` 的实例,请使用 `LayaGL.RenderOBJCreate.createIndexBuffer3D`。 + */ + class VertexBuffer3D { + _byteLength: number; + _buffer: Float32Array | Uint16Array | Uint8Array | Uint32Array; + bufferUsage: BufferUsage; + /** + * @en The vertex declaration. + * @zh 顶点声明。 + */ + get vertexDeclaration(): VertexDeclaration | null; + set vertexDeclaration(value: VertexDeclaration | null); + /** + * @en Whether this is an instance buffer. + * @zh 是否是实例缓冲区。 + */ + get instanceBuffer(): boolean; + set instanceBuffer(value: boolean); + /** + * @en Whether the buffer is readable. + * @zh 缓冲区是否可读。 + */ + get canRead(): boolean; + /** + * @en Constructor method. + * @param byteLength The byte length of the buffer. + * @param bufferUsage The usage type of the VertexBuffer3D. + * @param canRead Whether the buffer is readable. + * @zh 构造方法。 + * @param byteLength 字节长度。 + * @param bufferUsage VertexBuffer3D用途类型。 + * @param canRead 是否可读。 + */ + constructor(byteLength: number, bufferUsage: BufferUsage, canRead?: boolean); + /** + * @en Sets the data for the vertex buffer. + * @param buffer The data to set. + * @param bufferOffset The offset within the vertex buffer, in bytes. + * @param dataStartIndex The starting index within the data, in bytes. + * @param dataCount The number of bytes to set. + * @zh 设置顶点缓冲区的数据。 + * @param buffer 要设置的数据。 + * @param bufferOffset 顶点缓冲中的偏移,以字节为单位。 + * @param dataStartIndex 顶点数据的偏移,以字节为单位。 + * @param dataCount 顶点数据的长度,以字节为单位。 + */ + setData(buffer: ArrayBuffer, bufferOffset?: number, dataStartIndex?: number, dataCount?: number): void; + /** + * @en Gets the vertex data as a `Uint8Array`. + * @zh 以 `Uint8Array` 形式获取顶点数据。 + */ + getUint8Data(): Uint8Array; + /** + * @ignore + * @en Gets the vertex data as a `Float32Array`, if the buffer is readable. + * @zh 如果缓冲区可读,以 `Float32Array` 形式获取顶点数据。 + */ + getFloat32Data(): Float32Array | null; + /** + * @ignore + * @en Marks the buffer as unreadable and releases the data. + * @zh 将缓冲区标记为不可读并释放数据。 + */ + markAsUnreadbale(): void; + /** + * @inheritDoc + * @override + * @en Destroys the vertex buffer and releases the resources. + * @zh 销毁顶点缓冲区并释放资源。 + */ + destroy(): void; + } + /** + * @ignore + * @en Used for loading cubemap textures. + * @zh 用于加载立方体纹理资源。 + */ + class CubemapLoader implements IResourceLoader { + constructor(); + /** + * @en Load a cubemap texture resource. + * @param task The load task. + * @returns A Promise, when loaded successfully, it is resolves with the loaded texture or null if loading fails. + * @zh 加载立方体贴图资源。 + * @param task 加载任务。 + * @returns 一个Promise, 加载成功时解析为加载的纹理,加载失败时为 null。 + */ + load(task: ILoadTask): Promise; + private move; + } + /** + * @ignore + * @en Usedfor loading lens flare. + * @zh 用于加载镜头光晕数据资源。 + */ + class LensFlareSettingsLoader implements IResourceLoader { + /** + * @en Load lens flare from a specified URL. + * @param task The load task that contains the URL and other loading options. + * @returns A Promise, when loaded successfully, it is resolves with the loaded `LensFlareData` object or null if loading fails. + * @zh 加载指定的镜头光晕数据资源。 + * @param task 包含 URL 和其他加载选项的加载任务。 + * @returns 一个Promise,加载成功时解析为加载的 `LensFlareData` 对象,加载失败时为 null。 + */ + load(task: ILoadTask): Promise; + } + /** + * @ignore + * @en Used for loading 2D texture array resources(.tex2darray). + * @zh 用于加载纹理数组资源(.tex2darray)。 + */ + class Texture2DArrayLoader implements IResourceLoader { + constructor(); + /** + * @en Load a 2D texture array from the specified URL. + * @param task The load task that contains the URL and other loading options. + * @returns A promise that resolves with the loaded texture array or null if loading fails. + * @zh 加载指定的纹理数组资源。 + * @param task 包含 URL 和其他加载选项的加载任务。 + * @returns 一个Promise,加载成功时解析为加载的纹理数组,加载失败时为 null。 + */ + load(task: ILoadTask): Promise; + } + /** + * @en The `BoundBox` class is used for creating a bounding box. + * @zh `BoundBox` 类用于创建包围盒。 + */ + class BoundBox implements IClone { + /** + * @en The minimum vertex of the bounding box. + * @zh 包围盒的最小顶点。 + */ + min: Vector3; + /** + * @en The maximum vertex of the bounding box. + * @zh 包围盒的最大顶点。 + */ + max: Vector3; + /** + * @en Constructor method of the bounding box. + * @param min The minimum vertex of the bounding box. + * @param max The maximum vertex of the bounding box. + * @zh 包围盒的构造方法。 + * @param min 包围盒的最小顶点。 + * @param max 包围盒的最大顶点。 + */ + constructor(min: Vector3, max: Vector3); + /** + * @en Retrieves the 8 corner vertices of the bounding box. + * @param corners The array to store the corner vertices. + * @zh 获取包围盒的8个角顶点。 + * @param corners 角顶点的输出数组。 + */ + getCorners(corners: Vector3[]): void; + /** + * @en Retrieves the center point of the bounding box.。 + * @param out The vector to store the center point. + * @zh 获取包围盒的中心点。 + * @param out 存储中心点的向量。 + */ + getCenter(out: Vector3): void; + /** + * @en Retrieves the extents of the bounding box. + * @param out The vector to store the extents. + * @zh 获取包围盒的范围。 + * @param out 存储轴半径的向量。 + */ + getExtent(out: Vector3): void; + /** + * @en Sets the center and extents of the bounding box. + * @param center The center point of the bounding box. + * @param extent The axis radius of the bounding box. + * @zh 设置包围盒的中心点和范围 + * @param center 包围盒的中心点。 + * @param extent 包围盒的轴半径 + */ + setCenterAndExtent(center: Vector3, extent: Vector3): void; + /** + * @en Resets the bounding box to its default values. + * @zh 将包围盒重置为其默认值。 + */ + toDefault(): void; + /** + * @en Creates a bounding box from a set of points. + * @param points The set of points. + * @param out The resulting bounding box. + * @zh 从一组顶点生成包围盒。 + * @param points 所需顶点队列。 + * @param out 生成的包围盒。 + */ + static createfromPoints(points: Vector3[], out: BoundBox): void; + /** + * @en Merges two bounding boxes into one. + * @param box1 The first bounding box. + * @param box2 The second bounding box. + * @param out The merged bounding box + * @zh 合并两个包围盒为一个。 + * @param box1 第一个包围盒。 + * @param box2 第二个包围盒。 + * @param out 合并后的包围盒。 + */ + static merge(box1: BoundBox, box2: BoundBox, out: BoundBox): void; + /** + * @en Clones this bounding box to another object. + * @param destObject The object to receive the clone. + * @zh 克隆这个包围盒到另一个对象。 + * @param destObject 接收克隆的对象。 + */ + cloneTo(destObject: BoundBox): void; + /** + * @en Creates a clone of this bounding box. + * @return The cloned bounding box. + * @zh 创建这个包围盒的克隆。 + * @return 克隆的包围盒。 + */ + clone(): any; + } + /** + * @en The corner of frustum. + * @zh 锥体角点。 + */ + enum FrustumCorner { + FarBottomLeft = 0, + FarTopLeft = 1, + FarTopRight = 2, + FarBottomRight = 3, + nearBottomLeft = 4, + nearTopLeft = 5, + nearTopRight = 6, + nearBottomRight = 7, + unknown = 8 + } + /** + * @en The BoundFrustum class is used to create a frustum. + * @zh BoundFrustum 类用于创建截锥体。 + */ + class BoundFrustum implements IClone { + /** + * @en Obtain 6 enclosing planes based on the matrix. + * @param m The matrix that describes the frustum. + * @param np The near plane. + * @param fp The far plane. + * @param lp The left plane. + * @param rp The right plane. + * @param tp The top plane. + * @param bp The bottom plane. + * @zh 根据矩阵获取6个包围平面。 + * @param m 描述矩阵。 + * @param np 近平面。 + * @param fp 远平面。 + * @param lp 左平面。 + * @param rp 右平面。 + * @param tp 顶平面。 + * @param bp 底平面。 + */ + static getPlanesFromMatrix(m: Matrix4x4, np: Plane, fp: Plane, lp: Plane, rp: Plane, tp: Plane, bp: Plane): void; + /** + * @en Constructor method. + * @param matrix The 4x4 matrix that describes the frustum. + * @zh 构造方法。 + * @param matrix 锥截体的描述4x4矩阵。 + */ + constructor(matrix: Matrix4x4); + protected initBoundingPlane(): void; + /** + * @en The matrix that describes the frustum. + * @zh 描述矩阵。 + */ + get matrix(): Matrix4x4; + set matrix(matrix: Matrix4x4); + /** + * @en The near plane. + * @zh 近平面。 + */ + get near(): Plane; + /** + * @en The far plane. + * @zh 远平面。 + */ + get far(): Plane; + /** + * @en The left plane. + * @zh 左平面。 + */ + get left(): Plane; + /** + * @en The right plane. + * @zh 右平面。 + */ + get right(): Plane; + /** + * @en The top plane. + * @zh 顶平面。 + */ + get top(): Plane; + /** + * @en The bottom plane. + * @zh 底平面。 + */ + get bottom(): Plane; + /** + * @en Determines whether this bound frustum is equal to another bound frustum. + * @param other The other bound frustum to compare. + * @zh 判断这个截锥体是否与另一个截锥体相等。 + * @param other 要比较的另一个截锥体。 + */ + equalsBoundFrustum(other: BoundFrustum): boolean; + /** + * @en Determines whether this object is equal to another object. + * @param obj The object to compare. + * @zh 判断此对象是否等于另一个对象。 + * @param obj 要比较的另一个对象。 + */ + equalsObj(obj: any): boolean; + /** + * @en Gets a specific plane of the frustum. + * @param index The index of the plane to retrieve. Indices: + * - 0: Near plane + * - 1: Far plane + * - 2: Left plane + * - 3: Right plane + * - 4: Top plane + * - 5: Bottom plane + * @returns The requested plane or `null` if the index is out of range. + * @zh 获取截锥体的特定平面。 + * @param index 要检索的平面的索引。索引: + * - 0: 近平面 + * - 1: 远平面 + * - 2: 左平面 + * - 3: 右平面 + * - 4: 顶平面 + * - 5: 底平面 + * @returns 所请求的平面或 `null` 如果索引超出范围。 + */ + getPlane(index: number): Plane; + /** + * @en Calculates the intersection point of three planes within the frustum. + * @param p1 The first plane. + * @param p2 The second plane. + * @param p3 The third plane. + * @param out The vector to store the intersection point. + * @zh 计算截锥体中三个平面的交点。 + * @param p1 第一个平面。 + * @param p2 第二个平面。 + * @param p3 第三个平面。 + * @param out 存储交点的向量。 + */ + static get3PlaneInterPoint(p1: Plane, p2: Plane, p3: Plane, out: Vector3): void; + /** + * @en Retrieves the eight corner points of the frustum. + * @param corners The array to store the corner points. + * @zh 获取截锥体的八个角点 + * @param corners 存储角点的数组。 + */ + getCorners(corners: Vector3[]): void; + /** + * @en Determines the relationship between the frustum and a point. + * @param point The point to test. + * @returns The relationship between the point and the frustum: + * - 1: The point is inside the frustum. + * - 2: The point intersects the frustum. + * - 0: The point is outside and does not intersect the frustum. + * @zh 确定截锥体与点的关系。 + * @param point 要测试的点。 + * @returns 点与截锥体之间的关系: + * - 1: 点在截锥体内。 + * - 2: 点与截锥体相交。 + * - 0: 点在截锥体外且不相交。 + */ + containsPoint(point: Vector3): number; + /** + * @en Determines whether this frustum intersects with a bounding box. + * @param box The bounding box to test against. + * @returns `true` if they intersect; otherwise, `false`. + * @zh 判断这个截锥体是否与包围盒相交。 + * @param box 要测试的包围盒。 + * @returns 如果相交返回 `true`;否则返回 `false`。 + */ + intersects(box: BoundBox | Bounds): boolean; + /** + * @en Determines the spatial relationship between this frustum and a bounding box. + * @param box The bounding box to test. + * @returns The spatial relationship: + * - 1: The bounding box is inside the frustum. + * - 2: The bounding box intersects the frustum. + * - 0: The bounding box is outside and does not intersect the frustum. + * @zh 确定这个截锥体和包围盒之间的空间关系。 + * @param box 要测试的包围盒。 + * @returns 关系类型: + * - 1: 包围盒在截锥体内。 + * - 2: 包围盒与截锥体相交。 + * - 0: 包围盒在截锥体外且不相交。 + */ + containsBoundBox(box: BoundBox | Bounds): number; + /** + * @en Determines the spatial relationship between this frustum and a bounding sphere. + * @param sphere The bounding sphere to test. + * @returns The relationship type: + * - 1: The sphere is inside the frustum. + * - 2: The sphere intersects the frustum. + * - 0: The sphere is outside and does not intersect the frustum. + * @zh 确定这个截锥体和包围球之间的空间关系。 + * @param sphere 要测试的包围球。 + * @returns 关系类型: + * - 1: 包围球在截锥体内。 + * - 2: 包围球与截锥体相交。 + * - 0: 包围球在截锥体外且不相交。 + */ + containsBoundSphere(sphere: BoundSphere): number; + /** + * @en Clones this frustum into another object. + * @param dest The destination BoundFrustum to copy the values into. + * @zh 克隆这个截锥体到另一个对象。 + * @param dest 目标对象,用以复制值。 + */ + cloneTo(dest: BoundFrustum): void; + /** + * @en Creates a clone of this frustum. + * @returns A new BoundFrustum that is a clone of this one. + * @zh 创建这个截锥体的克隆。 + * @returns 一个克隆自当前截锥体的新的 BoundFrustum。 + */ + clone(): BoundFrustum; + } + /** + * @en used for creating a bounding volume. + * @zh 用于创建包围体。 + */ + class Bounds implements IClone { + /** + * @en Merges two bounding boxes into one. + * @param box1 The first bounding box. + * @param box2 The second bounding box. + * @param out The merged bounding box. + * @zh 合并两个包围盒。 + * @param box1 第一个包围盒。 + * @param box2 第二个包围盒。 + * @param out 生成的包围盒。 + */ + static merge(box1: Bounds, box2: Bounds, out: Bounds): void; + /** + * @en Determines whether the bounding box contains a point. + * @param box The bounding box. + * @param point The point to check. + * @returns `true` if the point is inside the bounding box; otherwise, `false`. + * @zh 判断包围盒是否包含一个点。 + * @param box 包围盒。 + * @param point 需要检测的点。 + * @return 如果点在包围盒内返回 `true`;否则返回 `false`。 + */ + static containPoint(box: Bounds, point: Vector3): boolean; + /** + * @en The minimum point of the bounding box. + * @zh 包围盒的最小点 + */ + get min(): Vector3; + set min(value: Vector3); + /** + * @en The maximum point of the bounding box. + * @zh 包围盒的最大点 + */ + get max(): Vector3; + set max(value: Vector3); + /** + * @en The center point of the bounding box. + * @param value The new center point of the bounding box. + * @zh 设置包围盒的最小点。 + * @param value 包围盒的新最小点。 + */ + setMin(value: Vector3): void; + /** + * @en Gets the minimum point of the bounding box. + * @return The minimum point of the bounding box. + * @zh 获取包围盒的最小点。 + * @return 包围盒的最小点。 + */ + getMin(): Vector3; + /** + * @en Sets the maximum point of the bounding box. + * @param value The new maximum point of the bounding box. + * @zh 设置包围盒的最大点。 + * @param value 包围盒的新最大点。 + */ + setMax(value: Vector3): void; + /** + * @en Gets the maximum point of the bounding box. + * @return The maximum point of the bounding box. + * @zh 获取包围盒的最大点。 + * @return 包围盒的最大点。 + */ + getMax(): Vector3; + /** + * @en Sets the center point of the bounding box. + * @param value The new center point of the bounding box. + * @zh 设置包围盒的中心点。 + * @param value 包围盒的新中心点。 + */ + setCenter(value: Vector3): void; + /** + * @en Gets the center point of the bounding box. + * @return The center point of the bounding box. + * @zh 获取包围盒的中心点。 + * @return 包围盒的中心点。 + */ + getCenter(): Vector3; + /** + * @en Sets the range of the bounding box. + * @param value The new range of the bounding box. + * @zh 设置包围盒的范围。 + * @param value 包围盒的新范围。 + */ + setExtent(value: Vector3): void; + /** + * @en Gets the range of the bounding box. + * @return The range of the bounding box. + * @zh 获取包围盒的范围。 + * @return 包围盒的范围。 + */ + getExtent(): Vector3; + /** + * @en Constructor method. + * @param min The minimum point of the bounding box. + * @param max The maximum point of the bounding box. + * @zh 构造方法。 + * @param min min 最小坐标 + * @param max max 最大坐标。 + */ + constructor(min?: Vector3, max?: Vector3); + /** + * @en Retrieves the eight corner vertices of the bounding box. + * @param corners The array to store the corner vertices. + * @zh 获取包围盒的八个角顶点 + * @param corners 存储角顶点的数组。 + */ + getCorners(corners: Vector3[]): void; + /** + * @en Gets the bounding box. + * @param box The bounding box to store the result. + * @zh 获取包围盒 + * @param box 用于存储结果的包围盒。 + */ + getBoundBox(box: BoundBox): void; + /** + * @en Calculate whether two bounding boxes intersect + * @param bounds The bounding box to calculate the intersection volume. + * @return -1 if the two bounding boxes do not intersect; when not 0, the return value is the intersecting volume + * @zh 计算两个包围盒是否相交 + * @param bounds 需要计算包围盒 + * @returns -1为不相交 不为0的时候返回值为相交体积 + */ + calculateBoundsintersection(bounds: Bounds): number; + /** + * @en Clones this bounds into another object. + * @param destObject The destination object to clone into. + * @zh 克隆这个边界到另一个对象。 + * @param destObject 克隆目标对象。 + */ + cloneTo(destObject: Bounds): void; + /** + * @en Creates a clone of this bounds. + * @return A new `Bounds` instance that is a clone of this one. + * @zh 创建这个边界的克隆。 + * @return 一个新的 `Bounds` 实例,是当前边界的克隆。 + */ + clone(): any; + } + /** + * @en BoundsImpl class is used to create a bounding box. + * @zh BoundsImpl 类用于创建包围体。 + */ + class BoundsImpl implements IClone { + /** + * @en The minimum point of the bounding box. + * @zh 包围盒的最小点。 + */ + get min(): Vector3; + set min(value: Vector3); + /** + * @en The maximum point of the bounding box. + * @zh 包围盒的最大点。 + */ + get max(): Vector3; + set max(value: Vector3); + /** + * @en Sets the minimum point of the bounding box. + * @param value The new minimum point to set for the bounding box. + * @zh 设置包围盒的最小点。 + * @param value 为包围盒设置的新最小点。 + */ + setMin(value: Vector3): void; + /** + * @en Gets the minimum point of the bounding box. + * @return The minimum point of the bounding box. + * @zh 获取包围盒的最小点。 + * @return 包围盒的最小点。 + */ + getMin(): Vector3; + /** + * @en Sets the maximum point of the bounding box. + * @param value The new maximum point to set for the bounding box. + * @zh 设置包围盒的最大点。 + * @param value 要设置的包围盒的新最大点。 + */ + setMax(value: Vector3): void; + /** + * @en Gets the maximum point of the bounding box. + * @return The maximum point of the bounding box. + * @zh 获取包围盒的最大点。 + * @return 包围盒的最大点。 + */ + getMax(): Vector3; + /** + * @en Sets the center point of the bounding box. + * @param value The new center point to set for the bounding box. + * @zh 设置包围盒的中心点。 + * @param value 要设置的包围盒的新中心点。 + */ + setCenter(value: Vector3): void; + /** + * @en Gets the center point of the bounding box. + * @return The center point of the bounding box. + * @zh 获取包围盒的中心点。 + * @return 包围盒的中心点。 + */ + getCenter(): Vector3; + /** + * @en Sets the range of the bounding box. + * @param value The new range to set for the bounding box. + * @zh 设置包围盒的范围。 + * @param value 要设置的包围盒的新范围。 + */ + setExtent(value: Vector3): void; + /** + * @en Gets the range of the bounding box. + * @return The range of the bounding box. + * @zh 获取包围盒的范围。 + * @return 包围盒的范围。 + */ + getExtent(): Vector3; + /** + * @en Constructor method. + * @param min The minimum point of the bounding box. + * @param max The maximum point of the bounding box. + * @zh 构造方法。 + * @param min min 最小坐标 + * @param max max 最大坐标。 + */ + constructor(min?: Vector3, max?: Vector3); + /** + * @en Calculates the intersection volume between this bounds implementation and another `BoundsImpl` instance. + * @param bounds The `BoundsImpl` instance to calculate the intersection with. + * @returns -1 if the bounds do not intersect; when not 0, the return value is the intersecting volume + * @zh 计算此边界实现与另一个 `BoundsImpl` 实例之间的相交体积。 + * @param bounds 要计算相交的 `BoundsImpl` 实例。 + * @returns -1 如果边界不相交;不为0的时候返回值为相交体积。 + */ + calculateBoundsintersection(bounds: BoundsImpl): number; + /** + * @en Clones the current bounding box into another object. + * @param destObject The destination object to clone into. + * @zh 将当前包围体克隆到另一个对象中。 + * @param destObject 克隆的目标对象。 + */ + cloneTo(destObject: BoundsImpl): void; + /** + * @en Creates a clone of the bounding box. + * @return A new `BoundsImpl` instance that is a clone of the current bounding box. + * @zh 创建当前包围体的克隆。 + * @return 一个新的 `BoundsImpl` 实例,是当前包围体的克隆。 + */ + clone(): any; + } + /** + * @en The BoundSphere class is used to create bounding balls. + * @zh BoundSphere 类用于创建包围球。 + */ + class BoundSphere implements IClone { + /** + * @en The center of the bounding sphere. + * @zh 包围球的中心。 + */ + get center(): Vector3; + set center(value: Vector3); + /** + * @en The radius of the bounding sphere. + * @zh 包围球的半径。 + */ + get radius(): number; + set radius(value: number); + /** + * @en Constructor method. + * @param center The center of the bounding sphere. + * @param radius The radius of the bounding sphere. + * @zh 构造方法 + * @param center 包围球的中心。 + * @param radius 包围球的半径。 + */ + constructor(center?: Vector3, radius?: number); + /** + * @en Resets the bound sphere to its default state. + * @zh 将包围球重置为其默认状态。 + */ + toDefault(): void; + /** + * @en Generates a bounding sphere from a subset of vertex points. + * @param points The array of vertex points. + * @param start The starting offset of the vertex subset. + * @param count The number of vertices in the subset. + * @param out The resulting bounding sphere. + * @zh 从顶点的子队列生成包围球。 + * @param points 顶点的队列。 + * @param start 顶点子队列的起始偏移。 + * @param count 顶点子队列的顶点数。 + * @param out 生成的包围球。 + */ + static createFromSubPoints(points: Vector3[], start: number, count: number, out: BoundSphere): void; + /** + * @en Generates a bounding sphere from a vertex point array. + * @param points The array of vertex points. + * @param out The resulting bounding sphere. + * @zh 从顶点队列生成包围球。 + * @param points 顶点的队列。 + * @param out 生成的包围球。 + */ + static createfromPoints(points: Vector3[], out: BoundSphere): void; + /** + * @en Determines whether a ray intersects with the bounding sphere and returns the distance to the intersection point. + * @param ray The ray. + * @returns The distance to the intersection point, or -1 if there is no intersection. + * @zh 判断射线是否与包围球相交,并返回到交点的距离。 + * @param ray 射线。 + * @returns 到交点的距离,如果没有交点则为 -1。 + */ + intersectsRayDistance(ray: Ray): number; + /** + * @en Determines whether a ray intersects with the bounding sphere and returns the intersection point. + * @param ray The ray. + * @param outPoint The intersection point. + * @returns The distance to the intersection point, or -1 if there is no intersection. + * @zh 判断射线是否与包围球相交,并返回交点。 + * @param ray 射线。 + * @param outPoint 交点。 + * @returns 到交点的距离,如果没有交点则为 -1。 + */ + intersectsRayPoint(ray: Ray, outPoint: Vector3): number; + /** + * @en Clones this bounding sphere into another object. + * @param destObject The destination object to clone into. + * @zh 克隆这个包围球到另一个对象。 + * @param destObject 克隆目标对象。 + */ + cloneTo(destObject: BoundSphere): void; + /** + * @en Creates a clone of this bounding sphere. + * @return A new `BoundSphere` instance that is a clone of this one. + * @zh 创建这个包围球的克隆。 + * @return 一个新的 `BoundSphere` 实例,是当前包围球的克隆。 + */ + clone(): any; + } + /** + * @en Collision class is used to detect collisions + * @zh Collision 类用于检测碰撞。 + */ + class CollisionUtils { + /** + * @en constructor + * @zh 构造方法 + */ + constructor(); + /** + * @en Calculates the distance from a point to a plane in space. + * @param plane The plane. + * @param point The point. + * @returns The distance from the point to the plane. + * @zh 计算空间中点到平面的距离。 + * @param plane 平面。 + * @param point 点。 + * @returns 点到平面的距离。 + */ + static distancePlaneToPoint(plane: Plane, point: Vector3): number; + /** + * @en Calculates the distance from a point to a bounding box in space. + * @param box The bounding box. + * @param point The point. + * @returns The distance from the point to the bounding box. + * @zh 计算空间中点到包围盒的距离。 + * @param box 包围盒。 + * @param point 点。 + * @returns 点到包围盒的距离。 + */ + static distanceBoxToPoint(box: BoundBox, point: Vector3): number; + /** + * @en Calculates the distance between two bounding boxes in space. + * @param box1 The first bounding box. + * @param box2 The second bounding box. + * @returns The distance between the two bounding boxes. + * @zh 计算空间中两个包围盒之间的距离。 + * @param box1 第一个包围盒。 + * @param box2 第二个包围盒。 + * @returns 两个包围盒之间的距离。 + */ + static distanceBoxToBox(box1: BoundBox, box2: BoundBox): number; + /** + * @en Calculates the distance from a point to a bounding sphere in space. + * @param sphere The bounding sphere. + * @param point The point in space. + * @returns The distance from the point to the bounding sphere. + * @zh 计算空间中点到包围球的距离。 + * @param sphere 包围球。 + * @param point 空间中的点。 + * @returns 点到包围球的距离 + */ + static distanceSphereToPoint(sphere: BoundSphere, point: Vector3): number; + /** + * @en Calculates the distance between two bounding spheres in space. + * @param sphere1 The first bounding sphere. + * @param sphere2 The second bounding sphere. + * @returns The distance between the two bounding spheres. + * @zh 计算空间中两个包围球之间的距离。 + * @param sphere1 第一个包围球。 + * @param sphere2 第二个包围球。 + * @returns 两个包围球之间的距离。 + */ + static distanceSphereToSphere(sphere1: BoundSphere, sphere2: BoundSphere): number; + /** + * @en Determines whether a ray intersects with a triangle and outputs the distance to the intersection. + * @param ray The ray. + * @param vertex1 The first vertex of the triangle. + * @param vertex2 The second vertex of the triangle. + * @param vertex3 The third vertex of the triangle. + * @param out The distance to the intersection point. + * @returns True if there is an intersection, otherwise false. + * @zh 判断射线是否与三角形相交,并输出到交点的距离。 + * @param ray 射线。 + * @param vertex1 三角形的第一个顶点。 + * @param vertex2 三角形的第二个顶点。 + * @param vertex3 三角形的第三个顶点。 + * @param out 点和三角面间距离。 + * @returns 如果相交返回真,否则返回假。 + */ + static intersectsRayAndTriangleRD(ray: Ray, vertex1: Vector3, vertex2: Vector3, vertex3: Vector3, out: number): boolean; + /** + * @en Determines whether a ray intersects with a triangle and outputs the intersection point. + * @param ray The ray. + * @param vertex1 The first vertex of the triangle. + * @param vertex2 The second vertex of the triangle. + * @param vertex3 The third vertex of the triangle. + * @param out The intersection point. + * @returns True if there is an intersection, otherwise false. + * @zh 判断射线是否与三角形相交,并输出交点。 + * @param ray 射线。 + * @param vertex1 三角形的第一个顶点。 + * @param vertex2 三角形的第二个顶点。 + * @param vertex3 三角形的第三个顶点。 + * @param out 交点。 + * @returns 如果相交返回真,否则返回假。 + */ + static intersectsRayAndTriangleRP(ray: Ray, vertex1: Vector3, vertex2: Vector3, vertex3: Vector3, out: Vector3): boolean; + /** + * @en Determines whether a ray intersects with a point. + * @param ray The ray. + * @param point The point. + * @returns True if there is an intersection, otherwise false. + * @zh 判断射线是否与点相交。 + * @param ray 射线。 + * @param point 点。 + * @returns 如果相交返回真,否则返回假。 + */ + static intersectsRayAndPoint(ray: Ray, point: Vector3): boolean; + /** + * @en Determines whether two rays intersect and outputs the intersection point. + * @param ray1 The first ray. + * @param ray2 The second ray. + * @param out The intersection point. + * @returns True if there is an intersection, otherwise false. + * @zh 判断两条射线是否相交,并输出交点。 + * @param ray1 第一个射线。 + * @param ray2 第二个射线。 + * @param out 交点。 + * @returns 如果相交返回真,否则返回假。 + */ + static intersectsRayAndRay(ray1: Ray, ray2: Ray, out: Vector3): boolean; + /** + * @en Determines whether a plane intersects with a triangle in space and returns the spatial relationship. + * @param plane The plane. + * @param vertex1 The first vertex of the triangle. + * @param vertex2 The second vertex of the triangle. + * @param vertex3 The third vertex of the triangle. + * @returns The spatial relationship between the plane and the triangle: + * - 0(PlaneIntersectionType_Back): back, + * - 1(PlaneIntersectionType_Front): front, + * - 2(PlaneIntersectionType_Intersecting): intersecting. + * @zh 判断空间中的平面是否与三角形相交,并返回空间位置关系。 + * @param plane 平面。 + * @param vertex1 三角形的第一个顶点。 + * @param vertex2 三角形的第二个顶点。 + * @param vertex3 三角形的第三个顶点。 + * @returns 平面与三角面的相交类型: + * - 0(PlaneIntersectionType_Back): 背面, + * - 1(PlaneIntersectionType_Front): 正面, + * - 2(PlaneIntersectionType_Intersecting): 相交。 + */ + static intersectsPlaneAndTriangle(plane: Plane, vertex1: Vector3, vertex2: Vector3, vertex3: Vector3): number; + /** + * @en Determines whether a ray intersects with a plane and returns the distance to the intersection. + * @param ray The ray. + * @param plane The plane. + * @returns The distance to the intersection point, or -1 if there is no intersection. + * @zh 判断射线是否与平面相交,并返回到交点的距离。 + * @param ray 射线。 + * @param plane 平面。 + * @returns 到交点的距离,如果没有交点则为 -1。 + */ + static intersectsRayAndPlaneRD(ray: Ray, plane: Plane): number; + /** + * @en Determines whether a ray intersects with a plane and outputs the intersection point. + * @param ray The ray. + * @param plane The plane. + * @param out The intersection point. + * @returns True if there is an intersection, otherwise false. + * @zh 判断射线是否与平面相交,并输出交点。 + * @param ray 射线。 + * @param plane 平面。 + * @param out 交点。 + * @returns 如果相交返回真,否则返回假。 + */ + static intersectsRayAndPlaneRP(ray: Ray, plane: Plane, out: Vector3): boolean; + /** + * @en Determines whether a ray intersects with a bounding box and outputs the distance to the intersection. + * @param ray The ray. + * @param box The bounding box. + * @returns The distance to the intersection point, or -1 if there is no intersection. + * @zh 判断射线是否与包围盒相交,并输出到交点的距离。 + * @param ray 射线。 + * @param box 包围盒。 + * @returns 到交点的距离,如果没有交点则为 -1。 + */ + static intersectsRayAndBoxRD(ray: Ray, box: BoundBox): number; + /** + * @en Determines whether a ray intersects with a bounding box and returns the intersection point. + * @param ray The ray. + * @param box The bounding box. + * @param out The intersection point. + * @returns The distance to the intersection, or -1 if there is no intersection. + * @zh 判断射线是否与包围盒相交,并返回交点。 + * @param ray 射线。 + * @param box 包围盒。 + * @param out 交点。 + * @returns 到交点的距离,如果没有交点则为 -1。 + */ + static intersectsRayAndBoxRP(ray: Ray, box: BoundBox, out: Vector3): number; + /** + * @en Determines whether a ray intersects with a bounding sphere and returns the distance to the intersection. + * @param ray The ray. + * @param sphere The bounding sphere. + * @returns The distance to the intersection point, or -1 if there is no intersection. + * @zh 判断射线是否与包围球相交,并返回到交点的距离。 + * @param ray 射线。 + * @param sphere 包围球。 + * @returns 到交点的距离,如果没有交点则为 -1。 + */ + static intersectsRayAndSphereRD(ray: Ray, sphere: BoundSphere): number; + /** + * @en Determines whether a ray intersects with a bounding sphere and returns the distance to the intersection. + * @param ray The ray. + * @param sphere The bounding sphere. + * @param out The intersection point. + * @returns The distance to the intersection, or -1 if there is no intersection. + * @zh 判断射线是否与包围球相交并返回到交点的距离。 + * @param ray 射线。 + * @param sphere 包围球。 + * @param out 交点。 + * @returns 到交点的距离,如果没有交点则为 -1。 + */ + static intersectsRayAndSphereRP(ray: Ray, sphere: BoundSphere, out: Vector3): number; + /** + * @en Determines whether a bounding sphere intersects with a triangle. + * @param sphere The bounding sphere. + * @param vertex1 The first vertex of the triangle. + * @param vertex2 The second vertex of the triangle. + * @param vertex3 The third vertex of the triangle. + * @returns True if they intersect, otherwise false. + * @zh 判断包围球是否与三角形相交。 + * @param sphere 包围球。 + * @param vertex1 三角形的第一个顶点。 + * @param vertex2 三角形的第二个顶点。 + * @param vertex3 三角形的第三个顶点。 + * @returns 如果相交返回真,否则返回假。 + */ + static intersectsSphereAndTriangle(sphere: BoundSphere, vertex1: Vector3, vertex2: Vector3, vertex3: Vector3): boolean; + /** + * @en Determines the intersection status between a point and a plane. + * @param plane The plane. + * @param point The point. + * @returns The type of intersection between a point and a plane: + * - 0(PlaneIntersectionType_Back): back, + * - 1(PlaneIntersectionType_Front): front, + * - 2(PlaneIntersectionType_Intersecting): intersecting. + * @zh 判断点与平面之间的相交状态。 + * @param plane 平面。 + * @param point 点。 + * @returns 点与平面的相交类型: + * - 0(PlaneIntersectionType_Back): 背面, + * - 1(PlaneIntersectionType_Front): 正面, + * - 2(PlaneIntersectionType_Intersecting): 相交。 + */ + static intersectsPlaneAndPoint(plane: Plane, point: Vector3): number; + /** + * @en Determines whether two planes intersect. + * @param plane1 The first plane. + * @param plane2 The second plane. + * @returns True if they intersect, otherwise false. + * @zh 判断两个平面是否相交。 + * @param plane1 第一个平面。 + * @param plane2 第二个平面。 + * @returns 如果相交返回真,否则返回假。 + */ + static intersectsPlaneAndPlane(plane1: Plane, plane2: Plane): boolean; + /** + * @en Determines whether two planes intersect and outputs the line of intersection. + * @param plane1 The first plane. + * @param plane2 The second plane. + * @param line The line representing the intersection. + * @returns True if they intersect, otherwise false. + * @zh 判断两个平面是否相交并输出相交线。 + * @param plane1 第一个平面。 + * @param plane2 第二个平面。 + * @param line 相交线。 + * @returns 如果相交返回真,否则返回假。 + */ + static intersectsPlaneAndPlaneRL(plane1: Plane, plane2: Plane, line: Ray): boolean; + /** + * @en Determines the intersection status between a plane and a bounding box. + * @param plane The plane. + * @param box The bounding box. + * @returns The intersection type of the plane and the bounding box: + * - 0(PlaneIntersectionType_Back): back, + * - 1(PlaneIntersectionType_Front): front, + * - 2(PlaneIntersectionType_Intersecting): intersecting. + * @zh 判断平面与包围盒之间的相交状态。 + * @param plane 平面。 + * @param box 包围盒。 + * @returns 平面与包围盒的相交类型: + * - 0(PlaneIntersectionType_Back): 背面, + * - 1(PlaneIntersectionType_Front): 正面, + * - 2(PlaneIntersectionType_Intersecting): 相交。 + */ + static intersectsPlaneAndBox(plane: Plane, box: BoundBox): number; + /** + * @en Determines the intersection status between a plane and a bounding sphere. + * @param plane The plane. + * @param sphere The bounding sphere. + * @returns The intersection type of the plane and the bounding sphere: 0-back, 1-front, 2-intersecting. + * @zh 判断平面与包围球之间的相交状态。 + * @param plane 平面。 + * @param sphere 包围球。 + * @returns 平面与包围球的相交类型: 0-背面,1-正面,2-相交。 + */ + static intersectsPlaneAndSphere(plane: Plane, sphere: BoundSphere): number; + /** + * @en Determines whether two bounding boxes intersect. + * @param box1 The first bounding box. + * @param box2 The second bounding box. + * @returns True if they intersect, otherwise false. + * @zh 判断两个包围盒是否相交。 + * @param box1 第一个包围盒。 + * @param box2 第二个包围盒。 + * @returns 如果相交返回真,否则返回假。 + */ + static intersectsBoxAndBox(box1: BoundBox, box2: BoundBox): boolean; + /** + * @en Determines whether a bounding box intersects with a bounding sphere. + * @param box The bounding box. + * @param sphere The bounding sphere. + * @returns True if they intersect, otherwise false. + * @zh 判断包围盒是否与包围球是否相交。 + * @param box 包围盒。 + * @param sphere 包围球。 + * @returns 如果相交返回真,否则返回假。 + */ + static intersectsBoxAndSphere(box: BoundBox, sphere: BoundSphere): boolean; + /** + * @en Determines whether one bounding sphere intersects with another bounding sphere. + * @param sphere1 The first bounding sphere. + * @param sphere2 The second bounding sphere. + * @returns True if they intersect, otherwise false. + * @zh 判断一个包围球是否与另一个包围球相交。 + * @param sphere1 第一个包围球。 + * @param sphere2 第二个包围球。 + * @returns 如果相交返回真,否则返回假。 + */ + static intersectsSphereAndSphere(sphere1: BoundSphere, sphere2: BoundSphere): boolean; + /** + * @en Determines the spatial relationship between a bounding box and a point. + * @param box The bounding box. + * @param point The point. + * @returns The relationship type: 0 for disjoint, 1 for contains, 2 for intersecting. + * @zh 确定包围盒和点之间的空间关系。 + * @param box 包围盒。 + * @param point 点。 + * @returns 位置关系:0 表示不相交,1 表示包含,2 表示相交。 + */ + static boxContainsPoint(box: BoundBox, point: Vector3): number; + /** + * @en Determines the spatial relationship between two bounding boxes. + * @param box1 The first bounding box. + * @param box2 The second bounding box. + * @returns The relationship type: 0 for disjoint, 1 for contains, 2 for intersecting. + * @zh 确定两个包围盒之间的空间关系。 + * @param box1 第一个包围盒。 + * @param box2 第二个包围盒。 + * @returns 位置关系:0 表示不相交,1 表示包含,2 表示相交。 + */ + static boxContainsBox(box1: BoundBox, box2: BoundBox): number; + /** + * @en Determines the spatial relationship between a bounding box and a bounding sphere. + * @param box The bounding box. + * @param sphere The bounding sphere. + * @returns The relationship type: 0 for disjoint, 1 for contains, 2 for intersecting. + * @zh 确定包围盒和包围球之间的空间关系。 + * @param box 包围盒。 + * @param sphere 包围球。 + * @returns 位置关系: 0 表示不相交,1 表示包含,2 表示相交。 + */ + static boxContainsSphere(box: BoundBox, sphere: BoundSphere): number; + /** + * @en Determines the spatial relationship between a bounding sphere and a point. + * @param sphere The bounding sphere. + * @param point The point. + * @returns The relationship type: 0 for disjoint, 1 for contains, 2 for intersecting. + * @zh 确定包围球和点之间的空间关系。 + * @param sphere 包围球。 + * @param point 点。 + * @returns 位置关系:0 表示不相交,1 表示包含,2 表示相交。 + */ + static sphereContainsPoint(sphere: BoundSphere, point: Vector3): number; + /** + * @en Determines the spatial relationship between a bounding sphere and a triangle. + * @param sphere The bounding sphere. + * @param vertex1 The first vertex of the triangle. + * @param vertex2 The second vertex of the triangle. + * @param vertex3 The third vertex of the triangle. + * @returns The relationship type: 0 for disjoint, 1 for contains, 2 for intersecting. + * @zh 确定包围球和三角形之间的空间关系。 + * @param sphere 包围球。 + * @param vertex1 第一个顶点。 + * @param vertex2 第二个顶点。 + * @param vertex3 第三个顶点。 + * @returns 位置关系:0 表示不相交,1 表示包含,2 表示相交。 + */ + static sphereContainsTriangle(sphere: BoundSphere, vertex1: Vector3, vertex2: Vector3, vertex3: Vector3): number; + /** + * @en Determines whether a bounding sphere contains a bounding box. + * @param sphere The bounding sphere. + * @param box The bounding box. + * @returns The spatial relationship: 0 for disjoint, 1 for contains, 2 for intersecting. + * @zh 判断包围球是否包含包围盒。 + * @param sphere 包围球。 + * @param box 包围盒。 + * @returns 位置关系:0 表示不相交,1 表示包含,2 表示相交。 + */ + static sphereContainsBox(sphere: BoundSphere, box: BoundBox): number; + /** + * @en Determines whether one bounding sphere contains another bounding sphere. + * @param sphere1 The first bounding sphere. + * @param sphere2 The second bounding sphere. + * @returns The spatial relationship: 0 for disjoint, 1 for contains, 2 for intersecting. + * @zh 判断一个包围球是否包含另一个包围球。 + * @param sphere1 第一个包围球。 + * @param sphere2 第二个包围球。 + * @returns 位置关系:0 表示不相交,1 表示包含,2 表示相交。 + */ + static sphereContainsSphere(sphere1: BoundSphere, sphere2: BoundSphere): number; + /** + * @en Finds the closest point on a triangle to a given point in space. + * @param point The point in space. + * @param vertex1 The first vertex of the triangle. + * @param vertex2 The second vertex of the triangle. + * @param vertex3 The third vertex of the triangle. + * @param out The closest point on the triangle. + * @zh 找到空间中点到三角形的最近点。 + * @param point 空间中的点。 + * @param vertex1 三角形的第一个顶点。 + * @param vertex2 三角形的第二个顶点。 + * @param vertex3 三角形的第三个顶点。 + * @param out 三角形上的最近点。 + */ + static closestPointPointTriangle(point: Vector3, vertex1: Vector3, vertex2: Vector3, vertex3: Vector3, out: Vector3): void; + /** + * @en Finds the closest point on a plane to a given point in space. + * @param plane The plane. + * @param point The point in space. + * @param out The closest point on the plane. + * @zh 找到空间中点到平面的最近点。 + * @param plane 平面。 + * @param point 空间中的点。 + * @param out 平面上的最近点。 + */ + static closestPointPlanePoint(plane: Plane, point: Vector3, out: Vector3): void; + /** + * @en Finds the closest point on a bounding box to a given point in space. + * @param box The bounding box. + * @param point The point in space. + * @param out The closest point on the bounding box. + * @zh 找到空间中点到包围盒的最近点。 + * @param box 包围盒。 + * @param point 空间中的点。 + * @param out 包围盒上的最近点。 + */ + static closestPointBoxPoint(box: BoundBox, point: Vector3, out: Vector3): void; + /** + * @en Finds the closest point on a bounding sphere to a given point in space. + * @param sphere The bounding sphere. + * @param point The point in space. + * @param out The closest point on the bounding sphere. + * @zh 找到空间中点到包围球的最近点。 + * @param sphere 包围球。 + * @param point 空间中的点。 + * @param out 包围球上的最近点。 + */ + static closestPointSpherePoint(sphere: BoundSphere, point: Vector3, out: Vector3): void; + /** + * @en Finds the closest points between two bounding spheres. + * @param sphere1 The first bounding sphere. + * @param sphere2 The second bounding sphere. + * @param out The closest point on the first bounding sphere to the second. + * @zh 找到两个包围球之间的最近点。 + * @param sphere1 第一个包围球。 + * @param sphere2 第二个包围球。 + * @param out 第一个包围球上到第二个包围球的最近点。 + */ + static closestPointSphereSphere(sphere1: BoundSphere, sphere2: BoundSphere, out: Vector3): void; + } + /** + * @en ContainmentType class defines the space object position relationship. + * @zh ContainmentType 类用于定义空间物体位置关系。 + */ + class ContainmentType { + /** + * @en Disjoint. + * @zh 不相交 + */ + static Disjoint: number; + /** + * @en Contains. + * @zh 包含 + */ + static Contains: number; + /** + * @en Intersects. + * @zh 相交 + */ + static Intersects: number; + } + /** + * @en Plane in 3D space. + * @zh 三维空间中的平面。 + */ + class Plane { + /** + * @en Intersection type of the plane with other geometries, indicating the back side. + * @zh 平面与其他几何体相交类型,表示背面。 + */ + static PlaneIntersectionType_Back: number; + /** + * @en Intersection type of the plane with other geometries, indicating the front side. + * @zh 平面与其他几何体相交类型,表示正面。 + */ + static PlaneIntersectionType_Front: number; + /** + * @en Intersection type of the plane with other geometries, indicating intersection. + * @zh 平面与其他几何体相交类型,表示相交。 + */ + static PlaneIntersectionType_Intersecting: number; + /** + * @en Constructor method of the plane. + * @param normal The normal vector of the plane. + * @param d The distance from the plane to the origin of the coordinate system. + * @zh 平面的构造方法 + * @param normal 平面的向量 + * @param d 平面到原点的距离 + */ + constructor(normal?: Vector3, d?: number); + /** + * @en Creates a plane defined by three points. + * @param point0 The first point. + * @param point1 The second point. + * @param point2 The third point. + * @param out The plane to store the result. + * @zh 通过三个点创建一个平面。 + * @param point0 第一个点。 + * @param point1 第二个点。 + * @param point2 第三个点。 + * @param out 存储结果的平面。 + */ + static createPlaneBy3P(point0: Vector3, point1: Vector3, point2: Vector3, out: Plane): void; + /** + * @en Normalizes the plane's normal vector to unit length. + * @zh 使平面的法线向量成为单位长度。 + */ + normalize(): void; + /** + * @en Clones the plane into another object. + * @param destObject The destination object to clone into. + * @zh 克隆平面到另一个对象。 + * @param destObject 克隆目标对象。 + */ + cloneTo(destObject: Plane): void; + /** + * @en Creates a clone of this plane. + * @return A new Plane instance that is a clone of this one. + * @zh 创建这个平面的克隆。 + * @return 一个新的 Plane 实例,是当前平面的克隆。 + */ + clone(): Plane; + } + /** + * @en The Rand class is used to create random numbers using a 32-bit unsigned integer seed. + * @zh Rand 类用于通过32位无符号整型随机种子创建随机数。 + */ + class Rand { + /** + * @en Obtain unsigned 32-bit floating-point random numbers through unsigned 32-bit shaping + * @param v The unsigned 32-bit integer random number. + * @returns The 32-bit floating-point random number. + * @zh 通过无符号32位整形,获取32位浮点随机数。 + * @param v 无符号32位整数随机数。 + * @returns 32位浮点随机数。 + */ + static getFloatFromInt(v: number): number; + /** + * @en Obtain an unsigned 8-bit byte random number through unsigned 32-bit shaping. + * @param v The unsigned 32-bit integer random number. + * @returns The unsigned 8-bit byte random number. + * @zh 通过无符号32位整形,获取无符号8位字节随机数。 + * @param v 无符号32位整数随机数。 + * @returns 无符号8位字节随机数。 + */ + static getByteFromInt(v: number): number; + /** + * @en Obtain random seeds + * @zh 获取随机种子。 + */ + seeds: Uint32Array; + /** + * @en The random seed. + * @zh 随机种子。 + */ + get seed(): number; + set seed(seed: number); + /** + * @en Constructor method. + * @param seed 32bit unsigned integer random seed. + * @zh 构造方法。 + * @param seed 32位无符号整型随机种子。 + */ + constructor(seed: number); + /** + * @en Gets an unsigned 32-bit integer random number. + * @returns The unsigned 32-bit integer random number. + * @zh 获取无符号32位整数随机数 + * @returns 无符号32位整数随机数。 + */ + getUint(): number; + /** + * @en Gets a floating-point random number between 0 and 1. + * @returns The floating-point random number between 0 and 1. + * @zh 获取0到1之间的浮点随机数。 + * @returns 0到1之间的浮点随机数。 + */ + getFloat(): number; + /** + * @en Gets a floating-point random number between -1 and 1. + * @returns The floating-point random number between -1 and 1. + * @zh 获取-1到1之间的浮点随机数。 + * @returns -1到1之间的浮点随机数。 + */ + getSignedFloat(): number; + } + /** + * @en The `RandX` class is used to generate random numbers using a 128-bit integer seed. The algorithm comes from the provided link: https://github.com/AndreasMadsen/xorshift + * @zh `RandX` 类用于通过128位整型种子创建随机数。算法来自提供的链接:https://github.com/AndreasMadsen/xorshift + */ + class RandX { + /** + * @en A random number generator seeded based on the current time. + * @zh 基于当前时间种子的随机数生成器。 + */ + static defaultRand: RandX; + /** + * @en Constructor method. + * @param seed Random seed. + * @zh 构造方法 + * @param seed 随机种子。 + */ + constructor(seed: any[]); + /** + * @en Return a 64 bit random number through a 2x32-bit array. + * @returns 64 bit random number. + * @zh 通过2x32位的数组,返回64位的随机数。 + * @returns 64位的随机数。 + */ + randomint(): any[]; + /** + * @en Returns a random number in the range [0, 1). + * @returns A random number in the range [0, 1). + * @zh 返回一个介于[0, 1)范围内的随机数。 + * @returns 介于[0, 1)范围内的随机数。 + */ + random(): number; + } + /** + * @en Ray class used to create a ray. + * @zh Ray 类用于创建射线。 + */ + class Ray { + /** + * @en The origin point of the ray. + * @zh 射线的原点。 + */ + origin: Vector3; + /** + * @en The direction of the ray. + * @zh 射线的方向。 + */ + direction: Vector3; + /** + * @en Constructor method of the ray class. + * @param origin The origin point of the ray. + * @param direction The direction vector of the ray. + * @zh 射线的构造方法 + * @param origin 射线的起点 + * @param direction 射线的方向 + */ + constructor(origin: Vector3, direction: Vector3); + /** + * @en Calculates a point on the ray at the specified parameter t. + * @param t The parameter along the ray at which to calculate the point. + * @param out The `Vector3` object to store the result. + * @zh 计算在指定参数 t 处的射线上的点。 + * @param t 沿射线计算点的参数。 + * @param out 存储结果的 `Vector3` 对象。 + */ + at(t: number, out: Vector3): void; + } + /** + * @en CharacterController class is used to create a character controller. + * @zh CharacterController 类用于创建角色控制器。 + */ + class CharacterController extends PhysicsColliderComponent { + protected _onAdded(): void; + /** + * @ignore + * @en The frame loop. + * @zh 帧循环 + */ + onUpdate(): void; + /** + * @en The capsule radius. + * @zh 胶囊碰撞形状的半径。 + */ + get radius(): number; + set radius(value: number); + /** + * @en The capsule height. + * @zh 胶囊碰撞形状的高度。 + */ + get height(): number; + set height(value: number); + /** + * @en The minimum step distance when a character moves using `move`. This feature is only effective in the PhysX engine. + * @zh 角色移动(通过move)时的单步最小距离。该功能只在PhysX引擎中有效。 + **/ + get minDistance(): number; + set minDistance(value: number); + /** + * @en The center offset of the capsule. + * @zh 胶囊碰撞形状的本地偏移 + */ + get centerOffset(): Vector3; + set centerOffset(value: Vector3); + /** + * @en gravity. The gravity will affect the movement of rigidbody, making it accelerate in a certain direction (usually downward, negative Y-axis) and simulate the free fall effect in real world. + * The default gravity value is **(0, -9.8, 0)**, which means the object will fall with an acceleration of 9.8 m/s² downward. + * @zh 重力。重力会影响刚体的运动,使其向某个方向(通常是向下,即 Y 轴负方向)持续加速,从而模拟真实世界中的自由落体效果。默认的重力值为 **(0, -9.8, 0)**,表示物体会以 9.8 m/s² 的加速度向下坠落 + */ + get gravity(): Vector3; + set gravity(value: Vector3); + /** + * @en The skin width of the CharacterController. + * - This property is only effective in the PhysX engine. + * - It defines the distance between the collider surface and where collision detection actually occurs. This helps in triggering collision detection and response earlier, improving the stability and reliability of the object's physical simulation. + * @zh 碰撞器外表的宽度; + * - 该属性仅在 PhysX 引擎中有效。 + * - 用于定义碰撞器表面与实际发生碰撞检测的距离,用于提前触发碰撞检测和响应,从而提高物体在物理模拟中的稳定性和可靠性。 + */ + get skinWidth(): number; + set skinWidth(value: number); + /** + * @en The maximum slope angle that the character can climb. + * If the slope angle exceeds the set value, the character will be unable to continue moving upward and may start sliding down or stop at the bottom of the slope. + * @zh 角色行走的最大坡度(角度值)。 + * 如果坡度角度超过设定的值,角色将无法继续向上移动,可能会开始滑落或停在斜坡下方。 + */ + get maxSlope(): number; + set maxSlope(value: number); + /** + * @en The height of the character's step. It represents the maximum height that the character can step over. + * @zh 角色行走的脚步高度,表示角色能够跨越的最大台阶高度。 + */ + get stepHeight(): number; + set stepHeight(value: number); + /** + * @deprecated + * @zh 角色的向上轴, 由于和其它方法设置存在冲突, 为避免开发者误解, 废弃掉. + */ + get upAxis(): Vector3; + set upAxis(value: Vector3); + /** + * @en The character's position. + * @zh 角色位置 + */ + get position(): Vector3; + set position(v: Vector3); + /** + * @en The magnitude of the push force. + * @zh 推动力的大小。 + */ + get pushForce(): number; + set pushForce(value: number); + /** + * @deprecated + * @zh 原本是用于jump没有设置值的时候,用于影响向上轴的跳跃速度与高度.考虑到建议在jump时设置速度,避免开发者的误解,所以废弃了这个属性. + */ + get jumpSpeed(): number; + set jumpSpeed(value: number); + /** + * @ignore + */ + constructor(); + /** + * @en Gets the vertical speed. + * - When the character performs a jump action, the vertical speed starts from a positive value (rising phase), then decreases to zero and finally becomes negative (falling phase). + * Developers can detect changes in vertical speed to determine whether the character is rising, at the peak or falling. + * @zh 获取角色的垂直速度。 + * - 当角色执行跳跃动作时,垂直速度会从正值开始(上升阶段),然后逐渐减小到零,再变为负值(下落阶段)。 + * 开发者可以通过检测垂直速度的变化来判断角色处于上升、顶点或下落状态 + */ + getVerticalVel(): number; + /** + * @en Moves the character by the specified movement vector. By continuously calling the `move` method and passing in a movement vector, the character will move in the specified direction and distance. + * When you need to stop, not only stopping calling the move movement vector. But also resetting the move's movement vector to zero vector. Otherwise it will continue moving based on the last set vector + * @param movement The movement vector. + * @zh 通过指定移动向量移动角色。通过不断调用 `move` 方法并传入移动向量,角色会按照指定的方向和距离进行移动。 + * 当需要停止的时候,不仅仅是停止调用move移动向量。还要将move的移动向量重置为零向量。否则会一直基于最后一次设置的向量移动。 + * @param movement 移动向量。 + */ + move(movement: Vector3): void; + /** + * @en The jump vector, direction and height. + * It is usually the opposite direction of gravity (positive Y axis), and the absolute value is larger, the higher the single jump height. + * @param velocity The jump vector, each axis's direction and height. + * @zh 用于控制角色控制器的跳跃方向和高度,通常是重力相反的方向(Y轴正方向),绝对值越大,单次跳跃的高度越高。 + * @param velocity 跳跃向量,各轴的方向与高度。 + */ + jump(velocity?: Vector3): void; + } + /** + * @en The Collision class is used to create physical collision information. + * @zh Collision 类用于创建物理碰撞信息。 + */ + class Collision { + /** + * @readonly + * @en List of collision information generated by collision. + * @zh 碰撞产生的碰撞信息列表。 + */ + contacts: ContactPoint[]; + /** + * @readonly + * @en Another collision object involved in the collision. + * @zh 碰撞中涉及的另一个碰撞体组件。 + */ + other: PhysicsColliderComponent; + /** + * @en constructor of Collision. + * @zh Collision构造方法。 + */ + constructor(); + } + /** + * @en The ConfigurableConstraint class is used for configurable constraint components. + * @zh ConfigurableConstraint类用于可设置的约束组件 + */ + class ConfigurableConstraint extends ConstraintComponent { + /** @ignore */ + constructor(); + private _setDriveLinearX; + private _setDriveLinearY; + private _setDriveLinearZ; + private _setAngularXDrive; + private _setAngularYZDrive; + private _setAngularSlerpDrive; + private _setDistanceLimit; + private _setAngularXLimit; + private _setSwingLimit; + private _setTargetTransform; + /** + * axis + */ + private _setAxis; + private _setTargetVelocirty; + /** + * @en Main axis + * @zh 主轴 + */ + get axis(): Vector3; + set axis(value: Vector3); + /** + * @en Secondary axis + * @zh 副轴 + */ + get secondaryAxis(): Vector3; + set secondaryAxis(value: Vector3); + /** + * @en The motion type for X translation. + * @zh X位移运动类型。 + */ + get XMotion(): D6Axis; + set XMotion(value: D6Axis); + /** + * @en The motion type for Y translation. + * @zh Y位移运动类型。 + */ + get YMotion(): D6Axis; + set YMotion(value: D6Axis); + /** + * @en The motion type for Z translation. + * @zh Z位移运动类型。 + */ + get ZMotion(): D6Axis; + set ZMotion(value: D6Axis); + /** + * @en The motion type for X-axis rotation. + * @zh 绕 X 轴旋转的角运动类型 + */ + get angularXMotion(): D6Axis; + set angularXMotion(value: D6Axis); + /** + * @en The motion type for Y-axis rotation. + * @zh 绕 Y 轴旋转的角运动类型 + */ + get angularYMotion(): D6Axis; + set angularYMotion(value: D6Axis); + /** + * @en The motion type for Z-axis rotation. + * @zh 绕 Z 轴旋转的角运动类型 + */ + get angularZMotion(): D6Axis; + set angularZMotion(value: D6Axis); + /** + * @en The limit value for joint translation. + * @zh 关节位移值。 + */ + get distanceLimit(): number; + set distanceLimit(value: number); + /** + * @en The bounciness value after the joint translation limit is reached. + * @zh 关节位移限制后的弹力值。 + */ + get distanceBounciness(): number; + set distanceBounciness(value: number); + /** + * @en The bounciness threshold after the joint translation limit is reached. + * @zh 关节位移限制后弹力阈值。 + */ + get distanceBounceThreshold(): number; + set distanceBounceThreshold(value: number); + /** + * @en The spring coefficient value for joint translation. + * @zh 关节位移的弹簧系数。 + */ + get distanceSpring(): number; + set distanceSpring(value: number); + /** + * @en The damping coefficient value for joint translation. + * @zh 关节位移的阻尼值。 + */ + get distanceDamper(): number; + set distanceDamper(value: number); + /** + * @en The maximum angle value for the joint's X-axis, ranging from -180° to 180°. + * @zh 关节X轴的最大角度值,范围从 -180° 到 180°。 + */ + get angularXMaxLimit(): number; + set angularXMaxLimit(value: number); + /** + * @en The minimum angle value for the joint's X-axis. + * @zh 关节X轴的最小角度值。 + */ + get angularXMinLimit(): number; + set angularXMinLimit(value: number); + /** + * @en The bounciness value after the joint's X-axis angle reaches its maximum value. + * @zh 关节X轴角度达到最大值后的弹力值。 + */ + get AngleXLimitBounceness(): number; + set AngleXLimitBounceness(value: number); + /** + * @en The bounciness threshold after the joint's X-axis angle reaches its maximum value. + * @zh 关节X轴角度达到最大值后的弹力阈值。 + */ + get AngleXLimitBounceThreshold(): number; + set AngleXLimitBounceThreshold(value: number); + /** + * @en The spring coefficient value for the joint's X-axis angle. + * @zh 关节X轴角度弹簧系数。 + */ + get AngleXLimitSpring(): number; + set AngleXLimitSpring(value: number); + /** + * @en The damping value of joint X-axis angle + * @zh 关节X轴角度阻尼值 + */ + get AngleXLimitDamp(): number; + set AngleXLimitDamp(value: number); + /** + * @en The angle limit value for the joint's Y-axis. + * @zh 关节Y轴的角度限制值。 + */ + get AngleYLimit(): number; + set AngleYLimit(value: number); + /** + * @en The angle limit value for the joint's Z-axis. + * @zh 关节Z轴的角度限制值。 + */ + get AngleZLimit(): number; + set AngleZLimit(value: number); + /** + * @en The bounciness value after the joint's YZ-plane angle reaches its maximum limit. + * @zh 关节YZ平面角度达到最大限制后的弹力值。 + */ + get AngleYZLimitBounciness(): number; + set AngleYZLimitBounciness(value: number); + /** + * @en The bounciness threshold after the joint's YZ-plane angle reaches its maximum limit. + * @zh 关节YZ平面角度达到最大限制后的弹力阈值。 + */ + get AngleYZLimitBounceThreshold(): number; + set AngleYZLimitBounceThreshold(value: number); + /** + * @en The spring coefficient value for the joint's YZ-axis rotation. + * @zh 关节YZ轴旋转的弹簧系数。 + */ + get AngleYZLimitSpring(): number; + set AngleYZLimitSpring(value: number); + /** + * @en The damping value for the joint's YZ-axis rotation. + * @zh 关节YZ轴旋转的阻尼值。 + */ + get AngleYZLimitDamping(): number; + set AngleYZLimitDamping(value: number); + /** + * @en The target position the joint is moving towards. + * @zh 关节移动到的目标位置。 + */ + get targetPosition(): Vector3; + set targetPosition(value: Vector3); + /** + * @en The target rotation direction for the joint's rotation drive. + * @zh 关节旋转驱动的目标方向。 + */ + get targetRotation(): Vector3; + set targetRotation(value: Vector3); + /** + * @en The velocity at which the joint moves towards the target position. + * @zh 关节移动到目标位置的速度。 + */ + get targetPositionVelocity(): Vector3; + set targetPositionVelocity(value: Vector3); + /** + * @en The angular velocity driven by joint rotation to the target angle. + * @zh 关节旋转到目标角度驱动的角速度。 + */ + get targetAngularVelocity(): Vector3; + set targetAngularVelocity(value: Vector3); + /** + * @en The spring coefficient value for the joint along the X-axis. + * @zh 关节在X轴方向上的弹簧系数。 + */ + get XDriveSpring(): number; + set XDriveSpring(value: number); + /** + * @en The spring coefficient value for the joint along the Y-axis. + * @zh 关节在Y轴方向上的弹簧系数。 + */ + get YDriveSpring(): number; + set YDriveSpring(value: number); + /** + * @en The spring coefficient value for the joint along the Z-axis. + * @zh 关节在Z轴方向上的弹簧系数。 + */ + get ZDriveSpring(): number; + set ZDriveSpring(value: number); + /** + * @en The damping value along the X-axis of the joint drive. + * @zh 关节在X轴方向上的阻尼值。 + */ + get XDriveDamp(): number; + set XDriveDamp(value: number); + /** + * @en The damping value along the Y-axis of the joint drive. + * @zh 关节在Y轴方向上的阻尼值。 + */ + get YDriveDamp(): number; + set YDriveDamp(value: number); + /** + * @en The damping value along the Z-axis of the joint drive. + * @zh 关节在Z轴方向上的阻尼值。 + */ + get ZDriveDamp(): number; + set ZDriveDamp(value: number); + /** + * @en The maximum force limit along the X-axis of the joint drive. + * @zh 关节在X轴方向上的最大驱动力值。 + */ + get XDriveForceLimit(): number; + set XDriveForceLimit(value: number); + /** + * @en The maximum force limit along the Y-axis of the joint drive. + * @zh 关节在Y轴方向上的最大驱动力值。 + */ + get YDriveForceLimit(): number; + set YDriveForceLimit(value: number); + /** + * @en The maximum force limit along the Z-axis of the joint drive. + * @zh 关节在Z轴方向上的最大驱动力值。 + */ + get ZDriveForceLimit(): number; + set ZDriveForceLimit(value: number); + /** + * @en The maximum rotational driving force of the joint on the X-axis. + * @zh 关节在X轴上的最大旋转驱动力。 + */ + get angularXDriveForceLimit(): number; + set angularXDriveForceLimit(value: number); + /** + * @en The drive force for the joint's rotation around the X-axis. + * @zh 关节在X轴上的旋转驱动力。 + */ + get angularXDriveForce(): number; + set angularXDriveForce(value: number); + /** + * @en The rotational damping value of the joint in the X-axis direction. + * @zh 关节在X轴方向上的旋转阻尼值。 + */ + get angularXDriveDamp(): number; + set angularXDriveDamp(value: number); + /** + * @en The maximum drive force for the joint's rotation in the YZ-plane. + * @zh 关节在YZ平面旋转驱动力的最大值。 + */ + get angularYZDriveForceLimit(): number; + set angularYZDriveForceLimit(value: number); + /** + * @en The drive force for the joint's rotation in the YZ-plane. + * @zh 关节在YZ平面上的旋转驱动力。 + */ + get angularYZDriveForce(): number; + set angularYZDriveForce(value: number); + /** + * @en The damping for the joint's rotation in the YZ-plane. + * @zh 关节在YZ平面上的阻尼。 + */ + get angularYZDriveDamp(): number; + set angularYZDriveDamp(value: number); + /** + * @en The maximum drive force for the joint's angular slerp interpolation. + * @zh 关节的角度插值驱动力的最大值。 + */ + get angularSlerpDriveForceLimit(): number; + set angularSlerpDriveForceLimit(value: number); + /** + * @en The drive force for the joint's angular slerp interpolation. + * @zh 关节的角度插值驱动力。 + */ + get angularSlerpDriveForce(): number; + set angularSlerpDriveForce(value: number); + /** + * @en The damping for the joint's angular slerp interpolation. + * @zh 角度插值阻尼。 + */ + get angularSlerpDriveDamp(): number; + set angularSlerpDriveDamp(value: number); + } + /** + * @en ConstraintComponent class is the base class for creating constraints. + * @zh ConstraintComponent 类用于创建约束的父类。 + */ + class ConstraintComponent extends Component { + /** + * @en Initializes the joint instance. + * @zh 初始化关节实例。 + */ + initJoint(): void; + /** + * @en Physical components of joint connections rigid body + * @zh 关节连接的物理组件刚体 + */ + get connectedBody(): PhysicsColliderComponent; + set connectedBody(value: PhysicsColliderComponent); + /** + * @en The owner rigid body of the joint, which is the physical component that the joint is attached to. + * @zh 关节所属的物理组件刚体。 + */ + get ownBody(): PhysicsColliderComponent; + set ownBody(value: PhysicsColliderComponent); + /** + * @en The total force applied to the joint. + * @zh 作用在关节上的总力。 + */ + get currentForce(): Vector3; + /** + * @en The total torque applied to the joint. + * @zh 作用在关节上的总力矩。 + */ + get currentTorque(): Vector3; + /** + * @en The maximum force the joint can withstand before breaking. + * @zh 关节在断裂前能承受的最大力。 + */ + get breakForce(): number; + set breakForce(value: number); + /** + * @en The maximum torque the joint can withstand before breaking. + * @zh 关节在断裂前能承受的最大扭矩。 + */ + get breakTorque(): number; + set breakTorque(value: number); + /** + * @en The anchor point. + * @zh 锚点 + */ + get anchor(): Vector3; + set anchor(value: Vector3); + /** + * @en The connected anchor point. + * @zh 连接锚点位置 + */ + get connectAnchor(): Vector3; + set connectAnchor(value: Vector3); + /** + * @en Enables or disables collision between the connected bodies of the joint. + * @zh 是否启用关节连接体之间的碰撞。 + */ + get enableCollison(): boolean; + set enableCollison(value: boolean); + /** @ignore */ + constructor(); + /** + * @en Sets the number of solver iterations used to resolve the constraint. Higher values increase the precision but may reduce performance. + * @param overideNumIterations The number of iterations to override with. + * @zh 设置用于解决约束的求解器迭代次数。次数越高,精度越准确,但可能会降低性能。 + * @param overideNumIterations 要使用的迭代次数。 + */ + setOverrideNumSolverIterations(overideNumIterations: number): void; + /** + * @en Enables or disables the constraint. + * @param enable True to enable the constraint, false to disable it. + * @zh 启用或禁用约束。 + * @param enable 是否启用约束。 + */ + setConstraintEnabled(enable: boolean): void; + } + /** + * @en Fixed constraint. Used to fix two rigidbodies together. + * @zh 固定约束,用于将两个刚体固定在一起。 + */ + class FixedConstraint extends ConstraintComponent { + /** @ignore */ + constructor(); + } + /** + * @en Represents a hinge constraint between two rigid bodies. + * @zh 两个刚体之间的铰链约束。 + */ + class HingeConstraint extends ConstraintComponent { + /** @ignore */ + constructor(); + /** + * @en Main axis. Set Hinge Rotation Axis, value by rigidbody0. + * @zh 主轴。设置铰链旋转轴,值由刚体0决定。 + */ + get Axis(): Vector3; + set Axis(value: Vector3); + /** + * @en The minimum limit value for joints. + * @zh 关节的最小限制值。 + */ + get lowerLimit(): number; + set lowerLimit(value: number); + /** + * @en The maximum limit value of the joint. + * @zh 关节的最大限制值。 + */ + get uperLimit(): number; + set uperLimit(value: number); + /** + * @en Bounciness value after joint limit. + * @zh 关节限制值后的弹力值。 + */ + get bounceness(): number; + set bounceness(value: number); + /** + * @en Minimum velocity for bounce after joint limit. + * @zh 关节限制值后弹力反弹的最小速度。 + */ + get bouncenMinVelocity(): number; + set bouncenMinVelocity(value: number); + /** + * @en Contact distance value of the joint, continuous collision within this distance. + * @zh 关节的接触距离值,在此距离内持续碰撞。 + */ + get contactDistance(): number; + set contactDistance(value: number); + /** + * @en Rotation limit of the joint. + * @zh 关节的旋转限制。 + */ + get limit(): boolean; + set limit(value: boolean); + /** + * @en Whether it is a motor (self-driven). + * @zh 是否为马达(自驱动)。 + */ + get motor(): boolean; + set motor(value: boolean); + /** + * @en Self driving acceleration (not maintaining a constant driving speed) + * @zh 自驱动加速(不保持恒定驱动速度)。 + */ + get freeSpin(): boolean; + set freeSpin(value: boolean); + /** + * @en The target velocity for the drive model. + * @zh 驱动模型的目标速度。 + */ + get targetVelocity(): number; + set targetVelocity(velocity: number); + /** + * @en Get the current angle in degrees of the joint relative to its rest position. + * @zh 获取关节相对于其静止位置的当前角度(度)。 + */ + getAngle(): number; + /** + * @en The angular velocity of the joint in degrees per second. + * @zh 获取关节的角速度,单位为度每秒。 + */ + getVelocity(): Vector3; + } + /** + * @en The `SpringConstraint` class represents a type of constraint that simulates spring behavior in a physics simulation. + * @zh `SpringConstraint` 类表示一种在物理模拟中模拟弹簧行为的约束类型。 + */ + class SpringConstraint extends ConstraintComponent { + /** + * @en the minimum distance at which a spring constraint begins to exert a separating force when the distance between objects reaches or falls below this value. + * If the objects get closer than this, the spring applies a separating force to push them apart to a safe distance. When the distance is at or above the set value, the spring doesn't exert any stretching force. + * @zh 弹簧关节在物体间距达到或小于此值时开始施加分离力的最小距离。 + * 如果物体间距小于这个值,弹簧会施加分离力将它们推开到安全距离。而当距离达到或超过设定值时,弹簧不会施加任何拉伸力。 + */ + get minDistance(): number; + set minDistance(value: number); + /** + * @en the maximum distance in a spring constraint, where the spring starts pulling the objects together if they exceed this distance. + * @zh 两个物体之间的最大允许距离。当物体间距超过这个值时,弹簧会施加拉力使物体靠近。 + */ + get maxDistance(): number; + set maxDistance(value: number); + /** + * @en refers to the allowable margin of error in a physics engine, used to handle contact or constraints between objects, ensuring the system has a certain degree of tolerance in calculations. + * @zh 弹簧的误差容限。 + * 用于处理物体之间的接触或约束时,确保系统在计算中具有一定的容忍度,以避免由于数值计算精度问题导致的不稳定或错误行为。 + */ + get tolerance(): number; + set tolerance(value: number); + /** + * @en used to set the stiffness of a spring or constraint, adjusting the strength of the force or constraint between objects. + * @zh 弹簧的刚度,以控制物体之间的弹力或约束强度。 + */ + get spring(): number; + set spring(value: number); + /** + * @en The damping of the spring. + * @zh 弹簧的阻尼值。 + */ + get damping(): number; + set damping(value: number); + } + /** + * @en ContactPoint class used to create physical contact information. + * @zh ContactPoint 类用于创建物理碰撞信息。 + */ + class ContactPoint { + /** + * @en Collider A. + * @zh 碰撞器A。 + */ + _colliderA: ICollider; + /** + * @en Collider B. + * @zh 碰撞器B。 + */ + _colliderB: ICollider; + /** + * @en Distance. + * @zh 距离。 + */ + distance: number; + /** + * @en Normal. + * @zh 法线。 + */ + normal: Vector3; + /** + * @en Collider A's contact point. + * @zh 碰撞器A的碰撞点。 + */ + positionOnA: Vector3; + /** + * @en Collider B's contact point. + * @zh 碰撞器B的碰撞点。 + */ + positionOnB: Vector3; + /** + * @en constructor of ContactPoint. + * @zh ContactPoint 构造函数。 + */ + constructor(); + } + /** + * @en The HitResult class is used to store the result of raycasting or shape scanning. + * @zh HitResult 类用于实现射线检测或形状扫描的结果。 + */ + class HitResult { + /** + * @en Whether the raycast or shape scan is successful. + * @zh 射线检测或形状扫描是否成功。 + */ + succeeded: boolean; + /** + * @en The collider that was hit. + * @zh 发生碰撞的碰撞组件。 + */ + collider: ICollider; + /** + * @en The Collision point. + * @zh 碰撞点。 + */ + point: Vector3; + /** + * @en Collision normals. + * @zh 碰撞法线。 + */ + normal: Vector3; + /** + * @en Hit Fraction + * @zh 碰撞分数。 + */ + hitFraction: number; + /** @ignore */ + constructor(); + } + /** + * @en PhysicsCollider is a class used to create physical collider. + * @zh PhysicsCollider 类用于创建物理碰撞器。 + */ + class PhysicsCollider extends PhysicsColliderComponent { + /** @ignore */ + constructor(); + _onAdded(): void; + /** + * @en If this collider is a trigger. A trigger will trigger events but not produce actual physical blocking effects. + * @zh 此碰撞器是否为触发器。触发器会触发事件但不会产生实际的物理阻挡效果。 + */ + get isTrigger(): boolean; + set isTrigger(value: boolean); + /** + * @en Whether the collider allows sleep. + * @zh 是否允许碰撞器睡眠。 + */ + get allowSleep(): boolean; + set allowSleep(value: boolean); + } + /** + * @en Describes how the physics materials of colliding objects are combined. + * @zh 描述碰撞对象的物理材料是如何组合的。 + */ + enum PhysicsCombineMode { + /** + * @en Averages the friction/bounce of the two colliding materials. + * @zh 平均值,对两个碰撞材料的摩擦力/反弹力取平均值。 + */ + Average = 0, + /** + * @en Uses the smaller friction/bounce of the two colliding materials. + * @zh 最小值,使用两个碰撞材料中较小的摩擦力/反弹力。 + */ + Minimum = 1, + /** + * @en Multiplies the friction/bounce of the two colliding materials. + * @zh 乘积,将两个碰撞材料的摩擦力/反弹力相乘,得到最终的摩擦系数。 + */ + Multiply = 2, + /** + * @en Uses the larger friction/bounce of the two colliding materials. + * @zh 最大值,使用两个碰撞材料中较大的摩擦力/反弹力。 + */ + Maximum = 3 + } + /** + * @en Describes the mode of applying physics forces. + * @zh 描述应用物理力的模式。 + */ + enum PhysicsForceMode { + /** + * @en Applies a continuous force to the object. + * @zh 对物体施加持续的力。 + */ + Force = 0, + /** + * @en Applies an instantaneous velocity change to the object, equivalent to an impulse. + * @zh 对物体施加瞬时速度变化,相当于冲量。 + */ + Impulse = 1 + } + /** + * @en PhysicsColliderComponent is the base class for creating physics components. + * @zh PhysicsColliderComponent 类用于创建物理组件的父类。 + */ + class PhysicsColliderComponent extends Component { + /** + * @en The collider object. Used to access the underlying physics engine's collider object and directly operate on the underlying physics engine's collision characteristics. + * @zh 碰撞器对象。用于访问底层物理引擎的碰撞器对象,直接操作底层物理引擎的碰撞特性。 + */ + get collider(): ICollider; + /** + * @en The restitution coefficient is a key parameter in the physics engine that controls the elasticity of object collisions. + * @zh 恢复系数是物理引擎中控制物体碰撞弹性程度的关键参数,在中文物理学术语中也被称为"弹性系数"或"反弹系数"。 + */ + get restitution(): number; + set restitution(value: number); + /** + * @en The friction of the collider defines the friction coefficient of the object's surface, affecting the difficulty of the object sliding on the contact surface. The larger the value, the greater the friction, making it harder for the object to slide. + * @zh 碰撞器的摩擦力。用于定义物体表面的摩擦系数,影响物体在接触面上滑动的难易程度。值越大,摩擦力越大,物体越难以滑动。 + */ + get friction(): number; + set friction(value: number); + /** + * @en The rolling friction of the collider. Controls the resistance of an object as it rolls on a surface, affecting how quickly the object slows down when rolling. The larger the value, the faster the object's roll deceleration. + * @zh 碰撞器的滚动摩擦力。用于控制物体在表面上滚动时的阻力,影响物体的滚动减速速率。值越大,物体滚动减速越快。 + */ + get rollingFriction(): number; + set rollingFriction(value: number); + /** + * @en The dynamic friction of the collider. Defines the friction coefficient of an object when it is already in motion. + * @zh 碰撞器的动态摩擦力。定义物体在已经运动状态下的摩擦系数。 + */ + get dynamicFriction(): number; + set dynamicFriction(value: number); + /** + * @en The static friction of the collider. Defines the friction coefficient of an object when it is stationary, resisting its movement. Typically greater than or equal to dynamic friction. + * @zh 碰撞器的静态摩擦力。定义物体在静止状态时抵抗开始移动的摩擦系数。通常大于或等于动态摩擦力。 + */ + get staticFriction(): number; + set staticFriction(value: number); + /** + * @en Friction combination mode, used to define how the friction coefficients of two objects are combined during a collision to determine the final friction force. + * The values include: + * - Average: The friction coefficients of the two objects are averaged. + * - Minimum: The minimum friction coefficient of the two objects is used. + * - Maximum: The maximum friction coefficient of the two objects is used. + * - Multiply: The friction coefficients of the two objects are multiplied to get the final friction coefficient. + * @zh 摩擦力组合模式,用于定义在两个物体发生碰撞时,如何组合它们的摩擦系数,以确定最终的摩擦力。 + * 值包括: + * - Average(平均值):两个物体的摩擦系数取平均值。 + * - Minimum(最小值):使用两个物体摩擦系数中的最小值。 + * - Maximum(最大值):使用两个物体摩擦系数中的最大值。 + * - Multiply(乘积):将两个物体的摩擦系数相乘,得到最终的摩擦系数。 + */ + get frictionCombine(): PhysicsCombineMode; + set frictionCombine(value: PhysicsCombineMode); + /** + * @en The restitution mode of the collider. + * The values include: + * - Average: The friction coefficients of the two objects are averaged. + * - Minimum: The minimum friction coefficient of the two objects is used. + * - Maximum: The maximum friction coefficient of the two objects is used. + * - Multiply: The friction coefficients of the two objects are multiplied to get the final friction coefficient. + * @zh 恢复系数(弹力)组合模式,用于定义在两个物体发生碰撞时,如何组合它们的恢复系数,以确定最终的反弹效果。 + * 值为: + * - Average(平均值):两个物体的摩擦系数取平均值。 + * - Minimum(最小值):使用两个物体摩擦系数中的最小值。 + * - Maximum(最大值):使用两个物体摩擦系数中的最大值。 + * - Multiply(乘积):将两个物体的摩擦系数相乘,得到最终的摩擦系数。 + */ + get restitutionCombine(): PhysicsCombineMode; + set restitutionCombine(value: PhysicsCombineMode); + /** + * @en The collider shape of the physics collider. Used to set the geometric shape used by a physics collider, such as box, sphere, capsule, etc., defining the physical boundaries of an object. + * @zh 物理碰撞器的碰撞形状。用于设置物理碰撞器使用的几何形状,如盒体、球体、胶囊体等,用于定义物体的物理边界。 + */ + get colliderShape(): Physics3DColliderShape; + set colliderShape(value: Physics3DColliderShape); + /** + * @en The collision group this collider belongs to, used to control which objects can collide with it based on bitwise operations. + * @zh 此碰撞器所属的碰撞组,用于控制哪些物体可以与之碰撞,基于位掩码实现。 + */ + get collisionGroup(): number; + set collisionGroup(value: number); + /** + * @en The collision groups this collider can collide with, based on bitwise operations. + * @zh 此碰撞器可以与之碰撞的碰撞组,基于位运算。 + */ + get canCollideWith(): number; + set canCollideWith(value: number); + /** @ignore */ + constructor(); + } + /** + * @en The PhysicsSettings class is used to create physics configuration information. + * @zh PhysicsSettings 类用于创建物理配置信息。 + */ + class PhysicsSettings { + /** + * @en Flags that determine the behavior of the physics engine. + * @zh 标志位,用于确定物理引擎的行为。 + */ + flags: number; + /** + * @en Used in the physics engine to specify the maximum number of substeps allowed per frame to improve the accuracy and stability of the physics simulation. + * @zh 最大子步数,在物理引擎中用于指定每一帧允许的最大子步骤数,以提高物理模拟的精度和稳定性。 + */ + maxSubSteps: number; + /** + * @en The time step of the physics simulation. + * @zh 固定时间步长,物理模拟器帧的间隔时间。 + */ + fixedTimeStep: number; + /** + * @en Whether to enable continuous collision detection. + * @zh 是否开启连续碰撞检测 + */ + enableCCD: boolean; + /** + * @en The threshold for Continuous Collision Detection (CCD). + * @zh 连续碰撞检测的阈值。 + */ + ccdThreshold: number; + /** + * @en The radius of the sphere used for Continuous Collision Detection. + * @zh 连续碰撞检测的球体半径。 + */ + ccdSphereRadius: number; + } + /** + * @en The `PhysicsUpdateList` class is used to manage the physics update queue. + * @zh `PhysicsUpdateList` 类用于实现物理更新队列。 + */ + class PhysicsUpdateList extends SingletonList { + /** @ignore */ + constructor(); + } + /** + * @en Rigidbody3D is a component that creates a rigidbody collider. + * @zh Rigidbody3D 类用于创建刚体碰撞器。 + */ + class Rigidbody3D extends PhysicsColliderComponent { + /** + * @en The mass of the rigidbody. It affects the size of acceleration and momentum transfer during force application in collisions. + * @zh 刚体的质量。影响其受力时的加速度大小和在碰撞中的动量传递。 + */ + get mass(): number; + set mass(value: number); + /** + * @en Determines if the rigidbody is kinematic. If true, the rigidbody can only be moved by transform property, not by other force-related properties. + * @zh 设置刚体是否为运动学控制模式。如果为true仅可通过transform属性移动物体,而非其他力相关属性。 + */ + get isKinematic(): boolean; + set isKinematic(value: boolean); + /** + * @en The linear damping of the rigidbody. It simulates air resistance and other environmental factors to make the object slow down gradually. + * @zh 控制刚体线性运动的阻尼系数,模拟空气阻力等环境因素,使物体逐渐减速。 + */ + get linearDamping(): number; + set linearDamping(value: number); + /** + * @en The angular damping of the rigidbody. It simulates angular resistance and other environmental factors to make the object's rotation slow down gradually. + * @zh 刚体的角速度阻尼。控制刚体旋转运动的阻尼系数,使旋转逐渐减速,防止永久旋转。 + */ + get angularDamping(): number; + set angularDamping(value: number); + /** + * @en Sets the gravity vector applied to the rigidbody, allowing customization of direction and magnitude. + * @zh 设置作用于刚体的重力向量,可自定义方向和大小。 + */ + get gravity(): Vector3; + set gravity(value: Vector3); + /** + * @en The linear motion scaling factor for each axis of the rigidbody. + * If the value of any axis is 0, it means that the linear motion is frozen on that axis. + * If the value is 1, it means that linear motion on that axis is not restricted. + * @zh 限制刚体在特定轴向的线性运动, 如果某一轴的值为0表示冻结在该轴的线性运动。为1表示在该轴的线性运动不受限制。 + */ + get linearFactor(): Vector3; + set linearFactor(value: Vector3); + /** + * @en The linear velocity of the rigidbody. + * It is represented by a three-dimensional vector (x, y, z) that corresponds to the linear velocity components of the rigidbody on the X, Y, and Z axes. + * This value not only represents the magnitude but also includes direction. + * @zh 刚体的线速度。由一个三维向量(x, y, z)表示,分别对应刚体在X、Y、Z 轴上的速度分量,该分量值既有大小又有方向。 + */ + get linearVelocity(): Vector3; + set linearVelocity(value: Vector3); + /** + * @en The angular motion scaling factor for each axis of the rigidbody. If the value of any axis is 0, it means that the angular motion is frozen on that axis. + * @zh 限制刚体在特定轴向的旋转运动,如果某一轴的值为0表示冻结在该轴的角度运动。 + */ + get angularFactor(): Vector3; + set angularFactor(value: Vector3); + /** + * @en The angular velocity of the rigidbody. + * It is represented by a three-dimensional vector (x, y, z) that corresponds to the angular velocity components of the rigidbody around X, Y, and Z axes. + * This value not only represents the magnitude but also includes direction. The unit is **radians per second**. + * @zh 刚体的角速度。由一个三维向量(Vector3)表示,分别对应刚体围绕X、Y、Z 轴的旋转速率分量,该分量值既有大小又有方向。单位是**弧度/秒**。 + */ + get angularVelocity(): Vector3; + set angularVelocity(value: Vector3); + /** + * @en Set whether the rigidbody allows sleep. + * @zh 设置刚体是否允许睡眠。 + */ + set allowSleep(value: boolean); + get allowSleep(): boolean; + /** + * @en Whether it is sleeping. + * @zh 是否处于睡眠状态。 + */ + get isSleeping(): boolean; + /** + * @en The linear velocity threshold below which the rigidbody will go to sleep. + * @zh 刚体进入睡眠状态的线速度阈值。 + */ + get sleepThreshold(): number; + set sleepThreshold(value: number); + /** + * @en Directly sets the physical position of the rigidbody. + * @zh 直接设置刚体的物理位置。 + */ + set position(pos: Vector3); + /** + * @en Directly sets the physical rotation of the rigidbody. + * @zh 直接设置刚体的物理旋转。 + */ + set orientation(q: Quaternion); + /** + * @en Sets whether the rigidbody is a trigger. Triggers can detect collisions but do not produce physical reactions. + * @zh 设置刚体是否作为触发器使用。触发器可以检测碰撞但不产生物理反应。 + */ + get trigger(): boolean; + set trigger(value: boolean); + /** + * @en The collision detection mode of the rigidbody. + * @zh 刚体的碰撞检测模式。 + */ + get collisionDetectionMode(): number; + set collisionDetectionMode(value: number); + /** @ignore */ + constructor(); + /** + * @en Applies a force to the rigidbody. + * @param force The force to apply. + * @param localOffset The offset, if it is null, it is the center point. + * @zh 应用作用力。 + * @param force 作用力。 + * @param localOffset 偏移,如果为null则为中心点 + */ + applyForce(force: Vector3, localOffset?: Vector3): void; + /** + * @en Applies a torque to the rigidbody. + * @param torque The torque vector to apply. + * @zh 对刚体应用扭转力。 + * @param torque 扭转力 + */ + applyTorque(torque: Vector3): void; + /** + * @en Applies an impulse to the rigidbody. + * @param impulse The impulse vector to apply. + * @param localOffset The offset at which the impulse is applied, relative to the rigidbody's center of mass. If null, the impulse is applied at the center. + * @zh 对刚体应用冲量。 + * @param impulse 冲量。 + * @param localOffset 冲量相对于质心的偏移。如果为null,则冲量应用在质心处。 + */ + applyImpulse(impulse: Vector3, localOffset?: Vector3): void; + /** + * @en Applies a torque impulse (rotational impulse) to the rigidbody. + * @param torqueImpulse The torque impulse vector to apply. + * @zh 对刚体应用扭转冲量(旋转冲量)。 + * @param torqueImpulse 扭转冲量 + */ + applyTorqueImpulse(torqueImpulse: Vector3): void; + /** + * @en Wakes up the rigidbody. + * @zh 唤醒刚体。 + */ + wakeUp(): void; + /** + * @deprecated + * 刚体睡眠的线速度阈值。 + */ + get sleepLinearVelocity(): number; + set sleepLinearVelocity(value: number); + /** + * @deprecated + * 刚体睡眠的角速度阈值。 + */ + get sleepAngularVelocity(): number; + set sleepAngularVelocity(value: number); + /** + * @deprecated + * 应用作用力 + * @param fx x轴方向的力 + * @param fy y轴方向的力 + * @param fz z轴方向的力 + * @param localOffset 受力点距离质点的偏移 + */ + applyForceXYZ(fx: number, fy: number, fz: number, localOffset?: Vector3): void; + } + /** + * @en BoxColliderShape class is used to create box collider shape. + * @zh BoxColliderShape 类用于创建盒子形状碰撞器。 + */ + class BoxColliderShape extends Physics3DColliderShape { + /** + * @en Constructor method, initializes the box collider shape with a specified size. + * @param sizeX The size of the box along the X-axis. + * @param sizeY The size of the box along the Y-axis. + * @param sizeZ The size of the box along the Z-axis. + * @zh 盒形碰撞器的构造方法,初始化为指定尺寸。 + * @param sizeX 盒子X轴尺寸。 + * @param sizeY 盒子Y轴尺寸。 + * @param sizeZ 盒子Z轴尺寸。 + */ + constructor(sizeX?: number, sizeY?: number, sizeZ?: number); + /** + * @en Box size + * @zh 盒子尺寸 + */ + get size(): Vector3; + set size(value: Vector3); + /** + * @inheritDoc + * @override + * @en Clone a new BoxColliderShape object. + * @zh 克隆一个新的 BoxColliderShape 对象。 + */ + clone(): any; + /** + * @en Clone data to target object. + * @param destObject target object. + * @zh 克隆数据到目标对象 + * @param destObject 目标对象 + */ + cloneTo(destObject: BoxColliderShape): void; + /** + * @deprecated + * @en X-axis size. + * @zh X轴尺寸。 + */ + get sizeX(): number; + set sizeX(value: number); + /** + * @deprecated + * @en Y-axis size. + * @zh Y轴尺寸。 + */ + get sizeY(): number; + set sizeY(value: number); + /** + * @deprecated + * @en Z-axis size. + * @zh Z轴尺寸。 + */ + get sizeZ(): number; + set sizeZ(value: number); + } + /** + * @en CapsuleColliderShape class is used to create capsule collider shape. + * @zh CapsuleColliderShape 类用于创建胶囊形状碰撞器。 + */ + class CapsuleColliderShape extends Physics3DColliderShape { + /** + * @en The radius of the capsule collider. + * @zh 胶囊碰撞器的半径。 + */ + get radius(): number; + set radius(value: number); + /** + * @en The length of the capsule collider. + * @zh 胶囊碰撞器的长度。 + */ + get length(): number; + set length(value: number); + /** + * @en The orientation of the capsule collider. + * @zh 胶囊碰撞器的方向。 + */ + get orientation(): number; + set orientation(value: number); + /** + * @en initialize the capsule collider radius, length and direction. + * @param radius The radius of the capsule collider. + * @param length The length of the capsule collider. + * @param orientation The orientation of the capsule collider. + * @zh 初始化胶囊碰撞器的半径、长度和方向。 + * @param radius 胶囊半径。 + * @param length 胶囊长度。 + * @param orientation 胶囊体方向。 + */ + constructor(radius?: number, length?: number, orientation?: number); + /** + * @inheritDoc + * @override + * @en Clone a new CapsuleColliderShape object. + * @return Clone CapsuleColliderShape object. + * @zh 克隆一个新的 胶囊形状碰撞器 对象。 + * @return 克隆的 胶囊形状碰撞器 对象。 + */ + clone(): any; + /** + * @inheritDoc + * @override + * @en Clone data to target. + * @param destObject Clone target. + * @zh 克隆数据到目标 + * @param destObject 克隆目标 + */ + cloneTo(destObject: CapsuleColliderShape): void; + } + /** + * @en use to create compound collider. + * @zh 用于创建组合碰撞器。 + */ + class CompoundColliderShape extends Physics3DColliderShape { + _shape: ICompoundColliderShape; + /** + * @en create a new instance of CompoundColliderShape. + * @zh 创建一个新的组合碰撞形状实例。 + */ + constructor(); + protected _createShape(): void; + /** + * @en set the physics shape array. + * @zh 设置物理形状数组。 + */ + set shapes(value: any[]); + get shapes(): any[]; + /** + * @en add a child collider shape. + * @param shape. + * @zh 添加一个子碰撞器形状。 + * @param shape 子碰撞器形状。 + */ + addChildShape(shape: Physics3DColliderShape): void; + /** + * @en remove a child collider shape. + * @param shape. + * @zh 移除一个子碰撞器形状。 + * @param shape 子碰撞器形状。 + */ + removeChildShape(shape: Physics3DColliderShape): void; + /** + * @en clear the child collider shape. + * @zh 清空子碰撞器形状。 + */ + clearChildShape(): void; + /** + * @en get the child shape count. + * @zh 获取子形状数量。 + */ + getChildShapeCount(): number; + /** + * @en clone the data to the destination node. + * @zh 将数据克隆到目标节点。 + */ + cloneTo(destObject: CompoundColliderShape): void; + /** + * @en clone the data to the destination node. + * @zh 将数据克隆到目标节点。 + */ + clone(): any; + /** + * @en destroy the instance. + * @zh 销毁实例。 + */ + destroy(): void; + } + /** + * @en ConeColliderShape class is used to create cone collider. + * @zh ConeColliderShape 类用于创建圆锥碰撞器。 + */ + class ConeColliderShape extends Physics3DColliderShape { + /** + * @en The radius of the cone collider. + * @zh 圆锥碰撞器的半径。 + */ + get radius(): number; + set radius(value: number); + /** + * @en The height of the cone collider. + * @zh 圆锥碰撞器的高度。 + */ + get height(): number; + set height(value: number); + /** + * @en The orientation of the cone collider. + * @zh 圆锥碰撞器的方向。 + */ + get orientation(): number; + set orientation(value: number); + /** + * @en Constructor method, initialize ConeColliderShape. + * @param radius The radius of the cone collider. + * @param height The height of the cone collider. + * @param orientation The orientation of the cone collider. + * @zh 构造方法,初始化圆锥碰撞器。 + * @param radius 半径。 + * @param height 圆锥的高度。 + * @param orientation 圆锥的朝向。 + */ + constructor(radius?: number, height?: number, orientation?: number); + /** + * @inheritDoc + * @override + * @en Clone a new ConeColliderShape object. + * @return A new ConeColliderShape object. + * @zh 克隆一个新的 圆锥碰撞器 对象。 + * @return 一个新的 圆锥碰撞器 对象。 + */ + clone(): any; + /** + * @inheritDoc + * @override + * @en Clone data to target object. + * @param destObject Target object. + * @zh 将数据克隆到目标对象 + * @param destObject 目标对象。 + */ + cloneTo(destObject: ConeColliderShape): void; + } + /** + * @en CylinderColliderShape class is used to create a cylinder collider. + * @zh CylinderColliderShape 类用于创建圆柱碰撞器。 + */ + class CylinderColliderShape extends Physics3DColliderShape { + /** + * @en The radius of the cylinder collider. + * @zh 圆柱碰撞器的半径。 + */ + get radius(): number; + set radius(value: number); + /** + * @en The height of the cylinder collider. + * @zh 圆柱碰撞器的高度。 + */ + get height(): number; + set height(value: number); + /** + * @en The orientation of the cylinder collider. + * @zh 圆柱碰撞器的方向。 + */ + get orientation(): number; + set orientation(value: number); + /** + * @en Constructor method, initialize a cylinder collider. + * @param radius The radius of the cylinder collider. + * @param height The height of the cylinder collider. + * @param orientation The orientation of the cylinder collider. + * @zh 构造方法,初始化圆柱碰撞器。 + * @param radius 圆柱的半径。 + * @param height 圆柱的高度。 + * @param orientation 圆柱的朝向。 + */ + constructor(radius?: number, height?: number, orientation?: number); + /** + * @inheritDoc + * @override + * @en Clone a new CylinderColliderShape object. + * @return A new CylinderColliderShape object. + * @zh 克隆一个新的 圆柱碰撞器 对象。 + * @return 一个新的 圆柱碰撞器 对象。 + */ + clone(): any; + /** + * @inheritDoc + * @override + * @en Clone data to target object. + * @param destObject Target object. + * @zh 将数据克隆到目标对象 + * @param destObject 目标对象。 + */ + cloneTo(destObject: CylinderColliderShape): void; + } + /** + * @en Interface for height field data. + * @zh 高度场数据接口。 + */ + interface heightFieldData { + /** + * @en The number of rows in the height field. + * @zh 高度场中的行数。 + */ + numRows: number; + /** + * @en The number of columns in the height field. + * @zh 高度场中的列数。 + */ + numCols: number; + /** + * @en The height data of the field. + * @zh 高度场的高度数据。 + */ + heightData: Float32Array; + /** + * @en The tessellation flags for the height field, where 0 and 1 indicate whether the terrain triangle faces left or right. + * @zh 镶嵌标志,0 和 1 分别表示地形三角形朝向左还是朝右。 + */ + flag: Uint8Array; + /** + * @en The scale of the height field. + * @zh 高度场的缩放。 + */ + scale: Vector3; + } + /** + * @en Class describing the physics collision of a height field. + * @zh 描述高度场物理碰撞的类。 + */ + class HeightFieldColliderShape extends Physics3DColliderShape { + /** + * @ignore + * @en Constructor method, initialize height field data. + * @param heightFieldData Height field data. + * @zh 构造方法, 初始化高度场数据。 + * @param heightFieldData 高度场数据。 + */ + constructor(heightFieldData: heightFieldData); + } + /** + * @en The `MeshColliderShape` class is used to create mesh colliders. + * @zh `MeshColliderShape` 类用于创建网格碰撞器。 + */ + class MeshColliderShape extends Physics3DColliderShape { + /** + * @en The mesh of the collider. + * @zh 碰撞器的网格。 + */ + get mesh(): Mesh; + set mesh(value: Mesh); + private _changeShape; + /** + * @en The maximum number of convex vertices. + * @zh 凸多边形顶点的最大数量。 + */ + get convexVertexMax(): number; + set convexVertexMax(value: number); + /** + * @en Whether the collider uses a convex shape. + * @zh 碰撞器是否使用凸多边形形状。 + */ + get convex(): boolean; + set convex(value: boolean); + /** @ignore */ + constructor(); + /** + * @inheritDoc + * @override + * @en Clone data to target object. + * @param destObject Target object. + * @zh 将数据克隆到目标对象 + * @param destObject 目标对象。 + */ + cloneTo(destObject: MeshColliderShape): void; + /** + * @inheritDoc + * @override + * @en Clone a new MeshColliderShape object. + * @return A new MeshColliderShape object. + * @zh 克隆一个新的 网格碰撞器 对象。 + * @return 一个新的 网格碰撞器 对象。 + */ + clone(): any; + } + /** + * @en The Physics3DColliderShape class serves as the base class for creating collider shapes and is an abstract class. + * @zh 类是用于创建形状碰撞器的父类,该类为抽象类。 + */ + class Physics3DColliderShape implements IClone { + /** + * @en Shape orientation: along the positive X-axis. + * @zh 形状方向:沿 X 轴正向。 + */ + static SHAPEORIENTATION_UPX: number; + /** + * @en Shape orientation: along the positive Y-axis. + * @zh 形状方向:沿 Y 轴正向。 + */ + static SHAPEORIENTATION_UPY: number; + /** + * @en Shape orientation: along the positive Z-axis. + * @zh 形状方向:沿 Z 轴正向。 + */ + static SHAPEORIENTATION_UPZ: number; + /** + * @en The physics component of the collider. + * @zh 碰撞器的物理组件。 + */ + private _physicsComponent; + /** + * @en The shape of the collider. + * @zh 碰撞器的形状。 + */ + get shape(): IColliderShape; + /** + * @en The local offset of the shape. + * @zh 形状的本地偏移。 + */ + get localOffset(): Vector3; + set localOffset(value: Vector3); + /** + * @en The physics component of the collider. + * @zh 碰撞器的物理组件。 + */ + get physicsComponent(): PhysicsColliderComponent; + set physicsComponent(value: PhysicsColliderComponent); + /**@ignore */ + constructor(); + /** + * @en Clone this object to a destination object. + * @param destObject The destination object. + * @zh 将此对象克隆到目标对象。 + * @param destObject 目标对象。 + */ + cloneTo(destObject: Physics3DColliderShape): void; + /** + * @en Clone. + * @return A clone of this object. + * @zh 克隆。 + * @return 此对象的克隆 + */ + clone(): any; + /** + * @en Destroy this object. + * @zh 销毁此对象。 + */ + destroy(): void; + } + /** + * @en The `SphereColliderShape` class is used to create spherical colliders. + * @zh `SphereColliderShape` 类用于创建球形碰撞器。 + */ + class SphereColliderShape extends Physics3DColliderShape { + /** + * @en The radius of the sphere collider. + * @zh 球形碰撞器的半径。 + */ + get radius(): number; + set radius(value: number); + /** + * @en Constructor method, initialize the sphere collider. + * @param radius The radius of the sphere collider. + * @zh 构造方法,初始化球形碰撞器。 + * @param radius 球形碰撞器的半径。 + */ + constructor(radius?: number); + /** + * @inheritDoc + * @override + * @en Clone a new SphereColliderShape object. + * @return A new SphereColliderShape object. + * @zh 克隆一个新的 球形碰撞器 对象。 + * @return 一个新的 球形碰撞器 对象。 + */ + clone(): any; + } + class Laya3DRender { + static Render3DModuleDataFactory: I3DRenderModuleFactory; + static Render3DPassFactory: I3DRenderPassFactory; + /** + * @deprecated + */ + static renderOBJCreate: IRenderEngine3DOBJFactory; + } + /** + * @en Mesh class is used to create a template for file mesh data. + * @zh Mesh 类用于创建文件网格数据模板。 + */ + class Mesh extends Resource implements IClone { + /** + * @deprecated 请使用Loader.load(url:string, type: ILaya.Loader.MESH) + * @en Loads a mesh template from the specified URL and calls the complete callback upon completion. + * @param url The URL of the mesh template. + * @param complete The callback function to call when the mesh is loaded. + * @zh 从指定的URL加载网格模板,并在加载完成后执行完成回调。 + * @param url 网格模板的URL。 + * @param complete 加载完成后的回调函数。 + */ + static load(url: string, complete: Handler): void; + /** + * @en Morph target data for the mesh. + * @zh 网格的变形目标数据。 + */ + morphTargetData: MorphTargetData; + /** + * @en The array of inverse absolute bind poses for the mesh. + * @zh 网格的全局默认绑定动作逆矩阵数组。 + */ + get inverseAbsoluteBindPoses(): Matrix4x4[]; + /** + * @en The number of vertices in the mesh. + * @zh 网格中的顶点数。 + */ + get vertexCount(): number; + /** + * @en The number of indices in the mesh. + * @zh 网格中的索引个数。 + */ + get indexCount(): number; + /** + * @en The number of SubMeshes in the mesh. + * @zh 子网格的个数。 + */ + get subMeshCount(): number; + /** + * @en The bounds of the mesh. + * @zh 网格的边界 + */ + get bounds(): Bounds; + set bounds(value: Bounds); + /** + * @en The index format of the mesh. + * @zh 网格的索引格式。 + */ + get indexFormat(): IndexFormat; + set indexFormat(value: IndexFormat); + /** + * @en Constructor method, do not use. + * @param isReadable 是否可读。 + * @zh 构造方法,禁止使用。 + * @param isReadable 是否可读。 + */ + constructor(isReadable?: boolean); + /** + * @en Retrieves a sub-mesh based on the index. + * @param index The index of the sub-mesh. + * @returns The sub-mesh at the specified index. + * @zh 根据索引获取子网格。 + * @param index 子网格的索引。 + * @returns 索引处的子网格。 + */ + getSubMesh(index: number): SubMesh; + /** + * @en Copies and fills position data into an array.This method is a copy operation, which may be time-consuming. + * @param positions The array to fill with position data. + * @zh 拷贝并填充位置数据至数组。该方法为拷贝操作,比较耗费性能。 + * @param positions 用于填充位置数据的数组。 + */ + getPositions(positions: Vector3[]): void; + /** + * @en Sets the position data. + * @param positions The new position data to set. + * @zh 设置位置数据。 + * @param positions 要设置的新位置数据。 + */ + setPositions(positions: Vector3[]): void; + /** + * @en Copies and fills color data into an array.This method is a copy operation, which may be time-consuming. + * @param colors The array to fill with color data. + * @zh 拷贝并填充颜色数据至数组。该方法为拷贝操作,比较耗费性 + * @param colors 用于填充颜色数据的数组。 + */ + getColors(colors: Color[]): void; + /** + * @en Sets the color data. + * @param colors The new color data to set. + * @zh 设置颜色数据。 + * @param colors 要设置的新颜色数据。 + */ + setColors(colors: Color[]): void; + /** + * @en Copies and fills texture coordinate data into an array.This method is a copy operation, which may be time-consuming. + * @param uvs The array to fill with texture coordinate data. + * @param channel The texture coordinate channel. + * @zh 拷贝并填充纹理坐标数据至数组。该方法为拷贝操作,比较耗费性能。 + * @param uvs 纹理坐标数组。 + * @param channel 纹理坐标通道。 + */ + getUVs(uvs: Vector2[], channel?: number): void; + /** + * @en Sets the texture coordinate data. + * @param uvs The new texture coordinate data to set. + * @param channel The texture coordinate channel. + * @zh 设置纹理坐标数据。 + * @param uvs 要设置的新纹理坐标数据。 + * @param channel 纹理坐标通道。 + */ + setUVs(uvs: Vector2[], channel?: number): void; + /** + * @en Copies and fills normal data into an array.This method is a copy operation, which may be time-consuming. + * @param normals The array to fill with normal data. + * @zh 拷贝并填充法线数据至数组。该方法为拷贝操作,比较耗费性能。 + * @param normals 用于填充法线数据的数组。 + */ + getNormals(normals: Vector3[]): void; + /** + * @en Sets the normal data. + * @param normals The new normal data to set. + * @zh 设置法线数据。 + * @param normals 要设置的新法线数据。 + */ + setNormals(normals: Vector3[]): void; + /** + * @en Copies and fills tangent data into an array. + * @param tangents The array to fill with tangent data. + * @zh 拷贝并填充切线数据至数组。 + * @param tangents 用于填充切线数据的数组。 + */ + getTangents(tangents: Vector4[]): void; + /** + * @en Sets the tangent data. + * @param tangents The new tangent data to set. + * @zh 设置切线数据。 + * @param tangents 要设置的新切线数据。 + */ + setTangents(tangents: Vector4[]): void; + /** + * @en Copies and fills bone weight data into an array. + * @param boneWeights The array to fill with bone weight data. + * @zh 拷贝并填充骨骼权重数据至数组。 + * @param boneWeights 用于填充骨骼权重数据的数组。 + */ + getBoneWeights(boneWeights: Vector4[]): void; + /** + * @en Copy and fill the bone weight data into the array. + * @param boneWeights Bone weight data. + * @zh 拷贝并填充骨骼权重数据至数组。 + * @param boneWeights 骨骼权重。 + */ + setBoneWeights(boneWeights: Vector4[]): void; + /** + * @en Gets the bone indices. + * @param boneIndices The bone indices + * @zh 获取骨骼索引。 + * @param boneIndices 骨骼索引。 + */ + getBoneIndices(boneIndices: Vector4[]): void; + /** + * @en Sets the bone index data. + * @param boneIndices The new bone index data to set. + * @zh 设置骨骼索引数据。 + * @param boneIndices 要设置的新骨骼索引数据。 + */ + setBoneIndices(boneIndices: Vector4[]): void; + /** + * @en Marks the Mesh as non-readable, which can reduce memory usage. Once marked, no read methods can be called. + * @zh 将Mesh标记为不可读,可以减少内存使用。标记后,不能再调用任何读取方法。 + */ + markAsUnreadbale(): void; + /** + * @en Gets the vertex declaration. + * @zh 获取顶点声明。 + */ + getVertexDeclaration(): VertexDeclaration; + /** + * @en Copies and retrieves a copy of the vertex data. + * @returns A copy of the vertex data. + * @zh 拷贝并获取顶点数据的副本。 + * @returns 顶点数据副本。 + */ + getVertices(): ArrayBuffer; + /** + * @en Sets the vertex data. + * @param vertices The vertex data to set. + * @zh 设置顶点数据。 + * @param vertices 要设置的顶点数据。 + */ + setVertices(vertices: ArrayBuffer): void; + /** + * @en Copies and retrieves a copy of the mesh indices. + * @returns A copy of the mesh indices. + * @zh 拷贝并获取网格索引的副本。 + * @returns 网格索引的副本。 + */ + getIndices(): Uint8Array | Uint16Array | Uint32Array; + /** + * @en Sets the mesh indices. + * @param indices The mesh indices to set. + * @zh 设置网格索引。 + * @param indices 要设置的网格索引。 + */ + setIndices(indices: Uint8Array | Uint16Array | Uint32Array): void; + /** + * @en Generates a bounding box from the model's position data. + * @zh 从模型位置数据生成包围盒。 + */ + calculateBounds(): void; + /** + * @en Gets the convex model. + * @returns The convex mesh. + * @zh 获取凸包模型。 + * @returns 凸包网格。 + */ + getCorveMesh(): Mesh; + /** + * @en Clones this mesh to the destination object. + * @param destObject The destination object to clone to. + * @zh 克隆当前网格到目标对象。 + * @param destObject 克隆的目标对象。 + */ + cloneTo(destObject: Mesh): void; + /** + * @en Clones this mesh. + * @returns A clone of the current mesh. + * @zh 克隆当前网格。 + * @return 当前网格的克隆副本。 + */ + clone(): any; + } + /** + * @en Utility class for mesh operations + * @zh Mesh操作的实用工具类 + */ + class MeshUtil { + /** + * @en Get the shader defines for a mesh + * @param mesh The mesh to analyze + * @param out Array to store the resulting shader defines + * @zh 获取mesh的着色器宏定义 + * @param mesh 输入的Mesh对象 + * @param out 用于存储着色器宏定义的输出数组 + */ + static getMeshDefine(mesh: Mesh, out: Array): void; + } + /** + * @en Represents a morph target in 3D modeling + * @zh 表示3D建模中的变形目标 + */ + class MorphTarget { + /** + * @en The name of the morph target + * @zh 变形目标的名称 + */ + name: string; + /** + * @en The full weight of the morph target + * @zh 变形目标的完整权重 + */ + fullWeight: number; + /** + * @en The data of the morph target + * @zh 变形目标的数据 + */ + data: Float32Array; + /** @ignore */ + constructor(); + } + /** + * @en Represents a channel of morph targets + * @zh 表示变形目标的通道 + */ + class MorphTargetChannel { + /** + * @en The name of the morph target channel + * @zh 变形目标通道的名称 + */ + name: string; + /** + * @en The list of morph targets in this channel. + * @zh 此通道中的变形目标列表。 + */ + targets: Array; + /** + * @en The count of targets in this channel + * @zh 此通道中目标的数量 + */ + targetCount: number; + constructor(); + /** + * @en Get a target by its index + * @param index The index of the target + * @returns The MorphTarget at the specified index + * @zh 通过索引获取目标 + * @param index 目标的索引 + * @returns 指定索引处的MorphTarget + */ + getTargetByIndex(index: number): MorphTarget; + /** + * @en Add a target to this channel + * @param target The MorphTarget to add + * @zh 向此通道添加目标 + * @param target 要添加的MorphTarget + */ + addTarget(target: MorphTarget): void; + } + /** + * @en Morph target data. + * @zh 变形目标数据。 + */ + class MorphTargetData { + private targets; + private channels; + /** + * @en The count of vertices in the morph target data. + * @zh 变形目标数据中的顶点计数。 + */ + vertexCount: number; + /** + * @en Removed, replaced by getting it from the VertexDeclaration. + * @zh 移除,改为从 VertexDeclaration 中获取 + */ + elementCount: number; + /** + * @en The vertex declaration associated with the morph target data. + * @zh 与变形目标数据关联的顶点声明。 + */ + vertexDec: VertexDeclaration; + /** + * @en The bounding box. + * @zh 包围盒 + */ + bounds: Bounds; + /** @ignore */ + constructor(); + /** + * @en Adds a morph target channel to the data. + * @param channel The morph target channel to add. + * @zh 向数据添加一个变形目标通道。 + * @param channel 要添加的变形目标通道。 + */ + addMorphChannel(channel: MorphTargetChannel): void; + /** + * @en Retrieves a morph target channel by its name. + * @param name The name of the morph target channel to retrieve. + * @returns The morph target channel with the specified name. + * @zh 通过名称检索变形目标通道。 + * @param name 要检索的变形目标通道的名称。 + * @returns 具有指定名称的变形目标通道。 + */ + getMorphChannel(name: string): MorphTargetChannel; + /** + * @en Retrieves a morph target channel by its index. + * @param index The index of the morph target channel to retrieve. + * @returns The morph target channel at the specified index. + * @zh 通过索引检索变形目标通道。 + * @param index 要检索的变形目标通道的索引。 + * @returns 在指定索引处的变形目标通道。 + */ + getMorphChannelbyIndex(index: number): MorphTargetChannel; + /** + * @en Initializes the data for the morph targets. + * @zh 初始化变形目标的数据。 + */ + initData(): void; + /** + * @en Cleans up and destroys the resources associated with the morph target data. + * @zh 清理并销毁与变形目标数据关联的资源。 + */ + destroy(): void; + /** + * @en Clone the morph target data. + * @returns A cloned instance of the morph target data. + * @zh 克隆变形目标数据。 + * @returns 变形目标数据的克隆实例。 + */ + clone(): MorphTargetData; + } + /** + * @en The `PrimitiveMesh` class is used to create simple meshes. + * @zh `PrimitiveMesh` 类用于创建简单的网格。 + */ + class PrimitiveMesh { + static __init__(): void; + /** + * @en Creates a box mesh. + * @param long The length of the box. Default is 1. + * @param height The height of the box. Default is 1. + * @param width The width of the box. Default is 1. + * @return The created Mesh instance. + * @zh 创建一个立方体网格。 + * @param long 立方体的长度,默认值为1。 + * @param height 立方体的高度,默认值为1。 + * @param width 立方体的宽度,默认值为1。 + * @return 创建的网格实例。 + */ + static createBox(long?: number, height?: number, width?: number): Mesh; + /** + * @en Creates a capsule mesh. + * @param radius The radius of the capsule. Default is 0.5. + * @param height The height of the capsule. Default is 2. + * @param stacks The number of stacks, typically half the number of vertical slices. Default is 16. + * @param slices The number of vertical slices. Default is 32. + * @zh 创建一个胶囊体网格。 + * @param radius 胶囊的半径,默认值为0.5。 + * @param height 胶囊的高度,默认值为2。 + * @param stacks 水平层数,默认为16,一般设为垂直层数的一半。 + * @param slices 垂直层数,默认为32。 + */ + static createCapsule(radius?: number, height?: number, stacks?: number, slices?: number): Mesh; + /** + * @en Creates a cone mesh. + * @param radius The radius of the base of the cone. Default is 0.5. + * @param height The height of the cone. Default is 1. + * @param slices The number of segments around the base of the cone. Default is 32. + * @return The created Mesh instance. + * @zh 创建一个圆锥体网格。 + * @param radius 圆锥底面的半径,默认值为0.5。 + * @param height 圆锥的高度,默认值为1。 + * @param slices 圆锥底面圆周的分段数,默认为32。 + * @return 创建的网格实例。 + */ + static createCone(radius?: number, height?: number, slices?: number): Mesh; + /** + * @en Creates a cylinder mesh. + * @param radius The radius of the cylinder. Default is 0.5. + * @param height The height of the cylinder. Default is 2. + * @param slices The number of vertical segments of the cylinder. Default is 32. + * @return The created Mesh instance. + * @zh 创建一个圆柱体网格。 + * @param radius 圆柱的半径,默认值为0.5。 + * @param height 圆柱的高度,默认值为2。 + * @param slices 圆柱的垂直层数,默认为32。 + * @return 创建的网格实例。 + */ + static createCylinder(radius?: number, height?: number, slices?: number): Mesh; + /** + * @en Creates a plane mesh. + * @param long The length of the plane. Default is 10. + * @param width The width of the plane. Default is 10. + * @param stacks The number of longitudinal subdivisions. Default is 10. + * @param slices The number of latitudinal subdivisions. Default is 10. + * @return The created Mesh instance. + * @zh 创建一个平面网格。 + * @param long 平面的长。默认值为10。 + * @param width 平面的宽。默认值为10。 + * @param stacks 纵向细分的数量。默认为10。 + * @param slices 横向细分的数量。默认为10。 + * @return 创建的网格实例。 + */ + static createPlane(long?: number, width?: number, stacks?: number, slices?: number): Mesh; + /** + * @en Creates a quad mesh. + * @param long The length of the quad. Default is 1. + * @param width The width of the quad. Default is 1. + * @return The created Mesh instance. + * @zh 创建一个四边形网格。 + * @param long 四边形的长度。默认是1。 + * @param width 四边形的宽度。默认是1。 + * @return 创建的网格实例。 + */ + static createQuad(long?: number, width?: number): Mesh; + /** + * @en Creates a sphere mesh. + * @param radius The radius of the sphere. Default is 0.5. + * @param stacks The number of stacks, typically used for the vertical slices. Default is 32. + * @param slices The number of slices, typically used for the horizontal circles. Default is 32. + * @return The created Mesh instance. + * @zh 创建一个球体网格。 + * @param radius 球体的半径。默认是0.5。 + * @param stacks 水平层数,通常用作垂直切分。默认是32。 + * @param slices 垂直层数,通常用作水平圆周切分。默认是32。 + * @return 创建的网格实例。 + */ + static createSphere(radius?: number, stacks?: number, slices?: number): Mesh; + } + /** + * @en SkyBox class used to create a skybox. + * @zh SkyBox 类用于创建天空盒。 + */ + class SkyBox extends GeometryElement { + /** + * @en The singleton instance of the SkyBox class. + * @zh SkyBox类的单例实例。 + */ + static instance: SkyBox; + /** + * @ignore + * @en Creates an instance of SkyBox. + * @zh 创建 SkyBox 的实例。 + */ + constructor(); + } + /** + * @en SkyDome class is used to create a sky dome. + * @zh SkyDome 类用于创建天空球。 + */ + class SkyDome extends GeometryElement { + /** + * @en The singleton instance of the SkyDome. + * @zh SkyDome的实例。 + */ + static instance: SkyDome; + /** + * @en Creates an instance of SkyDome. + * @param stacks The number of stacks of the SkyDome. + * @param slices The number of slices of the SkyDome. + * @zh 创建一个 SkyDome 的实例。 + * @param stacks SkyDome的堆数。 + * @param slices SkyDome的层数。 + */ + constructor(stacks?: number, slices?: number); + } + /** + * @en SkyRenderer class used to implement sky rendering. + * @zh SkyRenderer 类用于实现天空渲染器。 + */ + class SkyRenderer { + private _renderData; + private _renderGeometry; + private _cacheRenderElement; + /** + * @en The material. + * @zh 材质。 + */ + get material(): Material; + set material(value: Material); + /** + * @en The mesh of the renderer. + * @zh 渲染器网格。 + */ + get mesh(): GeometryElement; + set mesh(value: GeometryElement); + /** + * @ignore + * @en Creates an instance of SkyRenderer. + * @zh 创建一个 SkyRenderer 的实例。 + */ + constructor(); + /** + * @en Sets the render element for the sky. + * @param skyRenderElement The render element to set. + * @zh 设置天空的渲染元素。 + * @param skyRenderElement 要设置的渲染元素。 + */ + setRenderElement(skyRenderElement: SkyRenderElement): void; + } + /** + * @en SubMesh class used to create submesh data template. + * @zh SubMesh 类用于创建子网格数据模板。 + */ + class SubMesh extends GeometryElement { + /** + * @en The number of indices. + * @zh 索引的数量。 + */ + get indexCount(): number; + /** + * @en Creates an instance of SubMesh. + * @param mesh The mesh data template. + * @zh 创建 SubMesh 实例。 + * @param mesh 网格数据模板。 + */ + constructor(mesh: Mesh); + /** + * @en Copies and gets a copy of the submesh index data. + * @returns A copy of the indices. + * @zh 拷贝并获取子网格索引数据的副本。 + * @returns 索引的副本。 + */ + getIndices(): Uint16Array | Uint32Array; + /** + * @en Sets the indices for the submesh. + * @param indices The indices to set. + * @zh 设置子网格的索引。 + * @param indices 要设置的索引。 + */ + setIndices(indices: Uint16Array): void; + /** + * @en Destroys the submesh and releases resources. + * @zh 销毁子网格并释放资源。 + */ + destroy(): void; + } + class BlinnPhongShaderInit { + static init(): void; + } + class PBRShaderLib { + /** + * emission + */ + static DEFINE_EMISSION: ShaderDefine; + /** + * clear coat + */ + static DEFINE_CLEARCOAT: ShaderDefine; + static DEFINE_CLEARCOAT_NORMAL: ShaderDefine; + /** + * anisotropy + */ + static DEFINE_ANISOTROPY: ShaderDefine; + /** + * ior + */ + static DEFINE_IOR: ShaderDefine; + /** + * iridescence + */ + static DEFINE_IRIDESCENCE: ShaderDefine; + /** + * sheen + */ + static DEFINE_SHEEN: ShaderDefine; + /** + * transmission + */ + static DEFINE_TRANSMISSION: ShaderDefine; + /** + * thick / volume + */ + static DEFINE_THICKNESS: ShaderDefine; + static init(): void; + } + class PBRStandardShaderInit { + static init(): void; + } + class ACESShaderLib { + static init(): void; + } + class BlitScreenShaderInit { + static init(): void; + private static lutBuilderInit; + } + /** + * ParticleShuriKen Shader init + */ + class ParticleShuriKenShaderInit { + static init(): void; + } + class SkyBoxShaderInit { + static init(): void; + } + class SkyPanoramicShaderInit { + static init(): void; + } + class SkyProceduralShaderInit { + static init(): void; + } + class TrailShaderInit { + static init(): void; + } + class UnlitShaderInit { + static init(): void; + } + /** + * @en Shadow Light enum + * @zh 阴影光类型 + */ + enum ShadowLightType { + /** + * @en Directional Light + * @zh 方向光 + */ + DirectionLight = 0, + /** + * @en Spot Light + * @zh 聚光 + */ + SpotLight = 1, + /** + * @en Point Light + * @zh 点光 + */ + PointLight = 2 + } + /** + * @en Camera culling information class. + * @zh 摄像机裁剪信息类。 + */ + class CameraCullInfo { + /** + * @en Position of the camera in the scene. + * @zh 摄像机在场景中的位置。 + */ + position: Vector3; + /** + * @en Whether to use occlusion culling. + * @zh 是否遮挡剔除 + */ + useOcclusionCulling: Boolean; + /** + * @en Frustum that bounds the camera's view. + * @zh 摄像机视锥体的包围盒。 + */ + boundFrustum: BoundFrustum; + /** + * @en Occlusion Mask + * @zh 遮挡标记 + */ + cullingMask: number; + /** + * @en Static Mask + * @zh 静态标记 + */ + staticMask: number; + /** + * @en Create a new instance of CameraCullInfo. + * @zh 创建 CameraCullInfo 类的新实例。 + */ + constructor(); + } + /** + * @en Shadow culling information. + * @zh 阴影裁剪信息 + */ + class ShadowCullInfo { + /** + * @en Position. + * @zh 位置。 + */ + position: Vector3; + /** + * @en Direction. + * @zh 方向。 + */ + direction: Vector3; + /** + * @en Array of planes used for culling. + * @zh 用于裁剪的平面数组。 + */ + cullPlanes: Plane[]; + /** + * @en Sphere used for culling. + * @zh 用于裁剪的球体。 + */ + cullSphere: BoundSphere; + /** + * @en Number of culling planes. + * @zh 裁剪平面的数量。 + */ + cullPlaneCount: number; + } + /** + * @en Spotlight Shadow Data + * @zh 聚光灯阴影数据 + */ + class ShadowSpotData { + /** + * @en The camera shader data. + * @zh 摄像机着色器数据。 + */ + cameraShaderValue: ShaderData; + /** + * @en Position of the shadow. + * @zh 阴影的位置。 + */ + position: Vector3; + /** + * @en Offset on the X-axis for the shadow map. + * @zh 阴影贴图在X轴上的偏移。 + */ + offsetX: number; + /** + * @en Offset on the Y-axis for the shadow map. + * @zh 阴影贴图在Y轴上的偏移。 + */ + offsetY: number; + /** + * @en Resolution of the shadow map. + * @zh 阴影贴图的分辨率。 + */ + resolution: number; + /** + * @en View matrix of the shadow. + * @zh 阴影的视图矩阵。 + */ + viewMatrix: Matrix4x4; + /** + * @en Projection matrix of the shadow. + * @zh 阴影的投影矩阵。 + */ + projectionMatrix: Matrix4x4; + /** + * @en Combined view and projection matrix of the shadow. + * @zh 阴影的视图投影矩阵。 + */ + viewProjectMatrix: Matrix4x4; + /** + * @en Culling information for the shadow camera. + * @zh 阴影摄像机的裁剪信息。 + */ + cameraCullInfo: CameraCullInfo; + /** + * @en Uniform buffer object for the camera. + * @zh 摄像机的统一缓冲对象。 + */ + cameraUBO: UniformBufferObject; + /** + * @en Uniform buffer data for the camera. + * @zh 摄像机的统一缓冲数据。 + */ + cameraUBData: UnifromBufferData; + /** + * @en Create a new instance of ShadowSpotData. + * @zh 创建 ShadowSpotData 类的新实例。 + */ + constructor(); + destroy(): void; + } + /** + * @en TextMesh class used to create text mesh. + * @zh TextMesh 类用于创建文本网格。 + */ + class TextMesh { + private _text; + private _fontSize; + private _color; + /** + * @en The text of the TextMesh. + * @zh 文本网格的文本。 + */ + get text(): string; + set text(value: string); + /** + * @en The font size of the TextMesh. + * @zh 字体尺寸。 + */ + get fontSize(): number; + set fontSize(value: number); + /** + * @en The color of the TextMesh. + * @zh 文本网格的颜色 + */ + get color(): Color; + set color(value: Color); + /** @ignore */ + constructor(); + } + /** + * @en Physics3DUtils class represents a 3D physics collision group. + * @zh Physics3DUtils 类表示3D物理碰撞组。 + */ + class Physics3DUtils { + /** + * @en Default collision filter group. + * @zh 默认碰撞组。 + */ + static COLLISIONFILTERGROUP_DEFAULTFILTER: number; + /** + * @en Static collision filter group. + * @zh 静态碰撞组。 + */ + static COLLISIONFILTERGROUP_STATICFILTER: number; + /** + * @en Kinematic rigid body collision filter group. + * @zh 运动学刚体碰撞组。 + */ + static COLLISIONFILTERGROUP_KINEMATICFILTER: number; + /** + * @en Debris collision filter group. + * @zh 碎片碰撞组。 + */ + static COLLISIONFILTERGROUP_DEBRISFILTER: number; + /** + * @en Sensor trigger filter group. + * @zh 传感器触发器。 + */ + static COLLISIONFILTERGROUP_SENSORTRIGGER: number; + /** + * @en Character filter group. + * @zh 字符过滤器。 + */ + static COLLISIONFILTERGROUP_CHARACTERFILTER: number; + /** + * @en Custom filter group 1. + * @zh 自定义过滤1。 + */ + static COLLISIONFILTERGROUP_CUSTOMFILTER1: number; + /** + * @en Custom filter group 2. + * @zh 自定义过滤2。 + */ + static COLLISIONFILTERGROUP_CUSTOMFILTER2: number; + /** + * @en Custom filter group 3. + * @zh 自定义过滤3。 + */ + static COLLISIONFILTERGROUP_CUSTOMFILTER3: number; + /** + * @en Custom filter group 4. + * @zh 自定义过滤4。 + */ + static COLLISIONFILTERGROUP_CUSTOMFILTER4: number; + /** + * @en Custom filter group 5. + * @zh 自定义过滤5。 + */ + static COLLISIONFILTERGROUP_CUSTOMFILTER5: number; + /** + * @en Custom filter group 6. + * @zh 自定义过滤6。 + */ + static COLLISIONFILTERGROUP_CUSTOMFILTER6: number; + /** + * @en Custom filter group 7. + * @zh 自定义过滤7。 + */ + static COLLISIONFILTERGROUP_CUSTOMFILTER7: number; + /** + * @en Custom filter group 8. + * @zh 自定义过滤8。 + */ + static COLLISIONFILTERGROUP_CUSTOMFILTER8: number; + /** + * @en Custom filter group 9. + * @zh 自定义过滤9。 + */ + static COLLISIONFILTERGROUP_CUSTOMFILTER9: number; + /** + * @en Custom filter group 10. + * @zh 自定义过滤10。 + */ + static COLLISIONFILTERGROUP_CUSTOMFILTER10: number; + /** + * @en All filter group that includes all other filter groups. + * @zh 包含所有其他过滤组的所有过滤组。 + */ + static COLLISIONFILTERGROUP_ALLFILTER: number; + /** + * @en Default mask value used in PhysX. + * @zh 在PhysX中使用的默认掩码值。 + */ + static PHYSXDEFAULTMASKVALUE: number; + } + /** + * @en Picker class used to create picking. + * @zh Picker 类用于创建拾取。 + */ + class Picker { + /** @ignore */ + constructor(); + /** + * @en Calculates a ray originating from the mouse position. + * @param point The mouse position in screen space. + * @param viewPort The viewport dimensions. + * @param projectionMatrix The projection (perspective) matrix. + * @param viewMatrix The view matrix. + * @param world The world offset matrix. + * @param out The output ray. + * @zh 根据鼠标位置计算射线。 + * @param point 屏幕空间中的鼠标位置。 + * @param viewPort 视口尺寸。 + * @param projectionMatrix 投影(透视)矩阵。 + * @param viewMatrix 视图矩阵。 + * @param world 世界偏移矩阵。 + * @param out 输出射线。 + */ + static calculateCursorRay(point: Vector2, viewPort: Viewport, projectionMatrix: Matrix4x4, viewMatrix: Matrix4x4, world: Matrix4x4, out: Ray): void; + /** + * @en Calculates the intersection of a ray with a triangle and returns the intersection distance. + * @param ray The ray. + * @param vertex1 The first vertex of the triangle. + * @param vertex2 The second vertex of the triangle. + * @param vertex3 The third vertex of the triangle. + * @returns The distance from the ray to the triangle, or `Number.NaN` if there is no intersection. + * @zh 计算射线与三角形的交点并返回交点距离。 + * @param ray 射线。 + * @param vertex1 三角形的第一个顶点。 + * @param vertex2 三角形的第二个顶点。 + * @param vertex3 三角形的第三个顶点。 + * @returns 射线到三角形的距离,如果没有交点则返回 `Number.NaN`。 + */ + static rayIntersectsTriangle(ray: Ray, vertex1: Vector3, vertex2: Vector3, vertex3: Vector3): number; + /** + * @en Detects the intersection point between a ray and a plane. + * @param ray The ray. + * @param plane The plane. + * @returns The intersection point, or `null` if there is no intersection. + * @zh 检测射线和平面的交点。 + * @param ray 射线。 + * @param plane 平面。 + * @returns 交点,如果没有交点则返回 `null`。 + */ + static rayPlaneIntersection(ray: Ray, plane: Plane): Vector3; + } + /** + * @en The `Size` class represents the dimensions of a rectangle or other shape in 2D space. + * @zh `Size` 类表示2D空间中矩形或其他形状的尺寸。 + */ + class Size { + /** + * @en Gets the screen size of the global scene. + * @return Returns a `Size` instance with both width and height set to -1, indicating full screen. + * @zh 获取全局场景的屏幕尺寸。 + * @return 返回一个宽度和高度都设置为 -1 的 `Size` 实例,表示全屏。 + */ + static get fullScreen(): Size; + private _width; + private _height; + /** + * @en Width. + * @zh 宽度 + */ + get width(): number; + /** + * @en Height. + * @zh 高度 + */ + get height(): number; + /** + * @en Creates an instance of `Size`. + * @param width Width. + * @param height Height. + * @zh 创建一个 `Size` 实例。 + * @param width 宽度 + * @param height 高度 + */ + constructor(width: number, height: number); + } + /** + * @en Utils3D is a class used to create 3D tools. + * @zh Utils3D 类用于创建3D工具。 + */ + class Utils3D { + /** + *通过数平移、旋转、缩放值计算到结果矩阵数组,骨骼动画专用。 + * @param tx left矩阵数组。 + * @param ty left矩阵数组的偏移。 + * @param tz right矩阵数组。 + * @param qx right矩阵数组的偏移。 + * @param qy 输出矩阵数组。 + * @param qz 输出矩阵数组的偏移。 + * @param qw 输出矩阵数组的偏移。 + * @param sx 输出矩阵数组的偏移。 + * @param sy 输出矩阵数组的偏移。 + * @param sz 输出矩阵数组的偏移。 + * @param outArray 结果矩阵数组。 + * @param outOffset 结果矩阵数组的偏移。 + */ + private static _rotationTransformScaleSkinAnimation; + /** + * @en Convert vertices to a billboard + * @zh 将顶点进行广告牌转换 + */ + static billboardTrans(v0: Vector3, cameraDir: Vector3, cameraUp: Vector3, out: Vector3): void; + /** + * @en Determines if point P is within the triangle formed by points A, B, and C. https://mathworld.wolfram.com/BarycentricCoordinates.html + * @param A The first vertex of the triangle. + * @param B The second vertex of the triangle. + * @param C The third vertex of the triangle. + * @param P The point to check. + * @returns True if P is inside the triangle, false otherwise. + * @zh 判断点P是否在由点A、B、C组成的三角形内。https://mathworld.wolfram.com/BarycentricCoordinates.html + * @param A 三角形的第一个顶点。 + * @param B 三角形的第二个顶点。 + * @param C 三角形的第三个顶点。 + * @param P 需要判断的点。 + * @returns 若P在三角形内,返回true,否则返回false。 + */ + static PointinTriangle(A: Vector3, B: Vector3, C: Vector3, P: Vector3): boolean; + /** + * @en Rotates a 3D vector using a quaternion. + * @param sourceArray The source vector components in a Float32Array. + * @param sourceOffset The offset in the source array where the source vector starts. + * @param rotation The quaternion representing the rotation. + * @param outArray The array to store the result of the rotation. + * @param outOffset The offset in the output array where the result will be stored. + * @zh 使用四元数旋转三维向量。 + * @param sourceArray 源三维向量的数组。 + * @param sourceOffset 源三维向量的偏移。 + * @param rotation 四元数。 + * @param outArray 输出数组。 + * @param outOffset 输出数组的偏移。 + */ + static transformVector3ArrayByQuat(sourceArray: Float32Array, sourceOffset: number, rotation: Quaternion, outArray: Float32Array, outOffset: number): void; + /** + * @en Multiplies two matrices using array data. + * @param leftArray The left-hand side matrix array. + * @param leftOffset The offset in the left-hand side array. + * @param rightArray The right-hand side matrix array. + * @param rightOffset The offset in the right-hand side array. + * @param outArray The output matrix array where the result will be stored. + * @param outOffset The offset in the output array. + * @zh 通过数组数据计算矩阵乘法。 + * @param leftArray 左矩阵数组。 + * @param leftOffset 左矩阵数组的偏移。 + * @param rightArray 右矩阵数组。 + * @param rightOffset 右矩阵数组的偏移。 + * @param outArray 输出矩阵数组。 + * @param outOffset 输出矩阵数组的偏移。 + */ + static mulMatrixByArray(leftArray: Float32Array, leftOffset: number, rightArray: Float32Array, rightOffset: number, outArray: Float32Array, outOffset: number): void; + /** + * @en Multiplies two matrices using array data, with the restriction that rightArray and outArray cannot be the same array reference. + * @param leftArray The left-hand side matrix array. + * @param leftOffset The offset in the left-hand side array. + * @param rightArray The right-hand side matrix array. + * @param rightOffset The offset in the right-hand side array. + * @param outArray The output matrix array where the result will be stored. + * @param outOffset The offset in the output array. + * @zh 通过数组数据计算矩阵乘法,注意 rightArray 和 outArray 不能是同一个数组引用。 + * @param leftArray 左矩阵数组。 + * @param leftOffset 左矩阵数组的偏移。 + * @param rightArray 右矩阵数组。 + * @param rightOffset 右矩阵数组的偏移。 + * @param outArray 输出矩阵数组。 + * @param outOffset 输出矩阵数组的偏移。 + */ + static mulMatrixByArrayFast(leftArray: Float32Array, leftOffset: number, rightArray: Float32Array, rightOffset: number, outArray: Float32Array, outOffset: number): void; + /** + * @en Multiplies a matrix by an array and another matrix, with the restriction that rightArray and outArray cannot be the same array reference. + * @param leftArray The left-hand side matrix array. + * @param leftOffset The offset in the left-hand side array. + * @param rightMatrix The right-hand side matrix. + * @param outArray The output matrix array where the result will be stored. + * @param outOffset The offset in the output array. + * @zh 通过数组数据和一个矩阵计算矩阵乘法,注意 rightArray 和 outArray 不能是同一个数组引用。 + * @param leftArray 左矩阵数组。 + * @param leftOffset 左矩阵数组的偏移。 + * @param rightMatrix 右矩阵。 + * @param outArray 输出矩阵数组。 + * @param outOffset 输出矩阵数组的偏移。 + */ + static mulMatrixByArrayAndMatrixFast(leftArray: Float32Array, leftOffset: number, rightMatrix: Matrix4x4, outArray: Float32Array, outOffset: number): void; + /** + * @en Calculates the result matrix array by the given translation, rotation, and scale values. + * @param tX X axis translation. + * @param tY Y axis translation. + * @param tZ Z axis translation. + * @param rX X axis rotation. + * @param rY Y axis rotation. + * @param rZ Z axis rotation. + * @param rW W component of the rotation quaternion. + * @param sX X axis scale. + * @param sY Y axis scale. + * @param sZ Z axis scale. + * @param outArray Output matrix array. + * @param outOffset Output matrix array offset. + * @zh 通过数平移、旋转、缩放值计算到结果矩阵数组。 + * @param tX X轴的平移量。 + * @param tY Y轴的平移量。 + * @param tZ Z轴的平移量。 + * @param rX 旋转四元数的X分量。 + * @param rY 旋转四元数的Y分量。 + * @param rZ 旋转四元数的Z分量。 + * @param rW 旋转四元数的实部(W分量)。 + * @param sX X轴的缩放因子。 + * @param sY Y轴的缩放因子。 + * @param sZ Z轴的缩放因子。 + * @param outArray 输出矩阵数组。 + * @param outOffset 输出矩阵数组的偏移。 + */ + static createAffineTransformationArray(tX: number, tY: number, tZ: number, rX: number, rY: number, rZ: number, rW: number, sX: number, sY: number, sZ: number, outArray: Float32Array, outOffset: number): void; + /** + * @en Transforms a 3D vector from one array to another using a transformation matrix. + * @param source The source vector array. + * @param sourceOffset The offset in the source array. + * @param transform The transformation matrix. + * @param result The resulting vector array. + * @param resultOffset The offset in the resulting array. + * @zh 使用变换矩阵将一个三维向量从一个数组转换到另一个数组。 + * @param source 源三维向量所在数组。 + * @param sourceOffset 源三维向量数组偏移。 + * @param transform 变换矩阵。 + * @param result 输出三维向量所在数组。 + * @param resultOffset 输出三维向量数组偏移。 + */ + static transformVector3ArrayToVector3ArrayCoordinate(source: Float32Array, sourceOffset: number, transform: Matrix4x4, result: Float32Array, resultOffset: number): void; + /** + * @en Transforms a 3D vector array from one array to another using a transformation matrix, and normalizes the resulting vector array. + * @param source The source normal vector array. + * @param sourceOffset The offset in the source array. + * @param transform The transformation matrix. + * @param result The resulting normal vector array. + * @param resultOffset The offset in the resulting array. + * @zh 通过矩阵转换一个三维向量数组到另外一个归一化的三维向量数组。 + * @param source 源三维向量法线所在数组。 + * @param sourceOffset 源三维向量法线数组偏移。 + * @param transform 变换矩阵。 + * @param result 输出三维向量法线所在数组。 + * @param resultOffset 输出三维向量法线数组偏移。 + */ + static transformVector3ArrayToVector3ArrayNormal(source: Float32Array, sourceOffset: number, transform: Matrix4x4, result: Float32Array, resultOffset: number): void; + /** + * @en Retrieves the version string from a URL. + * @param url The URL to extract the version from. + * @returns The version string or null if not found. + * @zh 从URL中获取版本字符串。 + * @param url 要提取版本的URL。 + * @returns 版本字符串或null。 + */ + static getURLVerion(url: string): string; + /** + * @en Applies a rotation to a 3D vector using a quaternion. + * @param source The original 3D vector. + * @param rotation The quaternion array representing the rotation. + * @param out The resulting rotated vector. + * @zh 使用四元数对三维向量应用旋转。 + * @param source 原始三维向量。 + * @param rotation 旋转四元数数组。 + * @param out 结果旋转后的向量。 + */ + static transformQuat(source: Vector3, rotation: Float32Array, out: Vector3): void; + /** + * @en Modifies the weight of a quaternion. + * @param f The original quaternion. + * @param weight The weight to apply to the quaternion. + * @param e The target data. + * @zh 修改四元数的权重。 + * @param f 元数据 + * @param weight 要应用于四元数的权重。 + * @param e 目标数据。 + */ + static quaternionWeight(f: Quaternion, weight: number, e: Quaternion): void; + static _getParentNodeByHierarchyPath(rootSprite: Node, path: number[]): Node; + /** + * @deprecated 请使用uint8ArrayToArrayBufferAsync函数代替 + * 将RenderTexture转换为Base64 + * @param rendertexture 渲染Buffer + * @returns + */ + static uint8ArrayToArrayBuffer(rendertexture: RenderTexture): string; + /** + * @en Converts a RenderTexture to a Base64 encoded string. + * @param rendertexture The RenderTexture to convert. + * @returns A promise that resolves to a Base64 string representing the RenderTexture. + * @zh 将 RenderTexture 转换为 Base64 编码的字符串。 + * @param rendertexture 要转换的 RenderTexture。 + * @returns 一个 Promise,该 Promise 将解析为表示 RenderTexture 的 Base64 字符串。 + */ + static uint8ArrayToArrayBufferAsync(rendertexture: RenderTexture): Promise; + } + /** + * @en This class is used to manage XRCamera + * @zh 此类用来管理XRCamera + */ + class WebXRCameraManager { + /** + * reference Quaternin + */ + private _referenceQuaternion; + /** + * reference Position + */ + private _referencedPosition; + /** + * WebXR Session Manager + */ + private _webXRSessionManager; + /** + * first Frame Flag + */ + private _firstFrame; + /** + * WebXR RenderTexture + */ + private _XRRenderTexture; + /** + * WebXRCamera Array + */ + private _rigCameras; + /** + * Reference position + */ + private _position; + /** + * @en The parent object that owns this camera manager. + * @zh 拥有此摄像机管理器的父对象。 + */ + owner: any; + /** + * @en The position of the camera. + * @zh 摄像机的位置。 + */ + get position(): Vector3; + set position(newPosition: Vector3); + /** + * @en The rotation of the camera. + * @zh 摄像机的旋转 + */ + get rotationQuaternion(): Quaternion; + set rotationQuaternion(value: Quaternion); + /** + * @en The array of rig cameras. + * @zh 绑定在此摄像机管理器上的摄像机数组。 + */ + get rigCameras(): WebXRCamera[]; + /** + * @en Creates a new instance of the WebXRCameraManager class. + * @param camera The parent object that owns this camera manager. + * @param manager WebXR Session Manager. + * @zh 创建 WebXRCameraManager 类的新实例。 + * @param camera 父对象,拥有此摄像机管理器。 + * @param manager WebXR管理器。 + */ + constructor(camera: any, manager?: WebXRSessionManager); + /** + * @en Updates the frame by the WebXR session, adjusting the camera's position, rotation, and viewport based on the XR session's viewer pose. + * @zh 通过WebXR会话更新帧,根据XR会话的观察者姿势调整相机的位置、旋转和视口。 + */ + _updateFromXRSession(): void; + /** + * update number of WebXRCamera + * @param viewCount + */ + private _updateNumberOfRigCameras; + /** + * TODO:update of Reference Space + */ + private _updateReferenceSpace; + /** + * @en Destroys and cleans up resources used by the WebXRCameraManager. + * @zh 销毁 WebXRCameraManager 并清理使用的资源。 + */ + destroy(): void; + } + class WebXRCameraInfo { + /**depth far */ + depthFar: number; + /**depth near */ + depthNear: number; + /**camera */ + camera: any; + } + /** + * @en Used to manage WebXR + * @zh 用来管理WebXR + */ + class WebXRExperienceHelper { + /** + * @en The WebGL instance. + * @zh WebGL 实例。 + */ + static glInstance: any; + /** + * @en The singleton instance of the XR session manager. + * @zh XR 会话管理器的单例实例。 + */ + static xr_Manager: WebXRSessionManager; + /** + * @en Indicates whether WebXR is supported in the current environment. + * @zh 表示当前环境是否支持 WebXR。 + */ + static supported: boolean; + /** + * @en Default options for the XRWebGLLayer. + * @zh XRWebGLLayer 的默认选项。 + */ + static canvasOptions: { + antialias: boolean; + depth: boolean; + stencil: boolean; + alpha: boolean; + multiview: boolean; + framebufferScaleFactor: number; + }; + /** + * @en Checks if a specific XRSession mode is supported. + * @param sessionMode The session mode to check, e.g., "inline", "immersive-vr", "immersive-ar". + * @returns A promise that resolves to a boolean indicating whether the mode is supported. + * @zh 检查是否支持特定的 XRSession 模式。 + * @param sessionMode 要检查的会话模式,例如:"inline"、"immersive-vr"、"immersive-ar"。 + * @returns 一个 Promise,该 Promise 将解析为一个布尔值,表示是否支持。 + */ + static supportXR(sessionMode: string): Promise; + /** + * @en Enters the specified XR session mode and sets up the reference space and WebGL layer. + * @param sessionMode The session mode, e.g., "inline", "immersive-vr", "immersive-ar". + * @param referenceSpaceType The reference space type, e.g., "viewer", "local", "local-floor", "unbounded". + * @param cameraInfo The WebXR camera settings. + * @returns A promise that resolves to the WebXRSessionManager. + * @zh 进入指定的 XR 会话模式,并设置引用空间和 WebGL 层。 + * @param sessionMode 要进入的会话模式,例如:"inline"、"immersive-vr"、"immersive-ar"。 + * @param referenceSpaceType 要使用的参考空间类型,例如:"viewer"、"local"、"local-floor"、"unbounded"。 + * @param cameraInfo WebXR相机设置。 + * @returns 一个 Promise,该 Promise 将解析为 WebXRSessionManager。 + */ + static enterXRAsync(sessionMode: string, referenceSpaceType: string, cameraInfo: WebXRCameraInfo): Promise; + /** + * @en Configures a WebXRCameraManager with the given camera and session manager. + * @param camera The camera to configure. + * @param manager The WebXR session manager. + * @returns A new WebXRCameraManager instance. + * @zh 使用给定的摄像机和会话管理器配置 WebXRCameraManager。 + * @param camera 要配置的摄像机。 + * @param manager WebXR 会话管理器。 + * @returns 一个新的 WebXRCameraManager 实例。 + */ + static setWebXRCamera(camera: Camera, manager: WebXRSessionManager): WebXRCameraManager; + /** + * @en Configures a WebXRInputManager with the given session and camera managers. + * @param sessionManager The WebXR session manager. + * @param cameraManager The WebXR camera manager. + * @returns A new WebXRInputManager instance. + * @zh 使用给定的会话和摄像机管理器配置 WebXRInputManager。 + * @param sessionManager WebXR 会话管理器。 + * @param cameraManager WebXR 摄像机管理器。 + * @returns 一个新的 WebXRInputManager 实例。 + */ + static setWebXRInput(sessionManager: WebXRSessionManager, cameraManager: WebXRCameraManager): WebXRInputManager; + } + /** + * @en The class used to describe the gamepad axis + * @zh 用于描述设备手柄上的摇杆轴 + */ + class AxiGamepad extends EventDispatcher { + /** + * @en Static event name for output axis events. + * @zh 事件名称,用于输出轴事件。 + */ + static EVENT_OUTPUT: string; + /** + * @en The name of the axis device. + * @zh 轴设备名字。 + */ + handness: string; + /** + * @en The number of axes. + * @zh 轴数量。 + */ + axisLength: number; + /** + * axis Array + */ + private axisData; + /** + * @en Cleans up and removes all listeners for this gamepad's axis events. + * @zh 清理并移除此游戏手柄轴的所有事件监听器。 + */ + destroy(): void; + } + /** + * @en The `ButtonGamepad` class is used to describe gamepad buttons. + * @zh `ButtonGamepad` 类用来描述游戏手柄上的按钮。 + */ + class ButtonGamepad extends EventDispatcher { + static EVENT_TOUCH_ENTER: string; + static EVENT_TOUCH_STAY: string; + static EVENT_TOUCH_OUT: string; + static EVENT_PRESS_ENTER: string; + static EVENT_PRESS_STAY: string; + static EVENT_PRESS_OUT: string; + static EVENT_PRESS_VALUE: string; + /** + * @en The handness of the gamepad. + * @zh 游戏手柄的名称。 + */ + handness: string; + /** + * @en The index of the button on the gamepad. + * @zh 游戏手柄上按钮的索引。 + */ + index: number; + /** + * front touch state + */ + private lastTouch; + private lastPress; + private lastPressValue; + /** + * current touch state + */ + private touch; + private press; + private pressValue; + /** + * @en Creates a new instance of the `ButtonGamepad` class. + * @param handness The name of the gamepad. + * @param index The index of the button on the gamepad. + * @zh 创建 ButtonGamepad 类的新实例。 + * @param handness 设备名称 + * @param index button索引 + */ + constructor(handness: string, index: number); + /** + * @en Cleans up and removes all listeners for this gamepad's button events. + * @zh 清理并移除此游戏手柄按钮的所有事件监听器。 + */ + destroy(): void; + } + /** + * @en The `WebXRInput` class is used to describe input devices for WebXR. + * @zh `WebXRInput` 类用来描述 WebXR 的输入设备。 + */ + class WebXRInput extends EventDispatcher { + static HANDNESS_LEFT: string; + static HANDNESS_RIGHT: string; + static EVENT_FRAMEUPDATA_WEBXRINPUT: string; + private static tempQua; + /** + * 预处理Button事件 + */ + private preButtonEventList; + /** + * 预处理axis事件 + */ + private preAxisEventList; + /** + * @en The last XR pose data. + * @zh 上一次的 XR 姿态数据。 + */ + lastXRPose: any; + /** + * @en The handness of the device, "left" or "right". + * @zh 设备名称,"left" 或 "right"。 + */ + handness: string; + /** + * @en The input ray representing the direction of the hand or controller. + * @zh 表示手或控制器方向的输入射线。 + */ + ray: Ray; + /** + * @en The position of the hand or controller. + * @zh 手或控制器的位置。 + */ + position: Vector3; + /** + * @en The rotation of the hand or controller. + * @zh 手或控制器的旋转。 + */ + rotation: Quaternion; + /** + * @en The last position of the input ray. + * @zh 输入射线的上一个位置。 + */ + _lastXRPose: any; + /** + * @en Information about the gamepad buttons. + * @zh 游戏手柄按钮的信息。 + */ + gamepadButton: Array; + /** + * @en Information about the gamepad axes. + * @zh 游戏手柄轴的信息。 + */ + gamepadAxis: AxiGamepad; + /** + * @ignore + * @en Creates a new instance of the `WebXRInput` class. + * @param handness The handness of the device, "left" or "right". + * @zh 创建 `WebXRInput` 类的新实例。 + * @param handness 设备名称,"left" 或 "right"。 + */ + constructor(handness: string); + /** + * handle gamepad Event + */ + private _handleProcessGamepad; + /** + * @en Adds an event listener for a gamepad button. + * @param index The index of the button. + * @param type The type of event. + * @param caller The execution scope of the event listener function. + * @param listener The event listener function. + * @zh 为游戏手柄按钮添加事件侦听器 + * @param index 按钮索引。 + * @param type 事件类型。 + * @param caller 事件侦听函数的执行域。 + * @param listener 事件侦听函数。 + */ + addButtonEvent(index: number, type: string, caller: any, listener: Function): void; + /** + * @en Adds an event listener for a gamepad axis. + * @param index The index of the axis. + * @param type The type of event. + * @param caller The execution scope of the event listener function. + * @param listener ener The event listener function. + * @zh 为游戏手柄轴添加事件侦听器。 + * @param index 轴索引。 + * @param type 事件类型。 + * @param caller 事件侦听函数的执行域。 + * @param listener 事件侦听函数。 + */ + addAxisEvent(index: number, type: string, caller: any, listener: Function): void; + /** + * @en Removes an event listener for a gamepad axis. + * @param index The index of the axis. + * @param type The type of event. + * @param caller The execution scope of the event listener function. + * @param listener The event listener function. + * @zh 移除游戏手柄轴的事件侦听器。 + * @param index 轴索引。 + * @param type 事件类型。 + * @param caller 事件侦听函数的执行域。 + * @param listener 事件侦听函数。 + */ + offAxisEvent(index: number, type: string, caller: any, listener: Function): void; + /** + * @en Removes an event listener for a gamepad button. + * @param index The index of the button. + * @param type The type of event. + * @param caller The execution scope of the event listener function. + * @param listener The event listener function. + * @zh 移除游戏手柄按钮的事件侦听器 + * @param index 按钮索引。 + * @param type 事件类型。 + * @param caller 事件侦听函数的执行域。 + * @param listener 事件侦听函数。 + */ + offButtonEvent(index: number, type: string, caller: any, listener: Function): void; + /** + * @en Destroys and cleans up the WebXR input instance. + * @zh 销毁并清理 WebXR 输入实例。 + */ + destroy(): void; + } + /** + * @en The `WebXRInputManager` class is responsible for managing input devices in a WebXR environment. + * - The path of the CDN from which the sample will fetch controller models: + * - MeshSource https://cdn.jsdelivr.net/npm/@webxr-input-profiles/assets@1.0.9/dist/profiles/ + * @zh `WebXRInputManager` 类用来在 WebXR 环境中管理输入设备。 + * - 样本将从此 CDN 路径获取控制器模型的路径: + * - MeshSource + */ + class WebXRInputManager { + /** + * Session Manager + */ + private webXRSessionManager; + /** + * webXRCamera Manager + */ + private webXRCameraManager; + /** + * array of XRInput + */ + private controllers; + /** + * bind of XRInput Node Render + */ + private controllerHandMesh; + /** + * bind of XRInput Ray Render + */ + private controllerLineRender; + /** + * line Color + */ + private lineColor; + /** + * Ray length + */ + private rayLength; + /** + * @en Creates a new instance of the `WebXRInputManager` class. + * @param webxrManager WebXR Session manager + * @param webXRCamera WebXR Manager + * @zh 创建 WebXRInputManager 类的新实例 + * @param webxrManager WebXR 会话管理器 + * @param webXRCamera WebXR 管理器 + */ + constructor(webxrManager: WebXRSessionManager, webXRCamera: WebXRCameraManager); + /** + * 更新输入挂点 + * @param xrInput + */ + private _updataMeshRender; + /** + * WebXRInput帧循环 + * @param xrFrame + */ + private _updateFromXRFrame; + /** + * @en Binds a rendering node to the input device. + * @param meshSprite The rendering sprite to bind. + * @param handness The handness of the device, "left" or "right". + * @zh 将渲染节点绑定到输入设备。 + * @param meshSprite 渲染挂点。 + * @param handness 设备名称,"left" 或 "right"。 + */ + bindMeshNode(meshSprite: Sprite3D, handness: string): void; + /** + * @en Binds a ray to the input device for visual representation. + * @param lineSprite The line sprite to bind as a ray. + * @param handness The handness of the device, "left" or "right". + * @zh 为输入设备绑定射线以进行可视化表示。 + * @param lineSprite 作为射线绑定的线条精灵。 + * @param handness 设备名称,"left" 或 "right"。 + */ + bindRayNode(lineSprite: PixelLineSprite3D, handness: string): void; + /** + * @en Retrieves the input device based on the specified handness. + * @param handness The handness of the device, "left" or "right". + * @returns The WebXRInput instance or null if handness is not valid. + * @zh 根据指定的设备名称获得输入设备。 + * @param handness 设备名称,"left" 或 "right"。 + * @returns 返回 WebXRInput 实例,如果手部设备名称无效则返回 null。 + */ + getController(handness: string): WebXRInput; + /** + * @en Destroys and cleans up the WebXR input manager. + * @zh 销毁并清理 WebXR 输入管理器。 + */ + destory(): void; + } + /** + * @en The `WebXRRenderTexture` class is used to create a render texture for WebXR rendering. + * @zh `WebXRRenderTexture` 类用来创建 WebXR 渲染的渲染纹理。 + */ + class WebXRRenderTexture extends RenderTexture { + /** + * @en The frame loop counter for the render texture. + * @zh 渲染纹理的帧循环计数器。 + */ + frameLoop: number; + /** + * @en Creates a new instance of the `WebXRRenderTexture` class. + * @zh 创建 WebXRRenderTexture 类的新实例 + */ + constructor(); + /** + * @en The frame buffer for the render texture. + * @zh 渲染纹理的帧缓冲。。 + */ + set frameBuffer(value: any); + /** + * No glframeBuffer create + * @param width + * @param height + */ + protected _create(width: number, height: number): void; + } + /** + * @en Manages an XRSession to work with the LayaAir engine. + * @zh 管理 XRSession 用以与 LayaAir 引擎协同工作。 + */ + class WebXRSessionManager extends EventDispatcher { + static EVENT_MANAGER_END: string; + static EVENT_FRAME_LOOP: string; + /** + * @en The underlying XR session being managed. + * @zh 被管理的底层 XR 会话。 + */ + session: any; + /** + * @en The XRReferenceSpace used for setting up the viewer's reference space. + * @zh 用于设置观察者参考空间的 XRReferenceSpace。 + */ + viewerReferenceSpace: any; + /** + * @en The base reference space for the XR session. + * @zh XR 会话的基参考空间。 + */ + baseReferenceSpace: any; + /** + * @en The current XR frame in the session. + * @zh 会话中的当前 XR 帧。 + */ + currentFrame: any; + /** + * @en The WebXR timestamp updated every frame. + * @zh 每帧更新的 WebXR 时间戳。 + */ + currentTimestamp: number; + /** + * @en The default height compensation used when initialization fails. + * @zh 初始化失败后使用的高度补偿默认值。 + */ + defaultHeightCompensation: number; + /** + * XRReferenceSpace + */ + private _referenceSpace; + /** "inline" | "immersive-vr" | "immersive-ar"*/ + private _sessionMode; + /** session enable state */ + private _sessionEnded; + /**WebXR Base Layer */ + private _baseLayer; + /**web XRSystem */ + private _xrNavigator; + /** + * @en The current reference space used in this session. + * @zh 当前会话中使用参考空间。 + */ + get referenceSpace(): any; + set referenceSpace(newReferenceSpace: any); + /** + * @en The mode for the managed XR session. + * @zh 管理 XR 会话的模式。 + */ + get sessionMode(): any; + /** + * @en Stops the XR session and restores the render loop. + * @zh 停止 XR 会话并恢复渲染循环。 + */ + exitXR(): void; + /** + * @en Initializes the XR layer for the session. + * @param xrSession The XR session to initialize. + * @param gl The WebGL rendering context. + * @returns A promise that resolves to true if the XR layer is successfully initialized. + * @zh 为会话初始化 XR 层。 + * @param xrSession 要初始化的 XR 会话。 + * @param gl WebGL 渲染上下文。 + * @returns 一个承诺,该承诺在 XR 层成功初始化时解决为 true。。 + */ + initializeXRGL(xrSession: any, gl: WebGLRenderingContext): Promise; + /** + * @en Checks if the browser supports WebXR. + * @returns A promise that resolves if WebXR is supported. + * @zh 检查浏览器是否支持 WebXR。 + * @returns 如果支持 WebXR 则返回一个解决的承诺。 + */ + initializeAsync(): Promise; + /** + * @en Checks if the session mode is supported by the browser. + * @param sessionMode The session mode to check, "inline", "immersive-vr", or "immersive-ar". + * @returns A promise that resolves to true if the session mode is supported, and false if not. + * @zh 检查会话模式是否得到浏览器支持。 + * @param sessionMode 要检查的会话模式,可以是 "inline"、"immersive-vr" 或 "immersive-ar"。 + * @returns 如果会话模式得到支持则返回一个解决为 true 的承诺,如果不支持则为 false。 + */ + isSessionSupportedAsync(sessionMode: string): Promise; + /** + * @en Initializes the XR session with the specified mode and initialization info. + * @param xrSessionMode The mode for the XR session. + * @param xrSessionInit The initialization info for the XR session. + * @returns A promise that resolves with the XR session if successful. + * @zh 使用指定的模式和初始化信息初始化 XR 会话。 + * @param xrSessionMode XR 会话的模式。 + * @param xrSessionInit XR 会话的初始化信息。 + * @returns 如果成功,返回一个解决为 XR 会话的承诺。 + */ + initializeSessionAsync(xrSessionMode?: string, xrSessionInit?: {}): Promise; + /** + * @en Resets the reference space to the one used at the start of the session. + * @zh 将参考空间重置为会话开始时使用的空间。 + */ + resetReferenceSpace(): void; + /** + * @en Starts the rendering loop for the XR session and binds it to the session's animation frame request. + * @zh 启动 XR 会话的渲染循环,并将其绑定到会话的动画帧请求。 + */ + runXRRenderLoop(): void; + /** + * @en Ends the rendering loop for the XR session. + * @zh 结束 XR 会话的渲染循环。 + */ + endXRRenderLoop(): void; + /** + * Update + * @param xrFrame + */ + private _updateByXrFrame; + /** + * @en Sets the reference space on the XR session. + * @param referenceSpaceType The type of space to set, defaults to "local-floor". + * @returns A promise that resolves once the reference space has been set. + * @zh 在 XR 会话上设置参考空间。 + * @param referenceSpaceType 要设置的参考空间类型,默认为 "local-floor"。 + * @returns 一个promise,该promise在参考空间已被设置时解决。 + */ + setReferenceSpaceTypeAsync(referenceSpaceType?: string): Promise; + /** + * @en Updates the render state of the WebXR session. + * @param state The new render state to be applied. + * @returns A promise that resolves once the render state has been updated. + * @zh 更新 WebXR 会话的渲染状态。 + * @param state 要应用的新渲染状态。 + * @returns 一个promise,该promise在渲染状态已被更新时解决。 + */ + updateRenderStateAsync(state: any): any; + /** + * @en The current frame rate reported by the device. + * @zh 设备报告的当前帧率。 + */ + get currentFrameRate(): number | undefined; + /** + * @en A list of supported frame rates, available only while in a session. + * @zh 支持的帧率列表,此属性仅在会话中可用。 + */ + get supportedFrameRates(): Float32Array | undefined; + /** + * @en Sets the frame rate for the WebXR session. + * @param rate The new frame rate to be set, must be within the supportedFrameRates range. + * @returns A promise that resolves once the frame rate has been set. + * @zh 为 WebXR 会话设置帧率。 + * @param rate 要设置的新帧率,必须在支持的帧率范围内。 + * @returns 一个承诺,该承诺在帧率已被设置时解决。 + */ + updateTargetFrameRate(rate: number): Promise; + /** + * @en Cleans up and destroys the WebXR session manager. + * @zh 清理并销毁 WebXR 会话管理器。 + */ + destroy(): void; + } + /** + * @en A class that encapsulates Geolocation-related functionalities can check if the browser supports the Geolocation API by using `Geolocation.supported`. + * @zh 封装了地理位置相关功能的类,可以通过`Geolocation.supported`查看浏览器是否支持地理位置API。 + */ + class Geolocation { + private static navigator; + private static position; + /** + * @en Indicates failure to get geographical information due to denied permission. + * @zh 表示由于权限被拒绝造成的地理信息获取失败。 + */ + static PERMISSION_DENIED: number; + /** + * @en Indicates failure to get geographical information due to an internal error from the location source. + * @zh 表示由于内部位置源返回了内部错误导致地理信息获取失败。 + */ + static POSITION_UNAVAILABLE: number; + /** + * @en Whether the runtime environment supports the Geolocation API. + * @zh 信息获取所用时长超出`timeout`所设置时长。 + */ + static TIMEOUT: number; + /** + * @en Whether the runtime environment supports the Geolocation API. + * @zh 运行环境是否支持地理位置API。 + */ + static supported: boolean; + /** + * @en If `enableHighAccuracy` set to true, and if the device can provide a more accurate location, it will get the best possible results. + * Note that this may lead to slower response times or increased power consumption (such as when using GPS). + * On the other hand, if set to false, it will get faster response and less power consumption. + * The default value is false. + * @zh 如果`enableHighAccuracy`设置为 true,并且设备能够提供一个更精确的位置,则会获取最佳可能的结果。 + * 请注意,这可能会导致响应时间变慢或电量消耗增加(例如使用 GPS)。 + * 另一方面,如果设置为 false,将会得到更快的响应和更少的电量消耗。 + * 默认值为 false。 + */ + static enableHighAccuracy: boolean; + /** + * @en Represents the maximum duration allowed for the device to obtain the location. The default is Infinity, meaning getCurentPosition() will not return until the location is available. + * @zh 表示允许设备获取位置的最长时间。默认为 Infinity,意味着 `getCurentPosition()` 直到位置可用时才会返回信息。 + */ + static timeout: number; + /** + * @en Represents the maximum age of the cached location information that can be returned. + * If set to 0, it means the device does not use cached locations and attempts to obtain a real-time location. + * If set to Infinity, the device must return a cached location regardless of its age. + * @zh 表示可被返回的缓存位置信息的最大时限。 + * 如果设置为 0,意味着设备不使用缓存位置,并且尝试获取实时位置。 + * 如果设置为 Infinity,设备必须返回缓存位置而无论其时限。 + */ + static maximumAge: number; + constructor(); + /** + * @en Gets the device's current position. + * @param onSuccess Callback handler with a unique `Position` parameter. + * @param onError Optional. Callback handler with an error message. Error code is one of Geolocation.PERMISSION_DENIED, Geolocation.POSITION_UNAVAILABLE, and Geolocation.TIMEOUT. + * @zh 获取设备当前位置。 + * @param onSuccess 带有唯一 `Position` 参数的回调处理器。 + * @param onError 可选的。带有错误信息的回调处理器。错误代码为 Geolocation.PERMISSION_DENIED、Geolocation.POSITION_UNAVAILABLE 和 Geolocation.TIMEOUT 之一。 + */ + static getCurrentPosition(onSuccess: Handler, onError?: Handler): void; + /** + * @en Watches the device's current position. The callback handler is executed when the device's position changes. + * @param onSuccess Callback handler with a unique `Position` parameter. + * @param onError Optional. Callback handler with an error message. Error code is one of Geolocation.PERMISSION_DENIED, Geolocation.POSITION_UNAVAILABLE, and Geolocation.TIMEOUT. + * @zh 监视设备当前位置。回调处理器在设备位置改变时被执行。 + * @param onSuccess 带有唯一 `Position` 参数的回调处理器。 + * @param onError 可选的。带有错误信息的回调处理器。错误代码为 Geolocation.PERMISSION_DENIED、Geolocation.POSITION_UNAVAILABLE 和 Geolocation.TIMEOUT 之一。 + */ + static watchPosition(onSuccess: Handler, onError: Handler): number; + /** + * @en Removes the specified handler installed by `watchPosition`. + * @param id The ID of the watch position handler to clear. + * @zh 移除 `watchPosition` 安装的指定处理器。 + * @param id 要清除的监视位置处理器的 ID。 + */ + static clearWatch(id: number): void; + } + /** + * @en Represents geolocation information for a device. + * @zh 表示设备的地理位置信息。 + */ + class GeolocationInfo { + private pos; + private coords; + /** + * @en Sets the device's latitude and longitude. + * @param pos The position object containing latitude and longitude data. + * @zh 设置设备的经纬度。 + * @param pos 包含纬度和经度数据的位置对象。 + */ + setPosition(pos: any): void; + /** + * @en The latitude of the device's current geographical coordinates. + * @zh 设备当前地理坐标的纬度。 + */ + get latitude(): number; + /** + * @en The longitude of the device's current geographical coordinates. + * @zh 设备当前地理坐标的经度。 + */ + get longitude(): number; + /** + * @en The altitude of the device's current geographical coordinates. + * @zh 设备当前地理坐标的高度。 + */ + get altitude(): number; + /** + * @en The accuracy of the device's current geographical coordinates. + * @zh 设备当前地理坐标的精度。 + */ + get accuracy(): number; + /** + * @en The altitude accuracy of the device's current geographical coordinates. + * @zh 设备当前地理坐标的高度精度。 + */ + get altitudeAccuracy(): number; + /** + * @en The heading direction of the device's current travel. + * @zh 设备当前行进方向。 + */ + get heading(): number; + /** + * @en The current speed of the device. + * @zh 设备当前的速度。 + */ + get speed(): number; + /** + * @en The timestamp when the device obtained its current position. + * @zh 设备得到当前位置的时间。 + */ + get timestamp(): number; + } + /** + * @en The Media class is used for capturing camera and microphone input. You can capture either one or both simultaneously. Before calling getCamera, you can use supported() to check if the current browser supports it. + * NOTE: + * Currently, Media only supports Android on mobile platforms, not iOS. It can only be fully used in FireFox; testing in Chrome does not capture video. + * @zh Media 类用于捕捉摄像头和麦克风。可以单独捕捉任一设备,或者同时捕捉两者。在使用之前,可以使用 `Media.supported()` 方法检查当前浏览器是否支持。 + * NOTE: + * 目前 Media 仅在移动平台上支持 Android,不支持 iOS。只能在 FireFox 中完整使用,在 Chrome 中测试时无法捕捉视频。 + */ + class Media { + constructor(); + /** + * @en Check browser compatibility + * @zh 检查浏览器兼容性。 + */ + static supported(): boolean; + /** + * @en Access the user's media devices (capture camera and microphone). + * @param options A simple set of options like { audio: true, video: true } to indicate capturing both. For more details, see https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia. + * @param onSuccess The success handler which is called with a single argument: the Blob URL of the media, which can be used with the Video element. + * @param onError The error handler which is called with a single argument: the Error object. + * @zh 获取用户的媒体设备(捕捉摄像头和麦克风)。 + * @param options 简单的可选项,如 { audio: true, video: true } 表示同时捕捉两者。更详细信息请查看 https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia。 + * @param onSuccess 获取成功的处理器,唯一参数返回媒体的 Blob 地址,可以将其传给 Video 。 + * @param onError 获取失败的处理器,唯一参数是 Error 对象。 + */ + static getMedia(options: any, onSuccess: Handler, onError: Handler): void; + } + /** + * @en Acceleration info, The unit of acceleration x/y/z is m/s ². + * If the hardware (gyroscope) does not support it, the values for alpha, beta, and gamma will be null. + * @zh 加速计信息,重力加速度x/y/z的单位均为m/s²。 + * 如果硬件(陀螺仪)不支持,则 alpha、beta 和 gamma 的值将为 null。 + */ + class AccelerationInfo { + /** + * @en The acceleration value along the x-axis. + * @zh x 轴上的加速度值。 + */ + x: number; + /** + * @en The acceleration value along the y-axis. + * @zh y 轴上的加速度值。 + */ + y: number; + /** + * @en The acceleration value along the z-axis. + * @zh z 轴上的加速度值。 + */ + z: number; + constructor(); + } + /** + * @en Use Accelerator.instance to get the unique Accelerator reference. Do not call the constructor directly. + * The callback handler of listen() accepts four parameters: + * - acceleration: The acceleration given to the device without gravity. + * - accelerationIncludingGravity: The total acceleration (including gravity). + * - rotationRate: The rate of rotation. + * - interval: The time interval for the acceleration data获取 (in milliseconds). + * NOTE + * For example, while the alpha in the rotationRate is documented as the z-axis rotation angle in both Apple and Mozilla documentation, actual testing shows it to be the x-axis rotation angle. To make the values represented by each property consistent with the documentation, the actual values have been swapped with other properties. + * The mappings are as follows: + * - alpha uses the gamma value. + * - beta uses the alpha value. + * - gamma uses the beta value. + * It is currently unclear which is correct, and this serves as a note. + * @zh 通过 Accelerator.instance 获取唯一的 Accelerator 引用,不要直接调用构造函数。 + * listen() 的回调处理器接受四个参数: + * - acceleration: 设备的加速度(不包含重力)。 + * - accelerationIncludingGravity: 总加速度(包含重力)。 + * - rotationRate: 自转速率。 + * - interval: 获取加速度数据的时间间隔(毫秒)。 + * 注意: + * 例如,rotationRate 中的 alpha 在 Apple 和 Mozilla 文档中都是 z 轴旋转角度,但实测是 x 轴旋转角度。为了使各属性表示的值与文档所述相同,实际值与其他属性进行了对调。 + * 具体对应如下: + * - alpha 使用 gamma 值。 + * - beta 使用 alpha 值。 + * - gamma 使用 beta 值。 + * 目前孰是孰非尚未可知,以此为注。 + */ + class Accelerator extends EventDispatcher { + /** + * Accelerator的唯一引用。 + */ + private static _instance; + /** + * @en The singleton instance of Accelerator. + * @zh Accelerator 的单例实例。 + */ + static get instance(): Accelerator; + private static acceleration; + private static accelerationIncludingGravity; + private static rotationRate; + constructor(); + protected onStartListeningToType(type: string): this; + private onDeviceOrientationChange; + private static transformedAcceleration; + /** + * @en Converts the acceleration values to visually correct acceleration values. This method depends on `Browser.window.orientation` and may not work on some low-end devices. + * @param acceleration The original acceleration information. + * @returns The transformed acceleration information. + * @zh 将加速度值转换为视觉上正确的加速度值。此方法依赖于 `Browser.window.orientation`,在部分低端机可能无效。 + * @param acceleration 原始的加速度信息。 + * @returns 转换后的加速度信息。 + */ + static getTransformedAcceleration(acceleration: AccelerationInfo): AccelerationInfo; + } + /** + * @en Use Gyroscope.instance to obtain the unique Gyroscope reference. Do not call the constructor directly. + * The callback handler of listen() accepts two parameters: + * - onOrientationChange: A function with the signature function onOrientationChange(absolute: Boolean, info: RotationInfo): void. + * - absolute: Indicates whether the device can provide absolute orientation data (toward the Earth coordinate system) or an arbitrary coordinate system determined by the device. For more information about coordinate systems, see [Orientation and motion data explained](https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Orientation_and_motion_data_explained). + * - info: A RotationInfo type parameter that stores the device's rotation values. + * For browser compatibility, refer to: (http://caniuse.com/#search=deviceorientation). + * @zh 通过 Gyroscope.instance 获取唯一的 Gyroscope 引用,不要直接调用构造函数。 + * listen() 的回调处理器接受两个参数: + * - function onOrientationChange: 一个函数,签名为 function onOrientationChange(absolute: Boolean, info: RotationInfo): void。 + * - absolute: 指明设备是否能够提供绝对方位数据(指向地球坐标系),或者由设备决定的任意坐标系。关于坐标系更多信息,请参阅 [方位和运动数据解释](https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Orientation_and_motion_data_explained)。 + * - info: RotationInfo 类型的参数,保存设备的旋转值。 + * 浏览器兼容性信息,请参阅:(http://caniuse.com/#search=deviceorientation)。 + */ + class Gyroscope extends EventDispatcher { + private static info; + /** + * Gyroscope的唯一引用。 + */ + private static _instance; + /** + * @en Gets the singleton instance of Gyroscope. + * @zh 获取 Gyroscope 的单例实例。 + */ + static get instance(): Gyroscope; + /** + * @en Constructor method of gyroscope. + * @param singleton An internal parameter used to enforce the singleton pattern. + * @zh 陀螺仪的构造方法 + * @param singleton 一个内部参数,用于强制实现单例模式。 + */ + constructor(singleton: number); + protected onStartListeningToType(type: string): this; + private onDeviceOrientationChange; + } + /** + * @en A class that saves rotation information. Do not modify the properties of this category. + * @zh 保存旋转信息的类。请勿修改本类的属性。 + * @author Survivor + */ + class RotationInfo { + /** + * @en Indicates whether the device can provide absolute orientation data (toward the Earth coordinate system) or an arbitrary coordinate system determined by the device. + * For more information about coordinate systems, see (https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Orientation_and_motion_data_explained). + * Note that on iOS, this value is always false. Even so, you can still obtain the correct value from `alpha`. + * @zh 指示设备是否可以提供绝对方位数据(指向地球坐标系),或者设备决定的任意坐标系。 + * 关于坐标系的更多信息,请参阅 (https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Orientation_and_motion_data_explained)。 + * 需要注意的是,在 iOS 环境下,该值始终为 false。即使如此,你依旧可以从 `alpha` 中取得正确的值。 + */ + absolute: boolean; + /** + * @en The angle of rotation around the Z-axis, ranging from 0 to 360. + * If `absolute` is true or on iOS, the `alpha` value represents the angle from north to the current direction of the device. + * @zh Z轴旋转角度,其值范围从0至360。 + * 若 `absolute` 为 true 或在 iOS 中,`alpha` 值是从北方到当前设备方向的角度值。 + */ + alpha: number; + /** + * @en The angle of rotation around the X-axis, ranging from -180 to 180. Represents the front-to-back motion of the device. + * @zh X轴旋转角度,其值范围从-180至180。代表设备从前至后的运动。 + */ + beta: number; + /** + * @en The angle of rotation around the Y-axis, ranging from -90 to 90. Represents the left-to-right motion of the device. + * @zh Y轴旋转角度,其值范围从-90至90。代表设备从左至右的运动。 + */ + gamma: number; + /** + * @en The accuracy of the compass data in degrees. Available only on iOS. + * @zh 罗盘数据的精确度(角度)。仅 iOS 可用。 + */ + compassAccuracy: number; + constructor(); + } + /** + * @en Shake is usually achieved through the built-in accelerometer and gyroscope sensors in a mobile phone, and it only works on devices that support this operation. + * @zh 摇动通常是通过手机内置的加速度计和陀螺仪传感器来实现,只能在支持此操作的设备环境上有效。 * + */ + class Shake extends EventDispatcher { + private threshold; + private shakeInterval; + private lastX; + private lastY; + private lastZ; + private lastMillSecond; + constructor(); + private static _instance; + /** + * @en The singleton instance of Shake. + * @zh Shake 的单例实例。 + */ + static get instance(): Shake; + /** + * @en Starts responding to device shaking. + * The response is based on the threshold of instantaneous velocity and the interval between shakes. + * @param threshold The threshold for the instantaneous velocity for a shake response, which is approximately between 5 to 10 for a mild shake. + * @param interval The interval time for responding to device shakes. + * @zh 开始响应设备摇晃。 + * @param threshold 响应瞬时速度的阈值,轻度摇晃的值约在 5 到 10 之间。 + * @param interval 设备摇晃的响应间隔时间。 + */ + start(threshold: number, interval: number): void; + /** + * @en Stops responding to device shaking. + * @zh 停止响应设备摇晃。 + */ + stop(): void; + private onShake; + /** + * @en Determines whether the device is shaken based on the acceleration differences in three directions. + * It checks if at least two of the acceleration differences exceed the set threshold. + * @param deltaX The acceleration difference in the X direction. + * @param deltaY The acceleration difference in the Y direction. + * @param deltaZ The acceleration difference in the Z direction. + * @returns Returns true if at least two of the acceleration differences exceed the threshold; otherwise, returns false. + * @zh 根据三个方向的加速度差值判断设备是否发生摇晃。 + * 检查三个方向的加速度差值中是否至少有两个超过了设定的阈值。 + * @param deltaX X 方向的加速度差值。 + * @param deltaY Y 方向的加速度差值。 + * @param deltaZ Z 方向的加速度差值。 + * @returns 如果至少有两个方向的加速度差值超过阈值,则返回 true;否则返回 false。 + */ + private isShaked; + } + /** + * @en The Animation class is a Graphics-based animation class. It implements interfaces for creating, playing, and controlling animations based on Graphics. + * The animation template cache pool stores key-value pairs, where the key can be customized or read from a specified configuration file, and the value is the corresponding animation template, which is an array of Graphics objects. Each Graphics object corresponds to a frame image, and the essence of animation playback is switching Graphics objects at regular intervals. + * This class uses an animation template cache pool, which trades some memory overhead for CPU savings. When the same animation template is used multiple times, compared to creating a new animation template each time, using the animation template cache pool only requires creation once, caching it for multiple reuses, thus saving the overhead of creating animation templates. + * Use the set source, loadImages(...), loadAtlas(...), loadAnimation(...) methods to create animation templates. Use play(...) to play the specified animation. + * @zh Animation 是基于 Graphics 的动画类。实现了基于 Graphics 的动画创建、播放、控制接口。 + * 本类使用了动画模版缓存池,它以一定的内存开销来节省CPU开销,当相同的动画模版被多次使用时,相比于每次都创建新的动画模版,使用动画模版缓存池,只需创建一次,缓存之后多次复用,从而节省了动画模版创建的开销。 + * 动画模版缓存池,以key-value键值对存储,key可以自定义,也可以从指定的配置文件中读取,value为对应的动画模版,是一个Graphics对象数组,每个Graphics对象对应一个帧图像,动画的播放实质就是定时切换Graphics对象。 + * 使用set source、loadImages(...)、loadAtlas(...)、loadAnimation(...)方法可以创建动画模版。使用play(...)可以播放指定动画。 + */ + class Animation extends AnimationBase { + /** + * @en The animation template cache pool, stored as key-value pairs. The key can be customized or read from a specified configuration file, and the value is the corresponding animation template, which is an array of Graphics objects. Each Graphics object corresponds to a frame image, and the essence of animation playback is switching Graphics objects at regular intervals. + * Use loadImages(...), loadAtlas(...), loadAnimation(...), set source methods to create animation templates. Use play(...) to play the specified animation. + * @zh 动画模版缓存池,以key-value键值对存储,key可以自定义,也可以从指定的配置文件中读取,value为对应的动画模版,是一个Graphics对象数组,每个Graphics对象对应一个帧图像,动画的播放实质就是定时切换Graphics对象。 + * 使用loadImages(...)、loadAtlas(...)、loadAnimation(...)、set source方法可以创建动画模版。使用play(...)可以播放指定动画。 + */ + static framesMap: any; + protected _frames: any[]; + private _source; + private _autoPlay; + /** + * @en The currently used atlas resources. + * @zh 当前正在使用的图集资源 + */ + private _atlasCatch; + /** + * @en Constructor method of Animation. + * @zh 动画类的构造方法 + */ + constructor(); + /** + * @en Destroys the object. + * @param destroyChild Whether to destroy child nodes + * @zh 销毁对象。 + * @param destroyChild 是否销毁子节点 + */ + destroy(destroyChild?: boolean): void; + /** + * @en Starts playing the animation. It will search for an animation template with the key value "name" in the animation template cache pool. If it exists, it will initialize the current sequence frame with this animation template. If it doesn't exist, it will use the current sequence frame. + * The play(...) method is designed to be called at any time after creating an instance. After calling, it will be in a playing state. When the corresponding resources are loaded, the animation frame filling method (set frames) is called, or the instance is displayed on the stage, it will determine whether it is in a playing state. If so, it will start playing. + * Combined with the wrapMode property, you can set the animation playback order type. + * @param start (Optional) Specifies the index (int) or frame label (String) where the animation playback starts. Frame labels can be added and removed using addLabel(...) and removeLabel(...). + * @param loop (Optional) Whether to loop playback. + * @param name (Optional) The key of the animation template in the animation template cache pool, which can also be considered as the animation name. If name is empty, it will play the current animation sequence frame; if it is not empty, it will look for an animation template with the key value "name" in the animation template cache pool. If it exists, it will initialize the current sequence frame with this animation template and play it. If it doesn't exist, it will still play the current animation sequence frame. If there is no frame data for the current animation, it will not play, but the instance will still be in a playing state. + * @zh 开始播放动画。会在动画模版缓存池中查找key值为name的动画模版,存在则用此动画模版初始化当前序列帧, 如果不存在,则使用当前序列帧。 + * play(...)方法被设计为在创建实例后的任何时候都可以被调用,调用后就处于播放状态,当相应的资源加载完毕、调用动画帧填充方法(set frames)或者将实例显示在舞台上时,会判断是否处于播放状态,如果是,则开始播放。 + * 配合wrapMode属性,可设置动画播放顺序类型。 + * @param start (可选)指定动画播放开始的索引(int)或帧标签(String)。帧标签可以通过addLabel(...)和removeLabel(...)进行添加和删除。 + * @param loop (可选)是否循环播放。 + * @param name (可选)动画模板在动画模版缓存池中的key,也可认为是动画名称。如果name为空,则播放当前动画序列帧;如果不为空,则在动画模版缓存池中寻找key值为name的动画模版,如果存在则用此动画模版初始化当前序列帧并播放,如果不存在,则仍然播放当前动画序列帧;如果没有当前动画的帧数据,则不播放,但该实例仍然处于播放状态。 + */ + play(start?: any, loop?: boolean, name?: string): void; + protected _setFramesFromCache(name: string, showWarn?: boolean): boolean; + private _copyLabels; + protected _frameLoop(): void; + protected _displayToIndex(value: number): void; + /** + * @en The current animation frame image array. In this class, each frame image is a Graphics object, and animation playback is essentially the process of switching Graphics objects at regular intervals. + * @zh 当前动画的帧图像数组。本类中,每个帧图像是一个Graphics对象,而动画播放就是定时切换Graphics对象的过程。 + */ + get frames(): any[]; + set frames(value: any[]); + /** + * @en Animation data source.For example: Atlas: "xx/a1.atlas"; Image collection: "a1.png,a2.png,a3.png"; LayaAir IDE animation: "xx/a1.ani". + * Types are as follows: + * 1. LayaAir IDE animation file path: Using this type requires preloading the required atlas resources, otherwise it will fail to create. If you don't want to preload or need a callback when creation is complete, please use the loadAnimation(...) method. + * 2. Atlas path: Animation templates created using this type will not be cached in the animation template cache pool. If you need caching or a callback when creation is complete, please use the loadAtlas(...) method. + * 3. Image path collection: Animation templates created using this type will not be cached in the animation template cache pool. If you need caching, please use the loadImages(...) method. + * @zh 动画数据源。例如:图集:"xx/a1.atlas"; 图片集合:"a1.png,a2.png,a3.png"; LayaAir IDE动画:"xx/a1.ani"。 + * 类型如下: + * 1. LayaAir IDE动画文件路径:使用此类型需要预加载所需的图集资源,否则会创建失败,如果不想预加载或者需要创建完毕的回调,请使用loadAnimation(...)方法; + * 2. 图集路径:使用此类型创建的动画模版不会被缓存到动画模版缓存池中,如果需要缓存或者创建完毕的回调,请使用loadAtlas(...)方法; + * 3. 图片路径集合:使用此类型创建的动画模版不会被缓存到动画模版缓存池中,如果需要缓存,请使用loadImages(...)方法。 + */ + get source(): string; + set source(value: string); + /** + * @en Whether to auto-play, default is false. If set to true, the animation will automatically play after being created and added to the stage. + * @zh 是否自动播放,默认为false。如果设置为true,则动画被创建并添加到舞台后自动播放。 + */ + set autoPlay(value: boolean); + get autoPlay(): boolean; + /** + * @en Stops animation playback and clears object properties. It can then be stored in the object pool for easy object reuse. + * @returns AnimationBase + * @zh 停止动画播放,并清理对象属性。之后可存入对象池,方便对象复用。 + * @returns AnimationBase + */ + clear(): AnimationBase; + /** + * @en Initializes the current animation sequence frame based on the specified animation template. The process of selecting an animation template is as follows: 1. The animation template with the key cacheName in the animation template cache pool; 2. If it doesn't exist, load the specified image collection and create an animation template. Note: Only when a non-empty cacheName is specified can the created animation template be cached in the animation template cache pool with this as the key, otherwise no caching is performed. + * The animation template cache pool trades a certain memory overhead for CPU savings. When the same animation template is used multiple times, compared to creating a new animation template each time, using the animation template cache pool only needs to be created once, cached, and reused multiple times, thus saving the overhead of creating animation templates. + * Because the return value is the Animation object itself, you can use the following syntax: loadImages(...).loadImages(...).play(...); + * @param urls Image path collection. When creating an animation template, this will be used as the data source. The parameter is in the form: [url1,url2,url3,...]. + * @param cacheName (Optional) The key of the animation template in the animation template cache pool. If this parameter is not empty, it means using the animation template cache pool. If an animation template with the key cacheName exists in the animation template cache pool, this template is used. Otherwise, a new animation template is created. If cacheName is not empty, it is cached in the animation template cache pool with cacheName as the key. If cacheName is empty, no caching is performed. + * @returns Returns the Animation object itself. + * @zh 根据指定的动画模版初始化当前动画序列帧。选择动画模版的过程如下:1. 动画模版缓存池中key为cacheName的动画模版;2. 如果不存在,则加载指定的图片集合并创建动画模版。注意:只有指定不为空的cacheName,才能将创建好的动画模版以此为key缓存到动画模版缓存池,否则不进行缓存。 + * 动画模版缓存池是以一定的内存开销来节省CPU开销,当相同的动画模版被多次使用时,相比于每次都创建新的动画模版,使用动画模版缓存池,只需创建一次,缓存之后多次复用,从而节省了动画模版创建的开销。 + * 因为返回值为Animation对象本身,所以可以使用如下语法:loadImages(...).loadImages(...).play(...);。 + * @param urls 图片路径集合。创建动画模版时,将以此为数据源。参数形式为:[url1,url2,url3,...]。 + * @param cacheName (可选)动画模板在动画模版缓存池中的key。如果此参数不为空,表示使用动画模版缓存池。如果动画模版缓存池中存在key为cacheName的动画模版,则使用此模版。否则,创建新的动画模版,如果cacheName不为空,则以cacheName为key缓存到动画模版缓存池中,如果cacheName为空,不进行缓存。 + * @returns 返回动画本身。 + */ + loadImages(urls: any[], cacheName?: string): Animation; + /** + * @en Initializes the current animation sequence frame based on the specified animation template. The process of selecting an animation template is as follows: 1. The animation template with the key cacheName in the animation template cache pool; 2. If it doesn't exist, load the specified atlas and create an animation template. + * Note: Only when a non-empty cacheName is specified can the created animation template be cached in the animation template cache pool with this as the key, otherwise no caching is performed. + * The animation template cache pool trades a certain memory overhead for CPU savings. When the same animation template is used multiple times, compared to creating a new animation template each time, using the animation template cache pool only needs to be created once, cached, and reused multiple times, thus saving the overhead of creating animation templates. + * Because the return value is the Animation object itself, you can use the following syntax: loadAtlas(...).loadAtlas(...).play(...); + * @param url Atlas path. When creating an animation template, this will be used as the data source. + * @param loaded (Optional) Callback when the animation is initialized using the specified atlas. + * @param cacheName (Optional) The key of the animation template in the animation template cache pool. If this parameter is not empty, it means using the animation template cache pool. If an animation template with the key cacheName exists in the animation template cache pool, this template is used. Otherwise, a new animation template is created. If cacheName is not empty, it is cached in the animation template cache pool with cacheName as the key. If cacheName is empty, no caching is performed. + * @returns Returns the Animation object itself. + * @zh 根据指定的动画模版初始化当前动画序列帧。选择动画模版的过程如下:1. 动画模版缓存池中key为cacheName的动画模版;2. 如果不存在,则加载指定的图集并创建动画模版。 + * 注意:只有指定不为空的cacheName,才能将创建好的动画模版以此为key缓存到动画模版缓存池,否则不进行缓存。 + * 动画模版缓存池是以一定的内存开销来节省CPU开销,当相同的动画模版被多次使用时,相比于每次都创建新的动画模版,使用动画模版缓存池,只需创建一次,缓存之后多次复用,从而节省了动画模版创建的开销。 + * 因为返回值为Animation对象本身,所以可以使用如下语法:loadAtlas(...).loadAtlas(...).play(...);。 + * @param url 图集路径。需要创建动画模版时,会以此为数据源。 + * @param loaded (可选)使用指定图集初始化动画完毕的回调。 + * @param cacheName (可选)动画模板在动画模版缓存池中的key。如果此参数不为空,表示使用动画模版缓存池。如果动画模版缓存池中存在key为cacheName的动画模版,则使用此模版。否则,创建新的动画模版,如果cacheName不为空,则以cacheName为key缓存到动画模版缓存池中,如果cacheName为空,不进行缓存。 + * @return 返回动画本身。 + */ + loadAtlas(url: string, loaded?: Handler, cacheName?: string): Animation; + /** + * @deprecated + * @en Loads and parses an animation file created by LayaAir IDE, which may contain multiple animations. The default frame rate is the frame rate designed in the IDE. If set interval has been called, the frame rate corresponding to this frame interval is used. After loading, it creates an animation template and caches it in the animation template cache pool. The key "url#animation name" corresponds to the animation template of the corresponding animation name, and the key "url#" corresponds to the default animation template of the animation template collection. + * Note: If you haven't preloaded the atlas used by the animation before calling this method, please specify the atlas parameter as the corresponding atlas path, otherwise it will cause the animation creation to fail. + * The animation template cache pool trades a certain memory overhead for CPU savings. When the same animation template is used multiple times, compared to creating a new animation template each time, using the animation template cache pool only needs to be created once, cached, and reused multiple times, thus saving the overhead of creating animation templates. + * Because the return value is the Animation object itself, you can use the following syntax: loadAnimation(...).loadAnimation(...).play(...); + * @param url Animation file path. Can be created and published by LayaAir IDE. + * @param loaded (Optional) Callback when the animation is initialized using the specified animation resource. + * @param atlas (Optional) The atlas address used by the animation (optional). + * @returns Returns the Animation object itself. + * @zh 加载并解析由LayaAir IDE制作的动画文件,此文件中可能包含多个动画。默认帧率为在IDE中设计的帧率,如果调用过set interval,则使用此帧间隔对应的帧率。加载后创建动画模版,并缓存到动画模版缓存池,key "url#动画名称" 对应相应动画名称的动画模板,key "url#" 对应动画模版集合的默认动画模版。 + * 注意:如果调用本方法前,还没有预加载动画使用的图集,请将atlas参数指定为对应的图集路径,否则会导致动画创建失败。 + * 动画模版缓存池是以一定的内存开销来节省CPU开销,当相同的动画模版被多次使用时,相比于每次都创建新的动画模版,使用动画模版缓存池,只需创建一次,缓存之后多次复用,从而节省了动画模版创建的开销。 + * 因为返回值为Animation对象本身,所以可以使用如下语法:loadAnimation(...).loadAnimation(...).play(...);。 + * @param url 动画文件路径。可由LayaAir IDE创建并发布。 + * @param loaded (可选)使用指定动画资源初始化动画完毕的回调。 + * @param atlas (可选)动画用到的图集地址(可选)。 + * @return 返回动画本身。 + */ + loadAnimation(url: string, loaded?: Handler, atlas?: string): Animation; + private _loadAnimationData; + /** + * @en Creates an animation template. Multiple animations can share the same animation template without having to create a new one each time, thus saving the overhead of creating a Graphics collection. + * @param url Atlas path or image path array. If it's an atlas path, the corresponding atlas needs to be preloaded. If it's not preloaded, it will cause creation failure. + * @param name The key of the animation template in the animation template cache pool. If it's not empty, the animation template is cached with this as the key, otherwise it's not cached. + * @returns Animation template. + * @zh 创建动画模板,多个动画可共享同一份动画模板,而不必每次都创建一份新的,从而节省创建Graphics集合的开销。 + * @param url 图集路径或者图片路径数组。如果是图集路径,需要相应图集已经被预加载,如果没有预加载,会导致创建失败。 + * @param name 动画模板在动画模版缓存池中的key。如果不为空,则以此为key缓存动画模板,否则不缓存。 + * @return 动画模板。 + */ + static createFrames(url: string | string[], name: string): any[]; + /** + * @en Clears the animation data with the specified key value from the animation template cache pool. + * When calling the function to create an animation template, developers can manually specify this value. For animation sets created by LayaAir IDE, the parsed key format is: "url#": represents the default animation template of the animation set, if this value is used as a parameter, it will clear the entire animation set data; "url#aniName": represents the animation template with the corresponding name. + * @param key The key of the animation template in the animation template cache pool. + * @zh 从动画模版缓存池中清除指定key值的动画数据。 + * 开发者在调用创建动画模版函数时,可以手动指定此值。而如果是由LayaAir IDE创建的动画集,解析后的key格式为:"url#":表示动画集的默认动画模版,如果以此值为参数,会清除整个动画集数据;"url#aniName":表示相应名称的动画模版。 + * @param key 动画模板在动画模版缓存池中的key。 + */ + static clearCache(key: string): void; + } + /** + * @en Base class for animations, providing basic animation playback control methods and frame label event-related functionality. + * This class can be inherited, but should not be instantiated directly as some methods need to be implemented by subclasses. + * - Event.COMPLETE dispatched when the animation playback is complete. + * - Event.LABEL dispatched when a specific label is reached during playback. + * @zh 动画基类,提供了基础的动画播放控制方法和帧标签事件相关功能。 + * 可以继承此类,但不要直接实例化此类,因为有些方法需要由子类实现。 + * - Event.COMPLETE 动画播放完毕后调度。 + * - Event.LABEL 播放到某标签后调度。 + */ + class AnimationBase extends Sprite { + /** + * @en Animation playback order type: Forward playback. + * @zh 动画播放顺序类型:正序播放。 + */ + static WRAP_POSITIVE: number; + /** + * @en Animation playback order type: Reverse playback. + * @zh 动画播放顺序类型:逆序播放。 + */ + static WRAP_REVERSE: number; + /** + * @en Animation playback order type: Ping-pong playback (changes playback direction after reaching the end when continuing to play). + * @zh 动画播放顺序类型:pingpong播放(当按指定顺序播放完结尾后,如果继续播放,则会改变播放顺序)。 + */ + static WRAP_PINGPONG: number; + /** + * @en Whether to loop playback. This value is set to the specified parameter value when calling the play(...) method. + * @zh 是否循环播放,调用play(...)方法时,会将此值设置为指定的参数值。 + */ + loop: boolean; + /** + * @en Playback order type: AnimationBase.WRAP_POSITIVE for forward playback (default), AnimationBase.WRAP_REVERSE for reverse playback, AnimationBase.WRAP_PINGPONG for ping-pong playback. + * @zh 播放顺序类型:AnimationBase.WRAP_POSITIVE为正序播放(默认值),AnimationBase.WRAP_REVERSE为倒序播放,AnimationBase.WRAP_PINGPONG为pingpong播放(当按指定顺序播放完结尾后,如果继续播发,则会改变播放顺序)。 + */ + wrapMode: number; + /** 播放间隔(单位:毫秒)。*/ + protected _interval: number; + protected _index: number; + protected _count: number; + protected _isPlaying: boolean; + protected _labels: any; + /**是否是逆序播放*/ + protected _isReverse: boolean; + protected _frameRateChanged: boolean; + protected _actionName: string; + private _controlNode; + /** + * @en constructor method, This class can be extended, but should not be instantiated directly as some methods need to be implemented by subclasses. + * @zh 构造方法,可以继承此类,但不要直接实例化此类,因为有些方法需要由子类实现。 + */ + constructor(); + /** + * @en Starts playing the animation. The play(...) method is designed to be called at any time after creating an instance. + * When the corresponding resources are loaded, the animation frame filling method (set frames) is called, or the instance is displayed on the stage, + * it will check if it's currently playing, and if so, it will start playing. + * Combined with the wrapMode property, you can set the animation playback order type. + * @param start (Optional) Specifies the starting index (int) or frame label (String) for animation playback. Frame labels can be added and removed using addLabel(...) and removeLabel(...). + * @param loop (Optional) Whether to loop playback. + * @param name (Optional) Animation name. + * @zh 开始播放动画。play(...)方法被设计为在创建实例后的任何时候都可以被调用,当相应的资源加载完毕、调用动画帧填充方法(set frames)或者将实例显示在舞台上时,会判断是否正在播放中,如果是,则进行播放。 + * 配合wrapMode属性,可设置动画播放顺序类型。 + * @param start (可选)指定动画播放开始的索引(int)或帧标签(String)。帧标签可以通过addLabel(...)和removeLabel(...)进行添加和删除。 + * @param loop (可选)是否循环播放。 + * @param name (可选)动画名称。 + */ + play(start?: any, loop?: boolean, name?: string): void; + /** + * @en Gets or sets the frame interval time (in milliseconds) for animation playback. + * The default value depends on Config.animationInterval=50, which can be modified through Config.animationInterval. + * To set an independent frame interval time for a specific animation, you can use set interval. + * Note: If the animation is currently playing, setting this will reset the frame loop timer's start time to the current time. + * Frequent setting of interval may cause the animation frame update interval to be slower than expected, or even not update. + * @zh 动画播放的帧间隔时间(单位:毫秒)。默认值依赖于Config.animationInterval=50,通过Config.animationInterval可以修改默认帧间隔时间。 + * 要想为某动画设置独立的帧间隔时间,可以使用set interval,注意:如果动画正在播放,设置后会重置帧循环定时器的起始时间为当前时间,也就是说,如果频繁设置interval,会导致动画帧更新的时间间隔会比预想的要慢,甚至不更新。 + */ + get interval(): number; + set interval(value: number); + protected _getFrameByLabel(label: string): number; + protected _frameLoop(): void; + protected _resumePlay(): void; + /** + * @en Stop the animation playback. + * @zh 停止动画播放。 + */ + stop(): void; + /** + * @en Whether the animation is currently playing. + * @zh 是否正在播放中。 + */ + get isPlaying(): boolean; + /** + * @en Add a frame label to the specified frame index. When the animation plays to this frame, it will dispatch an Event.LABEL event after updating the current frame. + * @param label The name of the frame label. + * @param index The frame index. + * @zh 增加一个帧标签到指定索引的帧上。当动画播放到此索引的帧时会派发Event.LABEL事件,派发事件是在完成当前帧画面更新之后。 + * @param label 帧标签名称。 + * @param index 帧索引。 + */ + addLabel(label: string, index: number): void; + /** + * @en Remove the specified frame label. + * @param label The name of the frame label. Note: If empty, all frame labels will be deleted! + * @zh 删除指定的帧标签。 + * @param label 帧标签名称。注意:如果为空,则删除所有帧标签! + */ + removeLabel(label: string): void; + private _removeLabelFromList; + /** + * @en Switch the animation to the specified frame and stop there. + * @param position Frame index or frame label. + * @zh 将动画切换到指定帧并停在那里。 + * @param position 帧索引或帧标签。 + */ + gotoAndStop(position: any): void; + /** + * @en The index of the current frame in the animation. + * @zh 动画当前帧的索引。 + */ + get index(): number; + set index(value: number); + /** + * @en Displays the specified frame. + * @param value The index of the frame to display. + * @zh 显示到某帧 + * @param value 帧索引 + */ + protected _displayToIndex(value: number): void; + /** + * @en The total number of frames in the current animation. + * @zh 当前动画中帧的总数。 + */ + get count(): number; + /** + * @en Stop the animation playback and clear object properties. After this, the object can be stored in the object pool for reuse. + * @returns The object itself. + * @zh 停止动画播放,并清理对象属性。之后可存入对象池,方便对象复用。 + * @returns 返回对象本身。 + */ + clear(): AnimationBase; + } + /** + * @en BitmapFont is a bitmap font class used to define bitmap font information. + * @zh BitmapFont 是位图字体类,用于定义位图字体信息。 + */ + class BitmapFont extends Resource { + /** + * @en Bitmap font texture + * @zh 位图字体纹理 + */ + texture: Texture; + /** + * @en Bitmap font key-value mapping + * @zh 位图字体键值对映射 + */ + dict: Record; + /** + * @en Font padding + * @zh 字体边距 + */ + padding: any[]; + /** + * @en Current bitmap font size. When used, if the font size is different from the setting and autoScaleSize=true, it will be scaled according to the set font size ratio. + * @zh 当前位图字体字号,使用时,如果字号和设置不同,并且autoScaleSize=true,则按照设置字号比率进行缩放显示。 + */ + fontSize: number; + /** + * @en Indicates whether to scale the bitmap font size according to the actual font size used. + * @zh 表示是否根据实际使用的字体大小缩放位图字体大小。 + */ + autoScaleSize: boolean; + /** + * @en Whether it is a font + * @zh 是否是字体 + */ + tint: boolean; + /** + * @en Maximum width + * @zh 最大宽度 + */ + maxWidth: number; + /** + * @en Line height + * @zh 行高 + */ + lineHeight: number; + /** + * @en Letter spacing + * @zh 字符间隔 + */ + letterSpacing: number; + /** + * @en Load the bitmap font file by specifying the file path. After loading, it will be automatically parsed. + * @param path The path of the bitmap font file. + * @param complete The callback function after loading and parsing are completed. + * @zh 通过指定位图字体文件路径,加载位图字体文件,加载完成后会自动解析。 + * @param path 位图字体文件的路径。 + * @param complete 加载并解析完成的回调。 + */ + static loadFont(path: string, complete: Handler): void; + /** + * @en BitmapFont constructor. + * @zh 位图字体构造方法。 + */ + constructor(); + /** + * @en Parse the font file. + * @param xml The XML of the font file. + * @param texture The texture of the font. + * @zh 解析字体文件。 + * @param xml 字体文件XML。 + * @param texture 字体的纹理。 + */ + parseFont(xml: XML, texture: Texture): void; + /** + * @en Destroys the bitmap font. This is called by default when Text.unregisterBitmapFont is invoked. + * @zh 销毁位图字体,调用 Text.unregisterBitmapFont 时,默认会销毁。 + */ + protected _disposeResource(): void; + /** + * @en Get the width of the specified text content. + * @param text The text content. + * @param fontSize The font size. + * @return The width of the text content. + * @zh 获取指定文本内容的宽度。 + * @param text 文本内容。 + * @param fontSize 字体大小。 + * @return 文本内容的宽度。 + */ + getTextWidth(text: string, fontSize?: number): number; + /** + * @en Get the maximum character width. + * @param fontSize The font size. + * @zh 获取最大字符宽度。 + * @param fontSize 字体大小。 + */ + getMaxWidth(fontSize?: number): number; + /** + * @en Get the maximum character height. + * @param fontSize The font size. + * @zh 获取最大字符高度。 + * @param fontSize 字体大小。 + */ + getMaxHeight(fontSize?: number): number; + } + interface BMGlyph { + x?: number; + y?: number; + width?: number; + height?: number; + advance?: number; + texture?: Texture; + } + /** + * @en Alpha command. + * @zh 透明命令 + */ + class AlphaCmd implements IGraphicCMD { + /** + * @en Identifier for the AlphaCmd + * @zh 透明命令的标识符 + */ + static ID: string; + /** + * @en The opacity level of the command. + * @zh 透明度值。 + */ + alpha: number; + /** + * @en Creates or retrieves an AlphaCmd instance from the object pool and initializes it with the specified alpha value. + * @param alpha The alpha value to set for the AlphaCmd instance. + * @returns An AlphaCmd instance initialized with the given alpha value. + * @zh 从对象池创建或获取一个 AlphaCmd 实例,并使用指定的 alpha 值进行初始化。 + * @param alpha 用于设置 AlphaCmd 实例的 alpha 值。 + * @returns 一个已用给定 alpha 值初始化的 AlphaCmd 实例。 + */ + static create(alpha: number): AlphaCmd; + /** + * @en Recovers the `AlphaCmd` instance to the object pool for reuse. + * @zh 将 `AlphaCmd` 实例回收到对象池以供重用。 + */ + recover(): void; + /** + * @en Execute the alpha command in the given context. + * @param context The rendering context. + * @param gx The global x coordinate (unused in this method). + * @param gy The global y coordinate (unused in this method). + * @zh 在给定的上下文中执行 alpha 命令。 + * @param context 渲染上下文。 + * @param gx 全局 x 坐标(本方法中未使用)。 + * @param gy 全局 y 坐标(本方法中未使用)。 + */ + run(context: Context, gx: number, gy: number): void; + /** + * @en Get the identifier for the AlphaCmd + * @zh 获得透明命令的标识符 + */ + get cmdID(): string; + } + /** + * @en Clip command + * @zh 裁剪命令 + */ + class ClipRectCmd implements IGraphicCMD { + /** + * @en Identifier for the ClipRectCmd + * @zh 裁剪命令的标识符 + */ + static ID: string; + /** + * @en X-axis offset. + * @zh X 轴偏移量。 + */ + x: number; + /** + * @en Y-axis offset. + * @zh Y 轴偏移量。 + */ + y: number; + /** + * @en Width of the clip rectangle. + * @zh 裁剪矩形的宽度。 + */ + width: number; + /** + * @en Height of the clip rectangle. + * @zh 裁剪矩形的高度。 + */ + height: number; + /** + * @en Creates or retrieves a ClipRectCmd instance from the object pool and initializes it with the specified parameters. + * @param x The x-coordinate of the top-left corner of the clip rectangle. + * @param y The y-coordinate of the top-left corner of the clip rectangle. + * @param width The width of the clip rectangle. + * @param height The height of the clip rectangle. + * @returns A ClipRectCmd instance initialized with the given parameters. + * @zh 从对象池创建或获取一个 ClipRectCmd 实例,并使用指定的参数进行初始化。 + * @param x 裁剪矩形左上角的 x 坐标。 + * @param y 裁剪矩形左上角的 y 坐标。 + * @param width 裁剪矩形的宽度。 + * @param height 裁剪矩形的高度。 + * @returns 一个已用给定参数初始化的 ClipRectCmd 实例。 + */ + static create(x: number, y: number, width: number, height: number): ClipRectCmd; + /** + * @en Recycle the instance to the object pool. + * @zh 将实例回收到对象池。 + */ + recover(): void; + /** + * @en Execute the clip rectangle command in the given context. + * @param context The rendering context. + * @param gx The global x coordinate. + * @param gy The global y coordinate. + * @zh 在给定的上下文中执行裁剪矩形命令。 + * @param context 渲染上下文。 + * @param gx 全局 x 坐标。 + * @param gy 全局 y 坐标。 + */ + run(context: Context, gx: number, gy: number): void; + /** + * @en The identifier for the ClipRectCmd + * @zh 裁剪命令的标识符 + */ + get cmdID(): string; + } + /** + * @en Draw circle command + * @zh 绘制圆形命令 + */ + class DrawCircleCmd implements IGraphicCMD { + /** + * @en Identifier for the DrawCircleCmd + * @zh 绘制圆形命令的标识符 + */ + static ID: string; + /** + * @en X-axis position of the circle center + * @zh 圆心X轴位置 + */ + x: number; + /** + * @en Y-axis position of the circle center + * @zh 圆心Y轴位置 + */ + y: number; + /** + * @en Radius of the circle + * @zh 圆的半径 + */ + radius: number; + /** + * @en Fill color + * @zh 填充颜色 + */ + fillColor: any; + /** + * @en (Optional) Border color + * @zh (可选)边框颜色 + */ + lineColor: any; + /** + * @en (Optional) Border width + * @zh (可选)边框宽度 + */ + lineWidth: number; + /** + * @en Whether the position and size are percentages + * @zh 位置和大小是否是百分比 + */ + percent: boolean; + /** + * @private + * @en Create a DrawCircleCmd instance + * @param x X-axis position of the circle center + * @param y Y-axis position of the circle center + * @param radius Radius of the circle + * @param fillColor Fill color + * @param lineColor Border color + * @param lineWidth Border width + * @returns A DrawCircleCmd instance + * @zh 创建绘制圆形的DrawCircleCmd实例 + * @param x 圆心X轴位置 + * @param y 圆心Y轴位置 + * @param radius 圆的半径 + * @param fillColor 填充颜色 + * @param lineColor 边框颜色 + * @param lineWidth 边框宽度 + * @returns DrawCircleCmd实例 + */ + static create(x: number, y: number, radius: number, fillColor: any, lineColor: any, lineWidth: number): DrawCircleCmd; + /** + * @en Recycle the instance to the object pool + * @zh 将实例回收到对象池 + */ + recover(): void; + /** + * @en Execute the draw circle command + * @param context The rendering context + * @param gx Global X offset + * @param gy Global Y offset + * @zh 执行绘制圆形命令 + * @param context 渲染上下文 + * @param gx 全局X偏移 + * @param gy 全局Y偏移 + */ + run(context: Context, gx: number, gy: number): void; + /** + * @en The identifier for the DrawCircleCmd + * @zh 绘制圆形命令的标识符 + */ + get cmdID(): string; + /** + * @en Get the bounding points of the circle + * @param sp The sprite that draws the cmd + * @returns An array of bounding points + * @zh 获取圆形的包围盒顶点数据 + * @param sp 绘制cmd的精灵 + * @returns 包围盒顶点数据数组 + */ + getBoundPoints(sp?: { + width: number; + height?: number; + }): number[]; + } + /** + * @en Draw curves command + * @zh 绘制曲线命令 + */ + class DrawCurvesCmd implements IGraphicCMD { + /** + * @en Identifier for the DrawCurvesCmd + * @zh 绘制曲线命令的标识符 + */ + static ID: string; + /** + * @en X-axis position to start drawing + * @zh 开始绘制的 X 轴位置 + */ + x: number; + /** + * @en Y-axis position to start drawing + * @zh 开始绘制的 Y 轴位置 + */ + y: number; + /** + * @en Collection of points for the curve segments, format: [controlX, controlY, anchorX, anchorY...] + * @zh 线段的点集合,格式:[controlX, controlY, anchorX, anchorY...] + */ + points: number[] | null; + /** + * @en Line color + * @zh 线段颜色 + */ + lineColor: any; + /** + * @en (Optional) Line width + * @zh (可选)线段宽度 + */ + lineWidth: number; + /** + * @private + * @en Create a DrawCurvesCmd instance + * @param x X-axis position to start drawing + * @param y Y-axis position to start drawing + * @param points Collection of points for the curve segments + * @param lineColor Line color + * @param lineWidth Line width + * @returns A DrawCurvesCmd instance + * @zh 创建一个DrawCurvesCmd实例 + * @param x 开始绘制的 X 轴位置 + * @param y 开始绘制的 Y 轴位置 + * @param points 线段的点集合 + * @param lineColor 线段颜色 + * @param lineWidth 线段宽度 + * @returns DrawCurvesCmd实例 + */ + static create(x: number, y: number, points: any[], lineColor: any, lineWidth: number): DrawCurvesCmd; + /** + * @en Recycle the instance to the object pool + * @zh 将实例回收到对象池 + */ + recover(): void; + /** + * @en Execute the draw curves command + * @param context The rendering context + * @param gx Global X offset + * @param gy Global Y offset + * @zh 执行绘制曲线命令 + * @param context 渲染上下文 + * @param gx 全局X偏移 + * @param gy 全局Y偏移 + */ + run(context: Context, gx: number, gy: number): void; + /** + * @en The identifier for the DrawCurvesCmd + * @zh 绘制曲线命令的标识符 + */ + get cmdID(): string; + /** + * @en Get the bounding points of the curves. + * @zh 获取贝塞尔曲线上的点数据。 + */ + getBoundPoints(): number[]; + } + /** + * @en Draw ellipse command + * @zh 绘制椭圆命令 + */ + class DrawEllipseCmd implements IGraphicCMD { + /** + * @en Identifier for the DrawEllipseCmd + * @zh 绘制椭圆命令的标识符 + */ + static ID: string; + /** + * @en X-axis position of the ellipse center + * @zh 椭圆中心点X轴位置 + */ + x: number; + /** + * @en Y-axis position of the ellipse center + * @zh 椭圆中心点Y轴位置 + */ + y: number; + /** + * @en Horizontal radius of the ellipse + * @zh 椭圆的横向半径 + */ + width: number; + /** + * @en Vertical radius of the ellipse + * @zh 椭圆的纵向半径 + */ + height: number; + /** + * @en Fill color + * @zh 填充颜色 + */ + fillColor: any; + /** + * @en (Optional) Border color + * @zh (可选)边框颜色 + */ + lineColor: any; + /** + * @en (Optional) Border width + * @zh (可选)边框宽度 + */ + lineWidth: number; + /** + * @en Whether the position and size are percentages + * @zh 位置和大小是否是百分比 + */ + percent: boolean; + /** + * @en Create a DrawEllipseCmd instance + * @param x X-axis position of the ellipse center + * @param y Y-axis position of the ellipse center + * @param width Horizontal radius of the ellipse + * @param height Vertical radius of the ellipse + * @param fillColor Fill color + * @param lineColor Border color + * @param lineWidth Border width + * @param percent Whether the position and size are percentages + * @returns A DrawEllipseCmd instance + * @zh 创建一个绘制椭圆命令的实例 + * @param x 椭圆中心点X轴位置 + * @param y 椭圆中心点Y轴位置 + * @param width 椭圆的横向半径 + * @param height 椭圆的纵向半径 + * @param fillColor 填充颜色 + * @param lineColor 边框颜色 + * @param lineWidth 边框宽度 + * @param percent 位置和大小是否是百分比 + * @returns DrawEllipseCmd实例 + */ + static create(x: number, y: number, width: number, height: number, fillColor: any, lineColor: any, lineWidth: number, percent?: boolean): DrawEllipseCmd; + /** + * @en Recycle the instance to the object pool + * @zh 将实例回收到对象池 + */ + recover(): void; + /** + * @en Execute the draw ellipse command + * @param context The rendering context + * @param gx Global X offset + * @param gy Global Y offset + * @zh 执行绘制椭圆命令 + * @param context 渲染上下文 + * @param gx 全局X偏移 + * @param gy 全局Y偏移 + */ + run(context: Context, gx: number, gy: number): void; + /** + * @en The identifier for the DrawEllipseCmd + * @zh 绘制椭圆命令的标识符 + */ + get cmdID(): string; + /** + * @en Get the bounding points of the ellipse + * @param sp The sprite that draws the cmd + * @returns An array of bounding points + * @zh 获取椭圆的包围盒顶点数据 + * @param sp 绘制cmd的精灵 + * @returns 包围盒顶点数据数组 + */ + getBoundPoints(sp?: { + width: number; + height?: number; + }): number[]; + } + /** + * @en Draw geometry command + * @zh 绘制几何体命令 + */ + class DrawGeoCmd implements IGraphicCMD { + /** + * @en Identifier for the DrawGeoCmd + * @zh 绘制几何体命令的标识符 + */ + static ID: string; + /** + * @en Geometry element to be rendered + * @zh 要渲染的几何体元素 + */ + geo: IRenderGeometryElement; + /** + * @en Material used for rendering + * @zh 用于渲染的材质 + */ + material: Material; + /** + * @en Create a DrawGeoCmd instance + * @param geo Geometry element to be rendered + * @param material Material used for rendering + * @returns A DrawGeoCmd instance + * @zh 创建一个绘制几何体命令实例 + * @param geo 要渲染的几何体元素 + * @param material 用于渲染的材质 + * @returns DrawGeoCmd 实例 + */ + static create(geo: IRenderGeometryElement, material: Material): DrawGeoCmd; + /** + * @en Create a geometry element + * @param decl Vertex declaration + * @param vbArray Vertex buffer array + * @param vblen Vertex buffer length + * @param ibArray Index buffer array + * @param iblen Index buffer length + * @returns Created geometry element + * @zh 创建一个几何体元素 + * @param decl 顶点声明 + * @param vbArray 顶点缓冲数组 + * @param vblen 顶点缓冲长度 + * @param ibArray 索引缓冲数组 + * @param iblen 索引缓冲长度 + * @returns 创建的几何体元素 + */ + static creatGEO(decl: VertexDeclaration, vbArray: Float32Array, vblen: number, ibArray: Uint16Array, iblen: number): IRenderGeometryElement; + /** + * @en Initialize the DrawGeoCmd + * @param geo Geometry element to be rendered + * @param material Material used for rendering + * @zh 初始化绘制几何体命令 + * @param geo 要渲染的几何体元素 + * @param material 用于渲染的材质 + */ + init(geo: IRenderGeometryElement, material: Material): void; + /** + * @en Recycle the instance to the object pool + * @zh 将实例回收到对象池 + */ + recover(): void; + /** + * @en Execute the draw geometry command + * @param context The rendering context + * @param gx Global x-coordinate + * @param gy Global Y-coordinate + * @zh 执行绘制几何体命令 + * @param context 渲染上下文 + * @param gx 全局X坐标 + * @param gy 全局Y坐标 + */ + run(context: Context, gx: number, gy: number): void; + /** + * @en The identifier for the DrawGeoCmd + * @zh 绘制几何体命令的ID + */ + get cmdID(): string; + } + /** + * @en Draw multiple geometries command + * @zh 绘制多个几何体命令 + */ + class DrawGeosCmd implements IGraphicCMD { + /** + * @en Identifier for the DrawGeosCmd + * @zh 绘制多个几何体命令的标识符 + */ + static ID: string; + /** + * @en Geometry element to be rendered + * @zh 要渲染的几何体元素 + */ + geo: IRenderGeometryElement; + /** + * @en Array of [Material, startIndex, count] tuples for each geometry + * @zh 每个几何体的 [材质, 起始索引, 数量] 元组数组 + */ + elements: [ + Material, + number, + number + ][]; + /** + * @private + * @en Create a DrawGeosCmd instance + * @param geo Geometry element to be rendered + * @param elements Array of [Material, startIndex, count] tuples for each geometry + * @returns A DrawGeosCmd instance + * @zh 创建一个 DrawGeosCmd 实例 + * @param geo 要渲染的几何体元素 + * @param elements 每个几何体的 [材质, 起始索引, 数量] 元组数组 + * @returns DrawGeosCmd 实例 + */ + static create(geo: IRenderGeometryElement, elements: [ + Material, + number, + number + ][]): DrawGeosCmd; + /** + * @en Initialize the DrawGeosCmd + * @param geo Geometry element to be rendered + * @param elements Array of [Material, startIndex, count] tuples for each geometry + * @zh 初始化绘制多个几何体 + * @param geo 要渲染的几何体元素 + * @param elements 每个几何体的 [材质, 起始索引, 数量] 元组数组 + */ + init(geo: IRenderGeometryElement, elements: [ + Material, + number, + number + ][]): void; + /** + * @en Recycle the instance to the object pool + * @zh 将实例回收到对象池 + */ + recover(): void; + /** + * @en Execute the draw geometries command + * @param context The rendering context + * @param gx Global x-coordinate + * @param gy Global Y-coordinate + * @zh 执行绘制多个几何体命令 + * @param context 渲染上下文 + * @param gx 全局X坐标 + * @param gy 全局Y坐标 + */ + run(context: Context, gx: number, gy: number): void; + /** + * @en The identifier for the DrawGeosCmd + * @zh 绘制多个几何体命令的标识符 + */ + get cmdID(): string; + } + /** + * @en Draw image command + * @zh 绘制图片命令 + */ + class DrawImageCmd implements IGraphicCMD { + /** + * @en Identifier for the DrawImageCmd + * @zh 绘制图片命令的标识符 + */ + static ID: string; + /** + * @en Texture to be drawn + * @zh 要绘制的纹理 + */ + texture: Texture | null; + /** + * @en (Optional) X-axis offset + * @zh (可选)X轴偏移量 + */ + x: number; + /** + * @en (Optional) Y-axis offset + * @zh (可选)Y轴偏移量 + */ + y: number; + /** + * @en (Optional) Width of the drawn image + * @zh (可选)绘制图片的宽度 + */ + width: number; + /** + * @en (Optional) Height of the drawn image + * @zh (可选)绘制图片的高度 + */ + height: number; + /** + * @en (Optional) Drawing color + * @zh (可选)绘图颜色 + */ + color: number; + /** + * @en Create a DrawImageCmd instance + * @param texture Texture to be drawn + * @param x X-axis offset + * @param y Y-axis offset + * @param width Width of the drawn image + * @param height Height of the drawn image + * @param color Drawing color + * @returns A DrawImageCmd instance + * @zh 创建一个绘制图片命令实例 + * @param texture 要绘制的纹理 + * @param x X轴偏移量 + * @param y Y轴偏移量 + * @param width 绘制图片的宽度 + * @param height 绘制图片的高度 + * @param color 绘图颜色 + * @returns 绘制图片命令实例 + */ + static create(texture: Texture, x: number, y: number, width: number, height: number, color: string): DrawImageCmd; + /** + * @en Recycle the instance to the object pool + * @zh 将实例回收到对象池 + */ + recover(): void; + /** + * @en Execute the draw image command + * @param context The rendering context + * @param gx Global X offset + * @param gy Global Y offset + * @zh 执行绘制图片命令 + * @param context 渲染上下文 + * @param gx 全局X偏移 + * @param gy 全局Y偏移 + */ + run(context: Context, gx: number, gy: number): void; + /** + * @en The identifier for the DrawImageCmd + * @zh 绘制图片命令的标识符 + */ + get cmdID(): string; + } + /** + * @en Draw bend line command + * @zh 绘制单条曲线命令 + */ + class DrawLineCmd implements IGraphicCMD { + /** + * @en Identifier for the DrawLineCmd + * @zh 绘制单条曲线命令的标识符 + */ + static ID: string; + /** + * @en X-axis start position + * @zh X轴起始位置 + */ + fromX: number; + /** + * @en Y-axis start position + * @zh Y轴起始位置 + */ + fromY: number; + /** + * @en X-axis end position + * @zh X轴结束位置 + */ + toX: number; + /** + * @en Y-axis end position + * @zh Y轴结束位置 + */ + toY: number; + /** + * @en Line color + * @zh 线条颜色 + */ + lineColor: string; + /** + * @en (Optional) Line width + * @zh (可选)线条宽度 + */ + lineWidth: number; + /** + * @en Whether the position is a percentage + * @zh 位置是否是百分比 + */ + percent: boolean; + /** + * @private + * @en Create a DrawLineCmd instance + * @param fromX X-axis start position + * @param fromY Y-axis start position + * @param toX X-axis end position + * @param toY Y-axis end position + * @param lineColor Line color + * @param lineWidth Line width + * @returns A DrawLineCmd instance + * @zh 创建一个绘制单条曲线命令实例 + * @param fromX X轴起始位置 + * @param fromY Y轴起始位置 + * @param toX X轴结束位置 + * @param toY Y轴结束位置 + * @param lineColor 线条颜色 + * @param lineWidth 线条宽度 + * @returns DrawLineCmd 实例 + */ + static create(fromX: number, fromY: number, toX: number, toY: number, lineColor: string, lineWidth: number): DrawLineCmd; + /** + * @en Recycle the instance to the object pool + * @zh 将实例回收到对象池 + */ + recover(): void; + /** + * @en Execute the draw bend line command + * @param context The rendering context + * @param gx Global X offset + * @param gy Global Y offset + * @zh 执行绘制单条曲线命令 + * @param context 渲染上下文 + * @param gx 全局X偏移 + * @param gy 全局Y偏移 + */ + run(context: Context, gx: number, gy: number): void; + /** + * @en The identifier for the DrawLineCmd + * @zh 绘制单条曲线命令的标识符 + */ + get cmdID(): string; + /** + * @en Get the bounding points of the line + * @param sp The sprite that draws the cmd + * @returns An array of bounding points + * @zh 获取直线的包围盒顶点数据 + * @param sp 绘制cmd的精灵 + * @returns 包围盒顶点数据数组 + */ + getBoundPoints(sp?: { + width: number; + height?: number; + }): number[]; + } + /** + * @en Draw continuous curves command + * @zh 绘制连续曲线命令 + */ + class DrawLinesCmd implements IGraphicCMD { + /** + * @en Identifier for the DrawLinesCmd + * @zh 绘制连续曲线命令的标识符 + */ + static ID: string; + /** + * @en X-axis position to start drawing + * @zh 开始绘制的X轴位置 + */ + x: number; + /** + * @en Y-axis position to start drawing + * @zh 开始绘制的Y轴位置 + */ + y: number; + /** + * @en Collection of points for the line segments. Format: [x1,y1,x2,y2,x3,y3...] + * @zh 线段的点集合。格式:[x1,y1,x2,y2,x3,y3...] + */ + points: number[] | null; + /** + * @en Line color + * @zh 线段颜色 + */ + lineColor: any; + /** + * @en (Optional) Line width + * @zh (可选)线段宽度 + */ + lineWidth: number; + /** + * @en Create a DrawLinesCmd instance + * @param x X-axis position to start drawing + * @param y Y-axis position to start drawing + * @param points Collection of points for the line segments + * @param lineColor Line color + * @param lineWidth Line width + * @returns A DrawLinesCmd instance + * @zh 创建一个绘制连续曲线命令实例 + * @param x 开始绘制的X轴位置 + * @param y 开始绘制的Y轴位置 + * @param points 线段的点集合 + * @param lineColor 线段颜色 + * @param lineWidth 线段宽度 + * @returns DrawLinesCmd 实例 + */ + static create(x: number, y: number, points: any[], lineColor: any, lineWidth: number): DrawLinesCmd; + /** + * @en Recycle the instance to the object pool + * @zh 将实例回收到对象池 + */ + recover(): void; + /** + * @en Execute the draw continuous lines command + * @param context The rendering context + * @param gx Global X offset + * @param gy Global Y offset + * @zh 执行绘制连续曲线命令 + * @param context 渲染上下文 + * @param gx 全局X偏移 + * @param gy 全局Y偏移 + */ + run(context: Context, gx: number, gy: number): void; + /** + * @en The identifier for the DrawLinesCmd + * @zh 绘制连续曲线命令的标识符 + */ + get cmdID(): string; + } + /** + * @en Draw vector graphics based on the path + * @zh 根据路径绘制矢量图形 + */ + class DrawPathCmd { + /** + * @en Identifier for the DrawPathCmd + * @zh 根据路径绘制矢量图形命令的标识符 + */ + static ID: string; + /** + * @en The X-axis position to start drawing. + * @zh 开始绘制的 X 轴位置。 + */ + x: number; + /** + * @en The Y-axis position to start drawing. + * @zh 开始绘制的 Y 轴位置。 + */ + y: number; + /** + * @en Path collection. Paths support the following formats: [["moveTo",x,y],["lineTo",x,y],["arcTo",x1,y1,x2,y2,r],["closePath"]]. + * @zh 路径集合,路径支持以下格式:[["moveTo",x,y],["lineTo",x,y],["arcTo",x1,y1,x2,y2,r],["closePath"]]。 + */ + paths: any[] | null; + /** + * @en (Optional) Brush definition, supports the following settings: {fillStyle:"#FF0000"}. + * @zh (可选)刷子定义,支持以下设置:{fillStyle:"#FF0000"}。 + */ + brush: any; + /** + * @en (Optional) Pen definition, supports the following settings: {strokeStyle,lineWidth,lineJoin:"bevel|round|miter",lineCap:"butt|round|square",miterLimit}. + * @zh (可选)画笔定义,支持以下设置:{strokeStyle,lineWidth,lineJoin:"bevel|round|miter",lineCap:"butt|round|square",miterLimit}。 + */ + pen: any; + /** + * @en Create a DrawPathCmd instance + * @param x The X-axis position to start drawing + * @param y The Y-axis position to start drawing + * @param paths Path collection + * @param brush Brush definition + * @param pen Pen definition + * @returns DrawPathCmd instance + * @zh 创建一个根据路径绘制矢量图形命令实例 + * @param x 开始绘制的 X 轴位置 + * @param y 开始绘制的 Y 轴位置 + * @param paths 路径集合 + * @param brush 刷子定义 + * @param pen 画笔定义 + * @return DrawPathCmd 实例 + */ + static create(x: number, y: number, paths: any[], brush: any, pen: any): DrawPathCmd; + /** + * @en Recycle to the object pool + * @zh 回收到对象池 + */ + recover(): void; + /** + * @en Execute the drawing command + * @param context The rendering context + * @param gx Global X offset + * @param gy Global Y offset + * @zh 执行绘制命令 + * @param context 渲染上下文 + * @param gx 全局 X 偏移 + * @param gy 全局 Y 偏移 + */ + run(context: Context, gx: number, gy: number): void; + /** + * @en The identifier for the DrawPathCmd + * @zh 根据路径绘制矢量图形命令的标识符 + */ + get cmdID(): string; + /** + * @en Get the boundary points of the path + * @zh 获取路径的边界点 + */ + getBoundPoints(): number[]; + } + /** + * @en Draw a pie chart + * @zh 绘制扇形 + */ + class DrawPieCmd { + /** + * @en Identifier for the DrawPieCmd + * @zh 绘制扇形命令的标识符 + */ + static ID: string; + /** + * @en The X-axis position to start drawing. + * @zh 开始绘制的 X 轴位置。 + */ + x: number; + /** + * @en The Y-axis position to start drawing. + * @zh 开始绘制的 Y 轴位置。 + */ + y: number; + /** + * @en The radius of the pie chart. + * @zh 扇形半径。 + */ + radius: number; + /** + * @en The fill color + * @zh 填充颜色 + */ + fillColor: any; + /** + * @en (Optional) The border color + * @zh (可选)边框颜色 + */ + lineColor: any; + /** + * @en (Optional) The width of the border. + * @zh (可选)边框宽度。 + */ + lineWidth: number; + private _startAngle; + private _endAngle; + /** + * @en Create a DrawPieCmd instance + * @param x The X-axis position to start drawing + * @param y The Y-axis position to start drawing + * @param radius The radius of the pie chart + * @param startAngle The start angle of the pie chart + * @param endAngle The end angle of the pie chart + * @param fillColor The fill color + * @param lineColor The border color + * @param lineWidth The width of the border + * @returns DrawPieCmd instance + * @zh 创建一个绘制扇形命令实例 + * @param x 开始绘制的 X 轴位置 + * @param y 开始绘制的 Y 轴位置 + * @param radius 扇形半径 + * @param startAngle 扇形起始角度 + * @param endAngle 扇形终止角度 + * @param fillColor 填充颜色 + * @param lineColor 边框颜色 + * @param lineWidth 边框宽度 + * @returns 绘制扇形命令实例 + */ + static create(x: number, y: number, radius: number, startAngle: number, endAngle: number, fillColor: any, lineColor: any, lineWidth: number): DrawPieCmd; + /** + * @en Recycle to the object pool + * @zh 回收到对象池 + */ + recover(): void; + /** + * @en Execute the drawing command + * @param context The rendering context + * @param gx Global X offset + * @param gy Global Y offset + * @zh 执行绘制命令 + * @param context 渲染上下文 + * @param gx 全局 X 偏移 + * @param gy 全局 Y 偏移 + */ + run(context: Context, gx: number, gy: number): void; + /** + * @en The identifier for the DrawPieCmd + * @zh 绘制扇形命令的标识符 + */ + get cmdID(): string; + /** + * @en The start angle of the pie chart in degrees. + * @zh 开始角度(以度为单位)。 + */ + get startAngle(): number; + set startAngle(value: number); + /** + * @en The end angle of the pie chart in degrees. + * @zh 结束角度(以度为单位)。 + */ + get endAngle(): number; + set endAngle(value: number); + /** + * @en Get the boundary points of the pie chart + * @zh 获取扇形的边界点 + */ + getBoundPoints(): number[]; + } + /** + * @en Draw a polygon + * @zh 绘制多边形 + */ + class DrawPolyCmd { + /** + * @en Identifier for the DrawPolyCmd + * @zh 绘制多边形命令的标识符 + */ + static ID: string; + /** + * @en The X-axis position to start drawing. + * @zh 开始绘制的 X 轴位置。 + */ + x: number; + /** + * @en The Y-axis position to start drawing. + * @zh 开始绘制的 Y 轴位置。 + */ + y: number; + /** + * @en The collection of points for the polygon. + * @zh 多边形的点集合。 + */ + points: number[] | null; + /** + * @en The fill color + * @zh 填充颜色 + */ + fillColor: any; + /** + * @en (Optional) The border color + * @zh (可选)边框颜色 + */ + lineColor: any; + /** + * @en (Optional) The width of the border. + * @zh (可选)边框宽度。 + */ + lineWidth: number; + /** + * @en Create a DrawPolyCmd instance + * @param x The X-axis position to start drawing + * @param y The Y-axis position to start drawing + * @param points The collection of points for the polygon + * @param fillColor The fill color + * @param lineColor The border color + * @param lineWidth The width of the border + * @returns DrawPolyCmd instance + * @zh 创建绘制多边形命令的实例 + * @param x 开始绘制的 X 轴位置 + * @param y 开始绘制的 Y 轴位置 + * @param points 多边形的点集合 + * @param fillColor 填充颜色 + * @param lineColor 边框颜色 + * @param lineWidth 边框宽度 + */ + static create(x: number, y: number, points: any[], fillColor: any, lineColor: any, lineWidth: number): DrawPolyCmd; + /** + * @en Recycle to the object pool + * @zh 回收到对象池 + */ + recover(): void; + /** + * @en Execute the drawing polygon command + * @param context The rendering context + * @param gx Global X offset + * @param gy Global Y offset + * @zh 执行绘制多边形命令 + * @param context 渲染上下文 + * @param gx 全局 X 偏移 + * @param gy 全局 Y 偏移 + */ + run(context: Context, gx: number, gy: number): void; + /** + * @en The identifier for the DrawPolyCmd + * @zh 绘制多边形命令的标识符 + */ + get cmdID(): string; + } + /** + * @en Draw a rectangle + * @zh 绘制矩形 + */ + class DrawRectCmd { + /** + * @en Identifier for the DrawRectCmd + * @zh 绘制矩形命令的标识符 + */ + static ID: string; + /** + * @en The X-axis position to start drawing. + * @zh 开始绘制的 X 轴位置。 + */ + x: number; + /** + * @en The Y-axis position to start drawing. + * @zh 开始绘制的 Y 轴位置。 + */ + y: number; + /** + * @en The width of the rectangle. + * @zh 矩形宽度。 + */ + width: number; + /** + * @en The height of the rectangle. + * @zh 矩形高度。 + */ + height: number; + /** + * @en The fill color + * @zh 填充颜色 + */ + fillColor: any; + /** + * @en (Optional) The border color + * @zh (可选)边框颜色 + */ + lineColor: any; + /** + * @en (Optional) The width of the border. + * @zh (可选)边框宽度。 + */ + lineWidth: number; + /** + * @en Whether the position and size are percentages. + * @zh 位置和大小是否是百分比。 + */ + percent: boolean; + /** + * @en Create a DrawRectCmd instance + * @param x The X-axis position to start drawing + * @param y The Y-axis position to start drawing + * @param width The width of the rectangle + * @param height The height of the rectangle + * @param fillColor The fill color + * @param lineColor The border color + * @param lineWidth The width of the border + * @param percent Whether the position and size are percentages + * @returns DrawRectCmd instance + * @zh 创建绘制矩形的命令实例 + * @param x 开始绘制的 X 轴位置 + * @param y 开始绘制的 Y 轴位置 + * @param width 矩形宽度 + * @param height 矩形高度 + * @param fillColor 填充颜色 + * @param lineColor 边框颜色 + * @param lineWidth 边框宽度 + * @param percent 位置和大小是否是百分比 + * @returns DrawRectCmd实例 + */ + static create(x: number, y: number, width: number, height: number, fillColor: any, lineColor: any, lineWidth: number, percent?: boolean): DrawRectCmd; + /** + * @en Recycle to the object pool + * @zh 回收到对象池 + */ + recover(): void; + /** + * @en Execute the drawing rectangle command + * @param context The rendering context + * @param gx Global X offset + * @param gy Global Y offset + * @zh 执行绘制矩形命令 + * @param context 渲染上下文 + * @param gx 全局X偏移 + * @param gy 全局Y偏移 + */ + run(context: Context, gx: number, gy: number): void; + /** + * @en The identifier for the DrawRectCmd + * @zh 绘制矩形命令的标识符 + */ + get cmdID(): string; + /** + * @en Get the vertex data of the bounding box + * @param sp The sprite that draws the command + * @returns Array of vertex data + * @zh 获取包围盒的顶点数据 + * @param sp 绘制命令的精灵对象 + * @returns 顶点数据数组 + */ + getBoundPoints(sp?: { + width: number; + height?: number; + }): number[]; + } + /** + * @en Draw a rounded rectangle + * @zh 绘制圆角矩形 + */ + class DrawRoundRectCmd { + /** + * @en Identifier for the DrawRoundRectCmd + * @zh 绘制圆角矩形命令的标识符 + */ + static ID: string; + /** + * @en The X-axis position of the rounded rectangle. + * @zh 圆角矩形的 X 轴位置。 + */ + x: number; + /** + * @en The Y-axis position of the rounded rectangle. + * @zh 圆角矩形的 Y 轴位置。 + */ + y: number; + /** + * @en The width of the rounded rectangle. + * @zh 圆角矩形的宽度。 + */ + width: number; + /** + * @en The height of the rounded rectangle. + * @zh 圆角矩形的高度。 + */ + height: number; + /** + * @en The radius of the top-left corner. + * @zh 左上圆角的半径。 + */ + lt: number; + /** + * @en The radius of the top-right corner. + * @zh 右上圆角的半径。 + */ + rt: number; + /** + * @en The radius of the bottom-left corner. + * @zh 左下圆角的半径。 + */ + lb: number; + /** + * @en The radius of the bottom-right corner. + * @zh 右下圆角的半径。 + */ + rb: number; + /** + * @en The fill color. + * @zh 填充颜色 + */ + fillColor: any; + /** + * @en (Optional) The border color. + * @zh (可选)边框颜色 + */ + lineColor: any; + /** + * @en (Optional) The width of the border. + * @zh (可选)边框宽度。 + */ + lineWidth: number; + /** + * @en Whether the position and size are percentages. + * @zh 位置和大小是否是百分比。 + */ + percent: boolean; + /** + * @en Create a DrawRoundRectCmd instance + * @param x The X-axis position of the rounded rectangle + * @param y The Y-axis position of the rounded rectangle + * @param width The width of the rounded rectangle + * @param height The height of the rounded rectangle + * @param lt The radius of the top-left corner + * @param rt The radius of the top-right corner + * @param lb The radius of the bottom-left corner + * @param rb The radius of the bottom-right corner + * @param fillColor The fill color + * @param lineColor The border color + * @param lineWidth The width of the border + * @param percent Whether the position and size are percentages + * @returns DrawRoundRectCmd instance + * @zh 创建绘制圆角矩形命令的实例 + * @param x 圆角矩形的 X 轴位置 + * @param y 圆角矩形的 Y 轴位置 + * @param width 圆角矩形的宽度 + * @param height 圆角矩形的高度 + * @param lt 左上圆角的半径 + * @param rt 右上圆角的半径 + * @param lb 左下圆角的半径 + * @param rb 右下圆角的半径 + * @param fillColor 填充颜色 + * @param lineColor 边框颜色 + * @param lineWidth 边框宽度 + * @param percent 位置和大小是否是百分比 + * @returns DrawRoundRectCmd 实例 + */ + static create(x: number, y: number, width: number, height: number, lt: number, rt: number, lb: number, rb: number, fillColor: any, lineColor: any, lineWidth: number, percent?: boolean): DrawRoundRectCmd; + /** + * @en Recycle to the object pool + * @zh 回收到对象池 + */ + recover(): void; + /** + * @en Execute the drawing rounded rectangle command + * @param context The rendering context + * @param gx Global X offset + * @param gy Global Y offset + * @zh 执行绘制圆角矩形命令 + * @param context 渲染上下文 + * @param gx 全局X偏移 + * @param gy 全局Y偏移 + */ + run(context: Context, gx: number, gy: number): void; + /** + * @en The identifier for the DrawRoundRectCmd + * @zh 绘制圆角矩形命令的标识符 + */ + get cmdID(): string; + /** + * @en Get the vertex data of the bounding box + * @param sp The sprite that draws the command + * @returns Array of vertex data + * @zh 获取包围盒的顶点数据 + * @param sp 绘制命令的精灵对象 + * @returns 顶点数据数组 + */ + getBoundPoints(sp?: { + width: number; + height?: number; + }): number[]; + } + /** + * @en Draw a single texture + * @zh 绘制单个贴图 + */ + class DrawTextureCmd { + /** + * @en Identifier for the DrawTextureCmd + * @zh 绘制单个贴图命令的标识符 + */ + static ID: string; + /** + * @en The texture to be drawn. + * @zh 要绘制的纹理。 + */ + texture: Texture | null; + /** + * @en (Optional) X-axis offset. + * @zh (可选)X轴偏移量。 + */ + x: number; + /** + * @en (Optional) Y-axis offset. + * @zh (可选)Y轴偏移量。 + */ + y: number; + /** + * @en (Optional) Width of the texture. + * @zh (可选)纹理的宽度。 + */ + width: number; + /** + * @en (Optional) Height of the texture. + * @zh (可选)纹理的高度。 + */ + height: number; + /** + * @en (Optional) Matrix information for transformation. + * @zh (可选)矩阵信息,用于变换。 + */ + matrix: Matrix | null; + /** + * @en (Optional) Alpha value. + * @zh (可选)透明度。 + */ + alpha: number; + /** + * @en (Optional) Color filter. + * @zh (可选)颜色滤镜。 + */ + color: number; + /** + * @en (Optional) Blend mode. + * @zh (可选)混合模式。 + */ + blendMode: string | null; + /** + * @en (Optional) UV coordinates. + * @zh (可选)UV坐标。 + */ + uv: number[] | null; + /** + * @en Create a DrawTextureCmd instance + * @param texture The texture to be drawn + * @param x X-axis offset + * @param y Y-axis offset + * @param width Width of the texture + * @param height Height of the texture + * @param matrix Matrix information for transformation + * @param alpha Alpha value + * @param color Color filter + * @param blendMode Blend mode + * @param uv UV coordinates + * @returns DrawTextureCmd instance + * @zh 创建一个绘制单个贴图实例 + * @param texture 要绘制的纹理 + * @param x X轴偏移量 + * @param y Y轴偏移量 + * @param width 纹理的宽度 + * @param height 纹理的高度 + * @param matrix 矩阵信息,用于变换 + * @param alpha 透明度 + * @param color 颜色滤镜 + * @param blendMode 混合模式 + * @param uv UV坐标 + * @returns DrawTextureCmd实例 + */ + static create(texture: Texture, x: number, y: number, width: number, height: number, matrix: Matrix | null, alpha: number, color: string | null, blendMode: string | null, uv?: number[]): DrawTextureCmd; + /** + * @en Recycle to the object pool + * @zh 回收到对象池 + */ + recover(): void; + /** + * @en Execute the draw texture command. + * @param context The rendering context. + * @param gx Starting X coordinate. + * @param gy Starting Y coordinate. + * @zh 执行绘制纹理命令。 + * @param context 渲染上下文。 + * @param gx 起始 X 坐标。 + * @param gy 起始 Y 坐标。 + */ + run(context: Context, gx: number, gy: number): void; + /** + * @en The identifier for the DrawTextureCmd + * @zh 绘制单个贴图命令的标识符 + */ + get cmdID(): string; + } + /** + * @en Draw multiple textures based on coordinate sets + * @zh 根据坐标集合绘制多个贴图 + */ + class DrawTexturesCmd { + /** + * @en Identifier for the DrawTexturesCmd + * @zh 根据坐标集合绘制多个贴图命令的标识符 + */ + static ID: string; + /** + * @en The texture to be drawn. + * @zh 要绘制的纹理。 + */ + texture: Texture; + /** + * @en Drawing times and coordinates. + * @zh 绘制次数和坐标。 + */ + pos: ArrayLike; + /** + * @en Additional vertex colors. + * @zh 附加顶点色。 + */ + colors: number[]; + /** + * @en Create a DrawTexturesCmd instance + * @param texture The texture to be drawn + * @param pos Drawing times and coordinates + * @param colors Additional vertex colors + * @returns DrawTexturesCmd instance + * @zh 创建一个根据坐标集合绘制多个贴图实例 + * @param texture 要绘制的纹理 + * @param pos 绘制次数和坐标 + * @param colors 附加顶点色 + * @returns DrawTexturesCmd实例 + */ + static create(texture: Texture, pos: any[], colors: number[]): DrawTexturesCmd; + /** + * @en Recycle to the object pool + * @zh 回收到对象池 + */ + recover(): void; + /** + * @en Execute the drawing textures command + * @param context The rendering context + * @param gx Global X offset + * @param gy Global Y offset + * @zh 执行绘制多个纹理命令 + * @param context 渲染上下文 + * @param gx 全局X偏移 + * @param gy 全局Y偏移 + */ + run(context: Context, gx: number, gy: number): void; + /** + * @en The identifier for the DrawTexturesCmd + * @zh 根据坐标集合绘制多个贴图命令的标识符 + */ + get cmdID(): string; + } + /** + * @en Draw triangles command + * @zh 绘制三角形命令 + */ + class DrawTrianglesCmd { + /** + * @en Identifier for the DrawTrianglesCmd + * @zh 绘制三角形命令的标识符 + */ + static ID: string; + /** + * @en The texture to be drawn. + * @zh 要绘制的纹理。 + */ + texture: Texture | null; + /** + * @en X-axis offset. + * @zh X轴偏移量。 + */ + x: number; + /** + * @en Y-axis offset. + * @zh Y轴偏移量。 + */ + y: number; + /** + * @en Vertex array. + * @zh 顶点数组。 + */ + vertices: Float32Array; + /** + * @en UV data. + * @zh UV数据。 + */ + uvs: Float32Array; + /** + * @en Vertex indices. + * @zh 顶点索引。 + */ + indices: Uint16Array; + /** + * @en Scaling matrix. + * @zh 缩放矩阵。 + */ + matrix: Matrix | null; + /** + * @en Alpha value. + * @zh 透明度值。 + */ + alpha: number; + /** + * @en Blend mode. + * @zh 混合模式。 + */ + blendMode: string | null; + /** + * @en Color transformation. + * @zh 颜色变换。 + */ + color: number | null; + /** + * @en Create a DrawTrianglesCmd instance + * @param texture The texture to be drawn + * @param x X-axis offset + * @param y Y-axis offset + * @param vertices Vertex array + * @param uvs UV data + * @param indices Vertex indices + * @param matrix Scaling matrix + * @param alpha Alpha value + * @param color Color transformation + * @param blendMode Blend mode + * @returns DrawTrianglesCmd instance + * @zh 创建一个绘制三角形命令实例 + * @param texture 要绘制的纹理 + * @param x X轴偏移量 + * @param y Y轴偏移量 + * @param vertices 顶点数组 + * @param uvs UV数据 + * @param indices 顶点索引 + * @param matrix 缩放矩阵 + * @param alpha 透明度值 + * @param color 颜色变换 + * @param blendMode 混合模式 + * @returns 绘制三角形命令实例 + */ + static create(texture: Texture, x: number, y: number, vertices: Float32Array, uvs: Float32Array, indices: Uint16Array, matrix: Matrix | null, alpha: number, color: string | number, blendMode: string | null): DrawTrianglesCmd; + /** + * @en Recycle to the object pool + * @zh 回收到对象池 + */ + recover(): void; + /** + * @en Execute the drawing triangles command + * @param context The rendering context + * @param gx Global X offset + * @param gy Global Y offset + * @zh 执行绘制三角形命令 + * @param context 渲染上下文 + * @param gx 全局X偏移 + * @param gy 全局Y偏移 + */ + run(context: Context, gx: number, gy: number): void; + /** + * @en The identifier for the DrawTrianglesCmd + * @zh 绘制三角形命令的标识符 + */ + get cmdID(): string; + /** + * @en Get the boundary points of the triangles + * @zh 获取三角形的边界点 + */ + getBoundPoints(): number[]; + } + /** + * @en Draw text command + * @zh 绘制文字命令 + */ + class FillTextCmd { + /** + * @en Identifier for the FillTextCmd + * @zh 绘制文字命令的标识符 + */ + static ID: string; + /** + * @en The x position of the start of the text (relative to the canvas). + * @zh 开始绘制文本的 x 坐标位置(相对于画布)。 + */ + x: number; + /** + * @en The y position of the start of the text (relative to the canvas). + * @zh 开始绘制文本的 y 坐标位置(相对于画布)。 + */ + y: number; + private _text; + private _wordText; + private _font; + private _color; + private _strokeColor; + private _stroke; + private _align; + private _fontObj; + private _loosyBound; + /** + * @en Text content + * @zh 文本内容 + */ + get text(): string; + set text(value: string); + /** + * @en Stroke color + * @zh 描边颜色 + */ + get strokeColor(): string; + set strokeColor(value: string); + /** + * @en Stroke width + * @zh 描边宽度 + */ + get stroke(): number; + set stroke(value: number); + /** + * @en Text alignment + * @zh 对齐方式 + */ + get align(): number; + set align(value: number); + /** + * @en Create a FillTextCmd instance + * @param text Text content + * @param x X position + * @param y Y position + * @param font Font + * @param color Text color + * @param align Alignment + * @param stroke Stroke width + * @param strokeColor Stroke color + * @returns FillTextCmd instance + * @zh 创建绘制文本的命令的实例 + * @param text 文本内容 + * @param x x位置 + * @param y y位置 + * @param font 字体 + * @param color 文本颜色 + * @param align 对齐方式 + * @param stroke 描边宽度 + * @param strokeColor 描边颜色 + * @returns 绘制文本的命令实例 + */ + static create(text: string | WordText | null, x: number, y: number, font: string, color: string | null, align: string, stroke: number, strokeColor: string | null): FillTextCmd; + /** + * @en Recycle to the object pool + * @zh 回收到对象池 + */ + recover(): void; + /** + * @private + * @en Execute the drawing text command + * @param context The rendering context + * @param gx Global X offset + * @param gy Global Y offset + * @zh 执行绘制文本命令 + * @param context 渲染上下文 + * @param gx 全局X偏移 + * @param gy 全局Y偏移 + */ + run(context: Context, gx: number, gy: number): void; + /** + * @en The identifier for the FillTextCmd + * @zh 绘制文字命令的标识符 + */ + get cmdID(): string; + /** + * @en Define the font size and font, e.g., "20px Arial". + * @zh 定义字号和字体,比如"20px Arial"。 + */ + get font(): string; + set font(value: string); + /** + * @en Define the text color, e.g., "#ff0000". + * @zh 定义文本颜色,比如"#ff0000"。 + */ + get color(): string; + set color(value: string); + /** + * @en Gets the bounding points of the text element. Calculates and returns an array of points representing the bounding box of the text. + * @returns An array of numbers representing the bounding points. + * @zh 获取文本元素的边界点。计算并返回表示文本边界框的点数组。 + * @returns 表示边界点的数字数组。 + */ + getBoundPoints(): number[]; + } + /** + * @en Fill texture command + * @zh 填充贴图命令 + */ + class FillTextureCmd { + /** + * @en Identifier for the FillTextureCmd + * @zh 填充贴图命令的标识符 + */ + static ID: string; + /** + * @en The texture to be filled. + * @zh 要填充的纹理。 + */ + texture: Texture; + /** + * @en X-axis offset. + * @zh X轴偏移量。 + */ + x: number; + /** + * @en Y-axis offset. + * @zh Y轴偏移量。 + */ + y: number; + /** + * @en (Optional) Width of the filled area. + * @zh (可选)填充区域的宽度。 + */ + width: number; + /** + * @en (Optional) Height of the filled area. + * @zh (可选)填充区域的高度。 + */ + height: number; + /** + * @en (Optional) Fill type: repeat|repeat-x|repeat-y|no-repeat + * @zh (可选)填充类型:repeat|repeat-x|repeat-y|no-repeat + */ + type?: string; + /** + * @en (Optional) Texture offset + * @zh (可选)贴图纹理偏移 + */ + offset?: Point; + /** + * @en Whether the position and size are percentages + * @zh 位置和大小是否是百分比 + */ + percent: boolean; + /** + * @en (Optional) Drawing color + * @zh (可选)绘图颜色 + */ + color: number; + /** + * @en Create a FillTextureCmd instance + * @param texture The texture to be filled + * @param x X-axis offset + * @param y Y-axis offset + * @param width Width of the filled area + * @param height Height of the filled area + * @param type Fill type + * @param offset Texture offset + * @param color Drawing color + * @returns FillTextureCmd instance + * @zh 创建绘制填充贴图的命令实例 + * @param texture 要填充的纹理 + * @param x X轴偏移量 + * @param y Y轴偏移量 + * @param width 填充区域的宽度 + * @param height 填充区域的高度 + * @param type 填充类型 + * @param offset 贴图纹理偏移 + * @param color 绘图颜色 + * @returns FillTextureCmd实例 + */ + static create(texture: Texture, x: number, y: number, width: number, height: number, type: string, offset: Point, color: string): FillTextureCmd; + /** + * @en Recycle to the object pool + * @zh 回收到对象池 + */ + recover(): void; + /** + * @en Execute the fill texture command + * @param context The rendering context + * @param gx Global X offset + * @param gy Global Y offset + * @zh 执行绘制填充贴图命令 + * @param context 渲染上下文 + * @param gx 全局X偏移 + * @param gy 全局Y偏移 + */ + run(context: Context, gx: number, gy: number): void; + /** + * @en The identifier for the FillTextureCmd + * @zh 填充贴图命令的标识符 + */ + get cmdID(): string; + /** + * @en Get the vertex data of the bounding box + * @param sp The sprite that draws the command + * @returns Array of vertex data + * @zh 获取包围盒的顶点数据 + * @param sp 绘制命令的精灵对象 + * @returns 顶点数据数组 + */ + getBoundPoints(sp?: { + width: number; + height?: number; + }): number[]; + } + /** + * @en Restore command, used in conjunction with save + * @zh 恢复命令,与save配套使用 + */ + class RestoreCmd { + /** + * @en Identifier for the RestoreCmd + * @zh 恢复命令的标识符 + */ + static ID: string; + /** + * @en Create a RestoreCmd instance + * @returns RestoreCmd instance + * @zh 创建一个恢复命令实例 + * @returns 恢复命令实例 + */ + static create(): RestoreCmd; + /** + * @en Recycle to the object pool + * @zh 回收到对象池 + */ + recover(): void; + /** + * @en Execute the restore command + * @param context The rendering context + * @zh 执行恢复命令 + * @param context 渲染上下文 + */ + run(context: Context): void; + /** + * @en The identifier for the RestoreCmd + * @zh 恢复命令的标识符 + */ + get cmdID(): string; + } + /** + * @en Rotate command + * @zh 旋转命令 + */ + class RotateCmd { + /** + * @en Identifier for the RotateCmd + * @zh 旋转命令的标识符 + */ + static ID: string; + /** + * @en Rotation angle in radians. + * @zh 旋转角度,以弧度计。 + */ + angle: number; + /** + * @en (Optional) Horizontal axis point coordinates. + * @zh (可选)水平方向轴心点坐标。 + */ + pivotX: number; + /** + * @en (Optional) Vertical axis point coordinates. + * @zh (可选)垂直方向轴心点坐标。 + */ + pivotY: number; + /** + * @en Create a RotateCmd instance + * @param angle Rotation angle in radians + * @param pivotX Horizontal axis point coordinates. + * @param pivotY Vertical axis point coordinates. + * @returns RotateCmd instance + * @zh 创建一个旋转命令实例 + * @param angle 旋转角度,以弧度计。 + * @param pivotX 水平方向轴心点坐标。 + * @param pivotY 垂直方向轴心点坐标。 + * @returns 旋转命令实例 + */ + static create(angle: number, pivotX: number, pivotY: number): RotateCmd; + /** + * @en Recycle to the object pool + * @zh 回收到对象池 + */ + recover(): void; + /** + * @en Execute the rotate command + * @param context The rendering context + * @param gx Global X offset + * @param gy Global Y offset + * @zh 执行旋转命令 + * @param context 渲染上下文 + * @param gx 全局X偏移 + * @param gy 全局Y偏移 + */ + run(context: Context, gx: number, gy: number): void; + /** + * @en The identifier for the RotateCmd + * @zh 旋转命令的标识符 + */ + get cmdID(): string; + } + /** + * @en Save command, used in conjunction with restore + * @zh 存储命令,与restore配套使用 + */ + class SaveCmd { + /** + * @en Identifier for the SaveCmd + * @zh 存储命令的标识符 + */ + static ID: string; + /** + * @en Create a SaveCmd instance + * @returns SaveCmd instance + * @zh 创建一个存储命令实例 + * @returns 存储命令实例 + */ + static create(): SaveCmd; + /** + * @en Recycle to the object pool + * @zh 回收到对象池 + */ + recover(): void; + /** + * @en Execute the save command + * @param context The rendering context + * @zh 执行存储命令 + * @param context 渲染上下文 + */ + run(context: Context): void; + /** + * @en The identifier for the SaveCmd + * @zh 存储命令的标识符 + */ + get cmdID(): string; + } + /** + * @en Scale command + * @zh 缩放命令 + */ + class ScaleCmd { + /** + * @en Identifier for the ScaleCmd + * @zh 缩放命令的标识符 + */ + static ID: string; + /** + * @en Horizontal scaling value. + * @zh 水平方向缩放值。 + */ + scaleX: number; + /** + * @en Vertical scaling value. + * @zh 垂直方向缩放值。 + */ + scaleY: number; + /** + * @en (Optional) Horizontal axis point coordinates. + * @zh (可选)水平方向轴心点坐标。 + */ + pivotX: number; + /** + * @en (Optional) Vertical axis point coordinates. + * @zh (可选)垂直方向轴心点坐标。 + */ + pivotY: number; + /** + * @en Create a ScaleCmd instance + * @param scaleX Horizontal scaling value + * @param scaleY Vertical scaling value + * @param pivotX Horizontal axis point coordinates + * @param pivotY Vertical axis point coordinates + * @returns ScaleCmd instance + * @zh 创建一个缩放命令实例 + * @param scaleX 水平方向缩放值 + * @param scaleY 垂直方向缩放值 + * @param pivotX 水平方向轴心点坐标 + * @param pivotY 垂直方向轴心点坐标 + * @returns 缩放命令实例 + */ + static create(scaleX: number, scaleY: number, pivotX: number, pivotY: number): ScaleCmd; + /** + * @en Recycle to the object pool + * @zh 回收到对象池 + */ + recover(): void; + /** + * @en Execute the scale command + * @param context The rendering context + * @param gx Global X offset + * @param gy Global Y offset + * @zh 执行缩放命令 + * @param context 渲染上下文 + * @param gx 全局X偏移 + * @param gy 全局Y偏移 + */ + run(context: Context, gx: number, gy: number): void; + /** + * @en The identifier for the ScaleCmd + * @zh 缩放命令的标识符 + */ + get cmdID(): string; + } + /** + * @en Transform command + * @zh 矩阵变换命令 + */ + class TransformCmd { + /** + * @en Identifier for the TransformCmd + * @zh 矩阵变换命令的标识符 + */ + static ID: string; + /** + * @en The transformation matrix. + * @zh 变换矩阵。 + */ + matrix: Matrix; + /** + * @en (Optional) Horizontal axis point coordinates. + * @zh (可选)水平方向轴心点坐标。 + */ + pivotX: number; + /** + * @en (Optional) Vertical axis point coordinates. + * @zh (可选)垂直方向轴心点坐标。 + */ + pivotY: number; + /** + * @en Create a TransformCmd instance + * @param matrix The transformation matrix + * @param pivotX Horizontal axis point coordinates + * @param pivotY Vertical axis point coordinates + * @returns TransformCmd instance + * @zh 创建一个矩阵变换命令实例 + * @param matrix 变换矩阵 + * @param pivotX 水平方向轴心点坐标 + * @param pivotY 垂直方向轴心点坐标 + * @returns 矩阵变换命令实例 + */ + static create(matrix: Matrix, pivotX: number, pivotY: number): TransformCmd; + /** + * @en Recycle to the object pool + * @zh 回收到对象池 + */ + recover(): void; + /** + * @en Execute the transform command + * @param context The rendering context + * @param gx Global X offset + * @param gy Global Y offset + * @zh 执行矩阵变换命令 + * @param context 渲染上下文 + * @param gx 全局X偏移 + * @param gy 全局Y偏移 + */ + run(context: Context, gx: number, gy: number): void; + /** + * @en The identifier for the TransformCmd + * @zh 矩阵变换命令的标识符 + */ + get cmdID(): string; + } + /** + * @en Translate command + * @zh 位移命令 + */ + class TranslateCmd { + /** + * @en Identifier for the TranslateCmd + * @zh 位移命令的标识符 + */ + static ID: string; + /** + * @en The value to be added to the horizontal coordinate (x). + * @zh 添加到水平坐标(x)上的值。 + */ + tx: number; + /** + * @en The value to be added to the vertical coordinate (y). + * @zh 添加到垂直坐标(y)上的值。 + */ + ty: number; + /** + * @en Create a TranslateCmd instance + * @param tx The value to be added to the horizontal coordinate + * @param ty The value to be added to the vertical coordinate + * @returns TranslateCmd instance + * @zh 创建一个位移命令实例 + * @param tx 要添加到水平坐标的值 + * @param ty 要添加到垂直坐标的值 + * @returns 位移命令实例 + */ + static create(tx: number, ty: number): TranslateCmd; + /** + * @en Recycle to the object pool + * @zh 回收到对象池 + */ + recover(): void; + /** + * @en Execute the translate command + * @param context The rendering context + * @zh 执行位移命令 + * @param context 渲染上下文 + */ + run(context: Context): void; + /** + * @en The identifier for the TranslateCmd + * @zh 位移命令的标识符 + */ + get cmdID(): string; + } + /** + * @en Sprite style + * @zh 精灵样式 + */ + class SpriteStyle { + static readonly EMPTY: Readonly; + /** + * @en Horizontal scaling + * @zh 水平缩放 + */ + scaleX: number; + /** + * @en Vertical scaling + * @zh 垂直缩放 + */ + scaleY: number; + /** + * @en Horizontal skew angle + * @zh 水平倾斜角度 + */ + skewX: number; + /** + * @en Vertical skew angle + * @zh 垂直倾斜角度 + */ + skewY: number; + /** + * @en X-axis pivot point + * @zh X轴心点 + */ + pivotX: number; + /** + * @en Y-axis pivot point + * @zh Y轴心点 + */ + pivotY: number; + /** + * @en Rotation angle + * @zh 旋转角度 + */ + rotation: number; + /** + * @en Transparency + * @zh 透明度 + */ + alpha: number; + /** + * @en Scroll area + * @zh 滚动区域 + */ + scrollRect: Rectangle; + /** + * @en Viewport + * @zh 视口 + */ + viewport: Rectangle; + /** + * @en Hit area + * @zh 点击区域 + */ + hitArea: IHitArea; + /** + * @en Dragging + * @zh 滑动 + */ + dragging: Dragging; + /** + * @en Blend mode + * @zh 混合模式 + */ + blendMode: string; + constructor(); + /** + * @en Reset for easy reuse next time + * @zh 重置,方便下次复用 + */ + reset(): SpriteStyle; + /** + * @en Recycle to the object pool + * @zh 回收到对象池 + */ + recover(): void; + /** + * @en Create SpriteStyle object pool instance + * @zh 创建SpriteStyle对象池实例 + */ + static create(): SpriteStyle; + } + /** + * @en Text style class + * @zh 文本的样式类 + */ + class TextStyle { + /** + * @en Font + * @zh 字体 + */ + font: string; + /** + * @en Font size + * @zh 字号 + */ + fontSize: number; + /** + * @en Text color + * @zh 文字颜色 + */ + color: string; + /** + * @en Whether the text is bold + * @zh 是否为粗体 + */ + bold: boolean; + /** + * @en Whether the text is italic + * @zh 是否为斜体 + */ + italic: boolean; + /** + * @en Whether to show underline + * @zh 是否显示下划线 + */ + underline: boolean; + /** + * @en Underline color + * @zh 下划线颜色 + */ + underlineColor: string; + /** + * @en Whether to display the strikethrough. + * @zh 是否显示删除线。 + */ + strikethrough: boolean; + /** + * @en The color of the strikethrough. + * @zh 删除线颜色。 + */ + strikethroughColor: string; + /** + * @en Indicates the horizontal alignment of text paragraphs using this text format + * @zh 表示使用此文本格式的文本段落的水平对齐方式 + * @default "left" + */ + align: string; + /** + * @en Indicates the vertical alignment of text paragraphs using this text format + * @zh 表示使用此文本格式的文本段落的垂直对齐方式 + * @default "top" + */ + valign: string; + /** + * @en Alignment of images and text in mixed content. Possible values are top, middle, bottom + * @zh 图文混排时图片和文字的对齐方式。可选值是top, middle, bottom + */ + alignItems: string; + /** + * @en Vertical line spacing (in pixels) + * @zh 垂直行间距(以像素为单位) + */ + leading: number; + /** + * @en Stroke width (in pixels). Default is 0, meaning no stroke + * @zh 描边宽度(以像素为单位)。默认值0,表示不描边 + * @default 0 + */ + stroke: number; + /** + * @en Stroke color, represented as a string + * @zh 描边颜色,以字符串表示 + * @default "#000000" + */ + strokeColor: string; + constructor(); + } + /** + * @en Effect template. Used to add animation effects to specified target objects. Each effect has a unique target object, while the same object can add multiple effects. When one effect starts playing, other effects will automatically stop playing. + * @zh 动效模板。用于为指定目标对象添加动画效果。每个动效有唯一的目标对象,而同一个对象可以添加多个动效。当一个动效开始播放时,其他动效会自动停止播放。 + */ + class EffectAnimation extends FrameAnimation { + /** + * 动效开始事件。 + */ + private static EFFECT_BEGIN; + private _target; + private _playEvent; + private _initData; + private _aniKeys; + private _effectClass; + /** + * @en The target object of this instance. Controls the property changes of the target object through this instance. + * @zh 本实例的目标对象。通过本实例控制目标对象的属性变化。 + */ + get target(): any; + set target(v: any); + private _onOtherBegin; + /** + * @en The event name to trigger the animation. This instance will listen for the specified event of the target object and play the corresponding animation effect when triggered. + * @zh 触发动画的事件名称。本实例会侦听目标对象的指定事件,触发后播放相应动画效果。 + */ + set playEvent(event: string); + private _addEvent; + private _onPlayAction; + /** + * @en Play the animation effect. + * @param start The starting position of the animation. Default is 0. + * @param loop Whether to loop the animation. Default is true. + * @param name The name of the animation to play. Default is an empty string. + * @zh 播放动画效果。 + * @param start 动画的起始位置。默认为0。 + * @param loop 是否循环播放动画。默认为true。 + * @param name 要播放的动画名称。默认为空字符串。 + */ + play(start?: any, loop?: boolean, name?: string): void; + private _recordInitData; + /** + * @en Provide the path of the class that provides the data. + * @zh 提供数据的类的路径。 + */ + set effectClass(classStr: string); + /** + * @en The UI data containing animation information. + * @zh 包含动画信息的UI数据。 + */ + set effectData(uiData: any); + protected _displayToIndex(value: number): void; + protected _displayNodeToFrame(node: any, frame: number, targetDic?: any): void; + protected _calculateKeyFrames(node: any): void; + } + /** + * @en Node keyframe animation playback class. Parses and plays node animations created in the IDE. + * @zh 节点关键帧动画播放类。解析播放IDE内制作的节点动画。 + */ + class FrameAnimation extends AnimationBase { + private static _sortIndexFun; + protected _usedFrames: any[]; + constructor(); + /** + * @en Clears the animation data and resets the animation to its initial state. + * @returns The instance of the AnimationBase. + * @zh 清除动画数据并将动画重置为初始状态。 + * @returns AnimationBase 实例。 + */ + clear(): AnimationBase; + protected _displayToIndex(value: number): void; + /** + * 将节点设置到某一帧的状态 + * @param node 节点ID + * @param frame + * @param targetDic 节点表 + */ + protected _displayNodeToFrame(node: any, frame: number, targetDic?: any): void; + /** + * @en Calculate frame data + * @zh 计算帧数据 + */ + private _calculateDatas; + /** + * @en Calculate the frame data of a node + * @zh 计算某个节点的帧数据 + */ + protected _calculateKeyFrames(node: any): void; + /** + * @en Reset nodes to restore them to their state before the animation, facilitating control by other animations. + * This method iterates through all nodes in the animation data, resetting their properties to initial values. + * @zh 重置节点,使节点恢复到动画之前的状态,方便其他动画控制。 + * 此方法遍历动画数据中的所有节点,将它们的属性重置为初始值。 + */ + resetNodes(): void; + /** + * @en Calculate the frame data of a node's property + * @zh 计算节点某个属性的帧数据 + */ + private _calculateNodePropFrames; + private _dealKeyFrame; + /** + * @en Calculate the frame data between two key frames + * @zh 计算两个关键帧直接的帧数据 + */ + private _calculateFrameValues; + } + /** + * @ignore + * @en Graphics animation parser + * @zh Graphics动画解析器 + */ + class GraphicAnimation extends FrameAnimation { + /** + * @en List of animations + * @zh 动画列表 + */ + animationList: any[]; + /** + * @en Dictionary of animations + * @zh 动画字典 + */ + animationDic: any; + protected _nodeList: any[]; + protected _nodeDefaultProps: any; + protected _gList: any[]; + protected _nodeIDAniDic: any; + protected static _drawTextureCmd: any[]; + protected static _temParam: any[]; + private static _I; + private static _rootMatrix; + private _rootNode; + protected _nodeGDic: any; + private _parseNodeList; + private _calGraphicData; + private _createGraphicData; + protected _createFrameGraphic(frame: number): any; + protected _updateNodeGraphic(node: any, frame: number, parentTransfrom: Matrix, g: Graphics, alpha?: number): void; + protected _updateNoChilds(tNodeG: GraphicNode, g: Graphics): void; + protected _updateNodeGraphic2(node: any, frame: number, g: Graphics): void; + protected _calculateKeyFrames(node: any): void; + protected getNodeDataByID(nodeID: number): any; + protected _getParams(obj: any, params: any[], frame: number, obj2: any): any[]; + private _getObjVar; + protected _getNodeGraphicData(nodeID: number, frame: number, rst: GraphicNode): GraphicNode; + private static _tempMt; + protected _getTextureByUrl(url: string): any; + /** + * @en Set animation data + * @param uiView The UI view containing animation data + * @param aniName The name of the animation to set + * @zh 设置动画数据 + * @param uiView 包含动画数据的UI视图 + * @param aniName 要设置的动画名称 + */ + setAniData(uiView: any, aniName?: string): void; + /** + * @en Parse animation data + * @param aniData The animation data to parse + * @returns Parsed animation frame object + * @zh 解析动画数据 + * @param aniData 要解析的动画数据 + * @returns 解析后的动画帧对象 + */ + parseByData(aniData: any): any; + /** + * @en Set up animation data + * This method processes the animations in the UI view, creating a list and dictionary of animation frames. + * @param uiView The UI view containing animation data + * @zh 设置动画数据 + * 此方法处理UI视图中的动画,创建动画帧的列表和字典。 + * @param uiView 包含动画数据的UI视图 + */ + setUpAniData(uiView: any): void; + protected _clear(): void; + /** + * @en Parse animation by data + * @param animationObject The animation object to parse + * @returns Parsed animation data + * @zh 通过数据解析动画 + * @param animationObject 要解析的动画对象 + * @returns 解析后的动画数据 + */ + static parseAnimationByData(animationObject: any): any; + /** + * @en Parse animation data + * @param aniData The animation data to parse + * @returns An object containing parsed animation list and dictionary + * @zh 解析动画数据 + * @param aniData 要解析的动画数据 + * @returns 包含解析后的动画列表和字典的对象 + */ + static parseAnimationData(aniData: any): any; + } + /** + * @en The Graphics class is used to create drawing display objects. Graphics can draw multiple bitmaps or vector graphics simultaneously, and can also combine instructions such as save, restore, transform, scale, rotate, translate, alpha, etc. to change the drawing effect. + * Graphics is stored as a command stream and can be accessed through the cmds property. Graphics is a lighter object than Sprite, and proper use can improve application performance (for example, changing a large number of node drawings to a collection of Graphics commands of one node can reduce the consumption of creating a large number of nodes). + * @zh Graphics 类用于创建绘图显示对象。Graphics可以同时绘制多个位图或者矢量图,还可以结合save,restore,transform,scale,rotate,translate,alpha等指令对绘图效果进行变化。 + * Graphics以命令流方式存储,可以通过cmds属性访问所有命令流。Graphics是比Sprite更轻量级的对象,合理使用能提高应用性能(比如把大量的节点绘图改为一个节点的Graphics命令集合,能减少大量节点创建消耗)。 + */ + class Graphics { + /** + * @en Add global Uniform Data Map + * @param propertyID The ID of the property + * @param propertyKey The key of the property + * @param uniformtype The type of the uniform + * @zh 添加全局Uniform数据映射 + * @param propertyID 属性ID + * @param propertyKey 属性键 + * @param uniformtype Uniform类型 + */ + static add2DGlobalUniformData(propertyID: number, propertyKey: string, uniformtype: ShaderDataType): void; + /** + * @deprecated + * @en Global shaderData,deprecated use Scene ShaderData replace + * @zh 全局着色器数据,请使用scene的ShaderData设置全局值 + */ + static get globalShaderData(): ShaderData; + private _cmds; + protected _vectorgraphArray: any[] | null; + private _graphicBounds; + private _material; + /**@ignore */ + constructor(); + /** + * @en Destroy this object. + * @zh 销毁此对象。 + */ + destroy(): void; + /** + * @en Clear drawing commands. + * @param recoverCmds Whether to recycle the drawing instruction array. If set to true, the instruction array will be recycled to save memory. It is recommended to set it to true for recycling, but if you manually reference the array, recycling is not recommended. + * @zh 清空绘制命令。 + * @param recoverCmds 是否回收绘图指令数组。设置为true,则对指令数组进行回收以节省内存开销。建议设置为true进行回收,但如果手动引用了数组,不建议回收。 + */ + clear(recoverCmds?: boolean): void; + /** @ignore */ + _clearBoundsCache(onSizeChanged?: boolean): void; + /**@private */ + private _initGraphicBounds; + /** + * @en Command flow. All drawing commands are stored. + * @zh 命令流。存储了所有绘制命令。 + */ + get cmds(): IGraphicCMD[]; + set cmds(value: IGraphicCMD[]); + /** + * @en Save to the command stream. + * @zh 添加到命令流。 + */ + addCmd(cmd: any): any; + /** + * @en Remove a specific command from the command list. + * @param cmd The command to be removed. + * @zh 从命令列表中移除特定的命令。 + * @param cmd 要移除的命令。 + */ + removeCmd(cmd: any): void; + /** + * @en Get the position and size information matrix (CPU-intensive, frequent use may cause lag, use sparingly). + * @param realSize (Optional) Use the real size of the image, default is false. + * @returns A Rectangle object composed of position and size. + * @zh 获取位置及宽高信息矩阵(比较耗CPU,频繁使用会造成卡顿,尽量少用)。 + * @param realSize (可选)使用图片的真实大小,默认为false。 + * @returns 位置与宽高组成的一个 Rectangle 对象。 + */ + getBounds(realSize?: boolean): Rectangle; + /** + * @en Get the list of endpoints. + * @param realSize (Optional) Use the real size of the image, default is false. + * @returns An array of endpoint coordinates. + * @zh 获取端点列表。 + * @param realSize (可选)使用图片的真实大小,默认为false。 + * @returns 端点坐标的数组。 + */ + getBoundPoints(realSize?: boolean): any[]; + /** + * @en The material of the graphics object. + * @zh 图形对象的材质。 + */ + get material(): Material; + set material(value: Material); + /** + * @en Draw a single image + * @param texture The texture to draw + * @param x (Optional) X-axis offset. Default is 0. + * @param y (Optional) Y-axis offset. Default is 0. + * @param width (Optional) Width of the image. Default is null. + * @param height (Optional) Height of the image. Default is null. + * @param color (Optional) Color of the image. Default is null. + * @zh 绘制单独图片 + * @param texture 要绘制的纹理 + * @param x (可选)X轴偏移量。默认为0。 + * @param y (可选)Y轴偏移量。默认为0。 + * @param width (可选)图片宽度。默认为null。 + * @param height (可选)图片高度。默认为null。 + * @param color (可选)图片颜色。默认为null。 + */ + drawImage(texture: Texture, x?: number, y?: number, width?: number, height?: number, color?: string): DrawImageCmd | null; + /** + * @en Draw a texture. More powerful than drawImage but less performant. + * @param texture The texture to draw + * @param x (Optional) X-axis offset. Default is 0. + * @param y (Optional) Y-axis offset. Default is 0. + * @param width (Optional) Width of the texture. Default is null. + * @param height (Optional) Height of the texture. Default is null. + * @param matrix (Optional) Matrix information. Default is null. + * @param alpha (Optional) Transparency. Default is 1. + * @param color (Optional) Color filter. Default is null. + * @param blendMode (Optional) Blend mode. Default is null. + * @param uv (Optional) UV coordinates. Default is undefined. + * @zh 绘制纹理,相比drawImage功能更强大,性能会差一些 + * @param texture 要绘制的纹理 + * @param x (可选)X轴偏移量。默认为0。 + * @param y (可选)Y轴偏移量。默认为0。 + * @param width (可选)纹理宽度。默认为null。 + * @param height (可选)纹理高度。默认为null。 + * @param matrix (可选)矩阵信息。默认为null。 + * @param alpha (可选)透明度。默认为1。 + * @param color (可选)颜色滤镜。默认为null。 + * @param blendMode (可选)混合模式。默认为null。 + * @param uv (可选)UV坐标。默认为undefined。 + */ + drawTexture(texture: Texture | null, x?: number, y?: number, width?: number, height?: number, matrix?: Matrix | null, alpha?: number, color?: string | null, blendMode?: string | null, uv?: number[]): DrawTextureCmd | null; + /** + * @en Batch draw the same texture multiple times. + * @param texture The texture to draw + * @param pos Array of positions for each draw + * @param colors (Optional) Array of colors for each draw + * @zh 批量绘制同样纹理 + * @param texture 要绘制的纹理 + * @param pos 绘制次数和坐标数组 + * @param colors (可选)图片颜色数组 + */ + drawTextures(texture: Texture, pos: any[], colors?: number[]): DrawTexturesCmd | null; + /** + * @en Draw geometry + * @param geo Render geometry element + * @param material Material to use for rendering + * @zh 绘制几何体 + * @param geo 渲染几何元素 + * @param material 用于渲染的材质 + */ + drawGeo(geo: IRenderGeometryElement, material: Material): any; + /** + * @en Draw multiple geometries + * @param geo Render geometry element + * @param elements Array of [Material, startIndex, count] tuples + * @zh 绘制多个几何体 + * @param geo 渲染几何元素 + * @param elements [材质, 起始索引, 数量] 元组数组 + */ + drawGeos(geo: IRenderGeometryElement, elements: [ + Material, + number, + number + ][]): any; + /** + * @en Draw a group of triangles + * @param texture The texture to use + * @param x X-axis offset + * @param y Y-axis offset + * @param vertices Vertex array + * @param uvs UV data. Note that the UV coordinates are used directly. If the texture is from an atlas, these UVs are also from the atlas and don't need conversion. + * @param indices Vertex indices + * @param matrix (Optional) Scale matrix. Default is null. + * @param alpha (Optional) Alpha value. Default is 1. + * @param color (Optional) Color transformation. Default is null. + * @param blendMode (Optional) Blend mode. Default is null. + * @zh 绘制一组三角形 + * @param texture 要使用的纹理 + * @param x X轴偏移量 + * @param y Y轴偏移量 + * @param vertices 顶点数组 + * @param uvs UV数据。注意这里的uv是直接使用的,如果texture是图集中的资源,这里的uv也是图集中的,即不需要转换直接用。 + * @param indices 顶点索引 + * @param matrix (可选)缩放矩阵。默认为null。 + * @param alpha (可选)alpha值。默认为1。 + * @param color (可选)颜色变换。默认为null。 + * @param blendMode (可选)混合模式。默认为null。 + */ + drawTriangles(texture: Texture, x: number, y: number, vertices: Float32Array, uvs: Float32Array, indices: Uint16Array, matrix?: Matrix | null, alpha?: number, color?: string | number, blendMode?: string | null): DrawTrianglesCmd; + /** + * @en Fill with texture + * @param texture The texture to use for filling + * @param x X-axis offset + * @param y Y-axis offset + * @param width (Optional) Width. Default is 0. + * @param height (Optional) Height. Default is 0. + * @param type (Optional) Fill type: 'repeat', 'repeat-x', 'repeat-y', or 'no-repeat'. Default is 'repeat'. + * @param offset (Optional) Texture offset. Default is null. + * @param color (Optional) Color. Default is null. + * @zh 用纹理填充 + * @param texture 用于填充的纹理 + * @param x X轴偏移量 + * @param y Y轴偏移量 + * @param width (可选)宽度。默认为0。 + * @param height (可选)高度。默认为0。 + * @param type (可选)填充类型:'repeat'、'repeat-x'、'repeat-y'或'no-repeat'。默认为'repeat'。 + * @param offset (可选)贴图纹理偏移。默认为null。 + * @param color (可选)颜色。默认为null。 + */ + fillTexture(texture: Texture, x: number, y: number, width?: number, height?: number, type?: string, offset?: Point | null, color?: string): FillTextureCmd | null; + /** + * @en Set the clipping area. Coordinates outside the clipping area will not be displayed. + * @param x X-axis offset + * @param y Y-axis offset + * @param width Width of the clipping area + * @param height Height of the clipping area + * @zh 设置剪裁区域,超出剪裁区域的坐标不显示。 + * @param x X轴偏移量 + * @param y Y轴偏移量 + * @param width 剪裁区域的宽度 + * @param height 剪裁区域的高度 + */ + clipRect(x: number, y: number, width: number, height: number): ClipRectCmd; + /** + * @en Draw text on the canvas + * @param text The text to output on the canvas + * @param x The x-coordinate where to start drawing the text (relative to the canvas) + * @param y The y-coordinate where to start drawing the text (relative to the canvas) + * @param font Defines the font size and family, e.g., "20px Arial" + * @param color Defines the text color, e.g., "#ff0000" + * @param textAlign Text alignment. Possible values: "left", "center", "right" + * @zh 在画布上绘制文本 + * @param text 在画布上输出的文本 + * @param x 开始绘制文本的x坐标位置(相对于画布) + * @param y 开始绘制文本的y坐标位置(相对于画布) + * @param font 定义字号和字体,例如"20px Arial" + * @param color 定义文本颜色,例如"#ff0000" + * @param textAlign 文本对齐方式。可选值:"left"、"center"、"right" + */ + fillText(text: string | WordText, x: number, y: number, font: string, color: string, textAlign: string): FillTextCmd; + /** + * @en Draw filled and stroked text on the canvas. + * @param text The text to output on the canvas + * @param x The x-coordinate where to start drawing the text (relative to the canvas) + * @param y The y-coordinate where to start drawing the text (relative to the canvas) + * @param font Defines the font and size, e.g., "20px Arial" + * @param fillColor Defines the text color, e.g., "#ff0000" + * @param textAlign Text alignment. Possible values: "left", "center", "right" + * @param lineWidth Width of the stroke line + * @param borderColor Defines the color of the text stroke + * @zh 在画布上绘制"被填充且镶边的"文本。 + * @param text 在画布上输出的文本 + * @param x 开始绘制文本的x坐标位置(相对于画布) + * @param y 开始绘制文本的y坐标位置(相对于画布) + * @param font 定义字体和字号,例如"20px Arial" + * @param fillColor 定义文本颜色,例如"#ff0000" + * @param textAlign 文本对齐方式。可选值:"left"、"center"、"right" + * @param lineWidth 镶边线条宽度 + * @param borderColor 定义镶边文本颜色 + */ + fillBorderText(text: string | WordText, x: number, y: number, font: string, fillColor: string, textAlign: string, lineWidth: number, borderColor: string): FillTextCmd; + /** + * @en Draw text on the canvas (without fill). The default color of the text is black. + * @param text The text to output on the canvas + * @param x The x-coordinate where to start drawing the text (relative to the canvas) + * @param y The y-coordinate where to start drawing the text (relative to the canvas) + * @param font Defines the font and size, e.g., "20px Arial" + * @param color Defines the text color, e.g., "#ff0000" + * @param lineWidth Width of the line + * @param textAlign Text alignment. Possible values: "left", "center", "right" + * @zh 在画布上绘制文本(没有填色)。文本的默认颜色是黑色。 + * @param text 在画布上输出的文本 + * @param x 开始绘制文本的x坐标位置(相对于画布) + * @param y 开始绘制文本的y坐标位置(相对于画布) + * @param font 定义字体和字号,例如"20px Arial" + * @param color 定义文本颜色,例如"#ff0000" + * @param lineWidth 线条宽度 + * @param textAlign 文本对齐方式。可选值:"left"、"center"、"right" + */ + strokeText(text: string | WordText, x: number, y: number, font: string, color: string, lineWidth: number, textAlign: string): FillTextCmd; + /** + * @en Set the transparency. + * @param alpha The transparency value + * @zh 设置透明度。 + * @param alpha 透明度值 + */ + alpha(alpha: number): AlphaCmd; + /** + * @en Replace the current transformation matrix for drawing. + * @param matrix The matrix + * @param pivotX (Optional) X-coordinate of the pivot point. Default is 0. + * @param pivotY (Optional) Y-coordinate of the pivot point. Default is 0. + * @zh 替换绘图的当前转换矩阵。 + * @param matrix 矩阵 + * @param pivotX (可选)水平方向轴心点坐标。默认为0。 + * @param pivotY (可选)垂直方向轴心点坐标。默认为0。 + */ + transform(matrix: Matrix, pivotX?: number, pivotY?: number): TransformCmd; + /** + * @en Rotate the current drawing. (It's recommended to use transform for better performance) + * @param angle The rotation angle in radians + * @param pivotX (Optional) X-coordinate of the pivot point. Default is 0. + * @param pivotY (Optional) Y-coordinate of the pivot point. Default is 0. + * @zh 旋转当前绘图。(推荐使用transform,性能更高) + * @param angle 旋转角度,以弧度计 + * @param pivotX (可选)水平方向轴心点坐标。默认为0。 + * @param pivotY (可选)垂直方向轴心点坐标。默认为0。 + */ + rotate(angle: number, pivotX?: number, pivotY?: number): RotateCmd; + /** + * @en Scale the current drawing to a larger or smaller size. (It's recommended to use transform for better performance) + * @param scaleX Horizontal scaling value + * @param scaleY Vertical scaling value + * @param pivotX (Optional) X-coordinate of the pivot point. Default is 0. + * @param pivotY (Optional) Y-coordinate of the pivot point. Default is 0. + * @zh 缩放当前绘图至更大或更小。(推荐使用transform,性能更高) + * @param scaleX 水平方向缩放值 + * @param scaleY 垂直方向缩放值 + * @param pivotX (可选)水平方向轴心点坐标。默认为0。 + * @param pivotY (可选)垂直方向轴心点坐标。默认为0。 + */ + scale(scaleX: number, scaleY: number, pivotX?: number, pivotY?: number): ScaleCmd; + /** + * @en Remap the (0,0) position on the canvas. + * @param tx The value to add to the horizontal coordinate (x) + * @param ty The value to add to the vertical coordinate (y) + * @zh 重新映射画布上的 (0,0) 位置。 + * @param tx 添加到水平坐标(x)上的值 + * @param ty 添加到垂直坐标(y)上的值 + */ + translate(tx: number, ty: number): TranslateCmd; + /** + * @en Save the current state of the environment. + * @zh 保存当前环境的状态。 + */ + save(): SaveCmd; + /** + * @en Return the previously saved path state and properties. + * @zh 返回之前保存过的路径状态和属性。 + */ + restore(): RestoreCmd; + /** + * @en Replace text color. + * @param color The new color + * @zh 替换文本颜色。 + * @param color 新的颜色 + */ + replaceTextColor(color: string): void; + /** + * @en Load and display an image. + * @param url The URL of the image + * @param x (Optional) The x-coordinate where the image will be displayed. Default is 0. + * @param y (Optional) The y-coordinate where the image will be displayed. Default is 0. + * @param width (Optional) The width to display the image. Set to 0 to use the default image width. Default is null. + * @param height (Optional) The height to display the image. Set to 0 to use the default image height. Default is null. + * @param complete (Optional) The callback function to be called when the image is loaded + * @zh 加载并显示一个图片。 + * @param url 图片地址 + * @param x (可选)显示图片的x位置。默认为0。 + * @param y (可选)显示图片的y位置。默认为0。 + * @param width (可选)显示图片的宽度,设置为0表示使用图片默认宽度。默认为null。 + * @param height (可选)显示图片的高度,设置为0表示使用图片默认高度。默认为null。 + * @param complete (可选)加载完成回调 + */ + loadImage(url: string, x?: number, y?: number, width?: number, height?: number, complete?: Function | null): void; + /** + * @en Draw a line. + * @param fromX X-axis starting position + * @param fromY Y-axis starting position + * @param toX X-axis ending position + * @param toY Y-axis ending position + * @param lineColor Color of the line + * @param lineWidth (Optional) Width of the line. Default is 1. + * @zh 绘制一条线。 + * @param fromX X轴开始位置 + * @param fromY Y轴开始位置 + * @param toX X轴结束位置 + * @param toY Y轴结束位置 + * @param lineColor 线条颜色 + * @param lineWidth (可选)线条宽度。默认为1。 + */ + drawLine(fromX: number, fromY: number, toX: number, toY: number, lineColor: string, lineWidth?: number): DrawLineCmd; + /** + * @en Draw a series of line segments. + * @param x X-axis position to start drawing + * @param y Y-axis position to start drawing + * @param points Collection of points for line segments. Format: [x1,y1,x2,y2,x3,y3...] + * @param lineColor Color of the line segments, or gradient object for filling the drawing + * @param lineWidth (Optional) Width of the line segments. Default is 1. + * @zh 绘制一系列线段。 + * @param x 开始绘制的X轴位置 + * @param y 开始绘制的Y轴位置 + * @param points 线段的点集合。格式:[x1,y1,x2,y2,x3,y3...] + * @param lineColor 线段颜色,或者填充绘图的渐变对象 + * @param lineWidth (可选)线段宽度。默认为1。 + */ + drawLines(x: number, y: number, points: any[], lineColor: any, lineWidth?: number): DrawLinesCmd | null; + /** + * @en Draw a series of curves. + * @param x X-axis position to start drawing + * @param y Y-axis position to start drawing + * @param points Collection of points for curves. Format: [controlX, controlY, anchorX, anchorY...] + * @param lineColor Color of the curves, or gradient object for filling the drawing + * @param lineWidth (Optional) Width of the curves. Default is 1. + * @zh 绘制一系列曲线。 + * @param x 开始绘制的X轴位置 + * @param y 开始绘制的Y轴位置 + * @param points 曲线的点集合,格式:[controlX, controlY, anchorX, anchorY...] + * @param lineColor 曲线颜色,或者填充绘图的渐变对象 + * @param lineWidth (可选)曲线宽度。默认为1。 + */ + drawCurves(x: number, y: number, points: any[], lineColor: any, lineWidth?: number): DrawCurvesCmd; + /** + * @en Draw a rectangle. + * @param x X-axis position to start drawing + * @param y Y-axis position to start drawing + * @param width Width of the rectangle + * @param height Height of the rectangle + * @param fillColor Fill color, or gradient object for filling the drawing + * @param lineColor (Optional) Border color, or gradient object for filling the drawing. Default is null. + * @param lineWidth (Optional) Border width. Default is 1. + * @param percent Whether the position and size are percentage values + * @returns DrawRectCmd object + * @zh 绘制矩形。 + * @param x 开始绘制的X轴位置 + * @param y 开始绘制的Y轴位置 + * @param width 矩形宽度 + * @param height 矩形高度 + * @param fillColor 填充颜色,或者填充绘图的渐变对象 + * @param lineColor (可选)边框颜色,或者填充绘图的渐变对象。默认为null。 + * @param lineWidth (可选)边框宽度。默认为1。 + * @param percent 位置和大小是否是百分比值 + * @returns DrawRectCmd对象 + */ + drawRect(x: number, y: number, width: number, height: number, fillColor: any, lineColor?: any, lineWidth?: number, percent?: boolean): DrawRectCmd; + /** + * @en Draw a rounded rectangle. + * @param x X-axis position to start drawing + * @param y Y-axis position to start drawing + * @param width Width of the rounded rectangle + * @param height Height of the rounded rectangle + * @param lt Left-top corner radius + * @param rt Right-top corner radius + * @param lb Left-bottom corner radius + * @param rb Right-bottom corner radius + * @param fillColor Fill color, or gradient object for filling the drawing + * @param lineColor (Optional) Border color, or gradient object for filling the drawing. Default is null. + * @param lineWidth (Optional) Border width. Default is 1. + * @param percent (Optional) Whether the position and size are percentage values + * @zh 绘制圆角矩形。 + * @param x 开始绘制的X轴位置 + * @param y 开始绘制的Y轴位置 + * @param width 圆角矩形宽度 + * @param height 圆角矩形高度 + * @param lt 左上圆角 + * @param rt 右上圆角 + * @param lb 左下圆角 + * @param rb 右下圆角 + * @param fillColor 填充颜色,或者填充绘图的渐变对象 + * @param lineColor (可选)边框颜色,或者填充绘图的渐变对象。默认为null。 + * @param lineWidth (可选)边框宽度。默认为1。 + * @param percent (可选)位置和大小是否是百分比值 + */ + drawRoundRect(x: number, y: number, width: number, height: number, lt: number, rt: number, lb: number, rb: number, fillColor: any, lineColor?: any, lineWidth?: number, percent?: boolean): any; + /** + * @en Draw a circle. + * @param x X-axis position of the circle center + * @param y Y-axis position of the circle center + * @param radius Radius of the circle + * @param fillColor Fill color, or gradient object for filling the drawing + * @param lineColor (Optional) Border color, or gradient object for filling the drawing. Default is null. + * @param lineWidth (Optional) Border width. Default is 1. + * @zh 绘制圆形。 + * @param x 圆点X轴位置 + * @param y 圆点Y轴位置 + * @param radius 半径 + * @param fillColor 填充颜色,或者填充绘图的渐变对象 + * @param lineColor (可选)边框颜色,或者填充绘图的渐变对象。默认为null。 + * @param lineWidth (可选)边框宽度。默认为1。 + */ + drawCircle(x: number, y: number, radius: number, fillColor: any, lineColor?: any, lineWidth?: number): DrawCircleCmd; + /** + * @en Draw an ellipse. + * @param x X-axis position of the ellipse center + * @param y Y-axis position of the ellipse center + * @param width Horizontal radius + * @param height Vertical radius + * @param fillColor Fill color, or gradient object for filling the drawing + * @param lineColor (Optional) Border color, or gradient object for filling the drawing + * @param lineWidth (Optional) Border width + * @param percent (Optional) Whether the position and size are percentage values + * @zh 绘制椭圆形。 + * @param x 圆点X轴位置 + * @param y 圆点Y轴位置 + * @param width 横向半径 + * @param height 纵向半径 + * @param fillColor 填充颜色,或者填充绘图的渐变对象 + * @param lineColor (可选)边框颜色,或者填充绘图的渐变对象 + * @param lineWidth (可选)边框宽度 + * @param percent (可选)位置和大小是否是百分比值 + */ + drawEllipse(x: number, y: number, width: number, height: number, fillColor: any, lineColor: any, lineWidth: number, percent?: boolean): DrawEllipseCmd; + /** + * @en Draw a pie. + * @param x X-axis position to start drawing + * @param y Y-axis position to start drawing + * @param radius Radius of the pie + * @param startAngle Start angle + * @param endAngle End angle + * @param fillColor Fill color, or gradient object for filling the drawing + * @param lineColor (Optional) Border color, or gradient object for filling the drawing. Default is null. + * @param lineWidth (Optional) Border width. Default is 1. + * @zh 绘制扇形。 + * @param x 开始绘制的X轴位置 + * @param y 开始绘制的Y轴位置 + * @param radius 扇形半径 + * @param startAngle 开始角度 + * @param endAngle 结束角度 + * @param fillColor 填充颜色,或者填充绘图的渐变对象 + * @param lineColor (可选)边框颜色,或者填充绘图的渐变对象。默认为null。 + * @param lineWidth (可选)边框宽度。默认为1。 + */ + drawPie(x: number, y: number, radius: number, startAngle: number, endAngle: number, fillColor: any, lineColor?: any, lineWidth?: number): DrawPieCmd; + /** + * @en Draw a polygon. + * @param x X-axis position to start drawing + * @param y Y-axis position to start drawing + * @param points Collection of points for the polygon + * @param fillColor Fill color, or gradient object for filling the drawing + * @param lineColor (Optional) Border color, or gradient object for filling the drawing. Default is null. + * @param lineWidth (Optional) Border width. Default is 1. + * @zh 绘制多边形。 + * @param x 开始绘制的X轴位置 + * @param y 开始绘制的Y轴位置 + * @param points 多边形的点集合 + * @param fillColor 填充颜色,或者填充绘图的渐变对象 + * @param lineColor (可选)边框颜色,或者填充绘图的渐变对象。默认为null。 + * @param lineWidth (可选)边框宽度。默认为1。 + */ + drawPoly(x: number, y: number, points: any[], fillColor: any, lineColor?: any, lineWidth?: number): DrawPolyCmd; + /** + * @en Draw a path. + * @param x X-axis position to start drawing + * @param y Y-axis position to start drawing + * @param paths Collection of paths. Paths support the following format: [["moveTo",x,y],["lineTo",x,y],["arcTo",x1,y1,x2,y2,r],["closePath"]] + * @param brush (Optional) Brush definition, supports the following settings: {fillStyle:"#FF0000"} + * @param pen (Optional) Pen definition, supports the following settings: {strokeStyle,lineWidth,lineJoin:"bevel|round|miter",lineCap:"butt|round|square",miterLimit} + * @zh 绘制路径。 + * @param x 开始绘制的X轴位置 + * @param y 开始绘制的Y轴位置 + * @param paths 路径集合,路径支持以下格式:[["moveTo",x,y],["lineTo",x,y],["arcTo",x1,y1,x2,y2,r],["closePath"]] + * @param brush (可选)刷子定义,支持以下设置:{fillStyle:"#FF0000"} + * @param pen (可选)画笔定义,支持以下设置:{strokeStyle,lineWidth,lineJoin:"bevel|round|miter",lineCap:"butt|round|square",miterLimit} + */ + drawPath(x: number, y: number, paths: any[], brush?: any, pen?: any): DrawPathCmd; + /** + * @en Draw an image with nine-grid + * @param texture The texture to draw + * @param x (Optional) X-axis position. Default is 0. + * @param y (Optional) Y-axis position. Default is 0. + * @param width (Optional) Width of the image. Default is 0. + * @param height (Optional) Height of the image. Default is 0. + * @param sizeGrid Nine-grid information + * @param color (Optional) Color to tint the image + * @zh 绘制带九宫格的图片 + * @param texture 要绘制的纹理 + * @param x (可选)X轴位置。默认为0。 + * @param y (可选)Y轴位置。默认为0。 + * @param width (可选)图片宽度。默认为0。 + * @param height (可选)图片高度。默认为0。 + * @param sizeGrid 九宫格信息 + * @param color (可选)图片的着色颜色 + */ + draw9Grid(texture: Texture, x: number, y: number, width: number, height: number, sizeGrid: any[], color?: string): void; + } + /** + * @ignore + * @en Graphic bounds data class + * @zh 图形边界数据类 + */ + class GraphicsBounds { + private _temp; + private _bounds; + private _rstBoundPoints; + private _cacheBounds; + /** + * @en Destroy + * @zh 销毁 + */ + destroy(): void; + /** + * @en Create a new GraphicsBounds instance + * @zh 创建一个新的GraphicsBounds实例 + */ + static create(): GraphicsBounds; + /** + * @en Reset data + * @zh 重置数据 + */ + reset(): void; + /** + * @en Get the position and size information matrix (CPU intensive, frequent use may cause lag, use sparingly). + * @param realSize (Optional) Use the real size of the image. Default is false. + * @returns A Rectangle object composed of position and size. + * @zh 获取位置及宽高信息矩阵(比较耗CPU,频繁使用会造成卡顿,尽量少用)。 + * @param realSize (可选)使用图片的真实大小,默认为false。 + * @returns 位置与宽高组成的一个Rectangle对象。 + */ + getBounds(realSize?: boolean): Rectangle; + /** + * @en Get the list of boundary points. + * @param realSize (Optional) Use the real size of the image. Default is false. + * @returns An array of boundary points. + * @zh 获取边界点列表。 + * @param realSize (可选)使用图片的真实大小,默认为false。 + * @returns 边界点的数组。 + */ + getBoundPoints(realSize?: boolean): any[]; + private _getCmdPoints; + private _switchMatrix; + } + /** + * @en The Input class is used to create display objects to display and input text. + * The Input class encapsulates the native text input box. Due to differences between browsers, there may be slight deviations between the position of the default text of this object and the position of the text when the user clicks to input. + * - Event.INPUT: Dispatched when one or more text characters are input by the user. + * - Event.CHANGE: Dispatched after the text has changed. + * - Event.ENTER: Dispatched when the user presses the Enter key in the input field. + * - Event.FOCUS: Dispatched when the display object receives focus. + * - Event.BLUR: Dispatched when the display object loses focus. + * @zh Input 类用于创建显示对象以显示和输入文本。 + * Input 类封装了原生的文本输入框,由于不同浏览器的差异,会导致此对象的默认文本的位置与用户点击输入时的文本的位置有少许的偏差。 + * - Event.INPUT: 当用户输入一个或多个文本字符时后调度。 + * - Event.CHANGE: 文本发生变化后调度。 + * - Event.ENTER: 用户在输入框内敲回车键后,将会调度 enter 事件。 + * - Event.FOCUS: 显示对象获得焦点后调度。 + * - Event.BLUR: 显示对象失去焦点后调度。 + */ + class Input extends Text { + /** + * @en Regular text field. + * @zh 常规文本域。 + */ + static TYPE_TEXT: string; + /** + * @en Password type for password input fields. + * @zh password 类型用于密码域输入。 + */ + static TYPE_PASSWORD: string; + /** + * @en Email type for input fields that should contain an e-mail address. + * @zh email 类型用于应该包含 e-mail 地址的输入域。 + */ + static TYPE_EMAIL: string; + /** + * @en URL type for input fields that should contain a URL address. + * @zh url 类型用于应该包含 URL 地址的输入域。 + */ + static TYPE_URL: string; + /** + * @en Number type for input fields that should contain a numeric value. + * @zh number 类型用于应该包含数值的输入域。 + */ + static TYPE_NUMBER: string; + /** + * @en Range type for input fields that should contain a numeric value within a certain range. + * The range type is displayed as a slider. + * You can also set limitations on the accepted numbers. + * @zh range 类型用于应该包含一定范围内数字值的输入域。 + * range 类型显示为滑动条。 + * 您还能够设定对所接受的数字的限定。 + */ + static TYPE_RANGE: string; + /** + * @en Select day, month, and year. + * @zh 选取日、月、年。 + */ + static TYPE_DATE: string; + /** + * @en Select month and year. + * @zh month - 选取月、年。 + */ + static TYPE_MONTH: string; + /** + * @en Select week and year. + * @zh week - 选取周和年。 + */ + static TYPE_WEEK: string; + /** + * @en Select time (hours and minutes). + * @zh time - 选取时间(小时和分钟)。 + */ + static TYPE_TIME: string; + /** + * @en Select time, day, month, year (UTC time). + * @zh datetime - 选取时间、日、月、年(UTC 时间)。 + */ + static TYPE_DATE_TIME: string; + /** + * @en Select time, day, month, year (local time). + * @zh datetime-local - 选取时间、日、月、年(本地时间)。 + */ + static TYPE_DATE_TIME_LOCAL: string; + /** + * @en Search type for search fields, such as site search or Google search. + * The search field is displayed as a regular text field. + * @zh search 类型用于搜索域,比如站点搜索或 Google 搜索。 + * search 域显示为常规的文本域。 + */ + static TYPE_SEARCH: string; + protected static input: HTMLInputElement; + protected static area: HTMLTextAreaElement; + protected static inputElement: HTMLInputElement | HTMLTextAreaElement; + protected static inputContainer: HTMLDivElement; + protected static confirmButton: any; + protected static promptStyleDOM: any; + protected _focus: boolean; + protected _multiline: boolean; + protected _editable: boolean; + protected _restrict: string; + protected _restrictPattern: any; + protected _maxChars: number; + private _type; + /** + * @en Indicates whether the application is running in an iframe on iOS. + * @zh 指示应用程序是否在iOS的iframe中运行。 + */ + static IOS_IFRAME: boolean; + /** + * @en Indicates whether the application uses the new input method. + * @zh 指示应用程序是否使用新的输入方法。 + */ + static isAppUseNewInput: boolean; + constructor(); + /** + * @en Pop up the input method on mobile platforms after clicking the event. + * @zh 移动平台单击事件触发后弹出输入法。 + */ + private static _popupInputMethod; + private static _createInputElement; + private static _initInput; + private static _processInputting; + private static _stopEvent; + /** + * @en Set the cursor position and select characters. + * @param startIndex The starting position of the cursor. + * @param endIndex The ending position of the cursor. + * @zh 设置光标位置和选取字符。 + * @param startIndex 光标起始位置。 + * @param endIndex 光标结束位置。 + */ + setSelection(startIndex: number, endIndex: number): void; + /** + * @en Whether it's a multi-line input box. + * @zh 是否是多行输入框。 + */ + get multiline(): boolean; + set multiline(value: boolean); + /** + * @en Reference instance to input box + * @zh 对输入框的引用实例。 + */ + get nativeInput(): HTMLInputElement | HTMLTextAreaElement; + private _onUnDisplay; + private _onMouseDown; + /** + * @en Sync the position of the input box when the Input instance changes during input. + * @zh 在输入期间,如果 Input 实例的位置改变,调用_syncInputTransform同步输入框的位置。 + */ + private _syncInputTransform; + /** + * @en Selects all the text in the current instance. + * @zh 选中当前实例的所有文本。 + */ + select(): void; + /** + * @en Whether the focus is on this instance. + * Note: On mobile platforms, the keyboard may not immediately pop up when calling the focus interface. + * On mobile platforms, focus is usually triggered by clicking on the canvas. + * @zh 焦点是否在此实例上。 + * 注意:在移动平台上,调用 focus 接口可能无法立即弹出键盘。 + * 移动平台上通常是点击画布才会触发焦点。 + */ + get focus(): boolean; + set focus(value: boolean); + private _setInputMethod; + private _focusIn; + /** + * @en Set the prompt color of DOM input box. + * @zh 设置DOM输入框提示符颜色。 + */ + private _setPromptColor; + private _focusOut; + private _onKeyDown; + /** + * @en Specifically for mini-games (resolves the issue of content inconsistency between keyboard input box and game input box). + * @param value The text value to be synchronized. + * @zh 小游戏专用(解决键盘输入框内容和游戏输入框内容不同步的问题)。 + * @param value 需要同步的文本值。 + */ + miniGameTxt(value: string): void; + /** + * @en The text content of the input field. + * @zh 输入框的文本内容。 + */ + get text(): string; + set text(value: string); + /** + * @en Set the color of the input text. + * @zh 设置输入文本的颜色。 + */ + set_color(value: string): void; + /** + * @en The background color of the input text. + * @zh 输入文本的背景颜色。 + */ + get bgColor(): string; + set bgColor(value: string); + /** + * @en The restriction on input characters. + * @zh 对输入字符的限制。 + */ + get restrict(): string; + set restrict(value: string); + /** + * @en Whether the input text is editable. + * @zh 输入框文本是否可编辑。 + */ + get editable(): boolean; + set editable(value: boolean); + /** + * @en The maximum number of characters allowed in the input field. Default is 10000. + * When setting the character limit, values less than or equal to 0 will set the limit to 10000. + * @zh 输入框允许的最大字符数量,默认为10000。 + * 设置字符数量限制时,小于等于0的值将会限制字符数量为10000。 + */ + get maxChars(): number; + set maxChars(value: number); + /** + * @en The prompt text for the input field. + * @zh 输入框的提示文本。 + */ + get prompt(): string; + set prompt(value: string); + /** + * @en Enter the prompt color. + * @zh 输入提示文本的颜色。 + */ + get promptColor(): string; + set promptColor(value: string); + /** + * @en The input field type, which should be one of the Input static constants. + * Available types include: + * - TYPE_TEXT + * - TYPE_PASSWORD + * - TYPE_EMAIL + * - TYPE_URL + * - TYPE_NUMBER + * - TYPE_RANGE + * - TYPE_DATE + * - TYPE_MONTH + * - TYPE_WEEK + * - TYPE_TIME + * - TYPE_DATE_TIME + * - TYPE_DATE_TIME_LOCAL + * For platform compatibility, please refer to: http://www.w3school.com.cn/html5/html_5_form_input_types.asp + * @zh 输入框类型,应为 Input 静态常量之一。 + * 常用类型包括: + * - TYPE_TEXT + * - TYPE_PASSWORD + * - TYPE_EMAIL + * - TYPE_URL + * - TYPE_NUMBER + * - TYPE_RANGE + * - TYPE_DATE + * - TYPE_MONTH + * - TYPE_WEEK + * - TYPE_TIME + * - TYPE_DATE_TIME + * - TYPE_DATE_TIME_LOCAL + * @zh 平台兼容性请参考:http://www.w3school.com.cn/html5/html_5_form_input_types.asp + */ + get type(): string; + set type(value: string); + } + /** + * @en The `Node` class is the base class for all objects that can be placed in the display list. + * The display list manages all objects displayed in the runtime of Laya. + * Use the Node class to arrange the display list. A Node object can have child display objects. + * @zh `Node` 类是可放在显示列表中的所有对象的基类。 + * 该显示列表管理 LayaAir 运行时中显示的所有对象。使用 Node 类排列显示列表中的显示对象。Node 对象可以有子显示对象。 + */ + class Node extends EventDispatcher { + private _bits; + private _hideFlags; + /** + * @ignore + * @en Extra data of the node. + * @zh 节点的额外数据。IDE内部使用。 + */ + _extra: INodeExtra; + /** + * @en Node name. + * @zh 节点名称。 + */ + name: string; + /** + * @en Node tag. + * @zh 节点标签。 + */ + tag: string; + /** + * @en The URL of the resource. + * @zh 资源的URL。 + */ + get url(): string; + set url(path: string); + /** + * @en Hide flags. + * @zh 隐藏标志。 + */ + get hideFlags(): number; + set hideFlags(value: number); + /** + * @en Whether it is a 3D node, i.e., Scene3D, Sprite3D and their derived classes. + * @zh 是否是3D节点,即Scene3D、Sprite3D及其衍生类。 + */ + get is3D(): boolean; + /** + * @en Whether it has been destroyed. The object cannot be used after being destroyed. + * @zh 是否已经销毁。对象销毁后不能再使用。 + */ + get destroyed(): boolean; + /** @ignore */ + constructor(); + /** + * @en Set a specific bit of the node. + * @param type The bit type to set. + * @param value The value to set, true or false. + * @zh 设置节点的特定位。 + * @param type 要设置的位类型。 + * @param value 要设置的值,true或false。 + */ + _setBit(type: number, value: boolean): void; + /** + * @en Get a specific bit of the node. + * @param type The bit type to get. + * @returns The bit value, true or false. + * @zh 获取节点的特定位。 + * @param type 要获取的位类型。 + * @returns 位的值,true或false。 + */ + _getBit(type: number): boolean; + /** + * @en Update the display status of the node in the stage. + * This method checks the node's hierarchy to determine if it or any of its parents are displayed in the stage, and updates the DISPLAYED_INSTAGE flag accordingly. + * @zh 更新节点在舞台中的显示状态。 + * 此方法检查节点的层次结构,以确定它或其任何父节点是否显示在舞台中,并相应地更新 DISPLAYED_INSTAGE 标志。 + */ + private _updateDisplayedInstage; + /** + * @en Start listening to a specific event type. + * This method sets the DISPLAY flag if the event type is DISPLAY or UNDISPLAY and the node is not already marked as displayed. + * @param type The event type to listen to. + * @zh 开始监听特定事件类型。 + * 如果事件类型是 DISPLAY 或 UNDISPLAY 且节点尚未标记为显示,则此方法设置 DISPLAY 标志。 + * @param type 要监听的事件类型。 + */ + protected onStartListeningToType(type: string): void; + /** + * @en Bubble an event up the parent chain. + * @param type The event type. + * @param data The event data. If not provided, a new Event object will be created. + * @zh 事件冒泡到父节点链。 + * @param type 事件类型。 + * @param data 事件数据。如果未提供,将创建一个新的Event对象。 + */ + bubbleEvent(type: string, data?: any): void; + /** + * @en Check whether the node has a specific hide flag. + * @param flag The hide flag to check. + * @returns Whether the node has the specified hide flag. + * @zh 检查节点是否具有特定的隐藏标志。 + * @param flag 要检查的隐藏标志。 + * @returns 节点是否具有指定的隐藏标志。 + */ + hasHideFlag(flag: number): boolean; + /** + * @en Destroy this node. When a node is destroyed, it will be removed from its parent node and the references will be cleared, waiting for the garbage collector to recycle it. + * When destroying a node, its own event listeners, timer listeners, child objects will be removed, and it will be removed from its parent node. + * @param destroyChild Whether to destroy child nodes as well. If true, all child nodes will be destroyed recursively; otherwise, they will only be removed from the parent. + * @zh 销毁此节点。destroy对象默认会把自己从父节点移除,并且清理自身引用关系,等待js自动垃圾回收机制回收。destroy后不能再使用。 + * destroy时会移除自身的事情监听,自身的timer监听,移除子对象及从父节点移除自己。 + * @param destroyChild 是否同时销毁子节点,若值为true,则销毁子节点,否则不销毁子节点。 + */ + destroy(destroyChild?: boolean): void; + /** + * @en The callback function when the node is destroyed. This is a virtual method. You can override it for custom logic when the node is about to be destroyed. + * @zh 节点被销毁时执行的回调函数。此方法为虚方法,使用时重写覆盖即可。 + */ + onDestroy(): void; + /** + * @en Destroy all child nodes, without destroying the node itself. + * @zh 销毁所有子节点,但不销毁节点本身。 + */ + destroyChildren(): void; + /** + * @en Add a child node. + * @param node The node to be added as a child. + * @returns The added child node. + * @zh 添加子节点。 + * @param node 节点对象。 + * @returns 返回添加的节点。 + */ + addChild(node: T): T; + /** + * @en Add multiple child nodes. + * @param args A variable number of child nodes to be added. + * @zh 批量增加子节点。 + * @param args 无数子节点。 + */ + addChildren(...args: any[]): void; + /** + * @en Insert a child node at a specific index. + * @param node The child node to be inserted. + * @param index The index at which the child node will be inserted. + * @returns The inserted child node. + * @zh 在指定的索引位置插入子节点。 + * @param node 节点对象。 + * @param index 索引位置。 + * @returns 返回添加的节点。 + */ + addChildAt(node: Node, index: number): Node; + /** + * @en Get the index of a child node. + * @param node The child node to query. + * @returns The index of the child node. + * @zh 获取子节点的索引位置。 + * @param node 子节点。 + * @returns 子节点所在的索引位置。 + */ + getChildIndex(node: Node): number; + /** + * @en Get a child node by its name. + * @param name The name of the child node. + * @returns The child node with the specified name, or null if not found. + * @zh 根据子节点的名字获取子节点对象。 + * @param name 子节点的名字。 + * @returns 节点对象。 + */ + getChildByName(name: string): Node; + /** + * @en Get a child node by its index. + * @param index The index of the child node. + * @returns The child node at the specified index, or null if the index is out of range. + * @zh 根据子节点的索引位置获取子节点对象。 + * @param index 索引位置。 + * @returns 指定索引处的子节点,如果索引超出范围,则为空。 + */ + getChildAt(index: number): Node; + /** + * @en Set the index of a child node. + * @param node The child node to set the index for. + * @param index The new index of the child node. + * @returns The child node itself. + * @zh 设置子节点的索引位置。 + * @param node 子节点。 + * @param index 新的索引。 + * @returns 返回子节点本身。 + */ + setChildIndex(node: Node, index: number): Node; + /** + * @en Callback when a child node changes. + * @param child The child node that has changed. + * @zh 子节点发生变化时的回调。 + * @param child 发生变化的子节点。 + */ + protected _childChanged(child?: Node): void; + /** + * @en Remove a child node. + * @param node The child node to be removed. + * @returns The removed node. + * @zh 删除子节点。 + * @param node 子节点。 + * @returns 被删除的节点。 + */ + removeChild(node: Node): Node; + /** + * @en Remove itself from its parent node. If it hasn't been added to any parent node, nothing happens. + * @returns The node itself. + * @zh 从父容器删除自己,如果已经被删除不会抛出异常。 + * @returns 当前节点。 + */ + removeSelf(): Node; + /** + * @en Remove a child node by its name. + * @param name The name of the child node. + * @returns The removed node. + * @zh 根据子节点名字删除对应的子节点对象,如果找不到不会抛出异常。 + * @param name 对象名字。 + * @returns 查找到的节点。 + */ + removeChildByName(name: string): Node; + /** + * @en Remove a child node by its index. + * @param index The index of the child node. + * @returns The removed node. + * @zh 根据子节点索引位置,删除对应的子节点对象。 + * @param index 节点索引位置。 + * @returns 被删除的节点。 + */ + removeChildAt(index: number): Node; + /** + * @en Remove all children from this node. + * @param beginIndex The begin index. + * @param endIndex The end index. + * @returns The node itself. + * @zh 删除指定索引区间的所有子对象。 + * @param beginIndex 开始索引。 + * @param endIndex 结束索引。 + * @returns 当前节点对象。 + */ + removeChildren(beginIndex?: number, endIndex?: number): Node; + /** + * @en Replace a child node. + * @param newNode The new node to replace the old one. + * @param oldNode The old node to be replaced. + * @returns The new node. + * @zh 替换子节点。 + * @param newNode 新节点。 + * @param oldNode 老节点。 + * @returns 返回新节点。 + */ + replaceChild(newNode: Node, oldNode: Node): Node; + /** + * @en The number of child nodes. + * @zh 子对象数量。 + */ + get numChildren(): number; + /** + * @en The parent node. + * @zh 父节点。 + */ + get parent(): Node; + /** + * @en Check if this node is an ancestor of the given node. + * @returns True if this node is an ancestor of the given node, false otherwise. + * @param node The node to check. + * @zh 检查本节点是否是某个节点的上层节点。 + * @param node 要检查的节点。 + * @returns 一个布尔值,表示本节点是否是某个节点的上层节点。 + */ + isAncestorOf(node: Node): boolean; + /** + * @en Set the parent node of the current node. + * @param value The new parent node. + * @zh 设置当前节点的父节点。 + * @param value 新的父节点。 + */ + protected _setParent(value: Node): void; + /** + * @en Indicates whether the node is displayed in the scene. + * @zh 表示是否在显示列表中显示。 + */ + get displayedInStage(): boolean; + /** + * @en Set the display state of a node's children. + * @param node The node whose children's display state needs to change. + * @param display The display state to set. + * @zh 设置指定节点对象的子对象是否可见(是否在渲染列表中)。 + * @param node 节点。 + * @param display 是否可见。 + */ + private _displayChild; + /** + * @en Checks whether the current node contains the specified node. + * @returns A Boolean value indicating whether the current node contains the specified node. + * @param node The specified node. + * @zh 当前容器是否包含指定的节点对象。 + * @param node 指定的节点对象。 + * @returns 一个布尔值,表示是否包含指定的节点对象。 + */ + contains(node: Node): boolean; + /** + * @en Repeatedly execute a callback function at a fixed interval. This is a wrapper of the `loop` method in the timer property of the node. + * @param delay The interval between executions, in milliseconds. + * @param caller The execution scope of the callback function (this). + * @param method The callback function. + * @param args The parameters passed to the callback function. + * @param coverBefore Whether to override the previous delayed execution. The default value is true. + * @param jumpFrame Whether the callback should be executed when the timer jumps frames. The default value is false. If set to true, the callback will be executed multiple times in a single frame if possible, for performance reasons. + * @zh 定时重复执行某函数。这是对节点 timer 属性的 `loop` 方法的封装。 + * @param delay 执行间隔时间,以毫秒为单位。 + * @param caller 回调函数的执行域(this)。 + * @param method 回调函数。 + * @param args 传递给回调函数的参数。 + * @param coverBefore 是否覆盖之前的延迟执行,默认为 true。 + * @param jumpFrame 时钟是否跳帧。基于时间的循环回调,单位时间间隔内,如能执行多次回调,出于性能考虑,引擎默认只执行一次,设置jumpFrame为true后,则回调会连续执行多次。默认为false。 + */ + timerLoop(delay: number, caller: any, method: Function, args?: any[], coverBefore?: boolean, jumpFrame?: boolean): void; + /** + * @en Executes a callback function once after a specified delay. + * @param delay The delay time, in milliseconds. + * @param caller The execution scope of the callback function (this). + * @param method The callback function. + * @param args The parameters passed to the callback function. + * @param coverBefore Whether to override the previous delayed execution. The default value is true. + * @zh 在指定延迟时间后执行一次回调函数。功能同Laya.timer.once()。 + * @param delay 延迟时间,以毫秒为单位。 + * @param caller 回调函数的执行域(this)。 + * @param method 回调函数。 + * @param args 传递给回调函数的参数。 + * @param coverBefore 是否覆盖之前的延迟执行,默认为 true。 + */ + timerOnce(delay: number, caller: any, method: Function, args?: any[], coverBefore?: boolean): void; + /** + * @en Repeatedly executes a callback function at a fixed interval based on frame rate. + * @param delay The interval between executions, in frames. + * @param caller The execution scope of the callback function (this). + * @param method The callback function. + * @param args The parameters passed to the callback function. + * @param coverBefore Whether to override the previous delayed execution. The default value is true. + * @zh 基于帧率,定时重复执行回调函数。功能同Laya.timer.frameLoop()。 + * @param delay 执行间隔时间,以帧为单位。 + * @param caller 回调函数的执行域(this)。 + * @param method 回调函数。 + * @param args 传递给回调函数的参数。 + * @param coverBefore 是否覆盖之前的延迟执行,默认为 true。 + */ + frameLoop(delay: number, caller: any, method: Function, args?: any[], coverBefore?: boolean): void; + /** + * @en Executes a callback function once after a specified delay based on frame rate. + * @param delay The delay time, in frames. + * @param caller The execution scope of the callback function (this). + * @param method The callback function. + * @param args The parameters passed to the callback function. + * @param coverBefore Whether to override the previous delayed execution. The default value is true. + * @zh 基于帧率,在指定延迟时间后执行一次回调函数。功能同Laya.timer.frameOnce()。 + * @param delay 延迟时间,以帧为单位。 + * @param caller 回调函数的执行域(this)。 + * @param method 回调函数。 + * @param args 传递给回调函数的参数。 + * @param coverBefore 是否覆盖之前的延迟执行,默认为 true。 + */ + frameOnce(delay: number, caller: any, method: Function, args?: any[], coverBefore?: boolean): void; + /** + * @en Clears a timer. + * @param caller The execution scope of the callback function (this). + * @param method The callback function. + * @zh 清除定时器。功能同Laya.timer.clear()。 + * @param caller 回调函数的执行域(this)。 + * @param method 回调函数。 + */ + clearTimer(caller: any, method: Function): void; + /** + * @en Delays the execution of a callback function until the next frame after the current execution block is finished. + * The callback function will only be executed once. It is generally called before the control is displayed on the screen to delay the calculation of data. + * @param method The callback function. + * @param args The parameters passed to the callback function. + * @zh 在当前执行块完成后,延迟执行回调函数到下一帧。 + * 回调函数只会被执行一次。一般在控件被显示在屏幕之前调用,用于延迟计算数据。 + * @param method 回调函数。 + * @param args 传递给回调函数的参数。 + */ + callLater(method: Function, args?: any[]): void; + /** + * @en If there are callback functions delayed by `callLater`, they will be executed immediately. + * @param method The name of the callback function to be executed, such as `functionName`. + * @zh 如果有通过 `callLater` 延迟执行的回调函数,将立即执行它们。 + * @param method 要执行的回调函数名称,例如 `functionName`。 + */ + runCallLater(method: Function): void; + /** + * @en The component list of this node. + * @zh 节点的组件列表。 + */ + protected _components: Component[]; + /**@private */ + private _activeChangeScripts; + /** + * @en Get the scene this node belongs to. + * @zh 获取该节点所属的场景。 + */ + get scene(): any; + /** + * @en Thether this node is active. + * @zh 该节点自身是否激活。 + */ + get active(): boolean; + set active(value: boolean); + /** + * @en Thether this node is active in the hierarchy. + * @zh 该节点在层级中是否激活。 + */ + get activeInHierarchy(): boolean; + /** + * @en Actions performed when the node becomes active. + * @zh 节点激活时执行的操作。 + */ + protected _onActive(): void; + /** + * @en Actions performed when the node becomes inactive. + * @zh 节点停用时执行的操作。 + */ + protected _onInActive(): void; + /** + * @en Actions performed when the node is added to the scene. + * @zh 节点被添加到场景时执行的操作。 + */ + protected _onActiveInScene(): void; + /** + * @en Actions performed when the node is removed from the scene. + * @zh 节点从场景中移除时执行的操作。 + */ + protected _onInActiveInScene(): void; + /** + * @en The callback function that is executed when the component is activated, at which point all nodes and components have been created. + * This is a virtual method that needs to be overridden in the subclass. + * @zh 组件被激活后执行,此时所有节点和组件均已创建完毕,此方法只执行一次。 + * 此方法为虚方法,使用时重写覆盖即可。 + */ + onAwake(): void; + /** + * @en The callback function that is executed when the component is enabled, such as when a node is added to the stage. + * This is a virtual method that needs to be overridden in the subclass. + * @zh 组件被启用后执行,比如节点被添加到舞台后。 + * 此方法为虚方法,使用时重写覆盖即可。 + */ + onEnable(): void; + /** + * @en The callback function that is executed when the component is disabled, such as when a node is removed from the stage. + * This is a virtual method that needs to be overridden in the subclass. + * @zh 组件被禁用时执行,比如从节点从舞台移除后。 + * 此方法为虚方法,使用时重写覆盖即可。 + */ + onDisable(): void; + /** + * @en Handle the addition of the node to its parent. + * This method is called when the node is added to a parent node, updating the active state and scene reference if applicable. + * @zh 处理节点被添加到父节点时的操作。 + * 当节点被添加到父节点时调用此方法,如果适用,更新激活状态和场景引用。 + */ + protected _onAdded(): void; + /** + * @en Handle the removal of the node from its parent. + * This method is called when the node is removed from its parent node, updating the active state and scene reference if applicable. + * @zh 处理节点从父节点移除时的操作。 + * 当节点从父节点移除时调用此方法,如果适用,更新激活状态和场景引用。 + */ + protected _onRemoved(): void; + /** + * @en Destroy all components on the node. + * @zh 销毁节点上的所有组件。 + */ + private destroyAllComponent; + /** + * @en Handle changes to the node's components. + * This method is called when a component is added, removed, or all components are destroyed. + * @param comp The component that was changed. + * @param action The action performed: 0 for added, 1 for removed, 2 for all destroyed. + * @zh 处理节点组件的变化。 + * 当组件被添加、移除或所有组件被销毁时调用此方法。 + * @param comp 发生变化的组件。 + * @param action 执行的操作:0 表示添加,1 表示移除,2 表示全部销毁。 + */ + protected _componentsChanged?(comp: Component, action: 0 | 1 | 2): void; + /** + * @en Add a component instance to the node. + * @param component The component instance. + * @returns The added component instance. + * @zh 添加组件实例到节点。 + * @param component 组件实例。 + * @returns 添加的组件实例。 + */ + addComponentInstance(component: Component): Component; + /** + * @en Add a component to the node. + * @param componentType The type of the component. + * @returns The added component instance. + * @zh 添加组件到节点。 + * @param componentType 组件类型。 + * @returns 添加的组件实例。 + */ + addComponent(componentType: new () => T): T; + /** + * @en Get a component instance by type. Returns null if not found. + * @param componentType The type of the component. + * @returns The component instance. + * @zh 根据类型获取组件实例。如果没有找到则返回null。 + * @param componentType 组件类型。 + * @returns 组件实例。 + */ + getComponent(componentType: new () => T): T; + /** + * @en Get all component instances on the node. + * @returns An array of component instances. + * @zh 获取节点上的所有组件实例。 + * @returns 组件实例数组。 + */ + get components(): ReadonlyArray; + /** + * @en Get all component instances by type. Returns an empty array if none are found. + * @param componentType The type of the component. + * @returns An array of component instances. + * @zh 根据类型获取所有组件实例。如果没有找到则返回空数组。 + * @param componentType 组件类型。 + * @returns 组件实例数组。 + */ + getComponents(componentType: typeof Component): Component[]; + /** + * @en Get the timer associated with the node. + * @returns The timer. + * @zh 获取与节点关联的计时器。 + * @returns 计时器。 + */ + get timer(): Timer; + /** + * @en Called after deserialization. + * @zh 反序列化后调用。 + */ + onAfterDeserialize(): void; + } + interface INodeExtra { + } + /** + * @en Scene class, responsible for scene creation, loading, destruction and other functions. + * After the scene is removed from the node, it will not be automatically recycled by the garbage mechanism. If you want to recycle it, please call the destroy interface. + * You can view the list of scenes that have not been destroyed through the unDestroyedScenes property. + * @zh 场景类,负责场景创建、加载、销毁等功能。 + * 场景被从节点移除后,并不会被自动垃圾机制回收。如果想回收,请调用 destroy 接口。 + * 可以通过 unDestroyedScenes 属性查看还未被销毁的场景列表。 + */ + class Scene extends Sprite { + /** + * @en List of scenes that have been created but not yet destroyed. This property is read-only, please do not modify it directly. + * @zh 创建后还未被销毁的场景列表。此属性只读,请不要直接修改。用于方便查看未销毁的场景列表,便于内存管理。 + */ + static readonly unDestroyedScenes: Set; + /** + * @en Get the root node + * @zh 获取根节点 + * */ + private static _root; + private static _loadPage; + /** + * @en Whether to automatically destroy (destroy nodes and used resources) after the scene is closed, default is false + * @zh 场景被关闭后,是否自动销毁(销毁节点和使用到的资源),默认为 false + */ + autoDestroyAtClosed: boolean; + /** + * @en relative layout component + * @zh 相对布局组件 + */ + protected _widget: Widget; + /** + * @en The scene clock + * @zh 场景时钟 + */ + private _timer; + private _viewCreated; + private _shaderData; + /** @ignore */ + constructor(createChildren?: boolean); + /** + * @ignore + * @en Compatible with legacy projects + * @zh 兼容老项目 + */ + protected createChildren(): void; + /** + * @en Compatible loading mode, load mode setting uimap + * @param url The URL of the uimap JSON file. + * @zh 兼容加载模式,加载模式设置uimap + * @param url url uimapJSON 文件的 URL。 + */ + static setUIMap(url: string): void; + /** + * @ignore + * @en Load scene view. Used for loading mode. Compatible with old projects. + * @param path The scene address. + * @zh 装载场景视图。用于加载模式。兼容老项目。 + * @param path 场景地址。 + */ + loadScene(path: string): void; + /** + * @ignore + * @en Create view using view data. Compatible with old projects. + * @param view The view data information. + * @zh 通过视图数据创建视图。兼容老项目。 + * @param view 视图数据信息。 + */ + createView(view: any): void; + /** + * @en Get the node instance based on the node ID in the IDE. + * @param id The node ID. + * @zh 根据IDE内的节点id,获得节点实例。 + * @param id 节点ID。 + */ + getNodeByID(id: number): any; + /** + * @en Open the scene. Note: If the closed scene has not set autoDestroyAtRemoved=true, resources may not be reclaimed and need to be manually reclaimed. + * @param closeOther Whether to close other scenes, default is true (optional). + * @param param Parameters for opening the page, will be passed to the onOpened method (optional). + * @zh 打开场景。注意:被关闭的场景,如果没有设置autoDestroyAtRemoved=true,则资源可能不能被回收,需要自己手动回收。 + * @param closeOther 是否关闭其他场景,默认为true(可选)。 + * @param param 打开页面的参数,会传递给onOpened方法(可选)。 + */ + open(closeOther?: boolean, param?: any): void; + /** + * @en Called after the scene is opened (if there is a pop-up animation, it will be executed after the animation is completed). + * @param param Parameters. + * @zh 场景打开完成后调用此方法(如果有弹出动画,则在动画完成后执行)。 + * @param param 参数。 + */ + onOpened(param: any): void; + /** + * @en Close the scene. Note: If the closed scene has not set autoDestroyAtRemoved=true, resources may not be reclaimed and need to be manually reclaimed. + * @param type The reason for closing, which will be passed to the onClosed function. + * @zh 关闭场景。注意:被关闭的场景,如果没有设置autoDestroyAtRemoved=true,则资源可能不能被回收,需要自己手动回收。 + * @param type 关闭的原因,会传递给onClosed函数。 + */ + close(type?: string): void; + /** + * @en Called after the scene is closed (if there is a closing animation, it will be executed after the animation is completed). + * @param type If triggered by clicking the default close button, pass the name of the close button, otherwise null. + * @zh 关闭完成后调用此方法(如果有关闭动画,则在动画完成后执行)。 + * @param type 如果是点击默认关闭按钮触发,则传入关闭按钮的名字(name),否则为null。 + */ + onClosed(type?: string): void; + /** + * @en Destroy the scene. + * @param destroyChild Whether to delete child nodes. + * @zh 场景销毁。 + * @param destroyChild 是否删除子节点。 + */ + destroy(destroyChild?: boolean): void; + /** + * @en Scene clock + * @zh 场景时钟 + */ + get timer(): Timer; + set timer(value: Timer); + /** + * @en 3D scene instances included in the scene + * @zh 场景包含的3D场景实例 + */ + get scene3D(): any; + get sceneShaderData(): ShaderData; + /** + * @en The vertical distance (in pixels) between the top edge of the component and the top edge of its content area. + * @zh 从组件顶边到其内容区域顶边之间的垂直距离(以像素为单位)。 + */ + get top(): number; + set top(value: number); + /** + * @en The vertical distance (in pixels) between the bottom edge of the component and the bottom edge of its content area. + * @zh 从组件底边到其内容区域底边之间的垂直距离(以像素为单位)。 + */ + get bottom(): number; + set bottom(value: number); + /** + * @en The horizontal distance (in pixels) between the left edge of the component and the left edge of its content area. + * @zh 从组件左边到其内容区域左边之间的水平距离(以像素为单位)。 + */ + get left(): number; + set left(value: number); + /** + * @en The horizontal distance (in pixels) between the right edge of the component and the right edge of its content area. + * @zh 从组件右边到其内容区域右边之间的水平距离(以像素为单位)。 + */ + get right(): number; + set right(value: number); + /** + * @en The distance (in pixels) between the horizontal axis of this object and the horizontal center line of its parent container. + * @zh 在父容器中,此对象的水平方向中轴线与父容器的水平方向中心线的距离(以像素为单位)。 + */ + get centerX(): number; + set centerX(value: number); + /** + * @en The distance (in pixels) between the vertical axis of this object and the vertical center line of its parent container. + * @zh 在父容器中,此对象的垂直方向中轴线与父容器的垂直方向中心线的距离(以像素为单位)。 + */ + get centerY(): number; + set centerY(value: number); + protected _shouldRefreshLayout(): void; + protected _sizeChanged(): void; + /** + * @en Repositioning + * @zh 重新排版 + */ + freshLayout(): void; + /** + * @en Get the layout style of the object. Please do not directly modify this object + * @zh 获取对象的布局样式。请不要直接修改此对象 + */ + private _getWidget; + /** + * @en Get the root container of the scene. + * @zh 获取场景根容器 + */ + static get root(): Sprite; + /** + * @deprecated 请使用Loader.load(url:string, type: ILaya.Loader.HIERARCHY) + * @en Load the scene and resources used by the scene. + * @param url The scene address. + * @param complete Callback function when loading is complete, returns the scene instance (optional). + * @param progress Callback function for loading progress (optional). + * @zh 加载场景及场景使用到的资源。 + * @param url 场景地址。 + * @param complete 加载完成回调,返回场景实例(可选)。 + * @param progress 加载进度回调(可选)。 + */ + static load(url: string, complete?: Handler, progress?: Handler): Promise; + /** + * @en Load and open the scene. + * @param url The scene address. + * @param closeOther Whether to close other scenes, default is true (optional). Note: If the closed scene has not set autoDestroyAtRemoved=true, resources may not be reclaimed and need to be manually reclaimed. + * @param param Parameters for opening the page, will be passed to the onOpened method (optional). + * @param complete Callback function when opening is complete, returns the scene instance (optional). + * @param progress Callback function for loading progress (optional). + * @zh 加载并打开场景。 + * @param url 场景地址。 + * @param closeOther 是否关闭其他场景,默认为true(可选)。注意:被关闭的场景,如果没有设置autoDestroyAtRemoved=true,则资源可能不能被回收,需要自己手动回收。 + * @param param 打开页面的参数,会传递给onOpened方法(可选)。 + * @param complete 打开完成回调,返回场景实例(可选)。 + * @param progress 加载进度回调(可选)。 + */ + static open(url: string, closeOther?: boolean, param?: any, complete?: Handler, progress?: Handler): Promise; + private static _onSceneLoaded; + /** + * @en Close the scene (including dialog) based on the address. + * @param url The scene address. + * @param name If name is not empty, it must match to close the scene. + * @returns Returns whether the closure was successful. If the url is not found, it will not be successful. + * @zh 根据地址,关闭场景(包括对话框)。 + * @param url 场景地址。 + * @param name 如果name不为空,name必须相同才能关闭。 + * @returns 返回是否关闭成功,如果url找不到,则不成功。 + */ + static close(url: string, name?: string): boolean; + /** + * @en Close all scenes, not including dialogs. To close dialogs, please use Dialog.closeAll(). + * Note: If the closed scene has not set autoDestroyAtRemoved=true, resources may not be reclaimed and need to be manually reclaimed. + * @zh 关闭所有场景,不包括对话框。如果要关闭对话框,请使用Dialog.closeAll()。 + * 注意:被关闭的场景,如果没有设置autoDestroyAtRemoved=true,则资源可能不能被回收,需要自己手动回收。 + */ + static closeAll(): void; + /** + * @en Destroy the scene (including dialog) based on the address. + * @param url The scene address. + * @param name If name is not empty, it must match to destroy the scene. + * @returns Returns whether the destruction was successful. If the url is not found, it will not be successful. + * @zh 根据地址,销毁场景(包括对话框)。 + * @param url 场景地址。 + * @param name 如果name不为空,name必须相同才能销毁。 + * @returns 返回是否销毁成功,如果url找不到,则不成功。 + */ + static destroy(url: string, name?: string): boolean; + /** + * @en Destroy currently unused resources. This function will ignore resources with lock=true. + * @zh 销毁当前没有被使用的资源,该函数会忽略lock=true的资源。 + */ + static gc(): void; + /** + * @en Set the loading interface. The engine will delay opening the loading interface after calling the open method, and close the loading interface after the page is added to the stage. + * @param loadPage The loading page instance. + * @zh 设置loading界面,引擎会在调用open方法后,延迟打开loading界面,在页面添加到舞台之后,关闭loading界面。 + * @param loadPage load界面实例。 + */ + static setLoadingPage(loadPage: Sprite): void; + /** + * @en Display the loading interface. + * @param param Opening parameters. If it's a scene, it will be passed to the onOpened method. + * @param delay Delay opening time, default is 500 milliseconds. + * @zh 显示loading界面。 + * @param param 打开参数,如果是scene,则会传递给onOpened方法。 + * @param delay 延迟打开时间,默认500毫秒。 + */ + static showLoadingPage(param?: any, delay?: number): void; + private static _showLoading; + private static _hideLoading; + /** + * @en Hide the loading interface. + * @param delay Delay closing time, default is 500 milliseconds. + * @zh 隐藏loading界面。 + * @param delay 延迟关闭时间,默认500毫秒。 + */ + static hideLoadingPage(delay?: number): void; + } + /** + * @en Sprite is a basic display list node for displaying graphical content. By default, Sprite does not accept mouse events. Through the graphics API, images or vector graphics can be drawn, supporting operations like rotation, scaling, translation, and more. Sprite also functions as a container class, allowing the addition of multiple child nodes. + * @zh Sprite是基本的显示图形的显示列表节点。Sprite默认不接受鼠标事件。通过graphics可以绘制图片或者矢量图,支持旋转,缩放,位移等操作。Sprite同时也是容器类,可用来添加多个子节点。 + */ + class Sprite extends Node { + protected _tfChanged: boolean; + protected _repaint: number; + private _texture; + private _sizeFlag; + private _filterArr; + /** + @en For non-UI component display object nodes (container objects or display objects without image resources), specifies whether the mouse events penetrate this object's collision detection. `true` means the object is penetrable, `false` means it is not penetrable. + * When penetrable, the engine will no longer detect this object and will recursively check its child objects until it finds the target object or misses all objects. + * When not penetrable, the node's width and height define the mouse collision area (a non-penetrable rectangular area). If the rectangular collision area does not meet the requirements, you can use the drawing area of the hit area as the collision area. The hit area takes precedence over width and height of node as the non-penetrable mouse collision area. + * Note that for UI object nodes with a set skin property, once a skin texture resource is set, this property becomes ineffective, and the rectangular area drawn by the texture will always be non-penetrable unless it does not accept mouse events or a non-clickable area is set. + *@zh 用于非UI组件显示对象节点(容器对象或没有设置图像资源的显示对象),鼠标事件与此对象在碰撞检测时,是否穿透。ture为可穿透,false为不可穿透。 + * 可穿透时,引擎不再检测本对象,而会递归检测子对象,直到找到命中的目标对象或者未命中任何对象。 + * 不可穿透时,以节点宽高为鼠标碰撞区(矩形的不可穿透区域)。如果矩形碰撞区不能满足需求,可以将点击区域的绘制图形作为碰撞区,绘制区域优先于宽高作为不可穿透的鼠标碰撞区域。 + * 注意,可以设置skin属性的UI对象节点,当设置了skin纹理资源之后,该属性设置失效,纹理绘制的矩形区域内会始终处于不可穿透状态。除非不接受鼠标事件或设置不可点击区域。 + */ + mouseThrough: boolean; + /** + * @en Under the premise that this object is non-penetrable (mouseThrough is false), specify whether the mouse event capture detection prioritizes this object. When set to true, the object itself is prioritized for detection. When set to false, the child objects are prioritized. + * When set to prioritize the object itself, the object is detected first. If the object itself is not hit, the detection is directly interrupted, indicating that no target was hit. If the object itself is hit, further recursive detection is performed on its child objects until the final mouse hit target is found or all child nodes have been checked. + * When set to prioritize child objects, the child objects are recursively detected first. If a child object is hit, the detection is interrupted and the hit target is obtained. If all child nodes have been checked and no child object is hit, then the detection checks if the object itself is hit. + * In most cases, prioritizing the detection of child objects is advisable unless the developer does not care about the mouse event detection results of the current node's child nodes. For example, when child nodes are certainly within the width and height range of the parent node's container, there is no need for recursive detection layer by layer if the mouse click does not occur within the parent node's area. + * Using this property appropriately can reduce the nodes for mouse event detection and improve performance. + * @zh 在本对象为不可穿透(mouseThrough为false)的前提下,指定鼠标事件捕获检测是否优先检测本对象。为`true`时优先检测本对象,为`false`时优先检测子对象。 + * 优先检测本对象时,如果本对象没有被检测命中,会中断检测,表示没有命中目标;如果本对象被检测命中,则进一步递归检测其子对象,直到找到鼠标最终的命中目标或所有子节点都检测完毕。 + * 优先检测子对象时,先递归检测其子对象,如果子对象被检测命中,则中断检测,获得命中目标。如果所有子节点都检测完毕,仍未检测命中任何子对象,最后再检测本对象是否被命中; + * 大多数情况下需要优先检测子对象,除非开发者并不关心当前节点的子节点的鼠标事件检测结果,也就是以当前节点作为其子节点的鼠标事件检测依据。例如,子节点肯定在父节点的容器宽高范围内,当鼠标点击不发生在父节点范围内的区域时,就不必层层递归检测了。 + * 合理使用本属性,能减少鼠标事件检测的节点,提高性能。 + */ + hitTestPrior: boolean; + /** + * @en Whether to automatically calculate the width and height of the node. The default value is `false`, which does not automatically calculate and offers better performance. + * If you want to get the width and height based on the drawn content, you can set this property to `true`, or use the getBounds method to obtain them, which has some impact on performance. + * @zh 是否自动计算节点的宽高数据。默认值为 false,不自动计算,性能更佳。 + * 如果想根据绘制内容获取宽高,可以设置本属性为true,或者通过getBounds方法获取,对性能有一定影响。 + */ + autoSize: boolean; + /** + * @en Destroy the sprite. + * @param destroyChild Whether to destroy child nodes. Default is true. + * @zh 销毁精灵。 + * @param destroyChild 是否删除子节点。默认为 true。 + */ + destroy(destroyChild?: boolean): void; + /** @ignore */ + constructor(); + /** + * @en Get the scene the sprite belongs to. + * @zh 获取所属的场景。 + */ + get scene(): Scene; + /** + * @en Re-sort by zOrder. + * @zh 根据 zOrder 进行重新排序。 + */ + updateZOrder(): void; + /** + * @en Enable or disable custom rendering. Custom rendering must be enabled to use the customRender function. + * @param {boolean} b Whether to enable custom rendering. + * @zh 设置是否开启自定义渲染,只有开启自定义渲染,才能使用 customRender 函数渲染。 + * @param {boolean} b 是否开启自定义渲染。 + */ + set customRenderEnable(b: boolean); + /** + * @en Specifies whether the display object is cached as a static image. When cacheAs is set, changes in child objects will automatically update the cache. You can also manually call the reCache method to update the cache. + * It is recommended to cache "complex content" that does not change frequently as a static image to greatly improve rendering performance. cacheAs has three values: "none", "normal", and "bitmap". + * The default is "none," which does not perform any caching. + * When set to "normal," command caching is used. + * When set to "bitmap," renderTarget caching is used. + * Disadvantages of the renderTarget caching mode: it creates additional renderTarget objects, increasing memory overhead, has a maximum cache area limit of 2048, and can increase CPU overhead with constant redrawing. Advantages: it significantly reduces draw calls and provides the highest rendering performance. + * Disadvantages of the command caching mode: it only reduces node traversal and command organization and does not reduce the number of draw calls, resulting in moderate performance. Advantages: it has no additional memory overhead and does not require renderTarget support. + * @zh 指定显示对象是否缓存为静态图像,cacheAs 时,子对象发生变化,会自动重新缓存,同时也可以手动调用 reCache 方法更新缓存。 + * 建议把不经常变化的“复杂内容”缓存为静态图像,能极大提高渲染性能。cacheAs 有 "none","normal" 和 "bitmap" 三个值可选。 + * 默认为 "none",不做任何缓存。 + * 当值为 "normal" 时,使用命令缓存。 + * 当值为 "bitmap" 时,使用 renderTarget 缓存。 + * renderTarget 缓存模式缺点:会额外创建 renderTarget 对象,增加内存开销,缓存面积有最大 2048 限制,不断重绘时会增加 CPU 开销。优点:大幅减少 drawcall,渲染性能最高。 + * 命令缓存模式缺点:只会减少节点遍历及命令组织,不会减少 drawcall 数,性能中等。优点:没有额外内存开销,无需 renderTarget 支持。 + */ + get cacheAs(): string; + set cacheAs(value: string); + /** + * @deprecated + * 设置cacheAs为非空时此值才有效,staticCache=true时,子对象变化时不会自动更新缓存,只能通过调用reCache方法手动刷新。 + */ + get staticCache(): boolean; + /**@deprecated */ + set staticCache(value: boolean); + /** + * @deprecated + * @en Call this method to refresh the cache when cacheAs is set. + * @zh 在设置 cacheAs 的情况下,调用此方法会重新刷新缓存。 + */ + reCache(): void; + /** + * @en The rendering component node of the sprite. + * @zh 精灵的渲染组件节点。 + */ + get renderNode2D(): BaseRenderNode2D; + set renderNode2D(value: BaseRenderNode2D); + /** + * @en Get the repaint type. + * @returns The repaint type. + * @zh 获取重绘类型。 + * @returns 重绘类型。 + */ + getRepaint(): number; + /** + * @en The x coordinate value relative to the parent container. + * @zh 显示对象相对于父容器的水平方向坐标值。 + */ + get x(): number; + set x(value: number); + /** + * @en The y coordinate value relative to the parent container. + * @zh 显示对象相对于父容器的垂直方向坐标值。 + */ + get y(): number; + set y(value: number); + /** + * @en The width of the Node, in pixels + * @zh 节点的宽度,单位为像素。 + */ + get width(): number; + set width(value: number); + /** + * @en Set the width of the Node. + * @param number value The width value, in pixels. + * @zh 设置节点的宽度。 + * @param number value 宽度值,以像素为单位。 + */ + protected set_width(value: number): void; + /** + * @en Get the width of the Node, in pixels + * @zh 获取节点的宽度。以像素为单位。 + */ + protected get_width(): number; + /** + * @en The height of the Node, in pixels. + * @zh 节点的高度,单位为像素。 + */ + get height(): number; + set height(value: number); + /** + * @en Set the height of the Node, in pixels + * @zh 设置节点的高度,单位为像素。 + */ + protected set_height(value: number): void; + /** + * @en Get the height of the Node, in pixels. + * @zh 获取节点的高度,以像素为单位。 + */ + protected get_height(): number; + /** + * @en Check if the width is set. + * @returns True if the width is set, otherwise false. + * @zh 检查是否设置了宽度。 + * @returns True 表示宽度已设置,否则为 False。 + */ + get _isWidthSet(): boolean; + /** + * @en Check if the height is set. + * @returns True if the height is set, otherwise false. + * @zh 检查是否设置了高度。 + * @returns True 表示高度已设置,否则为 False。 + */ + get _isHeightSet(): boolean; + /** + * @en Called when the layout should be refreshed. + * @zh 当需要刷新布局时调用。 + */ + protected _shouldRefreshLayout(): void; + /** + * @en The display width of the object, in pixels, including X axis scaling. + * @returns The display width. + * @zh 对象的显示宽度(以像素为单位),包含X轴缩放。 + * @returns 显示宽度。 + */ + get displayWidth(): number; + /** + * @en The display height of the object, in pixels, including Y axis scaling. + * @returns The display height. + * @zh 对象的显示高度(以像素为单位),包含Y轴缩放。 + * @returns 显示高度。 + */ + get displayHeight(): number; + /** + * @en Set the bounds of the object. If set, getBounds will not be used to calculate the bounds. Proper use can improve performance. + * @param bound The bounds rectangle. + * @zh 设置对象的边界大小,如果设置,则不再通过getBounds计算边界。合理使用能提高性能。 + * @param bound 边界矩形区域 + */ + setSelfBounds(bound: Rectangle): void; + /** + * @en Get the rectangle display area of the object in the parent container's coordinate system. + * Note: This calculation is complex, use sparingly. + * @return The rectangle area. + * @zh 获取本对象在父容器坐标系的矩形显示区域。 + * 注意:计算量较大,尽量少用。 + * @returns 矩形区域。 + */ + getBounds(): Rectangle; + /** + * @en Get the rectangle display area of the object in its own coordinate system. + * Note: This calculation is complex, use sparingly. + * @returns The rectangle area. + * @zh 获取本对象在自己坐标系的矩形显示区域。 + * 注意:计算量较大,尽量少用。 + * @returns 矩形区域。 + */ + getSelfBounds(): Rectangle; + /** + * @en Returns the display area of the drawing object (`Graphics`) in this instance, excluding child objects. + * @param realSize (Optional) Use the actual size of the image, default is false. + * @returns A Rectangle object representing the obtained display area. + * @zh 返回此实例中绘图对象(`Graphics`)的显示区域,不包括子对象。 + * @param realSize (可选)使用图片的真实大小,默认为false。 + * @returns 一个 Rectangle 对象,表示获取到的显示区域。 + */ + getGraphicBounds(realSize?: boolean): Rectangle; + /** + * @ignore + * @en Get the sprite style. + * @return The sprite style (SpriteStyle). + * @zh 获取精灵样式。 + * @return 精灵样式 (SpriteStyle)。 + */ + getStyle(): SpriteStyle; + /** + * @ignore + * @en Set the sprite style. + * @param value The sprite style to set. + * @zh 设置精灵样式。 + * @param value 要设置的精灵样式。 + */ + setStyle(value: SpriteStyle): void; + /** + * @en The scale factor on the X axis, with a default value of 1. Setting a negative value can achieve a horizontal flip effect, e.g., scaleX=-1. + * @zh X轴缩放值,默认值为1。设置为负数可以实现水平反转效果,例如scaleX=-1。 + */ + get scaleX(): number; + set scaleX(value: number); + /** + * @en The scale factor on the Y axis, with a default value of 1. Setting a negative value can achieve a vertical flip effect, e.g., scaleY=-1. + * @zh Y轴缩放值,默认值为1。设置为负数可以实现垂直反转效果,例如scaleY=-1。 + */ + get scaleY(): number; + set scaleY(value: number); + /** + * @en The rotation angle, in degrees, with a default value of 0. + * @zh 旋转角度,默认值为0。以角度为单位。 + */ + get rotation(): number; + set rotation(value: number); + /** + * @en The horizontal skew angle, in degrees, with a default value of 0. + * @zh 水平倾斜角度,默认值为0。以角度为单位。 + */ + get skewX(): number; + set skewX(value: number); + /** + * @en The vertical skew angle, in degrees, with a default value of 0. + * @zh 垂直倾斜角度,默认值为0。以角度为单位。 + */ + get skewY(): number; + set skewY(value: number); + /** + * @en Adjust the transform matrix. + * @return The adjusted transform matrix. + * @zh 调整变换矩阵。 + * @return 调整后的变换矩阵。 + */ + protected _adjustTransform(): Matrix; + /** + * @en The matrix information of the object. By setting the matrix, node rotation, scaling, and displacement effects can be achieved. + * @zh 对象的矩阵信息。通过设置矩阵可以实现节点旋转,缩放,位移效果。 + */ + get transform(): Matrix; + set transform(value: Matrix); + /** + * @en The x-axis pivot point position, in pixels, with a default value of 0. The pivot point affects the object's position, scaling center, and rotation center. + * @zh X 轴轴心点的位置,以像素为单位,默认为 0。轴心点会影响对象的位置、缩放中心和旋转中心。 + */ + get pivotX(): number; + set pivotX(value: number); + /** + * @en The y-axis pivot point position, in pixels, with a default value of 0. The pivot point affects the object's position, scaling center, and rotation center. + * @zh Y 轴轴心点的位置,以像素为单位,默认为 0。轴心点会影响对象的位置、缩放中心和旋转中心。 + */ + get pivotY(): number; + set pivotY(value: number); + /** + * @en The anchor point's x-coordinate, ranging from 0 to 1. Setting anchorX will ultimately change the node's pivot point through the pivotX value. + * @zh X 轴锚点,值为 0-1。设置 anchorX 值最终会通过 pivotX 值来改变节点的轴心点。 + */ + get anchorX(): number; + set anchorX(value: number); + /** + * @en The anchor point's y-coordinate, ranging from 0 to 1. Setting anchorY will ultimately change the node's pivot point through the pivotY value. + * @zh Y 轴锚点,值为 0-1。设置 anchorY 值最终会通过 pivotY 值来改变节点的轴心点。 + */ + get anchorY(): number; + set anchorY(value: number); + /** + * @en The transparency value, ranging from 0 to 1, with a default value of 1 (opaque). Changing the alpha value will affect the drawcall. + * @zh 透明度,值为 0-1,默认值为 1(不透明)。更改 alpha 值会影响 drawcall。 + */ + get alpha(): number; + set alpha(value: number); + /** + * @en Indicates whether the object is visible. The default value is true. If set to false, the node will not be rendered. + * @zh 表示对象是否可见,默认为 true。如果设置为 false,节点将不会被渲染。 + */ + get visible(): boolean; + set visible(value: boolean); + /** + * @en Specifies the blending mode to be used. Only "lighter" is currently supported. + * @zh 指定要使用的混合模式,目前只支持 "lighter"。 + */ + get blendMode(): string; + set blendMode(value: string); + /** + * @en The drawing object, which encapsulates the interfaces for drawing bitmaps and vector graphics. All drawing operations of Sprite are implemented through Graphics. + * @zh 绘图对象。封装了绘制位图和矢量图的接口,Sprite 的所有绘图操作都是通过 Graphics 实现的。 + */ + get graphics(): Graphics; + set graphics(value: Graphics); + /** + * @en Set the Graphics object for drawing. + * @param value The Graphics object to set. + * @param transferOwnership Whether to set the Graphics object to the belonging node (i.e., transfer the ownership of the Graphics object to the Sprite). If true, the Sprite will be responsible for destroying the Graphics object when it's no longer needed. + * @zh 设置用于绘制的 Graphics 对象。 + * @param value 要设置的 Graphics 对象。 + * @param transferOwnership 是否将 Graphics 对象设置到所属节点上(即将 Graphics 对象的所有权转移给 Sprite)。如果为 true,则 Sprite 将负责在不再需要 Graphics 对象时销毁它。 + */ + setGraphics(value: Graphics, transferOwnership: boolean): void; + /** + * @en 2D sprite material + * @zh 2D精灵材质 + */ + get material(): Material; + set material(value: Material); + /** + * @en The scroll rectangle range of the display object, with a clipping effect (if you only want to limit the rendering area of child objects, please use viewport). + * Differences between srollRect and viewport: + * 1. srollRect has a clipping effect, viewport only affects whether child objects are rendered, and does not have a clipping effect (higher performance). + * 2. Setting the x and y properties of the rect can achieve scrolling effect, but scrollRect will keep the position of point 0,0 unchanged. + * @zh 显示对象的滚动矩形范围,具有裁剪效果(如果只想限制子对象渲染区域,请使用viewport) + * srollRect和viewport的区别: + * 1.srollRect自带裁剪效果,viewport只影响子对象渲染是否渲染,不具有裁剪效果(性能更高)。 + * 2.设置rect的x,y属性均能实现区域滚动效果,但scrollRect会保持0,0点位置不变。 + */ + get scrollRect(): Rectangle; + set scrollRect(value: Rectangle); + /** + * @en The viewport size. Child objects outside the viewport will not be rendered (if you want to achieve a clipping effect, please use scrollRect). Proper use can improve rendering performance. For example, map tiles composed of small images will not render small images outside the viewport. + * The default value is null. + * The differences between scrollRect and viewport: + * 1. scrollRect comes with a clipping effect, while viewport only affects whether child objects are rendered without clipping (better performance). + * 2. Setting the x and y properties of the rect can achieve a scrolling effect in the area, but scrollRect will keep the position of point 0,0 unchanged. + * @zh 视口大小,视口外的子对象将不被渲染(如果想实现裁剪效果,请使用scrollRect),合理使用能提高渲染性能。例如,由一个个小图片拼成的地图块,viewport外面的小图片将不渲染。 + * 默认值为null。 + * scrollRect和viewport的区别: + * 1. scrollRect自带裁剪效果,viewport只影响子对象是否渲染,不具有裁剪效果(性能更高)。 + * 2. 设置rect的x,y属性均能实现区域滚动效果,但scrollRect会保持0,0点位置不变。 + */ + get viewport(): Rectangle; + set viewport(value: Rectangle); + /** + * @en Set the position. Equivalent to setting the x and y properties separately. + * Since the return value is the Sprite object itself, you can use the following syntax: spr.pos(...).scale(...); + * @param x X-axis coordinate. + * @param y Y-axis coordinate. + * @param speedMode (Optional) Whether to use speed mode. Normally, this.x=value is called to assign values. Speed mode directly calls the internal function to handle it. If the x and y properties are not overridden, it is recommended to set to speed mode for higher performance. + * @returns The object itself. + * @zh 设置坐标位置。相当于分别设置x和y属性。 + * 因为返回值为Sprite对象本身,所以可以使用如下语法:spr.pos(...).scale(...); + * @param x X轴坐标。 + * @param y Y轴坐标。 + * @param speedMode (可选)是否极速模式,正常是调用this.x=value进行赋值,极速模式直接调用内部函数处理,如果未重写x,y属性,建议设置为极速模式性能更高。 + * @returns 返回对象本身。 + */ + pos(x: number, y: number, speedMode?: boolean): Sprite; + /** + * @en Set the pivot point. Equivalent to setting the pivotX and pivotY properties separately. + * Since the return value is the Sprite object itself, you can use the following syntax: spr.pivot(...).pos(50, 100); + * @param x X-axis pivot point. + * @param y Y-axis pivot point. + * @returns The object itself. + * @zh 设置轴心点。相当于分别设置pivotX和pivotY属性。 + * 因为返回值为Sprite对象本身,所以可以使用如下语法:spr.pivot(...).pos(50, 100); + * @param x X轴心点。 + * @param y Y轴心点。 + * @returns 返回对象本身。 + */ + pivot(x: number, y: number): Sprite; + /** + * @en Set the size. Equivalent to setting the width and height properties separately. + * Since the return value is the Sprite object itself, you can use the following syntax: spr.size(...).pos(50, 100); + * @param width Width value. + * @param height Height value. + * @returns The object itself. + * @zh 设置宽高。相当于分别设置width和height属性。 + * 因为返回值为Sprite对象本身,所以可以使用如下语法:spr.size(...).pos(50, 100); + * @param width 宽度值。 + * @param height 高度值。 + * @returns 返回对象本身。 + */ + size(width: number, height: number): Sprite; + /** + * @en Set the scale. Equivalent to setting the scaleX and scaleY properties separately. + * Since the return value is the Sprite object itself, you can use the following syntax: spr.scale(...).pos(50, 100); + * @param scaleX X-axis scale ratio. + * @param scaleY Y-axis scale ratio. + * @param speedMode (Optional) Whether to use speed mode. Normally, this.scaleX=value is called to assign values. Speed mode directly calls the internal function to handle it. If the scaleX and scaleY properties are not overridden, it is recommended to set to speed mode for higher performance. + * @returns The object itself. + * @zh 设置缩放。相当于分别设置scaleX和scaleY属性。 + * 因为返回值为Sprite对象本身,所以可以使用如下语法:spr.scale(...).pos(50, 100); + * @param scaleX X轴缩放比例。 + * @param scaleY Y轴缩放比例。 + * @param speedMode (可选)是否极速模式,正常是调用this.scaleX=value进行赋值,极速模式直接调用内部函数处理,如果未重写scaleX,scaleY属性,建议设置为极速模式性能更高。 + * @returns 返回对象本身。 + */ + scale(scaleX: number, scaleY: number, speedMode?: boolean): Sprite; + /** + * @en Set the skew angle. Equivalent to setting the skewX and skewY properties separately. + * Since the return value is the Sprite object itself, you can use the following syntax: spr.skew(...).pos(50, 100); + * @param skewX Horizontal skew angle. + * @param skewY Vertical skew angle. + * @returns The object itself. + * @zh 设置倾斜角度。相当于分别设置skewX和skewY属性。 + * 因为返回值为Sprite对象本身,所以可以使用如下语法:spr.skew(...).pos(50, 100); + * @param skewX 水平倾斜角度。 + * @param skewY 垂直倾斜角度。 + * @returns 返回对象本身。 + */ + skew(skewX: number, skewY: number): Sprite; + /** + * @en Update and render the display object. Called by the system. + * @param ctx The rendering context reference. + * @param x The X-axis coordinate. + * @param y The Y-axis coordinate. + * The meaning of x and y is complex. Without rotation, it is the world position of the current node. + * If any parent node has rotation, x and y will be reset to [0,0] there and then accumulated again. + * So, x and y can be considered as the cumulative value from the current node to a node with rotation (or the root node). + * @zh 更新、呈现显示对象。由系统调用。 + * @param ctx 渲染的上下文引用。 + * @param x X轴坐标。 + * @param y Y轴坐标。 + * 关于上面的x、y的含义比较复杂,在没有旋转的情况下,它就是当前节点的世界坐标的位置。 + * 如果此节点的某个父节点有旋转,x、y会在那里被重置为[0,0],然后继续累加。 + * 所以可以认为这个x、y是表示当前节点到某个有旋转的节点(或者根节点)的累加值。 + */ + render(ctx: Context, x: number, y: number): void; + /** + * @en Draws the current Sprite to a Canvas and returns an HtmlCanvas object. + * The drawing result can be used as an image source to be drawn into other Sprites. + * It can also obtain the original image data, send it to the server, or save it as an image to achieve a screenshot effect. + * @param canvasWidth The width of the canvas. + * @param canvasHeight The height of the canvas. + * @param offsetX The X-axis offset for drawing. + * @param offsetY The Y-axis offset for drawing. + * @returns The HTMLCanvas object. + * @zh 绘制当前 Sprite 到 Canvas 上,并返回一个 HtmlCanvas 对象。 + * 绘制的结果可以当作图片源,再次绘制到其他 Sprite 里面。也可以获取原始图片数据,发给服务器或者保存为图片,从而实现截图效果。 + * @param canvasWidth 画布宽度。 + * @param canvasHeight 画布高度。 + * @param offsetX 绘制的 X 轴偏移量。 + * @param offsetY 绘制的 Y 轴偏移量。 + * @returns HTMLCanvas 对象。 + */ + drawToCanvas(canvasWidth: number, canvasHeight: number, offsetX: number, offsetY: number): HTMLCanvas; + /** + * @ignore + * @en Draws the specified Sprite to a Canvas and returns an HtmlCanvas object. + * @param sprite The Sprite to draw. + * @param canvasWidth The width of the canvas. + * @param canvasHeight The height of the canvas. + * @param offsetX The X-axis offset for drawing. + * @param offsetY The Y-axis offset for drawing. + * @returns The HTMLCanvas object. + * @zh 绘制指定的 Sprite 到 Canvas 上,并返回一个 HtmlCanvas 对象。 + * @param sprite 要绘制的 Sprite。 + * @param canvasWidth 画布宽度。 + * @param canvasHeight 画布高度。 + * @param offsetX 绘制的 X 轴偏移量。 + * @param offsetY 绘制的 Y 轴偏移量。 + * @returns HTMLCanvas 对象。 + */ + static drawToCanvas(sprite: Sprite, canvasWidth: number, canvasHeight: number, offsetX: number, offsetY: number, isDrawRenderRect?: boolean): HTMLCanvas; + /** + * @deprecated + * @en Draws the current object to a Texture object. + * @param canvasWidth The width of the canvas. + * @param canvasHeight The height of the canvas. + * @param offsetX The X-axis offset for drawing. + * @param offsetY The Y-axis offset for drawing. + * @param rt The render target. + * @param isDrawRenderRect A boolean indicating whether to draw the render rectangle. When true, it starts drawing from (0,0) of the render texture and subtracts the offset of the cache rectangle. When false, it keeps the sprite's original relative position for drawing. + * @returns The drawn Texture or RenderTexture2D object. + * @zh 绘制当前对象到一个 Texture 对象上。 + * @param canvasWidth 画布宽度。 + * @param canvasHeight 画布高度。 + * @param offsetX 绘制的 X 轴偏移量。 + * @param offsetY 绘制的 Y 轴偏移量。 + * @param rt 渲染目标。 + * @param isDrawRenderRect 表示是否绘制渲染矩形。为 true 时,从渲染纹理的(0,0)点开始绘制,但要减去缓存矩形的偏移;为 false 时,保持精灵的原始相对位置进行绘制。 + * @returns 绘制的 Texture 或 RenderTexture2D 对象。 + */ + drawToTexture(canvasWidth: number, canvasHeight: number, offsetX: number, offsetY: number, rt?: RenderTexture2D | null, isDrawRenderRect?: boolean): Texture | RenderTexture2D; + /** + * @deprecated + * @ignore + * @en Draws the specified Sprite to a Texture or RenderTexture2D object. + * @param sprite The Sprite to draw. + * @param canvasWidth The width of the canvas. + * @param canvasHeight The height of the canvas. + * @param offsetX The X-axis offset for drawing. + * @param offsetY The Y-axis offset for drawing. + * @param rt The render target. If not provided, a new RenderTexture2D will be created. + * @param isDrawRenderRect A boolean indicating whether to draw the render rectangle. When true, it starts drawing from (0,0) of the render texture and subtracts the offset of the cache rectangle. When false, it keeps the sprite's original relative position for drawing. + * @returns The drawn Texture or RenderTexture2D object. + * @zh 将指定的 Sprite 绘制到 Texture 或 RenderTexture2D 对象上。 + * @param sprite 要绘制的 Sprite。 + * @param canvasWidth 画布宽度。 + * @param canvasHeight 画布高度。 + * @param offsetX 绘制的 X 轴偏移量。 + * @param offsetY 绘制的 Y 轴偏移量。 + * @param rt 渲染目标。如果未提供,将创建一个新的 RenderTexture2D。 + * @param isDrawRenderRect 表示是否绘制渲染矩形。为 true 时,从渲染纹理的(0,0)点开始绘制,但要减去缓存矩形的偏移;为 false 时,保持精灵的原始相对位置进行绘制。 + * @returns 绘制的 Texture 或 RenderTexture2D 对象。 + */ + static drawToTexture(sprite: Sprite, canvasWidth: number, canvasHeight: number, offsetX: number, offsetY: number, rt?: RenderTexture2D | null, isDrawRenderRect?: boolean): Texture | RenderTexture2D; + /** + * @en Draws the current object to a RenderTexture2D object. + * @param canvasWidth The width of the canvas. + * @param canvasHeight The height of the canvas. + * @param offsetX The X-axis offset for drawing. + * @param offsetY The Y-axis offset for drawing. + * @param rt The render target. + * @param isDrawRenderRect A boolean indicating whether to draw the render rectangle. When true, it starts drawing from (0,0) of the render texture and subtracts the offset of the cache rectangle. When false, it keeps the sprite's original relative position for drawing. + * @param flipY Optional. If true, the texture will be flipped vertical. Default is false. + * @returns The drawn RenderTexture2D object. + * @zh 绘制当前对象到一个 Texture 对象上。 + * @param canvasWidth 画布宽度。 + * @param canvasHeight 画布高度。 + * @param offsetX 绘制的 X 轴偏移量。 + * @param offsetY 绘制的 Y 轴偏移量。 + * @param rt 渲染目标。 + * @param isDrawRenderRect 表示是否绘制渲染矩形。为 true 时,从渲染纹理的(0,0)点开始绘制,但要减去缓存矩形的偏移;为 false 时,保持精灵的原始相对位置进行绘制。 + * @param flipY 可选。如果为 true,则垂直翻转纹理。默认为 false。 + * @returns 绘制的 RenderTexture2D 对象。 + */ + drawToRenderTexture2D(canvasWidth: number, canvasHeight: number, offsetX: number, offsetY: number, rt?: RenderTexture2D | null, isDrawRenderRect?: boolean, flipY?: boolean): RenderTexture2D; + /** + * @ignore + * @en Draws the specified Sprite to a RenderTexture2D object. + * @param sprite The Sprite to draw. + * @param canvasWidth The width of the canvas. + * @param canvasHeight The height of the canvas. + * @param offsetX The X-axis offset for drawing. + * @param offsetY The Y-axis offset for drawing. + * @param rt The render target. If not provided, a new RenderTexture2D will be created. + * @param isDrawRenderRect A boolean indicating whether to draw the render rectangle. When true, it starts drawing from (0,0) of the render texture and subtracts the offset of the cache rectangle. When false, it keeps the sprite's original relative position for drawing. + * @param flipY Optional. If true, the texture will be flipped vertical. Default is false. + * @returns The drawn RenderTexture2D object. + * @zh 将指定的 Sprite 绘制到 RenderTexture2D 对象上。 + * @param sprite 要绘制的 Sprite。 + * @param canvasWidth 画布宽度。 + * @param canvasHeight 画布高度。 + * @param offsetX 绘制的 X 轴偏移量。 + * @param offsetY 绘制的 Y 轴偏移量。 + * @param rt 渲染目标。如果未提供,将创建一个新的 RenderTexture2D。 + * @param isDrawRenderRect 表示是否绘制渲染矩形。为 true 时,从渲染纹理的(0,0)点开始绘制,但要减去缓存矩形的偏移;为 false 时,保持精灵的原始相对位置进行绘制。 + * @param flipY 可选。如果为 true,则垂直翻转纹理。默认为 false。 + * @returns 绘制的 RenderTexture2D 对象。 + */ + static drawToRenderTexture2D(sprite: Sprite, canvasWidth: number, canvasHeight: number, offsetX: number, offsetY: number, rt?: RenderTexture2D | null, isDrawRenderRect?: boolean, flipY?: boolean): RenderTexture2D; + /** + * 绘制到Canvas的上下文 + */ + static drawtocanvCtx: Context; + /** + * @en Custom update and render display objects. Generally used to extend rendering modes. Please use it reasonably as it may cause inability to render on accelerators. + * Note: Do not add or remove tree nodes in this function, otherwise it will affect the traversal of tree nodes. + * @param context The rendering context reference. + * @param x The X-axis coordinate. + * @param y The Y-axis coordinate. + * @zh 自定义更新、呈现显示对象。一般用来扩展渲染模式,请合理使用,可能会导致在加速器上无法渲染。 + * 注意: 不要在此函数内增加或删除树节点,否则会对树节点遍历造成影响。 + * @param context 渲染的上下文引用。 + * @param x X轴坐标。 + * @param y Y轴坐标。 + */ + customRender(context: Context, x: number, y: number): void; + /** + * @en The filter collection. Multiple filters can be combined. + * @zh 滤镜集合。可以设置多个滤镜组合。 + */ + get filters(): Filter[]; + set filters(value: Filter[]); + /** + * @en Converts the local coordinates to the global coordinates relative to the stage. + * @param point The local coordinate point. + * @param createNewPoint (Optional) Whether to create a new Point object as the return value. The default is false, which uses the input point object as the return value to reduce object creation overhead. + * @param globalNode The global node, default is Laya.stage + * @return The converted global coordinate point. + * @zh 把本地坐标转换为相对stage的全局坐标。 + * @param point 本地坐标点。 + * @param createNewPoint (可选)是否创建一个新的Point对象作为返回值,默认为false,使用输入的point对象返回,减少对象创建开销。 + * @param globalNode global节点,默认为Laya.stage + * @return 转换后的坐标的点。 + */ + localToGlobal(point: Point, createNewPoint?: boolean, globalNode?: Sprite | null): Point; + /** + * @en Converts the global coordinates relative to the stage to the local coordinates. + * @param point The global coordinate point. + * @param createNewPoint (Optional) Whether to create a new Point object as the return value. The default is false, which uses the input point object as the return value to reduce object creation overhead. + * @param globalNode The global node, default is Laya.stage. + * @return The converted local coordinate point. + * @zh 把stage的全局坐标转换为本地坐标。 + * @param point 全局坐标点。 + * @param createNewPoint (可选)是否创建一个新的Point对象作为返回值,默认为false,使用输入的point对象返回,减少对象创建开销。 + * @param globalNode global节点,默认为Laya.stage。 + * @return 转换后的坐标的点。 + */ + globalToLocal(point: Point, createNewPoint?: boolean, globalNode?: Sprite | null): Point; + /** + * @en Converts the coordinates in the local coordinate system to the coordinates in the parent container coordinate system. + * @param point The local coordinate point. + * @return The converted point in the parent container coordinate system. + * @zh 将本地坐标系坐标转换到父容器坐标系。 + * @param point 本地坐标点。 + * @return 转换后的点。 + */ + toParentPoint(point: Point): Point; + /** + * @en Converts the coordinates in the parent container coordinate system to the coordinates in the local coordinate system. + * @param point The point in the parent container coordinate system. + * @return The converted point in the local coordinate system. + * @zh 将父容器坐标系坐标转换到本地坐标系。 + * @param point 父容器坐标点。 + * @return 转换后的点。 + */ + fromParentPoint(point: Point): Point; + /** + * @en Starts listening to a specific event type. This method is called when a new event listener is added. + * If it is a mouse event, it sets itself and its parent objects to accept mouse interaction events. + * @param type The event type. + * @zh 开始监听特定事件类型。当添加新的事件侦听器时调用此方法。 + * 如果是鼠标事件,则设置自己和父对象为可接受鼠标交互事件。 + * @param type 事件类型。 + */ + protected onStartListeningToType(type: string): void; + /** + * @en Ensures that when the node is set to accept mouse interaction events, all parent objects are also set to accept mouse interaction events. + * @zh 当节点设置为接受鼠标交互事件时,确保所有父对象也被设置为接受鼠标交互事件。 + */ + protected _onDisplay(v?: boolean): void; + /** + * @en Set the parent node of the current node. + * @param value The new parent node. + * @zh 设置当前节点的父节点。 + * @param value 新的父节点。 + */ + protected _setParent(value: Node): void; + /** + * @en Load and display an image. Equivalent to loading the image and then setting the texture property. Note: calling this method multiple times will only display one image. + * @param url The image URL. + * @param complete (Optional) The callback function when loading is complete. + * @returns Returns the Sprite object itself. + * @zh 加载并显示一个图片。相当于加载图片后,设置texture属性。注意:多次调用,只会显示一个图片。 + * @param url 图片地址。 + * @param complete (可选)加载完成回调。 + * @returns 返回精灵对象本身。 + */ + loadImage(url: string, complete?: Handler): Sprite; + /** + * @en Create a new `Sprite` object based on the image URL to load and display the image. + * @param url The image URL. + * @returns Returns a new `Sprite` object. + * @zh 根据图片地址创建一个新的 `Sprite` 对象用于加载并显示此图片。 + * @param url 图片地址。 + * @returns 返回新的 `Sprite` 对象。 + */ + static fromImage(url: string): Sprite; + /** + * @en Redraw the Sprite and invalidate its own and parent's cache after setting cacheAs. + * @param type The redraw type. + * @zh 重新绘制,cacheAs后,设置自己和父对象缓存失效。 + * @param type 重新绘制类型。 + */ + repaint(type?: number): void; + /** + * @en Callback when a child node changes. + * @param child The child node that has changed. + * @zh 子节点发生变化时的回调。 + * @param child 发生变化的子节点。 + */ + protected _childChanged(child?: Node): void; + /** + * @en Repaint the parent node. When `cacheAs` is enabled, set all parent object caches to invalid. + * @param type The type of repaint. Default is SpriteConst.REPAINT_CACHE. + * @zh 重新绘制父节点。启用 `cacheAs` 时,设置所有父对象缓存失效。 + * @param type 重新绘制类型。默认为 SpriteConst.REPAINT_CACHE。 + */ + parentRepaint(type?: number): void; + /** + * @en Reference to the stage. + * @zh 对舞台的引用。 + */ + get stage(): Stage; + /** + * @en You can set a rectangular area as the clickable region, or set a HitArea instance as the clickable region. The HitArea can have both clickable and non-clickable areas defined. If the hitArea is not set, the mouse collision detection will be based on the area formed by the width and height of the object. + * @zh 可以设置一个矩形区域作为点击区域,或者设置一个 `HitArea` 实例作为点击区域,HitArea 内可以设置可点击和不可点击区域。如果不设置 hitArea,则根据宽高形成的区域进行鼠标碰撞检测。 + */ + get hitArea(): IHitArea; + set hitArea(value: IHitArea); + /** + * @en Masking allows setting an object (bitmap or vector graphic) as a mask, displaying content based on the object's shape. + * @zh 遮罩,可以设置一个对象(支持位图和矢量图),根据对象形状进行遮罩显示。 + */ + get mask(): Sprite; + set mask(value: Sprite); + /** + * @en Indicates whether the object receives mouse events. + * The default is false. If you listen to mouse events, this value and the value of mouseEnable for parent nodes will be automatically set to true (unless the parent node is manually set to false). + * @zh 是否接受鼠标事件。 + * 默认为 false,如果监听鼠标事件,则会自动设置本对象及父节点的属性 mouseEnable 的值都为 true(如果父节点手动设置为 false,则不会更改)。 + */ + get mouseEnabled(): boolean; + set mouseEnabled(value: boolean); + /** + * @en Starts dragging this object. + * @param area (Optional) The drag area, which is the active area of the object's registration point (excluding the object's width and height). + * @param hasInertia (Optional) Whether the object has inertia when the mouse is released. The default is false. + * @param elasticDistance (Optional) The distance value of the elastic effect. A value of 0 means no elastic effect. The default is 0. + * @param elasticBackTime (Optional) The bounce-back time for the elastic effect in milliseconds. The default is 300 milliseconds. + * @param data (Optional) The data carried by the drag event. + * @param ratio (Optional) The inertia damping coefficient, which affects the strength and duration of inertia. + * @zh 开始拖动此对象。 + * @param area (可选)拖动区域,此区域为当前对象注册点活动区域(不包括对象宽高) 。 + * @param hasInertia (可选)鼠标松开后,是否还惯性滑动,默认为false。 + * @param elasticDistance (可选)橡皮筋效果的距离值,0为无橡皮筋效果,默认为0。 + * @param elasticBackTime (可选)橡皮筋回弹时间,单位为毫秒,默认为300毫秒。 + * @param data (可选)拖动事件携带的数据。 + * @param ratio (可选)惯性阻尼系数,影响惯性力度和时长。 + */ + startDrag(area?: Rectangle, hasInertia?: boolean, elasticDistance?: number, elasticBackTime?: number, data?: any, ratio?: number): void; + /** + * @en Stops dragging this object. + * @zh 停止拖动此对象。 + */ + stopDrag(): void; + /** + * @en Checks whether a point is within this object. + * @param x Global x-coordinate. + * @param y Global y-coordinate. + * @returns Indicates whether the point is inside the object. + * @zh 检测某个点是否在此对象内。 + * @param x 全局x坐标。 + * @param y 全局y坐标。 + * @returns 表示是否在对象内。 + */ + hitTestPoint(x: number, y: number): boolean; + /** + * @en Get the mouse coordinates relative to this object. + * @returns The screen point information. + * @zh 获得相对于本对象上的鼠标坐标信息。 + * @returns 屏幕点信息。 + */ + getMousePoint(): Point; + /** + * @en The X-axis coordinate of the mouse in this object's coordinate system. + * @zh 鼠标在此对象坐标系上的 X 轴坐标信息。 + */ + get mouseX(): number; + /** + * @en The Y-axis coordinate of the mouse in this object's coordinate system. + * @zh 鼠标在此对象坐标系上的 Y 轴坐标信息。 + */ + get mouseY(): number; + /** + * @en The z-order. If this value is changed, all objects of the same container will be re-sorted according to the value. The larger the value, the higher it is. The default is 0, which is sorted according to the order of addition. + * @zh z排序,更改此值,则会按照值的大小对同一容器的所有对象重新排序。值越大,越靠上。默认为0,则根据添加顺序排序。 + */ + get zOrder(): number; + set zOrder(value: number); + /** + * @en Set a Texture instance and display the image (if there are other drawings before, it will be cleared). + * Equivalent to graphics.clear();graphics.drawImage(), but with better performance. + * You can also assign an image address, which will automatically load the image and then display it. + * @zh 设置一个Texture实例,并显示此图片(如果之前有其他绘制,则会被清除掉)。 + * 等同于graphics.clear();graphics.drawImage(),但性能更高。 + * 还可以赋值一个图片地址,则会自动加载图片,然后显示。 + */ + get texture(): Texture; + set texture(value: Texture); + /** + * @en Draw call optimization: when set to true, draw call optimization is enabled. During engine rendering, all text is automatically brought to the top layer to avoid interruptions by text when drawing images from the same atlas, thus reducing the number of draw calls. + * Enabling this will cause text to be non-obstructable. Use this feature cautiously if your project requires text to be obstructed. + * @zh 绘制调用优化,为true时,开启drawcall优化。引擎绘制时自动将所有文本提到显示最上层,避免同一个图集内的图像绘制时被文本打断,可以减少drawcall数量。 + * 开启后,会导致文本无法被遮挡,存在文本遮挡需求的项目,请谨慎使用该功能。 + */ + set drawCallOptimize(value: boolean); + get drawCallOptimize(): boolean; + set cacheGlobal(value: boolean); + set globalRotation(value: number); + /** + * @en Gets the global X-axis scale relative to the stage (this value includes the scaling of parent nodes). + * @returns The global X-axis scale. + * @zh 获得相对于stage的全局X轴缩放值(会叠加父亲节点的缩放值)。 + * @returns 全局X轴缩放值。 + */ + get globalScaleX(): number; + /** + * @en Gets the global Y-axis scale relative to the stage (this value includes the scaling of parent nodes). + * @returns The global Y-axis scale. + * @zh 获得相对于stage的全局Y轴缩放值(会叠加父亲节点的缩放值)。 + * @returns 全局Y轴缩放值。 + */ + get globalScaleY(): number; + /** + * @en Sets a global cache flag for a specific type. + * @param type The type of cache flag to set. + * @param value Whether to enable the cache flag. + * @zh 设置特定类型的全局缓存标志。 + * @param type 要设置的缓存标志类型。 + * @param value 是否启用缓存标志。 + */ + private _setGlobalCacheFlag; + } + /** + * @ignore + */ + class SpriteConst { + static ALPHA: number; + static TRANSFORM: number; + static BLEND: number; + static CANVAS: number; + static FILTERS: number; + static MASK: number; + static CLIP: number; + static TEXTURE: number; + static GRAPHICS: number; + static RENDERNODE2D: number; + static CUSTOM: number; + static HITAREA: number; + static CHILDS: number; + static REPAINT_NONE: number; + static REPAINT_NODE: number; + static REPAINT_CACHE: number; + static REPAINT_ALL: number; + } + /** + * @en Stage is the root node of the display list. All display objects are shown on the stage. It can be accessed through the Laya.stage singleton. + * Stage provides several adaptation modes. Different adaptation modes will produce different canvas sizes. The larger the canvas, the greater the rendering pressure, so it's important to choose an appropriate adaptation scheme. + * Stage provides different frame rate modes. The higher the frame rate, the greater the rendering pressure and power consumption. Reasonable use of frame rates or even dynamic changes in frame rates can help improve mobile phone power consumption. + * - Event.RESIZE("resize"): Discheduled when the stage size is resized. + * - Event.FOCUS("focus"): Dispatched when the stage gains focus. For example, when the browser or current tab is switched back from the background. + * - Event.BLUR("blur"): Dispatched when the stage loses focus. For example, when the browser or current tab is switched to the background. + * - Event.FOCUS_CHANGE("focuschange"): Dispatched when the stage focus changes. Use Laya.stage.isFocused to get whether the current stage has focus. + * - Event.VISIBILITY_CHANGE("visibilitychange"): Dispatched when the stage visibility changes (e.g., when the browser or current tab is switched to the background). Use Laya.stage.isVisibility to get the current visibility state. + * - Event.FULL_SCREEN_CHANGE("fullscreenchange"): Discheduled when the browser fullscreen state changes, such as entering or exiting fullscreen mode. + * @zh Stage 是舞台类,显示列表的根节点,所有显示对象都在舞台上显示。通过 Laya.stage 单例访问。 + * Stage提供几种适配模式,不同的适配模式会产生不同的画布大小,画布越大,渲染压力越大,所以要选择合适的适配方案。 + * Stage提供不同的帧率模式,帧率越高,渲染压力越大,越费电,合理使用帧率甚至动态更改帧率有利于改进手机耗电。 + * - Event.RESIZE("resize"): 舞台大小经过重新调整时进行调度。 + * - Event.FOCUS("focus"): 舞台获得焦点时调度。比如浏览器或者当前标签处于后台,重新切换回来时进行调度。 + * - Event.BLUR("blur"): 舞台失去焦点时调度。比如浏览器或者当前标签被切换到后台后调度。 + * - Event.FOCUS_CHANGE("focuschange"): 舞台焦点变化时调度,使用Laya.stage.isFocused可以获取当前舞台是否获得焦点。 + * - Event.VISIBILITY_CHANGE("visibilitychange"): 舞台可见性发生变化时调度(比如浏览器或者当前标签被切换到后台后调度),使用Laya.stage.isVisibility可以获取当前是否处于显示状态。 + * - Event.FULL_SCREEN_CHANGE("fullscreenchange"): 浏览器全屏更改时调度,比如进入全屏或者退出全屏。 + */ + class Stage extends Sprite { + /** + * @en No scaling is applied, and the stage is displayed at its design size. The actual width and height of the canvas are set to the design width and height. This mode is suitable for applications that want to maintain the original design ratio, but it may result in blank areas or content overflow on different devices. + * @zh 不进行缩放,舞台按照设计尺寸显示,画布的实际宽度和高度设置为设计宽度和高度。这种模式适合希望保持原始设计比例的应用,但在不同设备上可能会出现空白区域或内容超出屏幕的情况。 + */ + static SCALE_NOSCALE: string; + /** + * @en Scale the stage to fit the screen while maintaining the aspect ratio, ensuring that the entire design width and height remain visible. The canvas size remains equal to the design width and height, while the stage dimensions are calculated based on the design width and height multiplied by the minimum scaling factor of the physical resolution. Although this prevents content from being cropped, it may result in blank margins at the top and bottom or on the sides. + * @zh 保持纵横比的情况下,将舞台缩放以适应屏幕,确保整个舞台内容可见。画布的的宽高等于设计宽高,舞台的宽高根据设计宽度和高度乘以物理分辨率的最小缩放因子计算。虽然避免了内容被裁切,但可能会出现上下或左右的空白边缘。 + */ + static SCALE_SHOWALL: string; + /** + * @deprecated 不推荐使用 + * @en The stage is scaled to fill the screen, with the actual width and height of the canvas calculated based on the design width and height multiplied by the maximum scale factor. This mode ensures that content fully covers the display area, but it may result in some content being cut off. + * @zh 将舞台缩放以填满屏幕,画布的实际宽度和高度根据设计宽度和高度乘以最大缩放因子计算。这种模式保证内容完全覆盖屏幕,但可能会导致部分设计内容被裁切。 + */ + static SCALE_NOBORDER: string; + /** + * @en Set the stage and canvas directly to the screen's width and height. Other aspects are the same as the SCALE_NOSCALE mode, with no scaling applied to the design content itself. This mode is suitable for scenarios where you want to fully utilize the screen space and handle dynamic layout on the screen yourself. + * @zh 将舞台与画布直接设置为屏幕宽度和高度,其它方面与SCALE_NOSCALE模式一样,不对设计内容本身进行缩放。这种模式适用于希望完全利用屏幕空间,自行对屏幕动态排版的需求。 + */ + static SCALE_FULL: string; + /** + * @en Similar to SCALE_FULL, this mode sets the stage and canvas directly to the screen width and height. However, the difference is that it scales according to DPR (pixelRatio), making it suitable for high-DPR devices. + * Advantages of this mode: evelopers do not need to manually scale UI elements based on DPR in their logic. + * Important considerations: The design width and height should not use the physical resolution of the target device. Instead, they must use the logical resolution; otherwise, content exceeding the logical resolution may be cropped. + * @zh 与SCALE_FULL类似,将舞台与画布直接设置为屏幕宽度和高度,但区别是,会按 DPR(pixelRatio) 进行缩放,适合于各种高 DPR 的机型应用场景。 + * 该模式的好处是,不需要开发者对于 UI 根据 DPR 自行在逻辑里进行缩放处理。 + * 需要注意的是,在这种模式下,设计的宽高不能使用目标机型的物理分辨率,而是要使用目标机型的逻辑分辨率,这与其它适配模式不同,否则,会导致超出逻辑分辨率部分内容被裁切。 + */ + static SCALE_FULLSCREEN: string; + /** + * @en The stage width is kept fixed, and scaling is done based on the screen height. The canvas height is calculated based on the screen height and scale factor, and the stage height is set accordingly. This mode ensures consistent width but may alter the height ratio on different devices. + * @zh 保持舞台的宽度固定,根据屏幕高度进行缩放。画布的高度根据屏幕高度和缩放因子计算,并设置舞台的高度。这种模式确保宽度一致,但在不同设备上可能会改变高度比例。 + */ + static SCALE_FIXED_WIDTH: string; + /** + * @en The stage height is kept fixed, and scaling is done based on the screen width. The canvas width is calculated based on the screen width and scale factor, and the stage width is set accordingly. This mode ensures consistent height but may alter the width ratio on different devices. + * @zh 保持舞台的高度固定,根据屏幕宽度进行缩放。画布的宽度根据屏幕宽度和缩放因子计算,并设置舞台的宽度。这种模式确保高度一致,但在不同设备上可能会改变宽度比例。 + */ + static SCALE_FIXED_HEIGHT: string; + /** + * @en The scaling method is automatically chosen based on the comparison between the screen aspect ratio and the design aspect ratio. If the screen aspect ratio is less than the design aspect ratio, the width is kept fixed with equal scale factors and the canvas height is calculated; otherwise, the height is kept fixed with equal scale factors and the canvas width is calculated. This mode flexibly adapts to different devices but may result in content being cut off or blank borders appearing. + * @zh 根据屏幕宽高比与设计宽高比的比较,自动选择缩放方式;如果屏幕宽高比小于设计宽高比,则保持宽度固定,缩放因子相等并计算画布高度;否则,保持高度固定,缩放因子相等并计算画布宽度。这种模式可以灵活适应不同的设备,但可能会导致内容被裁切或出现空白边缘。 + */ + static SCALE_FIXED_AUTO: string; + /** + * @en Canvas is horizontally aligned to the left. + * @zh 画布水平居左对齐。 + */ + static ALIGN_LEFT: string; + /** + * @en Canvas is horizontally aligned to the right. + * @zh 画布水平居右对齐。 + */ + static ALIGN_RIGHT: string; + /** + * @en Canvas is horizontally centered. + * @zh 画布水平居中对齐。 + */ + static ALIGN_CENTER: string; + /** + * @en Canvas is vertically aligned to the top. + * @zh 画布垂直居上对齐。 + */ + static ALIGN_TOP: string; + /** + * @en Canvas is vertically centered. + * @zh 画布垂直居中对齐。 + */ + static ALIGN_MIDDLE: string; + /** + * @en Canvas is vertically aligned to the bottom. + * @zh 画布垂直居下对齐。 + */ + static ALIGN_BOTTOM: string; + /** + * @en Do not change the screen orientation. + * @zh 不更改屏幕。 + */ + static SCREEN_NONE: string; + /** + * @en Automatically switch to landscape mode. + * @zh 自动横屏。 + */ + static SCREEN_HORIZONTAL: string; + /** + * @en Automatically switch to portrait mode. + * @zh 自动竖屏。 + */ + static SCREEN_VERTICAL: string; + /** + * @en Fast mode, running at the configured maximum frame rate (not exceeding the device's maximum frame rate). + * @zh 快速模式,以配置的最高帧率运行(不得超过设备最高帧率)。 + */ + static FRAME_FAST: string; + /** + * @en Slow mode has a frame rate that is half of the fast mode. The principle is to skip rendering every other frame. For example, if the maximum frame rate in fast mode is 60, the maximum frame rate in slow mode would be 30. + * @zh 慢速模式的帧率是快速模式的一半,其原理是每隔一帧就会跳过渲染。例如快速模式的满帧为60时,慢速模式的满帧则为30。 + */ + static FRAME_SLOW: string; + /** + * @en Mouse mode, In this mode, it checks if the last mouse movement occurred within the last two seconds. If it did, `frameMode` will be set to `FRAME_FAST`; otherwise, it will be set to `FRAME_SLOW`. + * @zh 鼠标模式,该模式下,会检查上一次鼠标移动的时间,如果是在最近的两秒内,帧率的模式会采用快速模式,否则采用慢速模式。 + */ + static FRAME_MOUSE: string; + /** + * @en Sleep mode, running at 1 frame per second. + * @zh 休眠模式,以每秒1帧的速度运行。 + */ + static FRAME_SLEEP: string; + /** + * @en The current focus object, which will affect the dispatch of current keyboard events. + * @zh 当前焦点对象,此对象会影响当前键盘事件的派发主体。 + */ + focus: Node; + /** + * @private + * @deprecated + * @en Offset relative to the browser's top-left corner, deprecated, please use _canvasTransform. + * @zh 相对浏览器左上角的偏移,弃用,请使用_canvasTransform。 + */ + offset: Point; + /** + * @en Frame rate types:fast (default, full frame rate),slow (half of the full frame rate),mouse (full frame rate after mouse activity, switches to half frame rate if the mouse is idle for 2 seconds),sleep (1 frame per second) + * @zh 帧率类型:fast(默认,满帧),slow(满帧减半),mouse(鼠标活动后满帧,鼠标不动2秒后满帧减半),sleep(每秒1帧)。 + */ + private _frameRate; + /** + * @en Design width (the width set during initialization Laya.init(width,height)) + * @zh 设计宽度(初始化时设置的宽度Laya.init(width,height)) + */ + designWidth: number; + /** + * @en Design height (the height set during initialization Laya.init(width,height)) + * @zh 设计高度(初始化时设置的高度Laya.init(width,height)) + */ + designHeight: number; + /** + * @en Whether the canvas has been flipped. + * @zh 画布是否发生翻转。 + */ + canvasRotation: boolean; + /** + * @en The rotation angle of the canvas. + * @zh 画布的旋转角度。 + */ + canvasDegree: number; + /** + * @en Set whether to render. When set to false, rendering can be stopped, the screen will stay on the last render, reducing CPU consumption. This setting does not affect the clock. + * For example, in an inactive state, you can set renderingEnabled=false to save consumption. + * @zh 设置是否渲染,设置为false,可以停止渲染,画面会停留到最后一次渲染上,减少cpu消耗,此设置不影响时钟。 + * 比如非激活状态,可以设置renderingEnabled=false以节省消耗。 + */ + renderingEnabled: boolean; + /** + * @en Whether to enable screen adaptation. After adaptation, screen adaptation can be turned off at some point to prevent unexpected screen changes caused by certain operations. + * @zh 是否启用屏幕适配,可以适配后,在某个时候关闭屏幕适配,防止某些操作导致的屏幕意外改变。 + */ + screenAdaptationEnabled: boolean; + private _screenMode; + private _scaleMode; + private _alignV; + private _alignH; + private _bgColor; + private _renderCount; + private _safariOffsetY; + private _frameStartTime; + private _previousOrientation; + private _isFocused; + private _isVisibility; + private _globalRepaintSet; + private _globalRepaintGet; + /** + * @en Using physical resolution as the canvas size will improve rendering effects, but it will reduce performance + * @zh 使用物理分辨率作为画布大小,会改进渲染效果,但是会降低性能 + */ + useRetinalCanvas: boolean; + /** + * @ignore + * @en Stage class, there is only one stage instance in the engine. This instance can be accessed through Laya.stage. + * @zh 场景类,引擎中只有一个stage实例,此实例可以通过Laya.stage访问。 + * */ + constructor(); + /** + * @en Returns whether it is currently in a text input state on mobile devices. + * Note: Do not reset the canvas size while the input method is displayed during input on mobile devices. + * @zh 返回是否正处于移动端文本输入的状态。 + * 注意,在移动端输入时,输入法弹出期间不要进行画布尺寸重置。 + */ + private _isInputting; + /** + * @en The matrix information of the object. By setting the matrix, node rotation, scaling, and displacement effects can be achieved. + * @zh 对象的矩阵信息。通过设置矩阵可以实现节点旋转,缩放,位移效果。 + */ + get transform(): Matrix; + set transform(value: Matrix); + /** + * @en Whether the stage has focus. + * @zh 舞台是否获得焦点。 + */ + get isFocused(): boolean; + /** + * @en Indicates whether the stage is in a visible state (whether it has entered the background). + * @zh 舞台是否处于可见状态(是否进入后台)。 + */ + get isVisibility(): boolean; + private _needUpdateCanvasSize; + /** + * @en Update the canvas size + * @param delay If true, the change will be executed with a delay + * @zh 更新canvas大小 + * @param delay 是否延迟执行改动,如果为true,将延迟执行 + */ + updateCanvasSize(delay?: boolean): void; + /** + * @en Synchronize the final canvas size + * @zh 同步最终canvas大小 + */ + needUpdateCanvasSize(): void; + /** + * @en Set the screen size. The scene will adapt to the screen size. This method can be called dynamically to change the game display size. + * @param screenWidth The width of the screen. + * @param screenHeight The height of the screen. + * @zh 设置屏幕大小,场景会根据屏幕大小进行适配。可以动态调用此方法,来更改游戏显示的大小。 + * @param screenWidth 屏幕宽度。 + * @param screenHeight 屏幕高度。 + */ + setScreenSize(screenWidth: number, screenHeight: number): void; + /** + * @en Set screen size for scene rotation, required by layaverse + * @param screenWidth The width of the screen + * @param screenHeight The height of the screen + * @param screenMode The screen mode. "none" is the default value, "horizontal" for landscape mode, "vertical" for portrait mode + * @zh 设置场景旋转的屏幕大小,layaverse 需要 + * @param screenWidth 屏幕宽度 + * @param screenHeight 屏幕高度 + * @param screenMode 屏幕模式。"none"为默认值,"horizontal"为横屏,"vertical"为竖屏 + */ + setScreenSizeForScene(screenWidth: number, screenHeight: number, screenMode: string): { + stageWidth: number; + stageHeight: number; + canvasWidth: number; + canvasHeight: number; + scaleX: number; + scaleY: number; + }; + /**@private */ + private _formatData; + /** + * @en The scale mode. Default value is "noscale". + * Available values: + * - "noscale": No scaling. + * - "showall": The canvas matches the design width and height, and the stage is scaled proportionally to the maximum size while ensuring the design content remains fully visible. + * - "full": No scaling, the stage width and height equal to the screen width and height. + * - "fixedwidth": Fixed width, height scales according to the screen ratio. + * - "fixedheight": Fixed height, width scales according to the screen ratio. + * - "fixedauto": Automatically choose between fixedwidth or fixedheight based on the aspect ratio. + * @zh 缩放模式。默认值为 "noscale"。 + * 取值范围: + * - "noscale":不缩放,舞台与画布采用设计宽高。 + * - "showall":画布等于设计宽高,在保障设计内容可见的前提下,按设计宽高对舞台等比缩放至最大。 + * - "full":不缩放,舞台与画布的宽高等于屏幕宽高。 + * - "fixedwidth":宽度不变,高度根据屏幕比缩放。 + * - "fixedheight":高度不变,宽度根据屏幕比缩放。 + * - "fixedauto":根据宽高比,自动选择使用fixedwidth或fixedheight。 + */ + get scaleMode(): string; + set scaleMode(value: string); + /** + * @en Horizontal alignment of canvas. Default value is "left". + * Available values: + * - "left": Align to the left. + * - "center": Align to the center. + * - "right": Align to the right. + * @zh 画布水平对齐方式。默认值为"left"。 + * 取值范围: + * - "left":居左对齐。 + * - "center":居中对齐。 + * - "right":居右对齐。 + */ + get alignH(): string; + set alignH(value: string); + /** + * @en Vertical alignment of canvas. Default value is "top". + * Available values: + * - "top": Align to the top. + * - "middle": Align to the middle. + * - "bottom": Align to the bottom. + * @zh 画布垂直对齐方式。默认值为"top"。 + * 取值范围: + * - "top":居顶部对齐。 + * - "middle":居中对齐。 + * - "bottom":居底部对齐。 + */ + get alignV(): string; + set alignV(value: string); + /** + * @en The background color of the stage. Default is black, null for transparent. + * @zh 舞台的背景颜色,默认为黑色,null为透明。 + */ + get bgColor(): string; + set bgColor(value: string); + /** + * @en The X coordinate of the mouse on the Stage. + * @zh 鼠标在 舞台 上的 X 轴坐标。 + */ + get mouseX(): number; + /** + * @en The Y coordinate of the mouse on the Stage. + * @zh 鼠标在 舞台 上的 Y 轴坐标。 + */ + get mouseY(): number; + /** + * @en Get the mouse coordinate information on the screen + * @returns Screen point information + * @zh 获得屏幕上的鼠标坐标信息 + * @returns 屏幕点信息 + */ + getMousePoint(): Point; + /** + * @en The X-axis scaling factor caused by the current viewport scaling mode. + * @zh 当前视窗由缩放模式导致的 X 轴缩放系数。 + */ + get clientScaleX(): number; + /** + * @en The Y-axis scaling factor caused by the current viewport scaling mode. + * @zh 当前视窗由缩放模式导致的 Y 轴缩放系数。 + */ + get clientScaleY(): number; + /** + * @en The scene layout type. + * Available values: + * - "none": Do not change the screen + * - "horizontal": Automatic landscape mode + * - "vertical": Automatic portrait mode + * @zh 场景布局类型。 + * 取值范围: + * - "none":不更改屏幕 + * - "horizontal":自动横屏 + * - "vertical":自动竖屏 + */ + get screenMode(): string; + set screenMode(value: string); + /** + * @en Redraw + * @param type The type of redraw + * @zh 重新绘制 + * @param type 重新绘制类型 + */ + repaint(type?: number): void; + /** + * @en Redraw the parent node + * @param type The type of redraw + * @zh 重新绘制父节点 + * @param type 重新绘制类型 + */ + parentRepaint(type?: number): void; + /** + * @en Get frame start time. + * @zh 获取帧开始时间 + */ + getFrameTm(): number; + /** + * @en Get the time elapsed since the current frame started, in milliseconds. + * This can be used to judge the time consumption within functions, reasonably control the processing time of each frame function, avoid doing too much in one frame, and process complex calculations across frames, which can effectively reduce frame rate fluctuations. + * @zh 获得距当前帧开始后,过了多少时间,单位为毫秒。 + * 可以用来判断函数内时间消耗,通过合理控制每帧函数处理消耗时长,避免一帧做事情太多,对复杂计算分帧处理,能有效降低帧率波动。 + */ + getTimeFromFrameStart(): number; + /** + * @en Indicates whether it is visible, default is true. If set to invisible, the node will not be rendered. + * @zh 表示是否可见,默认为true。如果设置不可见,节点将不被渲染。 + */ + get visible(): boolean; + set visible(value: boolean); + /** + * @en Render all display objects on the stage + * @param context2D The rendering context + * @param x The x-axis coordinate + * @param y The y-axis coordinate + * @zh 渲染舞台上的所有显示对象 + * @param context2D 渲染的上下文 + * @param x 横轴坐标 + * @param y 纵轴坐标 + */ + render(context2D: Context, x: number, y: number): void; + /** + * @param context2D The rendering context + * @param x The x-axis coordinate + * @param y The y-axis coordinate + * @perfTag PerformanceDefine.T_UIRender + */ + private _render2d; + private _runComponents; + private _updateTimers; + /** + * @en Whether to enable fullscreen mode. Users can enter fullscreen mode by clicking. + * Compatibility note: Some browsers, such as iPhone, do not allow entering fullscreen mode by clicking. + * @zh 是否开启全屏,用户点击后进入全屏。 + * 兼容性提示:部分浏览器不允许点击进入全屏,比如iPhone等。 + */ + set fullScreenEnabled(value: boolean); + /** + * @zh Exit full screen mode + * @en 退出全屏模式 + */ + exitFullscreen(): void; + /** + * @en Frame rate types:fast (default, full frame rate),slow (half of the full frame rate),mouse (full frame rate after mouse activity, switches to half frame rate if the mouse is idle for 2 seconds),sleep (1 frame per second) + * @zh 当前帧率类型:fast(默认,满帧),slow(满帧减半),mouse(鼠标活动后满帧,鼠标不动2秒后满帧减半),sleep(每秒1帧)。 + */ + get frameRate(): string; + set frameRate(value: string); + /**@ignore */ + isGlobalRepaint(): boolean; + /**@ignore */ + setGlobalRepaint(): void; + } + /** + * @en The Text class is used to create display objects to show text. + * Note: If the runtime system cannot find the specified font, it will render the text with the system default font, which may cause display anomalies. (Usually, it displays normally on computers, but may display abnormally on some mobile devices due to the lack of the set font.) + * - Event.CHANGE event dispatched after the text content changes. + * @zh Text类用于创建显示对象以显示文本。 + * 注意:如果运行时系统找不到设定的字体,则用系统默认的字体渲染文字,从而导致显示异常。(通常电脑上显示正常,在一些移动端因缺少设置的字体而显示异常)。 + * - Event.CHANGE 事件表示文本内容发生改变后调度。 + */ + class Text extends Sprite { + /** + * @en Visible without any clipping. + * @zh visible不进行任何裁切。 + */ + static VISIBLE: string; + /** + * @en Scroll does not display character pixels outside the text area and supports the scroll interface. + * @zh scroll 不显示文本域外的字符像素,并且支持 scroll 接口。 + */ + static SCROLL: string; + /** + * @en Hidden does not display characters beyond the text area. + * @zh hidden 不显示超出文本域的字符。 + */ + static HIDDEN: string; + /** + * @en Shrink the entire text to fit the text box when it exceeds the text area. + * @zh shrink 超出文本域时,文本整体缩小以适应文本框。 + */ + static SHRINK: string; + /** + * @en Ellipsis truncates the text and displays an ellipsis at the end when it exceeds the text area. + * @zh ellipsis 超出文本域时,文本被截断,并且文本最后显示省略号。 + */ + static ELLIPSIS: string; + /** + * @en Language pack, a collection of key:value pairs, indexed by key, replaced with target value language. + * @zh 语言包,是一个包含key:value的集合,用key索引,替换为目标value语言。 + */ + static langPacks: Record; + /** + * @en Whether the display order is from right to left. + * @zh 是否是从右向左的显示顺序。 + */ + static RightToLeft: boolean; + /** + * @en Predicted length text, used to improve calculation efficiency, find the largest character for different languages. + * @zh 预测长度的文字,用来提升计算效率,不同语言找一个最大的字符即可。 + */ + static _testWord: string; + static _passwordChar: string; + /** + * @en Dictionary of bitmap fonts. + * @zh 位图字体字典。 + */ + private static _bitmapFonts; + /** + * @en Mark whether this text ignores the language pack. + * @zh 标记此文本是否忽略语言包。 + */ + ignoreLang: boolean; + /** + * @en Represents the text content string. + * @zh 表示文本内容字符串。 + */ + protected _text: string; + /** + * @en Represents the text overflow property. + * @zh 表示文本的溢出属性。 + */ + protected _overflow: string; + /** + * @en Split render. + * @zh 拆分渲染。 + */ + protected _singleCharRender: boolean; + protected _textStyle: TextStyle; + protected _prompt: string; + /** + * @en The color of the input prompt. + * @zh 输入提示符颜色。 + */ + protected _promptColor: string; + /** + * @en The background color of the text, represented as a string. + * @zh 文本背景颜色,以字符串表示。 + */ + protected _bgColor: string; + /** + * @en The border color of the text background, represented as a string. + * @zh 文本边框背景颜色,以字符串表示。 + */ + protected _borderColor: string; + /** + * @en The default padding information. + * [top padding, right padding, bottom padding, left padding] (in pixels). + * @zh 默认边距信息 + * [上边距,右边距,下边距,左边距](边距以像素为单位)。 + */ + protected _padding: number[]; + /** + * @en Indicates whether the text field using this text format automatically wraps. + * If the value of wordWrap is true, the text field automatically wraps; if the value is false, the text field does not automatically wrap. + * @zh 表示使用此文本格式的文本字段是否自动换行。 + * 如果 wordWrap 的值为 true,则该文本字段自动换行;如果值为 false,则该文本字段不自动换行。 + */ + protected _wordWrap: boolean; + protected _htmlParseOptions: HtmlParseOptions; + protected _templateVars: Record; + /** + * @en Indicates whether the text content has changed. + * @zh 表示文本内容是否发生改变。 + */ + protected _isChanged: boolean; + /** + * @en Indicates the width of the text in pixels. + * @zh 表示文本的宽度,以像素为单位。 + */ + protected _textWidth: number; + /** + * @en Indicates the height of the text in pixels. + * @zh 表示文本的高度,以像素为单位。 + */ + protected _textHeight: number; + protected _realFont: string; + protected _bitmapFont: BitmapFont; + protected _scrollPos: Point | null; + protected _bgDrawCmd: DrawRectCmd; + protected _html: boolean; + protected _ubb: boolean; + protected _lines: Array; + protected _elements: Array; + protected _objContainer: Sprite; + protected _maxWidth: number; + protected _hideText: boolean; + private _updatingLayout; + private _fontSizeScale; + /** + * An callback function for wrappers to do something after layout updated. + */ + _onPostLayout: () => void; + /** + * @en Constructor method of Text. + * @zh 文本的构造方法 + */ + constructor(); + /** + * @en Register a bitmap font. + * @param name The name of the bitmap font. + * @param bitmapFont The bitmap font file. + * @zh 注册位图字体。 + * @param name 位图字体的名称。 + * @param bitmapFont 位图字体文件。 + */ + static registerBitmapFont(name: string, bitmapFont: BitmapFont): void; + /** + * @en Remove a registered bitmap font file. + * @param name The name of the bitmap font. + * @param destroy Whether to destroy the specified font file. Default is true. + * @zh 移除注册的位图字体文件。 + * @param name 位图字体的名称。 + * @param destroy 是否销毁指定的字体文件。默认为 true。 + */ + static unregisterBitmapFont(name: string, destroy?: boolean): void; + /** + * @en Destroy the text. + * @param destroyChild Whether to destroy child nodes. Default is true. + * @zh 销毁文本。 + * @param destroyChild 是否销毁子节点。默认为 true。 + */ + destroy(destroyChild?: boolean): void; + /** + * @en Get the scrollable visible window. + * @param realSize Whether to use the real size of the image. Default is false. + * @zh 获取滚动可视视窗。 + * @param realSize 是否使用图片的真实大小。默认为 false。 + */ + getGraphicBounds(realSize?: boolean): Rectangle; + /** + * @en The width of the text in pixels. + * @zh 文本的宽度,以像素为单位。 + */ + get textWidth(): number; + /** + * @en The height of the text in pixels. + * @zh 文本的高度,以像素为单位。 + */ + get textHeight(): number; + /** + * @en The current content string of the text. + * @zh 当前文本的内容字符串。 + */ + get text(): string; + set text(value: string); + /** + * @deprecated + * @param text 文本 + */ + changeText(text: string): void; + /** + * @en The font name of the text, represented as a string. + * The default value is "Arial", which can be set through Config.defaultFont. + * If the runtime system cannot find the specified font, it will render the text with the system default font, which may cause display anomalies. (Usually, it displays normally on computers, but may display abnormally on some mobile devices due to the lack of the set font.) + * @zh 文本的字体名称,以字符串形式表示。 + * 默认值为:"Arial",可以通过Config.defaultFont设置默认字体。 + * 如果运行时系统找不到设定的字体,则用系统默认的字体渲染文字,从而导致显示异常。(通常电脑上显示正常,在一些移动端因缺少设置的字体而显示异常)。 + */ + get font(): string; + set font(value: string); + /** + * @en Specifies the font size of the text in pixels. + * The default is 20 pixels, which can be set through Config.defaultFontSize. + * @zh 指定文本的字体大小(以像素为单位)。 + * 默认为20像素,可以通过 Config.defaultFontSize 设置默认大小。 + */ + get fontSize(): number; + set fontSize(value: number); + /** + * @en Represents the color value of the text. The default color can be set through Text.defaultColor. + * The default value is black. + * @zh 表示文本的颜色值。可以通过 Text.defaultColor 设置默认颜色。 + * 默认值为黑色。 + */ + get color(): string; + set color(value: string); + /** + * @en Specifies whether the text is bold. + * The default value is false, which means bold is not used. If the value is true, the text is bold. + * @zh 指定文本是否为粗体字。 + * 默认值为 false,这意味着不使用粗体字。如果值为 true,则文本为粗体字。 + */ + get bold(): boolean; + set bold(value: boolean); + /** + * @en Indicates whether the text using this text format is italic. + * The default value is false, which means italic is not used. If the value is true, the text is italic. + * @zh 表示使用此文本格式的文本是否为斜体。 + * 默认值为 false,这意味着不使用斜体。如果值为 true,则文本为斜体。 + */ + get italic(): boolean; + set italic(value: boolean); + /** + * @en Represents the horizontal alignment of the text. + * Possible values: + * - "left": Left-aligned. + * - "center": Center-aligned. + * - "right": Right-aligned. + * @zh 表示文本的水平显示方式。 + * 取值: + * - "left": 居左对齐显示。 + * - "center": 居中对齐显示。 + * - "right": 居右对齐显示。 + */ + get align(): string; + set align(value: string); + /** + * @en Represents the vertical alignment of the text. + * Possible values: + * - "top": Top-aligned. + * - "middle": Middle-aligned. + * - "bottom": Bottom-aligned. + * @zh 表示文本的垂直显示方式。 + * 取值: + * - "top": 居顶部对齐显示。 + * - "middle": 居中对齐显示。 + * - "bottom": 居底部对齐显示。 + */ + get valign(): string; + set valign(value: string); + /** + * @en Alignment of images and text in mixed content. Possible values are top, middle, bottom. + * @zh 图文混排时图片和文字的对齐方式。可选值是 top, middle, bottom。 + */ + get alignItems(): string; + set alignItems(value: string); + /** + * @en Indicates whether the text automatically wraps, default is false. + * If true, the text will automatically wrap; otherwise, it will not. + * @zh 表示文本是否自动换行,默认为 false。 + * 若值为 true,则自动换行;否则不自动换行。 + */ + get wordWrap(): boolean; + set wordWrap(value: boolean); + /** + * @en Vertical line spacing in pixels. + * @zh 垂直行间距(以像素为单位)。 + */ + get leading(): number; + set leading(value: number); + /** + * @en Margin information. + * Data format: [top margin, right margin, bottom margin, left margin] (margins in pixels). + * @zh 边距信息。 + * 数据格式:[上边距,右边距,下边距,左边距](边距以像素为单位)。 + */ + get padding(): number[]; + set padding(value: number[] | string); + /** + * @en Text background color, represented as a string. + * @zh 文本背景颜色,以字符串表示。 + */ + get bgColor(): string; + set bgColor(value: string); + /** + * @en Text border background color, represented as a string. + * @zh 文本边框背景颜色,以字符串表示。 + */ + get borderColor(): string; + set borderColor(value: string); + /** + * @en Stroke width in pixels. + * The default value is 0, which means no stroke. + * @zh 描边宽度(以像素为单位)。 + * 默认值0,表示不描边。 + */ + get stroke(): number; + set stroke(value: number); + /** + * @en Stroke color, represented as a string. + * The default value is "#000000" (black). + * @zh 描边颜色,以字符串表示。 + * 默认值为 "#000000"(黑色)。 + */ + get strokeColor(): string; + set strokeColor(value: string); + /** + * @en Specifies the behavior when text exceeds the text area. + * Values: visible, hidden, scroll, shrink, ellipsis. + * Effects: + * - visible: All text is visible regardless of text width and height constraints. + * - hidden: Text exceeding width and height will be clipped, best for performance. + * - scroll: Parts exceeding width and height are hidden, can be controlled by scrolling. + * - shrink: Text size automatically adjusts to fit within the width and height. + * - ellipsis: When text exceeds width and height, last few characters are replaced with ellipsis. + * @zh 指定文本超出文本域后的行为。 + * 值为:可见visible、隐藏hidden、滚动scroll、自动收缩shrink、显示省略号ellipsis。 + * 作用: + * - 可见:文本不受文本宽高约束全部可见。 + * - 隐藏:超过文本宽高就会被裁切掉,性能最好。 + * - 滚动:超出宽高的部分被隐藏,可以通过划动控制显示在宽高内区域。 + * - 自动收缩:文本会跟随宽高的大小而自动调整文本的大小,始终全部显示在文本宽高内。 + * - 显示省略号:当文本超出宽高后,未尾的几位字符会替换为省略号,表示当前文本还有未显示的内容。 + */ + get overflow(): string; + set overflow(value: string); + /** + * @en Whether to display underline. + * @zh 是否显示下划线。 + */ + get underline(): boolean; + set underline(value: boolean); + /** + * @en The color of the underline. If null, it uses the font color. + * @zh 下划线的颜色。如果为null,则使用字体颜色。 + */ + get underlineColor(): string; + set underlineColor(value: string); + get strikethrough(): boolean; + set strikethrough(value: boolean); + /** + * 下划线的颜色,为null则使用字体颜色。 + */ + get strikethroughColor(): string; + set strikethroughColor(value: string); + /** + * @en Whether single character rendering is enabled. Enable this if the text content changes frequently, such as an increasing number, to prevent inefficient use of cache. + * @zh 是否启用单个字符渲染。如果Textd的内容一直改变,例如是一个增加的数字,就设置这个,防止无效占用缓存 + */ + get singleCharRender(): boolean; + set singleCharRender(value: boolean); + /** + * @en Whether rich text is enabled, supporting HTML syntax. + * @zh 是否启用富文本,支持HTML语法。 + */ + get html(): boolean; + set html(value: boolean); + /** + * @en Whether UBB syntax parsing is enabled for text. + * @zh 是否启用UBB语法解析文本。 + */ + get ubb(): boolean; + set ubb(value: boolean); + /** + * @en The maximum width allowed for text. When text reaches this width, it will automatically wrap. Set to 0 to disable this limit. + * @zh 文本允许的最大宽度。当文本达到这个宽度时,将自动换行。设置为0则此限制不生效。 + */ + get maxWidth(): number; + set maxWidth(value: number); + /** + * @en Rich text HTML mode options. + * @zh 富文本HTML模式选项。 + */ + get htmlParseOptions(): HtmlParseOptions; + set htmlParseOptions(value: HtmlParseOptions); + /** + * @en Parse the template content. + * @param template The template content. + * @returns The template string with placeholders substituted by their corresponding values from _templateVars. + * @zh 解析模板。 + * @param template 模板内容 + * @returns 模板字符串,其中占位符由_templateVars中的相应值替换。 + */ + protected parseTemplate(template: string): string; + /** + * @en Text Template + * @zh 文本模板 + */ + get templateVars(): Record; + set templateVars(value: Record | boolean); + /** + * @en Set the value of a template variable. + * @param name The name of the template variable. + * @param value The value to set. + * @returns The current Text instance. + * @zh 设置模板值。 + * @param name 模板名 + * @param value 值 + * @returns 当前 Text 实例。 + */ + setVar(name: string, value: any): Text; + /** + * @en The horizontal scroll amount. + * Even if a value outside the scroll range is set, it will be automatically limited to the maximum possible value. + * @zh 横向滚动量。 + * 即使设置超出滚动范围的值,也会被自动限制在可能的最大值处。 + */ + get scrollX(): number; + set scrollX(value: number); + /** + * @en The vertical scroll amount (in pixels). + * Even if a value outside the scroll range is set, it will be automatically limited to the maximum possible value. + * @zh 纵向滚动量(以像素为单位)。 + * 即使设置超出滚动范围的值,也会被自动限制在可能的最大值处。 + */ + get scrollY(): number; + set scrollY(value: number); + /** + * @en The maximum horizontal scrollable value. + * @zh 横向可滚动的最大值。 + */ + get maxScrollX(): number; + /** + * @en The maximum vertical scrollable value. + * @zh 纵向可滚动的最大值。 + */ + get maxScrollY(): number; + /** + * @en The text line information. + * @zh 文字行信息。 + */ + get lines(): ReadonlyArray; + /** + * @en Typeset the text. + * @zh 排版文本。 + */ + typeset(): void; + /** + * @en Refresh the layout with a delay. + * @zh 延迟刷新排版。 + */ + refreshLayout(): void; + /** + * @en The object container. + * @zh 对象容器。 + */ + get objContainer(): Sprite; + /** + * 排版文本。 + * 进行宽高计算,渲染、重绘文本。 + */ + protected _typeset(): void; + /** + * @en Analyze text wrapping. + * @zh 分析文本换行。 + */ + protected doLayout(): void; + /** + * @en Render the text. + * @zh 渲染文字。 + */ + protected renderText(): void; + /** + * @en Draw background + * @zh 绘制背景 + */ + protected drawBg(): void; + } + interface ITextCmd { + x: number; + y: number; + width: number; + height: number; + style: TextStyle; + ctxFont: string; + fontSize: number; + wt: WordText; + obj: IHtmlObject; + linkEnd: boolean; + next: ITextCmd; + prev: ITextCmd; + } + interface ITextLine { + x: number; + y: number; + height: number; + width: number; + cmd: ITextCmd; + } + /** + * @en Effect plugin base class, managed based on the object pool. + * @zh 效果插件基类,基于对象池管理。 + */ + class EffectBase extends Component { + /** + * @en The duration of the animation in milliseconds. + * @zh 动画持续时间,单位为毫秒。 + */ + duration: number; + /** + * @en The delay time of the animation in milliseconds. + * @zh 动画延迟时间,单位为毫秒。 + */ + delay: number; + /** + * @en The repeat count of the animation. Default is to play once. + * @zh 动画的重复次数。默认为播放一次。 + */ + repeat: number; + /** + * @en The type of easing. If empty, it defaults to uniform speed playback. + * @zh 缓动类型,如果为空,则默认为匀速播放。 + */ + ease: string; + /** + * @en The event that triggers the effect. If empty, it triggers upon creation. + * @zh 触发事件,如果为空,则创建时触发。 + */ + eventName: string; + /** + * @en The target object of the effect. If empty, it is the node where the script is located. + * @zh 效用作用的目标对象,如果为空,则是脚本所在的节点本身。 + */ + target: Sprite; + /** + * @en Whether to automatically remove the node when the effect is complete. + * @zh 效果结束后,是否自动移除节点。 + */ + autoDestroyAtComplete: boolean; + protected _comlete: Handler; + protected _tween: Tween; + protected _onAwake(): void; + protected _exeTween(): void; + protected _doTween(): Tween; + /** + * @en Reset the effect properties to their default values. + * @zh 重置效果属性到默认值。 + */ + onReset(): void; + } + /** + * @en Fade in effect + * @zh 淡入效果 + */ + class FadeIn extends EffectBase { + /** + * @override + */ + protected _doTween(): Tween; + } + /** + * @en Fade out effect + * @zh 淡出效果 + */ + class FadeOut extends EffectBase { + /** + * @override + */ + protected _doTween(): Tween; + } + interface ITouchInfo { + touchId: number; + readonly pos: Point; + } + /** + * @en `Event` is a collection of event types. Generally, when an event occurs, the `Event` object is passed as a parameter to the event listener. + * @zh `Event` 是事件类型的集合。一般当发生事件时,`Event` 对象将作为参数传递给事件侦听器。 + */ + class Event { + /** + * @en An empty Event object. Used for event dispatch transfer. + * @zh 一个空的 Event 对象。用于事件派发中转使用。 + */ + static readonly EMPTY: Readonly; + /** + * @en Defines the value of the `type` property of a `mousedown` event object, triggered when pressed on a display object. + * @zh 定义 `mousedown` 事件对象的 `type` 属性值,用于在显示对象上按下后触发。 + */ + static MOUSE_DOWN: string; + /** + * @en Defines the value of the `type` property of a `mouseup` event object, triggered when released on a display object. + * @zh 定义 `mouseup` 事件对象的 `type` 属性值,用于在显示对象抬起后触发。 + */ + static MOUSE_UP: string; + /** + * @en Defines the value of the `type` property of a `rightmousedown` event object. + * @zh 定义 `rightmousedown` 事件对象的 `type` 属性值。 + */ + static RIGHT_MOUSE_DOWN: string; + /** + * @en Defines the value of the `type` property of a `rightmouseup` event object. + * @zh 定义 `rightmouseup` 事件对象的 `type` 属性值。 + */ + static RIGHT_MOUSE_UP: string; + /** + * @en Defines the value of the `type` property of a `click` event object, triggered when a mouse click completes on a display object. + * @zh 定义 `click` 事件对象的 `type` 属性值,用于鼠标点击对象后触发。 + */ + static CLICK: string; + /** + * @en Defines the value of the `type` property of a `rightclick` event object. + * @zh 定义 `rightclick` 事件对象的 `type` 属性值。 + */ + static RIGHT_CLICK: string; + /** + * @en Defines the value of the `type` property of a `mousemove` event object, triggered when mouse moves over a display object. + * @zh 定义 `mousemove` 事件对象的 `type` 属性值,用于鼠标在对象身上进行移动后触发。 + */ + static MOUSE_MOVE: string; + /** + * @en Defines the value of the `type` property of a `mouseover` event object. + * @zh 定义 `mouseover` 事件对象的 `type` 属性值。 + */ + static MOUSE_OVER: string; + /** + * @en Defines the value of the `type` property of a `mouseout` event object. + * @zh 定义 `mouseout` 事件对象的 `type` 属性值。 + */ + static MOUSE_OUT: string; + /** + * @en Defines the value of the `type` property of a `mousewheel` event object. + * @zh 定义 `mousewheel` 事件对象的 `type` 属性值。 + */ + static MOUSE_WHEEL: string; + /** + * @en Defines the value of the `type` property of a `mouseover` event object. + * @zh 定义 `mouseover` 事件对象的 `type` 属性值。 + */ + static ROLL_OVER: string; + /** + * @en Defines the value of the `type` property of a `mouseout` event object, triggered when mouse leaves a display object. + * @zh 定义 `mouseout` 事件对象的 `type` 属性值,用于鼠标离开对象后触发。 + */ + static ROLL_OUT: string; + /** + * @en Defines the value of the `type` property of a `doubleclick` event object. + * @zh 定义 `doubleclick` 事件对象的 `type` 属性值。 + */ + static DOUBLE_CLICK: string; + /** + * @en Defines the value of the `type` property of a `mousedrag` event object. + * @zh 定义 `mousedrag` 事件对象的 `type` 属性值。 + */ + static MOUSE_DRAG: string; + /** + * @en Defines the value of the `type` property of a `mousedragend` event object. + * @zh 定义 `mousedragend` 事件对象的 `type` 属性值。 + */ + static MOUSE_DRAG_END: string; + /** + * @en Defines the value of the `type` property of a `dragstart` event object, triggered when drag start. + * @zh 定义 `dragstart` 事件对象的 `type` 属性值,用于开始拖动后触发。 + */ + static DRAG_START: string; + /** + * @en Defines the value of the `type` property of a `dragmove` event object, triggered when dragging. + * @zh 定义 `dragmove` 事件对象的 `type` 属性值,用于拖动中触发。 + */ + static DRAG_MOVE: string; + /** + * @en Defines the value of the `type` property of a `dragend` event object, triggered when drag end. + * @zh 定义 `dragend` 事件对象的 `type` 属性值,用于拖动结束后触发。 + */ + static DRAG_END: string; + /** + * @en Defines the value of the `type` property of a `keydown` event object. + * @zh 定义 `keydown` 事件对象的 `type` 属性值。 + */ + static KEY_DOWN: string; + /** + * @en Defines the value of the `type` property of a `keypress` event object. + * @zh 定义 `keypress` 事件对象的 `type` 属性值。 + */ + static KEY_PRESS: string; + /** + * @en Defines the value of the `type` property of a `keyup` event object. + * @zh 定义 `keyup` 事件对象的 `type` 属性值。 + */ + static KEY_UP: string; + /** + * @en Defines the value of the `type` property of a `change` event object. + * @zh 定义 `change` 事件对象的 `type` 属性值。 + */ + static CHANGE: string; + /** + * @en Defines the value of the `type` property of a `changed` event object. + * @zh 定义 `changed` 事件对象的 `type` 属性值。 + */ + static CHANGED: string; + /** + * @en Defines the value of the `type` property of a `willResize` event object. + * @zh 定义 `willResize` 事件对象的 `type` 属性值。 + */ + static WILL_RESIZE: string; + /** + * @en Defines the value of the `type` property of a `resize` event object. + * @zh 定义 `resize` 事件对象的 `type` 属性值。 + */ + static RESIZE: string; + /** + * @en Defines the value of the `type` property of an `added` event object. + * @zh 定义 `added` 事件对象的 `type` 属性值。 + */ + static ADDED: string; + /** + * @en Defines the value of the `type` property of a `removed` event object. + * @zh 定义 `removed` 事件对象的 `type` 属性值。 + */ + static REMOVED: string; + /** + * @en Defines the value of the `type` property of a `display` event object. + * @zh 定义 `display` 事件对象的 `type` 属性值。 + */ + static DISPLAY: string; + /** + * @en Defines the value of the `type` property of an `undisplay` event object. + * @zh 定义 `undisplay` 事件对象的 `type` 属性值。 + */ + static UNDISPLAY: string; + /** + * @en Defines the value of the `type` property of an `error` event object. + * @zh 定义 `error` 事件对象的 `type` 属性值。 + */ + static ERROR: string; + /** + * @en Defines the value of the `type` property of a `complete` event object. + * @zh 定义 `complete` 事件对象的 `type` 属性值。 + */ + static COMPLETE: string; + /** + * @en Defines the value of the `type` property of a `loaded` event object. + * @zh 定义 `loaded` 事件对象的 `type` 属性值。 + */ + static LOADED: string; + /** + * @en Defines the value of the `type` property of a `ready` event object. + * @zh 定义 `ready` 事件对象的 `type` 属性值。 + */ + static READY: string; + /** + * @en Defines the value of the `type` property of a `progress` event object. + * @zh 定义 `progress` 事件对象的 `type` 属性值。 + */ + static PROGRESS: string; + /** + * @en Defines the value of the `type` property of an `input` event object. + * @zh 定义 `input` 事件对象的 `type` 属性值。 + */ + static INPUT: string; + /** + * @en Defines the value of the `type` property of a `render` event object. + * @zh 定义 `render` 事件对象的 `type` 属性值。 + */ + static RENDER: string; + /** + * @en Defines the value of the `type` property of an `open` event object. + * @zh 定义 `open` 事件对象的 `type` 属性值。 + */ + static OPEN: string; + /** + * @en Defines the value of the `type` property of a `message` event object. + * @zh 定义 `message` 事件对象的 `type` 属性值。 + */ + static MESSAGE: string; + /** + * @en Defines the value of the `type` property of a `close` event object. + * @zh 定义 `close` 事件对象的 `type` 属性值。 + */ + static CLOSE: string; + /** + * @en Defines the value of the `type` property of a `enterframe` event object. + * @zh 定义 `enterframe` 事件对象的 `type` 属性值。 + */ + static FRAME: string; + /** + * @en Defines the value of the `type` property of an `enter` event object. + * @zh 定义 `enter` 事件对象的 `type` 属性值。 + */ + static ENTER: string; + /** + * @en Defines the value of the `type` property of a `select` event object. + * @zh 定义 `select` 事件对象的 `type` 属性值。 + */ + static SELECT: string; + /** + * @en Defines the value of the `type` property of a `blur` event object. + * @zh 定义 `blur` 事件对象的 `type` 属性值。 + */ + static BLUR: string; + /** + * @en Defines the value of the `type` property of a `focus` event object. + * @zh 定义 `focus` 事件对象的 `type` 属性值。 + */ + static FOCUS: string; + /** + * @en Defines the value of the `type` property of a `visibilitychange` event object. + * @zh 定义 `visibilitychange` 事件对象的 `type` 属性值。 + */ + static VISIBILITY_CHANGE: string; + /** + * @en Defines the value of the `type` property of a `focuschange` event object. + * @zh 定义 `focuschange` 事件对象的 `type` 属性值。 + */ + static FOCUS_CHANGE: string; + /** + * @en Defines the value of the `type` property of a `played` event object. + * @zh 定义 `played` 事件对象的 `type` 属性值。 + */ + static PLAYED: string; + /** + * @en Defines the value of the `type` property of a `paused` event object. + * @zh 定义 `paused` 事件对象的 `type` 属性值。 + */ + static PAUSED: string; + /** + * @en Defines the value of the `type` property of a `stopped` event object. + * @zh 定义 `stopped` 事件对象的 `type` 属性值。 + */ + static STOPPED: string; + /** + * @en Defines the value of the `type` property of a `start` event object. + * @zh 定义 `start` 事件对象的 `type` 属性值。 + */ + static START: string; + /** + * @en Defines the value of the `type` property of an `end` event object. + * @zh 定义 `end` 事件对象的 `type` 属性值。 + */ + static END: string; + /** + * @en Defines the value of the `type` property of a `link` event object. + * @zh 定义 `link` 事件对象的 `type` 属性值。 + */ + static LINK: string; + /** + * @en Defines the value of the `type` property of a `label` event object. + * @zh 定义 `label` 事件对象的 `type` 属性值。 + */ + static LABEL: string; + /** + * @en Triggered when the full screen state changes in the browser. + * @zh 浏览器全屏更改时触发 + */ + static FULL_SCREEN_CHANGE: string; + /** + * @en Triggered when the GPU device is lost. + * @zh 显卡设备丢失时触发 + */ + static DEVICE_LOST: string; + /** + * @en Triggered when the world matrix is updated. + * @zh 世界矩阵更新时触发。 + */ + static TRANSFORM_CHANGED: string; + /** + * @en Triggered when a 3D layer changes. + * @zh 3D layer改变时触发。 + */ + static LAYERCHANGE: string; + /** + * @en Triggered when 3D Static changes. + * @zh 3D Static改变时触发。 + */ + static staticMask: string; + /** + * @en For 2D physics collision or 3D physics trigger start. + * @zh 2D物理碰撞或3D物理触发开始。 + */ + static TRIGGER_ENTER: string; + /** + * @en For 2D physics collision or 3D physics trigger continues. + * @zh 2D物理碰撞或3D物理触发持续。 + */ + static TRIGGER_STAY: string; + /** + * @en For 2D physics collision or 3D physics trigger end. + * @zh 2D物理碰撞或3D物理触发结束。 + */ + static TRIGGER_EXIT: string; + /** + * @en 3DPhysical collision start. + * @zh 3D物理碰撞开始。 + */ + static COLLISION_ENTER: string; + /** + * @en 3DPhysical collision continues. + * @zh 3D物理碰撞持续。 + */ + static COLLISION_STAY: string; + /** + * @en 3DPhysical collision end. + * @zh 3D物理碰撞结束。 + */ + static COLLISION_EXIT: string; + /** + * @en Joint destruction. + * @zh 关节破坏。 + */ + static JOINT_BREAK: string; + /** + * @en Checks whether the specified event type is a mouse event. + * @param type The type of the event. + * @returns True if the specified event type is a mouse event; otherwise, false. + * @zh 检测指定事件类型是否是鼠标事件。 + * @param type 事件的类型。 + * @returns 如果是鼠标事件,则值为 true;否则,值为 false。 + */ + static isMouseEvent(type: string): boolean; + /** + * @en The event type. + * @zh 事件类型。 + */ + type: string; + /** + * @en The triggering object of the event. + * @zh 事件目标触发对象。 + */ + target: any; + /** + * @en The current propagation object of the event. + * @zh 事件当前冒泡对象。 + */ + currentTarget: any; + /** + * @en Unique identifier assigned to the touch point (as an int). + * @zh 分配给触摸点的唯一标识号(作为 int)。 + */ + touchId: number; + /** + * @en The clicked position. + * @zh 点击坐标。 + */ + readonly touchPos: Point; + /** + * @en Specifies whether this is a double-click. + * @zh 是否双击。 + */ + isDblClick: boolean; + /** + * @en The scroll wheel increments. + * @zh 滚轮滑动增量。 + */ + delta: number; + /** + * @en The mouse button. + * - 0: Main button, usually the left button + * - 1: Auxiliary button, usually the middle button (wheel button) + * - 2: Secondary button, usually the right button + * - 3: Fourth button, typically the browser Back button + * - 4: Fifth button, typically the browser Forward button + * @zh 鼠标按键, + * - 0:主按键,通常指鼠标左键 + * - 1:辅助按键,通常指鼠标滚轮中键 + * - 2:次按键,通常指鼠标右键 + * - 3:第四个按钮,通常指浏览器后退按钮 + * - 4:第五个按钮,通常指浏览器的前进按钮 + */ + button: number; + /** + * @en The original browser event. + * @zh 原生浏览器事件。 + */ + nativeEvent: MouseEvent | TouchEvent | WheelEvent | KeyboardEvent; + constructor(); + /** + * @en Sets the event data. + * @param type The type of the event. + * @param currentTarget The triggering object of the event. + * @param target The current propagation object of the event. + * @returns The current Event object. + * @zh 设置事件数据。 + * @param type 事件类型。 + * @param currentTarget 事件目标触发对象。 + * @param target 事件当前冒泡对象。 + * @returns 返回当前 Event 对象。 + */ + setTo(type: string, currentTarget: any, target: any): Event; + /** + * @en Prevents processing of all event listeners on the current node in the event flow after the current one. + * This method does not affect any event listeners on the current node (currentTarget). + * @zh 阻止对事件流中当前节点的后续节点中的所有事件侦听器进行处理。此方法不会影响当前节点 (currentTarget) 中的任何事件侦听器。 + */ + stopPropagation(): void; + /** + * @en The list of touch points. + * @zh 触摸点列表。 + */ + get touches(): ReadonlyArray>; + /** + * @en Indicates whether the Alt key is active (true) or inactive (false). + * @zh 表示 Alt 键是处于活动状态 (true) 还是非活动状态 (false)。 + */ + get altKey(): boolean; + /** + * @en Indicates whether the Ctrl key is active (true) or inactive (false). + * @zh 表示 Ctrl 键是处于活动状态 (true) 还是非活动状态 (false)。 + */ + get ctrlKey(): boolean; + /** + * @en Indicates whether the Shift key is active (true) or inactive (false). + * @zh 表示 Shift 键是处于活动状态 (true) 还是非活动状态 (false)。 + */ + get shiftKey(): boolean; + /** + * @en Indicates whether the Shift key is active (true) or inactive (false). + * @zh 表示 Shift 键是处于活动状态 (true) 还是非活动状态 (false)。 + */ + get metaKey(): boolean; + /** + * @en The event name. + * @zh 事件名称。 + */ + get key(): string; + /** + * @en The event name index. + * @zh 事件名称索引。 + */ + get keyCode(): number; + /** + * @en Contains the character code value of the key pressed or released. The character code value is for English keyboard. + * @zh 包含按下或释放的键的字符代码值。字符代码值为英文键盘值。 + */ + get charCode(): string; + /** + * @en Indicates the location of the key on the keyboard. This is useful for differentiating keys that appear more than once on the keyboard. + * For example, you can use this property to distinguish between the left and right Shift keys: the value of KeyLocation.LEFT for the left Shift key and the value of KeyLocation.RIGHT for the right Shift key. Another example is distinguishing between a key pressed on the standard keyboard (KeyLocation.STANDARD) and the same key pressed on the numeric keypad (KeyLocation.NUM_PAD). + * @zh 表示键在键盘上的位置。这对于区分在键盘上多次出现的键非常有用。 + * 例如,您可以根据此属性的值来区分左 Shift 键和右 Shift 键:左 Shift 键的值为 KeyLocation.LEFT,右 Shift 键的值为 KeyLocation.RIGHT。另一个示例是区分标准键盘 (KeyLocation.STANDARD) 与数字键盘 (KeyLocation.NUM_PAD) 上按下的数字键。 + */ + get keyLocation(): number; + /** + * @en The X axis coordinate of the mouse on the Stage. + * @zh 鼠标在 Stage 上的 X 轴坐标。 + */ + get stageX(): number; + /** + * @en The Y axis coordinate of the mouse on the Stage. + * @zh 鼠标在 Stage 上的 Y 轴坐标。 + */ + get stageY(): number; + } + /** + * @en The `EventDispatcher` class is the base class for all classes that dispatch events. + * @zh `EventDispatcher` 类是可调度事件的所有类的基类。 + */ + class EventDispatcher { + /**@private */ + private _events; + /** + * @en Check if the EventDispatcher object has any listeners registered for a specific type of event. + * @param type The type of event. + * @returns True if a listener of the specified type is registered, false otherwise. + * @zh 检查 EventDispatcher 对象是否为特定事件类型注册了任何侦听器。 + * @param type 事件的类型。 + * @returns 如果指定类型的侦听器已注册,则值为 true;否则,值为 false。 + */ + hasListener(type: string): boolean; + /** + * @en Dispatch an event. + * @param type The type of event. + * @param data (Optional) Data to pass to the callback. If multiple parameters p1, p2, p3, ... need to be passed, use an array structure such as [p1, p2, p3, ...]. If a single parameter p needs to be passed and p is an array, use a structure such as [p]. For other single parameters p, you can directly pass parameter p. + * @returns True if there are listeners for this event type, false otherwise. + * @zh 派发事件。 + * @param type 事件类型。 + * @param data (可选)回调数据。注意:如果是需要传递多个参数 p1,p2,p3,...可以使用数组结构如:[p1,p2,p3,...] ;如果需要回调单个参数 p ,且 p 是一个数组,则需要使用结构如:[p],其他的单个参数 p ,可以直接传入参数 p。 + * @returns 此事件类型是否有侦听者,如果有侦听者则值为 true,否则值为 false。 + */ + event(type: string, data?: any): boolean; + /** + * @en Register an event listener object with the EventDispatcher object so that the listener receives event notifications. + * @param type The type of event. + * @param listener The listener function. + * @returns This EventDispatcher object. + * @zh 使用 EventDispatcher 对象注册指定类型的事件侦听器对象,以使侦听器能够接收事件通知。 + * @param type 事件的类型。 + * @param listener 事件侦听函数。 + * @returns 此 EventDispatcher 对象。 + */ + on(type: string, listener: Function): EventDispatcher; + /** + * @en Register an event listener object with the EventDispatcher object so that the listener receives event notifications. + * @param type The type of event. + * @param caller The execution scope of the event listener function. + * @param listener The listener function. + * @param args (Optional) The callback parameters of the event listener function. + * @returns This EventDispatcher object. + * @zh 使用 EventDispatcher 对象注册指定类型的事件侦听器对象,以使侦听器能够接收事件通知。 + * @param type 事件的类型。 + * @param caller 事件侦听函数的执行域。 + * @param listener 事件侦听函数。 + * @param args (可选)事件侦听函数的回调参数。 + * @returns 此 EventDispatcher 对象。 + */ + on(type: string, caller: any, listener: Function, args?: any[]): EventDispatcher; + /** + * @en Register an event listener object with the EventDispatcher object so that the listener receives event notifications. This event listener responds once and is automatically removed after the first call. + * @param type The type of event. + * @param listener The listener function. + * @returns This EventDispatcher object. + * @zh 使用 EventDispatcher 对象注册指定类型的事件侦听器对象,以使侦听器能够接收事件通知,此侦听事件响应一次后自动移除。 + * @param type 事件的类型。 + * @param listener 事件侦听函数。 + * @returns 此 EventDispatcher 对象。 + */ + once(type: string, listener: Function): EventDispatcher; + /** + * @en Register an event listener object with the EventDispatcher object so that the listener receives event notifications. This event listener responds once and is automatically removed after the first call. + * @param type The type of event. + * @param caller The execution scope of the event listener function. + * @param listener The listener function. + * @param args (Optional) The callback parameters of the event listener function. + * @returns This EventDispatcher object. + * @zh 使用 EventDispatcher 对象注册指定类型的事件侦听器对象,以使侦听器能够接收事件通知,此侦听事件响应一次后自动移除。 + * @param type 事件的类型。 + * @param caller 事件侦听函数的执行域。 + * @param listener 事件侦听函数。 + * @param args (可选)事件侦听函数的回调参数。 + * @returns 此 EventDispatcher 对象。 + */ + once(type: string, caller: any, listener: Function, args?: any[]): EventDispatcher; + /** + * @en Remove a listener from the EventDispatcher object. + * @param type The type of event. + * @param listener The listener function. + * @returns This EventDispatcher object. + * @zh 从 EventDispatcher 对象中删除侦听器。 + * @param type 事件的类型。 + * @param listener 事件侦听函数。 + * @returns 此 EventDispatcher 对象。 + */ + off(type: string, listener: Function): EventDispatcher; + /** + * @en Remove a listener from the EventDispatcher object. + * @param type The type of event. + * @param caller The execution scope of the event listener function. + * @param listener (Optional) The listener function. + * @param args (Optional) The callback parameters of the event listener function. + * @returns This EventDispatcher object. + * @zh 从 EventDispatcher 对象中删除侦听器。 + * @param type 事件的类型。 + * @param caller 事件侦听函数的执行域。 + * @param listener (可选)事件侦听函数。 + * @param args (可选)事件侦听函数的回调参数。 + * @returns 此 EventDispatcher 对象。 + */ + off(type: string, caller: any, listener?: Function, args?: any[]): EventDispatcher; + /** + * @en Remove all listeners of the specified event type from the EventDispatcher object. + * @param type (Optional) The type of event. If the value is null, all types of listeners on this object are removed. + * @returns This EventDispatcher object. + * @zh 从 EventDispatcher 对象中删除指定事件类型的所有侦听器。 + * @param type (可选)事件类型,如果值为 null,则移除本对象所有类型的侦听器。 + * @returns 此 EventDispatcher 对象。 + */ + offAll(type?: string): EventDispatcher; + /** + * @en Remove all event listeners whose caller is the specified target. + * @param caller The target caller object. + * @returns This EventDispatcher object. + * @zh 移除caller为target的所有事件监听。 + * @param caller caller对象 + * @returns 此 EventDispatcher 对象。 + */ + offAllCaller(caller: any): EventDispatcher; + } + class InputManager { + /** + * @en Whether to enable multi-touch support. + * @zh 是否开启多点触控支持。 + */ + static multiTouchEnabled: boolean; + /** + * @en Whether to enable mouse/touch events. Default is true. + * @zh 是否开启鼠标/触摸事件。默认为 true。 + */ + static mouseEventsEnabled: boolean; + /** + * @en Whether to enable keyboard events. Default is true. + * @zh 是否开启键盘事件。默认为 true。 + */ + static keyEventsEnabled: boolean; + /** + * @en The threshold for considering a mouse press and release as a click. If the distance between the press and release positions exceeds this value, it is not considered a click. + * @zh 鼠标按下和弹起位置之间的距离阀值,用以判断是否视为一次点击。如果超过这个距离,则不视为点击。 + */ + static clickTestThreshold: number; + /** + * @en The X coordinate of the mouse on the canvas. + * @zh canvas 上鼠标的 X 坐标。 + */ + static mouseX: number; + /** + * @en The Y coordinate of the mouse on the canvas. + * @zh canvas 上鼠标的 Y 坐标。 + */ + static mouseY: number; + /** + * @en Indicates whether text input is currently active. + * @zh 表示当前是否正在输入文字。 + */ + static isTextInputting: boolean; + /** + * @en Indicates whether the current platform is iOS's WKWebView. + * @zh 表示当前是否是 iOS 的 WKWebView 平台。 + */ + static isiOSWKwebView: boolean; + /** + * @en Used for IDE processing. + * @zh 用于IDE处理。 + */ + protected _eventType: number; + protected _nativeEvent: MouseEvent | WheelEvent | TouchEvent; + protected _pressKeys: Set; + protected _keyEvent: Event; + private _lastTouchTime; + private _lastTouchId; + /** + * @ignore + */ + constructor(); + static get inst(): InputManager; + /** + * @en Get the touch position. + * @param touchId The ID of the touch point. If not provided, the position of the first touch point will be returned. + * @returns The position of the touch point. + * @zh 获取触摸位置。 + * @param touchId 触摸点ID。如果不提供,将返回第一个触摸点的位置。 + * @returns 触摸点的位置。 + */ + static getTouchPos(touchId?: number): Readonly; + /** + * @en Get the current touch target node. + * @zh 获取当前触摸目标节点。 + */ + static get touchTarget(): Node; + /** + * @en Get the array of current touch information. + * @zh 获取当前触摸信息的数组。 + */ + static get touches(): ReadonlyArray>; + /** + * @en Get the number of current touches. + * @zh 获取当前触摸数量。 + */ + static get touchCount(): number; + /** + * @en Cancel the click event for a touch point. + * @param touchId The ID of the touch event to cancel. + * @zh 取消指定触摸点的点击事件。 + * @param touchId 要取消的触摸事件ID。 + */ + static cancelClick(touchId?: number): void; + /** + * @en Check if a specific key is pressed. + * @param key The key value. For more information, see: https://developer.mozilla.org/en-US/docs/Web/API/UI_Events/Keyboard_event_key_values + * @return Whether the key is pressed. + * @zh 返回指定键是否被按下。 + * @param key 键值。更多信息请参考:https://developer.mozilla.org/en-US/docs/Web/API/UI_Events/Keyboard_event_key_values + * @return 是否被按下。 + */ + static hasKeyDown(key: string | number): boolean; + /** + * @private + * @en Initialization. + * @zh 初始化。 + */ + static __init__(stage: Stage, canvas: HTMLCanvasElement): void; + /** + * @en Handling mouse events + * @param ev Mouse events + * @param type Event types + * @zh 处理鼠标事件 + * @param ev 鼠标事件 + * @param type 事件类型 + */ + handleMouse(ev: MouseEvent | WheelEvent, type: number): void; + /** + * @en Handling touch screen events. + * @param ev Touch screen events. + * @param type Event types. + * @zh 处理触屏事件 + * @param ev 触屏事件 + * @param type 事件类型 + */ + handleTouch(ev: TouchEvent, type: number): void; + private getTouch; + private handleFocus; + /** + * @en Handle keys events + * @param ev Keys events + * @zh 处理按键事件 + * @param ev 按键事件 + */ + handleKeys(ev: KeyboardEvent): void; + /** + * @en Obtain nodes under location points + * @param x The x-coordinate value. + * @param y The y-coordinate value. + * @returns The node under the point or the stage if no node is found. + * @zh 获取位置点下的节点 + * @param x x坐标值。 + * @param y y坐标值。 + * @returns 该点下的对象节点,如果没有找到节点则返回舞台。 + */ + getNodeUnderPoint(x: number, y: number): Node; + /** + * @en Get the sprite under the specified coordinates relative to a Sprite. The x/y values are in the local coordinates of the Sprite. + * @param sp The Sprite relative to which the coordinates are calculated. + * @param x The x-coordinate relative to the Sprite. + * @param y The y-coordinate relative to the Sprite. + * @returns The sprite under the point or null if not found. + * @zh 获取在相对Sprite指定坐标下的sprite。x/y值是Sprite的本地坐标。 + * @param sp 相对哪个Sprite计算坐标。 + * @param x 相对于Sprite的X坐标。 + * @param y 相对于Sprite的Y坐标。 + * @returns 该点下的sprite,如果没有找到则返回null。 + */ + getSpriteUnderPoint(sp: Sprite, x: number, y: number): Sprite; + getSprite3DUnderPoint(x: number, y: number): Node; + /** + * @en Hit test + * @param sp Relative Sprite. + * @param x The x-coordinate relative to the Sprite. + * @param y The y-coordinate relative to the Sprite. + * @param editing Whether the test is performed in editing mode. + * @returns True if the point is within the Sprite's bounds, false otherwise. + * @zh 点击测试 + * @param sp 相对Sprite + * @param x 相对于Sprite的X坐标。 + * @param y 相对于Sprite的Y坐标。 + * @param editing 是否在编辑模式下进行测试。 + * @returns 如果点在Sprite的范围内返回true,否则返回false。 + */ + hitTest(sp: Sprite, x: number, y: number, editing?: boolean): boolean; + private handleRollOver; + } + /** + * @en The `Keyboard` class contains constants representing the most commonly used keys for controlling a game. + * @zh `Keyboard` 类的属性是一些常数,这些常数表示控制游戏时最常用的键。 + */ + class Keyboard { + /** + * @en The constant associated with the key code value (48) for the 0 key. + * @zh 与 0 的键控代码值(48) 关联的常数。 + */ + static NUMBER_0: number; + /** + * @en The constant associated with the key code value (49) for the 1 key. + * @zh 与 1 的键控代码值 (49) 关联的常数。 + */ + static NUMBER_1: number; + /** + * @en The constant associated with the key code value (50) for the 2 key. + * @zh 与 2 的键控代码值 (50) 关联的常数。 + */ + static NUMBER_2: number; + /** + * @en The constant associated with the key code value (51) for the 3 key. + * @zh 与 3 的键控代码值 (51) 关联的常数。 + */ + static NUMBER_3: number; + /** + * @en The constant associated with the key code value (52) for the 4 key. + * @zh 与 4 的键控代码值 (52) 关联的常数。 + */ + static NUMBER_4: number; + /** + * @en The constant associated with the key code value (53) for the 5 key. + * @zh 与 5 的键控代码值 (53) 关联的常数。 + */ + static NUMBER_5: number; + /** + * @en The constant associated with the key code value (54) for the 6 key. + * @zh 与 6 的键控代码值 (54) 关联的常数。 + */ + static NUMBER_6: number; + /** + * @en The constant associated with the key code value (55) for the 7 key. + * @zh 与 7 的键控代码值 (55) 关联的常数。 + */ + static NUMBER_7: number; + /** + * @en The constant associated with the key code value (56) for the 8 key. + * @zh 与 8 的键控代码值 (56) 关联的常数。 + */ + static NUMBER_8: number; + /** + * @en The constant associated with the key code value (57) for the 9 key. + * @zh 与 9 的键控代码值 (57) 关联的常数。 + */ + static NUMBER_9: number; + /** + * @en The constant associated with the key code value (65) for the A key. + * @zh 与 A 键的键控代码值 (65) 关联的常数。 + */ + static A: number; + /** + * @en The constant associated with the key code value (66) for the B key. + * @zh 与 B 键的键控代码值 (66) 关联的常数。 + */ + static B: number; + /** + * @en The constant associated with the key code value (67) for the C key. + * @zh 与 C 键的键控代码值 (67) 关联的常数。 + */ + static C: number; + /** + * @en The constant associated with the key code value (68) for the D key. + * @zh 与 D 键的键控代码值 (68) 关联的常数。 + */ + static D: number; + /** + * @en The constant associated with the key code value (69) for the E key. + * @zh 与 E 键的键控代码值 (69) 关联的常数。 + */ + static E: number; + /** + * @en The constant associated with the key code value (70) for the F key. + * @zh 与 F 键的键控代码值 (70) 关联的常数。 + */ + static F: number; + /** + * @en The constant associated with the key code value (71) for the G key. + * @zh 与 G 键的键控代码值 (71) 关联的常数。 + */ + static G: number; + /** + * @en The constant associated with the key code value (72) for the H key. + * @zh 与 H 键的键控代码值 (72) 关联的常数。 + */ + static H: number; + /** + * @en The constant associated with the key code value (73) for the I key. + * @zh 与 I 键的键控代码值 (73) 关联的常数。 + */ + static I: number; + /** + * @en The constant associated with the key code value (74) for the J key. + * @zh 与 J 键的键控代码值 (74) 关联的常数。 + */ + static J: number; + /** + * @en The constant associated with the key code value (75) for the K key. + * @zh 与 K 键的键控代码值 (75) 关联的常数。 + */ + static K: number; + /** + * @en The constant associated with the key code value (76) for the L key. + * @zh 与 L 键的键控代码值 (76) 关联的常数。 + */ + static L: number; + /** + * @en The constant associated with the key code value (77) for the M key. + * @zh 与 M 键的键控代码值 (77) 关联的常数。 + */ + static M: number; + /** + * @en The constant associated with the key code value (78) for the N key. + * @zh 与 N 键的键控代码值 (78) 关联的常数。 + */ + static N: number; + /** + * @en The constant associated with the key code value (79) for the O key. + * @zh 与 O 键的键控代码值 (79) 关联的常数。 + */ + static O: number; + /** + * @en The constant associated with the key code value (80) for the P key. + * @zh 与 P 键的键控代码值 (80) 关联的常数。 + */ + static P: number; + /** + * @en The constant associated with the key code value (81) for the Q key. + * @zh 与 Q 键的键控代码值 (81) 关联的常数。 + */ + static Q: number; + /** + * @en The constant associated with the key code value (82) for the R key. + * @zh 与 R 键的键控代码值 (82) 关联的常数。 + */ + static R: number; + /** + * @en The constant associated with the key code value (83) for the S key. + * @zh 与 S 键的键控代码值 (83) 关联的常数。 + */ + static S: number; + /** + * @en The constant associated with the key code value (84) for the T key. + * @zh 与 T 键的键控代码值 (84) 关联的常数。 + */ + static T: number; + /** + * @en The constant associated with the key code value (85) for the U key. + * @zh 与 U 键的键控代码值 (85) 关联的常数。 + */ + static U: number; + /** + * @en The constant associated with the key code value (86) for the V key. + * @zh 与 V 键的键控代码值 (86) 关联的常数。 + */ + static V: number; + /** + * @en The constant associated with the key code value (87) for the W key. + * @zh 与 W 键的键控代码值 (87) 关联的常数。 + */ + static W: number; + /** + * @en The constant associated with the key code value (88) for the X key. + * @zh 与 X 键的键控代码值 (88) 关联的常数。 + */ + static X: number; + /** + * @en The constant associated with the key code value (89) for the Y key. + * @zh 与 Y 键的键控代码值 (89) 关联的常数。 + */ + static Y: number; + /** + * @en The constant associated with the key code value (90) for the Z key. + * @zh 与 Z 键的键控代码值 (90) 关联的常数。 + */ + static Z: number; + /** + * @en The constant associated with the key code value (112) for the F1 key. + * @zh 与 F1 的键控代码值 (112) 关联的常数。 + */ + static F1: number; + /** + * @en The constant associated with the key code value (113) for the F2 key. + * @zh 与 F2 的键控代码值 (113) 关联的常数。 + */ + static F2: number; + /** + * @en The constant associated with the key code value (114) for the F3 key. + * @zh 与 F3 的键控代码值 (114) 关联的常数。 + */ + static F3: number; + /** + * @en The constant associated with the key code value (115) for the F4 key. + * @zh 与 F4 的键控代码值 (115) 关联的常数。 + */ + static F4: number; + /** + * @en The constant associated with the key code value (116) for the F5 key. + * @zh 与 F5 的键控代码值 (116) 关联的常数。 + */ + static F5: number; + /** + * @en The constant associated with the key code value (117) for the F6 key. + * @zh 与 F6 的键控代码值 (117) 关联的常数。 + */ + static F6: number; + /** + * @en The constant associated with the key code value (118) for the F7 key. + * @zh 与 F7 的键控代码值 (118) 关联的常数。 + */ + static F7: number; + /** + * @en The constant associated with the key code value (119) for the F8 key. + * @zh 与 F8 的键控代码值 (119) 关联的常数。 + */ + static F8: number; + /** + * @en The constant associated with the key code value (120) for the F9 key. + * @zh 与 F9 的键控代码值 (120) 关联的常数。 + */ + static F9: number; + /** + * @en The constant associated with the key code value (121) for the F10 key. + * @zh 与 F10 的键控代码值 (121) 关联的常数。 + */ + static F10: number; + /** + * @en The constant associated with the key code value (122) for the F11 key. + * @zh 与 F11 的键控代码值 (122) 关联的常数。 + */ + static F11: number; + /** + * @en The constant associated with the key code value (123) for the F12 key. + * @zh 与 F12 的键控代码值 (123) 关联的常数。 + */ + static F12: number; + /** + * @en The constant associated with the key code value (124) for the F13 key. + * @zh 与 F13 的键控代码值 (124) 关联的常数。 + */ + static F13: number; + /** + * @en The constant associated with the key code value (125) for the F14 key. + * @zh 与 F14 的键控代码值 (125) 关联的常数。 + */ + static F14: number; + /** + * @en The constant associated with the key code value (126) for the F15 key. + * @zh 与 F15 的键控代码值 (126) 关联的常数。 + */ + static F15: number; + /** + * @en The constant associated with the pseudo key code (21) for the numeric keypad. + * @zh 与数字键盘的伪键控代码 (21) 关联的常数。 + */ + static NUMPAD: number; + /** + * @en The constant associated with the key code value (96) for the number 0 on the numeric keypad. + * @zh 与数字键盘上的数字 0 的键控代码值 (96) 关联的常数。 + */ + static NUMPAD_0: number; + /** + * @en The constant associated with the key code value (97) for the number 1 on the numeric keypad. + * @zh 与数字键盘上的数字 1 的键控代码值 (97) 关联的常数。 + */ + static NUMPAD_1: number; + /** + * @en The constant associated with the key code value (98) for the number 2 on the numeric keypad. + * @zh 与数字键盘上的数字 2 的键控代码值 (98) 关联的常数。 + */ + static NUMPAD_2: number; + /** + * @en The constant associated with the key code value (99) for the number 3 on the numeric keypad. + * @zh 与数字键盘上的数字 3 的键控代码值 (99) 关联的常数。 + */ + static NUMPAD_3: number; + /** + * @en The constant associated with the key code value (100) for the number 4 on the numeric keypad. + * @zh 与数字键盘上的数字 4 的键控代码值 (100) 关联的常数。 + */ + static NUMPAD_4: number; + /** + * @en The constant associated with the key code value (101) for the number 5 on the numeric keypad. + * @zh 与数字键盘上的数字 5 的键控代码值 (101) 关联的常数。 + */ + static NUMPAD_5: number; + /** + * @en The constant associated with the key code value (102) for the number 6 on the numeric keypad. + * @zh 与数字键盘上的数字 6 的键控代码值 (102) 关联的常数。 + */ + static NUMPAD_6: number; + /** + * @en The constant associated with the key code value (103) for the number 7 on the numeric keypad. + * @zh 与数字键盘上的数字 7 的键控代码值 (103) 关联的常数。 + */ + static NUMPAD_7: number; + /** + * @en The constant associated with the key code value (104) for the number 8 on the numeric keypad. + * @zh 与数字键盘上的数字 8 的键控代码值 (104) 关联的常数。 + */ + static NUMPAD_8: number; + /** + * @en The constant associated with the key code value (105) for the number 9 on the numeric keypad. + * @zh 与数字键盘上的数字 9 的键控代码值 (105) 关联的常数。 + */ + static NUMPAD_9: number; + /** + * @en The constant associated with the key code value (107) for the plus sign (+) on the numeric keypad. + * @zh 与数字键盘上的加号 (+) 的键控代码值 (107) 关联的常数。 + */ + static NUMPAD_ADD: number; + /** + * @en The constant associated with the key code value (110) for the decimal point (.) on the numeric keypad. + * @zh 与数字键盘上的小数点 (.) 的键控代码值 (110) 关联的常数。 + */ + static NUMPAD_DECIMAL: number; + /** + * @en The constant associated with the key code value (111) for the division sign (/) on the numeric keypad. + * @zh 与数字键盘上的除号 (/) 的键控代码值 (111) 关联的常数。 + */ + static NUMPAD_DIVIDE: number; + /** + * @en The constant associated with the key code value (108) for the Enter key on the numeric keypad. + * @zh 与数字键盘上的 Enter 的键控代码值 (108) 关联的常数。 + */ + static NUMPAD_ENTER: number; + /** + * @en The constant associated with the key code value (106) for the multiplication sign (*) on the numeric keypad. + * @zh 与数字键盘上的乘号 (*) 的键控代码值 (106) 关联的常数。 + */ + static NUMPAD_MULTIPLY: number; + /** + * @en The constant associated with the key code value (109) for the minus sign (-) on the numeric keypad. + * @zh 与数字键盘上的减号 (-) 的键控代码值 (109) 关联的常数。 + */ + static NUMPAD_SUBTRACT: number; + /** + * @en The constant associated with the key code value (186) for the semicolon (;) key. + * @zh 与 ; 键的键控代码值 (186) 关联的常数。 + */ + static SEMICOLON: number; + /** + * @en The constant associated with the key code value (187) for the equal sign (=) key. + * @zh 与 = 键的键控代码值 (187) 关联的常数。 + */ + static EQUAL: number; + /** + * @en The constant associated with the key code value (188) for the comma (,) key. + * @zh 与 F15 的键控代码值 (188) 关联的常数。 + */ + static COMMA: number; + /** + * @en The constant associated with the key code value (189) for the minus (-) key. + * @zh 与 - 键的键控代码值 (189) 关联的常数。 + */ + static MINUS: number; + /** + * @en The constant associated with the key code value (190) for the period (.) key. + * @zh 与 . 键的键控代码值 (190) 关联的常数。 + */ + static PERIOD: number; + /** + * @en The constant associated with the key code value (191) for the forward slash (/) key. + * @zh 与 / 键的键控代码值 (191) 关联的常数。 + */ + static SLASH: number; + /** + * @en The constant associated with the key code value (192) for the backquote (`) key. + * @zh 与 ` 键的键控代码值 (192) 关联的常数。 + */ + static BACKQUOTE: number; + /** + * @en The constant associated with the key code value (219) for the left bracket ([) key. + * @zh 与 [ 键的键控代码值 (219) 关联的常数。 + */ + static LEFTBRACKET: number; + /** + * @en The constant associated with the key code value (220) for the backslash (\) key. + * @zh 与 \ 键的键控代码值 (220) 关联的常数。 + */ + static BACKSLASH: number; + /** + * @en The constant associated with the key code value (221) for the right bracket (]) key. + * @zh 与 ] 键的键控代码值 (221) 关联的常数。 + */ + static RIGHTBRACKET: number; + /** + * @en The constant associated with the key code value (222) for the single quote (') key. + * @zh 与 ' 键的键控代码值 (222) 关联的常数。 + */ + static QUOTE: number; + /** + * @en The constant associated with the key code value (18) for the Alternate (Option) key. + * @zh 与 Alternate (Option) 键的键控代码值 (18) 关联的常数。 + */ + static ALTERNATE: number; + /** + * @en The constant associated with the key code value (8) for the Backspace key. + * @zh 与 Backspace 的键控代码值 (8) 关联的常数。 + */ + static BACKSPACE: number; + /** + * @en The constant associated with the key code value (20) for the Caps Lock key. + * @zh 与 Caps Lock 的键控代码值 (20) 关联的常数。 + */ + static CAPS_LOCK: number; + /** + * @en The constant associated with the key code value (15) for the Mac Command key. + * @zh 与 Mac 命令键 (15) 关联的常数。 + */ + static COMMAND: number; + /** + * @en The constant associated with the key code value (17) for the Ctrl key. + * @zh 与 Ctrl 的键控代码值 (17) 关联的常数。 + */ + static CONTROL: number; + /** + * @en The constant associated with the key code value (46) for the Delete key. + * @zh 与 Delete 的键控代码值 (46) 关联的常数。 + */ + static DELETE: number; + /** + * @en The constant associated with the key code value (13) for the Enter key. + * @zh 与 Enter 的键控代码值 (13) 关联的常数。 + */ + static ENTER: number; + /** + * @en The constant associated with the key code value (27) for the Esc key. + * @zh 与 Esc 的键控代码值 (27) 关联的常数。 + */ + static ESCAPE: number; + /** + * @en The constant associated with the key code value (33) for the Page Up key. + * @zh 与 Page Up 的键控代码值 (33) 关联的常数。 + */ + static PAGE_UP: number; + /** + * @en The constant associated with the key code value (34) for the Page Down key. + * @zh 与 Page Down 的键控代码值 (34) 关联的常数。 + */ + static PAGE_DOWN: number; + /** + * @en The constant associated with the key code value (35) for the End key. + * @zh 与 End 的键控代码值 (35) 关联的常数。 + */ + static END: number; + /** + * @en The constant associated with the key code value (36) for the Home key. + * @zh 与 Home 的键控代码值 (36) 关联的常数。 + */ + static HOME: number; + /** + * @en The constant associated with the key code value (37) for the Left Arrow key. + * @zh 与向左箭头键的键控代码值 (37) 关联的常数。 + */ + static LEFT: number; + /** + * @en The constant associated with the key code value (38) for the Up Arrow key. + * @zh 与向上箭头键的键控代码值 (38) 关联的常数。 + */ + static UP: number; + /** + * @en The constant associated with the key code value (39) for the Right Arrow key. + * @zh 与向右箭头键的键控代码值 (39) 关联的常数。 + */ + static RIGHT: number; + /** + * @en The constant associated with the key code value (40) for the Down Arrow key. + * @zh 与向下箭头键的键控代码值 (40) 关联的常数。 + */ + static DOWN: number; + /** + * @en The constant associated with the key code value (16) for the Shift key. + * @zh 与 Shift 的键控代码值 (16) 关联的常数。 + */ + static SHIFT: number; + /** + * @en The constant associated with the key code value (32) for the Spacebar. + * @zh 与空格键的键控代码值 (32) 关联的常数。 + */ + static SPACE: number; + /** + * @en The constant associated with the key code value (9) for the Tab key. + * @zh 与 Tab 的键控代码值 (9) 关联的常数。 + */ + static TAB: number; + /** + * @en The constant associated with the key code value (45) for the Insert key. + * @zh 与 Insert 的键控代码值 (45) 关联的常数。 + */ + static INSERT: number; + } + /** + * @en The `KeyLocation` class contains constants that indicate the location of a key on a keyboard or keyboard-like input device. + * The `KeyLocation` constants are used within the `keyLocation` property of keyboard event objects. + * @zh `KeyLocation` 类包含表示键盘或类似键盘的输入设备上按键位置的常量。 + * `KeyLocation` 常数用在键盘事件对象的 `keyLocation` 属性中。 + */ + class KeyLocation { + /** + * @en Indicates that the active key does not distinguish between the left or right position, + * nor does it distinguish whether it is located on the numeric keypad (or activated by a virtual key corresponding to the numeric keypad). + * @zh 表示激活的键不区分位于左侧还是右侧,也不区分是否位于数字键盘(或者是使用对应于数字键盘的虚拟键激活的)。 + */ + static STANDARD: number; + /** + * @en Indicates that the active key is in the left key location (a key may have multiple possible locations). + * @zh 表示激活的键在左侧键位置(此键可能有多个可能的位置)。 + */ + static LEFT: number; + /** + * @en Indicates that the active key is in the right key location (a key may have multiple possible locations). + * @zh 表示激活的键在右侧键位置(此键可能有多个可能的位置)。 + */ + static RIGHT: number; + /** + * @en Indicates that the active key is on the numeric keypad or activated by a virtual key corresponding to the numeric keypad. + * void; + } + /** + * @en Luminous filter (can also be used as shadow filter) + * @zh 发光滤镜(也可以当成阴影滤使用) + */ + class GlowFilter extends Filter { + /**滤镜的颜色*/ + private _color; + private shaderDataBlur; + private shaderDataCopy; + private textureExtend; + private shaderDataCopy1; + private _flipY; + /** + * @en Creates an instance of a glow filter. + * @param color The color of the glow filter. + * @param blur The size of blurred edges + * @param offX The horizontal offset for the glow effect. + * @param offY The vertical offset for the glow effect. + * @zh 创建一个发光滤镜实例。 + * @param color 发光滤镜的颜色。 + * @param blur 边缘模糊的大小。 + * @param offX 发光效果的水平偏移。 + * @param offY 发光效果的垂直偏移。 + */ + constructor(color: string, blur?: number, offX?: number, offY?: number); + private _fillQuad; + useFlipY(b: boolean): void; + /** + * @en Renders the glow effect based on the source texture. + * @param srctexture The source RenderTexture2D to apply the glow effect on. + * @param width The width of the rendering area. + * @param height The height of the rendering area. + * @zh 根据源纹理渲染发光效果。 + * @param srctexture 应用发光效果的源 RenderTexture2D。 + * @param width 渲染区域的宽度。 + * @param height 渲染区域的高度。 + */ + render(srctexture: RenderTexture2D, width: number, height: number): void; + /** + * @private + * @en Gets Y offset value + * @zh 获取Y偏移值 + */ + get offY(): number; + /** + * @private + * @en Sets Y offset value + * @zh 设置Y偏移值 + */ + set offY(value: number); + /** + * @private + * @en Gets X offset value + * @zh 获取X偏移值 + */ + get offX(): number; + /** + * @private + * @en Sets X offset value + * @zh 设置X偏移值 + */ + set offX(value: number); + /** + * @private + * @en Gets X color value + * @zh 获取颜色值 + */ + get color(): string; + /** + * @private + * @en Sets X color value + * @zh 设置颜色值 + */ + set color(value: string); + /** + * @private + * @en Get the color array from the color utility. + * @zh 从颜色工具获取颜色数组。 + */ + getColor(): any[]; + /** + * @private + * @en Gest fuzzy value + * @zh 获取模糊值 + */ + get blur(): number; + /** + * @private + * @en Sets fuzzy value + * @zh 设置模糊值 + */ + set blur(value: number); + } + /** + * @en Filter mount + * @zh 滤镜接口。 + */ + interface IFilter { + type: number; + } + /** + * @en Enum representing the types of HTML elements. + * @zh 枚举,表示 HTML 元素的类型。 + */ + enum HtmlElementType { + /** + * @en Text element, typically used for raw text content. + * @zh 文本元素,通常用于纯文本内容。 + */ + Text = 0, + /** + * @en Link element, used for creating hyperlinks. + * @zh 链接元素,用于创建超链接。 + */ + Link = 1, + /** + * @en Image element, used for embedding images. + * @zh 图像元素,用于嵌入图像。 + */ + Image = 2, + /** + * @en Input element, used for creating input fields. + * @zh 输入元素,用于创建输入字段。 + */ + Input = 3, + /** + * @en Select element, used for creating dropdown selects. + * @zh 选择元素,用于创建下拉选择框。 + */ + Select = 4, + /** + * @en Object element, used for embedding objects like images, videos, or other media. + * @zh 对象元素,用于嵌入对象,如图像、视频或其他媒体。 + */ + Object = 5 + } + /** + * @en The `HtmlElement` class represents HTML element. + * @zh `HtmlElement` 类表示 HTML 元素。 + */ + class HtmlElement { + /** + * @en The type of the HTML element. + * @zh HTML 元素的类型。 + */ + type: HtmlElementType; + /** + * @en The name of the HTML element. + * @zh HTML 元素的名称。 + */ + name: string; + /** + * @en The text content of the HTML element. + * @zh HTML 元素的文本内容。 + */ + text: string; + /** + * @en The style of the HTML element. + * @zh HTML 元素的样式。 + */ + style: TextStyle; + /** + * @en The object associated with the HTML element. + * @zh 与 HTML 元素关联的对象。 + */ + obj: IHtmlObject; + /** + * @en The space associated with the element, used for layout purposes. + * @zh 与元素关联的空间,用于布局目的。 + */ + space: number; + _attrs: Record; + /** + * @en Creates a new instance of the `HtmlElement` class. + * @zh 创建 `HtmlElement` 类的新实例。 + */ + constructor(); + /** + * @en Gets the value of an attribute from the element. + * @param attrName The name of the attribute to retrieve. + * @returns The value of the attribute. + * @zh 从元素中获取属性的值。 + * @param attrName 属性名称。 + * @returns 属性值。 + */ + getAttr(attrName: string): any; + /** + * @en Sets an attribute on the element with the given value. + * @param attrName The name of the attribute to set. + * @param attrValue The value to set for the attribute. + * @zh 使用给定的值在元素上设置属性。 + * @param attrName 属性名称。 + * @param attrValue 属性值。 + */ + setAttr(attrName: string, attrValue: any): void; + /** + * @en Gets a string attribute value, with an optional default. + * @param attrName The name of the attribute. + * @param defValue The default value to use if the attribute is not found or is not a string. + * @returns The string value of the attribute or the default value. + * @zh 获取字符串属性值,可设置默认值。 + * @param attrName 属性名称。 + * @param defValue 默认值,如果属性不存在或不是字符串。 + * @returns 属性值或默认值。 + */ + getAttrString(attrName: string, defValue?: string): string; + /** + * @en Gets an integer attribute value, with an optional default. + * @param attrName The name of the attribute. + * @param defValue The default value to use if the attribute is not found or is not an integer. + * @returns The integer value of the attribute or the default value. + * @zh 获取整数属性值,可设置默认值。 + * @param attrName 属性名称。 + * @param defValue 默认值,如果属性不存在或不是整数。 + * @returns 属性值或默认值。 + */ + getAttrInt(attrName: string, defValue?: number): number; + /** + * @en Gets a float attribute value, with an optional default. + * @param attrName The name of the attribute. + * @param defValue The default value to use if the attribute is not found or is not a float. + * @returns The float value of the attribute or the default value. + * @zh 获取浮点属性值,可设置默认值。 + * @param attrName 属性名称。 + * @param defValue 默认值,如果属性不存在或不是浮点数。 + * @returns 属性值或默认值。 + */ + getAttrFloat(attrName: string, defValue?: number): number; + /** + * @en Gets a boolean attribute value, with an optional default. + * @param attrName The name of the attribute. + * @param defValue The default value to use if the attribute is not found or is not a boolean. + * @returns The boolean value of the attribute or the default value. + * @zh 获取布尔属性值,可设置默认值。 + * @param attrName 属性名称。 + * @param defValue 默认值,如果属性不存在或不是布尔值。 + * @returns 属性值或默认值。 + */ + getAttrBool(attrName: string, defValue?: boolean): boolean; + /** + * @en Fetches attributes from an external source and assigns them to the element. + * @zh 从外部源获取属性,并将它们分配给元素。 + */ + fetchAttributes(): void; + /** + * @en Resets the properties of the element to their default state, preparing it for reuse from the pool. + * @zh 将元素的属性重置为默认状态,准备从池中重用。 + */ + reset(): void; + /** + * @en A static pool of HtmlElement objects for reuse. + * @zh HtmlElement 对象的静态池。 + */ + static pool: Array; + /** + * @en Retrieves an HtmlElement from the pool with a specified type, initializing it if necessary. + * @zh 从池中检索具有指定类型的 HtmlElement,如有必要则进行初始化。 + */ + static getFromPool(type: HtmlElementType): HtmlElement; + /** + * @en Returns an HtmlElement or an array of HtmlElements back to the pool for reuse. + * @zh 将 HtmlElement 或 HtmlElement 数组返回到池中以供重用。 + */ + static returnToPool(ele: HtmlElement | Array): void; + } + /** + * @en The `HtmlImage` class represents an image object within an HTML element. + * @zh `HtmlImage` 类表示 HTML 元素中的图像对象。 + */ + class HtmlImage implements IHtmlObject { + /** + * @en The sprite object representing the image. + * @zh 表示图像的精灵对象。 + */ + readonly obj: Sprite; + private _owner; + private _element; + private _v; + /** + * @en Creates a new HtmlImage object. + * @zh 创建一个 HtmlImage 对象。 + */ + constructor(); + /** + * @en The associated HTML element. + * @zh 关联的 HTML 元素。 + */ + get element(): HtmlElement; + /** + * @en The width of the image. + * @zh 图像的宽度。 + */ + get width(): number; + /** + * @en The height of the image. + * @zh 图像的高度。 + */ + get height(): number; + /** + * @en Creates and loads the image with the specified owner text and HTML element. + * @param owner The owner text object. + * @param element The HTML element associated with the image. + * @zh 使用指定的文本所有者和 HTML 元素创建并加载图像。 + * @param owner 文本对象的所有者。 + * @param element 与图像关联的 HTML 元素。 + */ + create(owner: Text, element: HtmlElement): void; + protected loadTexture(src: string): void; + /** + * @en Positions the image at the specified coordinates. + * @param x The x-coordinate. + * @param y The y-coordinate. + * @zh 将图像定位到指定的坐标。 + * @param x x 坐标。 + * @param y y 坐标。 + */ + pos(x: number, y: number): void; + /** + * @en Releases resources and removes the image object from its parent container. + * @zh 释放资源并从父容器中移除图像对象。 + */ + release(): void; + /** + * @en Destroys the image object. + * @zh 销毁图像对象。 + */ + destroy(): void; + } + /** + * @en The `HtmlLink` class represents a clickable link area within an HTML element. + * @zh `HtmlLink` 类表示 HTML 元素内可点击的链接区域。 + */ + class HtmlLink implements IHtmlObject, IHitArea { + private _owner; + private _element; + private _shape; + private _rects; + private _rectCnt; + /** + * @en Creates a new instance of the `HtmlLink` class. + * @zh 创建 HtmlLink 类的新实例 + */ + constructor(); + /** + * @en The associated HTML element. + * @zh 关联的 HTML 元素。 + */ + get element(): HtmlElement; + /** + * @en The width of the link area. + * @zh 链接区域的宽度。 + */ + get width(): number; + /** + * @en The height of the link area. + * @zh 链接区域的高度。 + */ + get height(): number; + /** + * @en Creates the link with the specified owner text and HTML element. + * @param owner The owner text object. + * @param element The HTML element associated with the link. + * @zh 使用指定的文本所有者和 HTML 元素创建链接。 + * @param owner 所有者文本对象。 + * @param element 与链接关联的 HTML 元素。 + */ + create(owner: Text, element: HtmlElement): void; + /** + * @en Resets the link area. + * @zh 重置链接区域。 + */ + resetArea(): void; + /** + * @en Adds a rectangle to the hit area. + * @param x The x-coordinate of the rectangle. + * @param y The y-coordinate of the rectangle. + * @param width The width of the rectangle. + * @param height The height of the rectangle. + * @zh 向点击区域添加一个矩形。 + * @param x 矩形的 x 坐标。 + * @param y 矩形的 y 坐标。 + * @param width 矩形的宽度。 + * @param height 矩形的高度。 + */ + addRect(x: number, y: number, width: number, height: number): void; + /** + * @en Checks if the specified point is within the hit area. + * @param x The x-coordinate of the point. + * @param y The y-coordinate of the point. + * @returns `true` if the point is within the hit area, otherwise `false`. + * @zh 检查指定的点是否在点击区域内。 + * @param x 点的 x 坐标。 + * @param y 点的 y 坐标。 + * @returns 如果点在点击区域内,则返回 `true`,否则返回 `false`。 + */ + contains(x: number, y: number): boolean; + /** + * @en Positions the link area at the specified coordinates. This method does nothing. + * @param x The x-coordinate. + * @param y The y-coordinate. + * @zh 将链接区域定位到指定的坐标。此方法不执行任何操作。 + * @param x x 坐标。 + * @param y y 坐标。 + */ + pos(x: number, y: number): void; + /** + * @en Releases resources and removes the link area from its parent container. + * @zh 释放资源并从父容器中移除链接区域。 + */ + release(): void; + /** + * @en Destroys the link area and its associated sprite. + * @zh 销毁链接区域及其关联的精灵。 + */ + destroy(): void; + } + /** + * @en The `HtmlParseOptions` class defines a set of options used for parsing HTML content. + * @zh `HtmlParseOptions` 类定义了一组用于解析 HTML 内容的选项。 + */ + class HtmlParseOptions { + /** + * @en Indicates whether links should be displayed with an underline. + * @zh 指示链接是否应该显示下划线。 + */ + linkUnderline: boolean; + /** + * @en The default color for links. + * @zh 链接的默认颜色。 + */ + linkColor: string; + /** + * @en Indicates whether to ignore white spaces in the HTML content. + * @zh 指示是否忽略 HTML 内容中的空白。 + */ + ignoreWhiteSpace: boolean; + /** + * @en The default value for the `linkUnderline` option. + * @zh `linkUnderline` 选项的默认值。 + */ + static defaultLinkUnderline: boolean; + /** + * @en The default value for the `linkColor` option. + * @zh `linkColor` 选项的默认值。 + */ + static defaultLinkColor: string; + /** + * @ignore + * @en Creates a new instance of the `HtmlParseOptions` class. + * @zh 创建 HtmlParseOptions 类的新实例。 + */ + constructor(); + } + /** + * @en The `HtmlParser` class is responsible for parsing HTML content and converting it into a series of HTML elements with styles. + * @zh `HtmlParser` 类负责解析 HTML 内容,将其转换为一系列具有样式的 HTML 元素。 + */ + class HtmlParser { + /** + * @en The default instance of the HtmlParser class. + * @zh HtmlParser 类的默认实例。 + */ + static defaultParser: HtmlParser; + /** + * @en A mapping of HTML element types to their corresponding classes. + * @zh 将 HTML 元素类型映射到它们对应的类。 + */ + static classMap: Record IHtmlObject>; + protected _styleStack: Array; + protected _styleStackTop: number; + protected _style: TextStyle; + protected _elements: Array; + protected _options: HtmlParseOptions; + /** @ignore */ + constructor(); + /** + * @en Parses the given HTML source and populates the output array with HTML elements. + * @param aSource The HTML source to parse. + * @param style The default text style to apply. + * @param out The array to populate with parsed HTML elements. + * @param options The options for parsing the HTML. + * @zh 解析给定的 HTML 源代码,并将输出数组填充为 HTML 元素。 + * @param aSource 要解析的 HTML 源代码。 + * @param style 要应用的默认文本样式。 + * @param out 要填充解析后的 HTML 元素的数组。 + * @param options 解析 HTML 的选项。 + */ + parse(aSource: string, style: TextStyle, out: Array, options?: HtmlParseOptions): void; + protected pushStyle(): void; + protected popStyle(): void; + protected isNewLine(): boolean; + protected appendText(text: string): void; + } + /** + * @en The `IHtmlObject` interface defines the structure and behavior of objects that can be embedded within HTML content. + * @zh `IHtmlObject` 接口定义了可以嵌入在 HTML 内容中的对象的结构和行为。 + */ + interface IHtmlObject { + /** + * @en The width of the HTML object. + * @zh HTML 对象的宽度。 + */ + width: number; + /** + * @en The height of the HTML object. + * @zh HTML 对象的高度。 + */ + height: number; + /** + * @en The HTML element associated with this object. + * @zh 与此对象关联的 HTML 元素。 + */ + element: HtmlElement; + /** + * @en Indicates whether the HTML object is currently loading. + * @zh 表示 HTML 对象当前是否正在加载。 + */ + loading?: boolean; + /** + * @en Creates the HTML object with the given owner and element. + * @param owner The owner of the HTML object. + * @param element The HTML element to create the object from. + * @zh 使用给定的所有者和元素创建 HTML 对象。 + * @param owner HTML 对象的所有者。 + * @param element 用于创建对象的 HTML 元素。 + */ + create(owner: Text, element: HtmlElement): void; + /** + * @en Positions the HTML object at the specified coordinates. + * @param x The x-coordinate. + * @param y The y-coordinate. + * @zh 将 HTML 对象定位到指定的坐标。 + * @param x x 坐标。 + * @param y y 坐标。 + */ + pos(x: number, y: number): void; + /** + * @en Releases resources associated with the HTML object. + * @zh 释放与 HTML 对象关联的资源。 + */ + release(): void; + /** + * @en Destroys the HTML object and frees up all associated resources. + * @zh 销毁 HTML 对象并释放所有关联的资源。 + */ + destroy(): void; + } + /** + * @en The `IHtmlPageContext` interface represents the context in which HTML content is parsed and rendered, providing methods to create and manage HTML objects. + * @zh `IHtmlPageContext` 接口表示解析和渲染 HTML 内容的上下文环境,提供创建和管理 HTML 对象的方法。 + */ + interface IHtmlPageContext { + /** + * @en Creates an HTML object based on the provided owner and element, which can be embedded within the HTML content. + * @param owner The owner of the HTML object, typically a text container. + * @param element The HTML element from which to create the object. + * @returns An instance of `IHtmlObject` that represents the created HTML object. + * @zh 基于提供的拥有者和元素创建一个 HTML 对象,该对象可以嵌入在 HTML 内容中。 + * @param owner HTML 对象的拥有者,通常是一个文本容器。 + * @param element 用于创建对象的 HTML 元素。 + * @returns `IHtmlObject` 的一个实例,代表创建的 HTML 对象。 + */ + createObject(owner: Text, element: HtmlElement): IHtmlObject; + /** + * @en Frees an HTML object, releasing any resources associated with it. This method is typically called when an object is no longer needed. + * @param obj The HTML object to be freed. + * @zh 释放一个 HTML 对象,释放与其关联的所有资源。通常在不再需要对象时调用此方法。 + * @param obj 要释放的 HTML 对象。 + */ + freeObject(obj: IHtmlObject): void; + } + interface ITagHandler { + (tagName: string, end: boolean, attr: string): string; + } + /** + * @en The `UBBParser` class is responsible for parsing UBB formatted text and converting it to HTML. + * @zh `UBBParser` 类负责解析 UBB 格式的文本,并将其转换为 HTML。 + */ + class UBBParser { + /** + * @en The default instance of the UBBParser class. + * @zh UBBParser 类的默认实例。 + */ + static defaultParser: UBBParser; + private _text; + private _readPos; + protected _handlers: Record; + /** + * @en The default width for image tags. + * @zh 图像标签的默认宽度。 + */ + defaultImgWidth: number; + /** + * @en The default height for image tags. + * @zh 图像标签的默认高度。 + */ + defaultImgHeight: number; + /** + * @en The last color parsed in the text. + * @zh 文本中解析的最后颜色。 + */ + lastColor: string; + /** + * @en The last size parsed in the text. + * @zh 文本中解析的最后大小。 + */ + lastSize: string; + /** + * @ignore + * @en Creates an instance of the `UBBParser` class. + * @zh 创建 `UBBParser` 类的实例。 + */ + constructor(); + protected onTag_URL(tagName: string, end: boolean, attr: string): string; + protected onTag_IMG(tagName: string, end: boolean, attr: string): string; + protected onTag_B(tagName: string, end: boolean, attr: string): string; + protected onTag_I(tagName: string, end: boolean, attr: string): string; + protected onTag_U(tagName: string, end: boolean, attr: string): string; + protected onTag_Simple(tagName: string, end: boolean, attr: string): string; + protected onTag_COLOR(tagName: string, end: boolean, attr: string): string; + protected onTag_FONT(tagName: string, end: boolean, attr: string): string; + protected onTag_SIZE(tagName: string, end: boolean, attr: string): string; + protected getTagText(remove?: boolean): string; + /** + * @en Parses the UBB formatted text and returns the corresponding HTML string. + * @param text The UBB formatted text to parse. + * @param remove Whether to remove UBB tags or convert them to HTML. + * @returns The resulting HTML string. + * @zh 解析 UBB 格式的文本,并返回相应的 HTML 字符串。 + * @param text 要解析的 UBB 格式文本。 + * @param remove 是否移除 UBB 标签或将其转换为 HTML。 + * @returns 生成的 HTML 字符串。 + */ + parse(text: string, remove?: boolean): string; + } + /** + * @en The `XML` class represents an XML node with methods to manipulate and parse XML data. + * @zh `XML` 类表示一个 XML 节点,具有操作和解析 XML 数据的方法。 + */ + class XML { + /** + * @en The name of the XML node. + * @zh XML 节点的名称。 + */ + name: string; + /** + * @en The text content of the XML node. + * @zh XML 节点的文本内容。 + */ + text: string; + private _attrs; + private _children; + /** + * @ignore + * @en Creates a new instance of the `XML` class. + * @param XmlString Optional. The XML source string to parse. + * @zh 创建 `XML` 类的新实例。 + * @param XmlString 可选。要解析的 XML 源字符串。 + */ + constructor(XmlString?: string); + /** + * @en The attributes of the XML node. + * @zh XML 节点的属性。 + */ + get attributes(): Record; + /** + * @en Retrieves the value of an attribute as a string. If the attribute is not found, the default value is returned. + * @param attrName The name of the attribute to retrieve. + * @param defValue The default value to return if the attribute is not found. + * @returns The attribute value as a string, or the default value if the attribute is not present. + * @zh 根据属性名称获取对应的字符串。如果未找到属性,则返回默认值。 + * @param attrName 要检索的属性名称。 + * @param defValue 如果未找到属性,则返回的默认值。 + * @returns 属性的字符串,如果属性不存在,则为默认值。 + */ + getAttrString(attrName: string, defValue?: string): string; + /** + * @en Retrieve the attribute value from the XML node's attributes based on the attribute name, convert it to an integer, and return the default value if the attribute is not found. + * @param attrName The name of the attribute to retrieve. + * @param defValue The default value to return if the attribute is not found or not a number. + * @returns The integer value of an XML node attribute, or the default value if the attribute value does not exist. + * @zh 根据属性名称从 XML 节点的属性中检索属性值,将其转换为整数,如果未找到属性,则返回默认值。 + * @param attrName 要检索的属性名称。 + * @param defValue 如果属性未找到或无法转换为整数,则返回的默认整数值。 + * @returns XML 节点属性的整数值,如果属性值不存在,则为默认值。 + */ + getAttrInt(attrName: string, defValue?: number): number; + /** + * @en Retrieve the attribute value from the XML node's attributes based on the attribute name, convert it to a floating-point number, and return the default value if the attribute is not found. + * @param attrName The name of the attribute to retrieve. + * @param defValue The default value to return if the attribute is not found. + * @returns The floating-point value of an XML node attribute, which is the default value if the attribute value does not exist. + * @zh 根据属性名称从 XML 节点的属性中检索属性值,将其转换为浮点数,如果未找到属性,则返回默认值。 + * @param attrName 要检索的属性名称。 + * @param defValue 如果属性未找到,则返回的默认浮点数。 + * @returns XML 节点属性的浮点数值,如果属性值不存在,则为默认值。 + */ + getAttrFloat(attrName: string, defValue?: number): number; + /** + * @en Retrieve the attribute value from the XML node's attributes based on the attribute name, convert it to a floating-point number, and return the default value if the attribute is not found. + * @param attrName The name of the attribute to retrieve. + * @param defValue The default value to return if the attribute is not found or not a number. + * @returns The floating-point value of an XML node attribute, which is the default value if the attribute value does not exist. + * @zh 根据属性名称从 XML 节点的属性中检索属性值,将其转换为布尔值,如果未找到属性,则返回默认值。 + * @param attrName 要检索的属性名称。 + * @param defValue 如果属性未找到,则返回的默认布尔值。 + * @returns XML 节点属性的布尔值,如果属性值不存在,则为默认值。 + */ + getAttrBool(attrName: string, defValue?: boolean): boolean; + /** + * @en Sets an attribute on the XML node to the specified value. + * @param attrName The name of the attribute to set. + * @param attrValue The value of the attribute to set. + * @zh 设置 XML 节点的属性为指定的值。 + * @param attrName 要设置的属性名称。 + * @param attrValue 要设置的属性值。 + */ + setAttribute(attrName: string, attrValue: string): void; + /** + * @en Retrieves the first child node with the specified name. + * @param selector The name of the child node to find. + * @returns The first child node with the specified name, or null if not found. + * @zh 检索具有指定名称的第一个子节点。 + * @param selector 要查找的子节点名称。 + * @returns 如果找到具有指定名称的第一个子节点,则返回该节点;如果没有找到,则返回 null。 + */ + getNode(selector: string): XML; + /** + * @en Get child elements of the XML node. + * @param selector Optional. A string to filter child elements by name. + * @returns An array of XML objects representing the child elements. + * @zh 获取XML节点的子元素。 + * @param selector 可选。用于按名称筛选子元素的字符串。 + * @returns 表示子元素的XML对象数组。 + */ + elements(selector?: string): Array; + /** + * @en Parses the given XML source string and populates the node and its children according to the XML structure. + * @param aSource The XML source string to parse. + * @zh 解析给定的 XML 源字符串,并根据 XML 结构填充节点及其子节点。 + * @param aSource 要解析的 XML 源字符串。 + */ + parse(aSource: string): void; + /** + * @en Resets the attributes and child nodes of the XML node. + * @zh 重置 XML 节点的属性和子节点。 + */ + reset(): void; + } + /** + * @en The tag type of XML. + * @zh XML 的标签类型 + */ + enum XMLTagType { + /** + * @en Represents the start of an XML element. + * @zh 表示XML元素的开始。 + */ + Start = 0, + /** + * @en Represents the end of an XML element. + * @zh 表示XML元素的结束。 + */ + End = 1, + /** + * @en Represents a void XML element (self-closing tag). + * @zh 表示空的XML元素(自闭合标签)。 + */ + Void = 2, + /** + * @en Represents a CDATA section in XML. + * @zh 表示XML中的CDATA部分。 + */ + CDATA = 3, + /** + * @en Represents an XML comment. + * @zh 表示XML注释。 + */ + Comment = 4, + /** + * @en Represents an XML processing instruction. + * @zh 表示XML处理指令。 + */ + Instruction = 5 + } + /** + * @en XMLIterator class for parsing XML strings. + * @zh XML迭代器类,用于解析XML字符串。 + */ + class XMLIterator { + /** + * @en The name of the current XML tag. + * @zh 当前XML标签的名称。 + */ + static tagName: string; + /** + * @en The type of the current XML tag. + * @zh 当前XML标签的类型。 + */ + static tagType: XMLTagType; + /** + * @en The name of the last processed XML tag. + * @zh 上一个处理的XML标签的名称。 + */ + static lastTagName: string; + /** + * @en The source XML string being parsed. + * @zh 正在解析的源XML字符串。 + */ + static source: string; + /** + * @en The length of the source XML string. + * @zh 源XML字符串的长度。 + */ + static sourceLen: number; + /** + * @en The current parsing position in the source string. + * @zh 源字符串中的当前解析位置。 + */ + static parsePos: number; + /** + * @en The starting position of the current tag in the source string. + * @zh 当前标签在源字符串中的起始位置。 + */ + static tagPos: number; + /** + * @en The length of the current tag. + * @zh 当前标签的长度。 + */ + static tagLength: number; + /** + * @en The ending position of the last processed tag. + * @zh 上一个处理的标签的结束位置。 + */ + static lastTagEnd: number; + /** + * @en Indicates whether attributes have been parsed. + * @zh 指示是否已解析属性。 + */ + static attrParsed: boolean; + /** + * @en Indicates whether tag names should be converted to lowercase. + * @zh 指示是否应将标签名称转换为小写。 + */ + static lowerCaseName: boolean; + private static _attrs; + /** + * @en Initialize the XMLIterator with a source string. + * @param source The XML string to parse. + * @param lowerCaseName Optional. Whether to convert tag names to lowercase. + * @zh 使用源字符串初始化XMLIterator。 + * @param source 要解析的XML字符串。 + * @param lowerCaseName 可选。是否将标签名称转换为小写。 + */ + static begin(source: string, lowerCaseName?: boolean): void; + /** + * @en Parses through the XML source to find the next tag and updates the iterator's state accordingly. + * @returns Returns true if a new tag is found; otherwise, false if the end of the source is reached. + * @zh 解析XML源,查找下一个标签并相应地更新迭代器的状态。 + * @returns 如果找到新标签则返回true;如果到达源的末尾则返回false。 + */ + static nextTag(): boolean; + /** + * @en Get the source of the current XML tag. + * @returns The source of the current XML tag. + * @zh 获取当前XML标签的源代码。 + * @returns 当前XML标签的源代码。 + */ + static getTagSource(): string; + /** + * @en Gets the raw text between the last tag end and the current tag position. + * @param trim Whether to trim the whitespace characters at the beginning and end of the text. + * @returns The raw text, trimmed if specified. + * @zh 获取上一个标签结束和当前标签位置之间的原始文本。 + * @param trim 是否去除文本首尾的空白字符。 + * @returns 返回的原始文本,如果指定则去除首尾空白。 + */ + static getRawText(trim?: boolean): string; + /** + * @en Get the decoded text between XML tags, optionally trimmed. + * @param trim Whether to trim the whitespace at the beginning and end of the text. Default is false. + * @returns The decoded text between XML tags. + * @zh 获取XML标签之间的解码文本,可选择是否去除首尾空白字符。 + * @param trim 是否去除文本开头和结尾的空白字符。默认为false。 + * @returns XML标签之间的解码文本。 + */ + static getText(trim?: boolean): string; + /** + * @en The parsed attributes of the current tag. + * @zh 当前标签解析后的属性。 + */ + static get attributes(): any; + /** + * @en Gets the value of the specified attribute from the current tag. + * @param attrName The name of the attribute to get. + * @returns The value of the attribute. + * @zh 从当前标签获取指定属性的值。 + * @param attrName 要获取的属性名称。 + * @returns 返回属性的值。 + */ + static getAttribute(attrName: string): string; + /** + * @en Parses the attributes from the source text. + * @param attrs The object to store the parsed attributes. + * @zh 从源文本解析属性。 + * @param attrs 存储解析后属性的对象。 + */ + static parseAttributes(attrs: any): void; + } + /** + * @en Utility class for XML operations. + * @zh XML操作的工具类。 + */ + class XMLUtils { + /** + * @en Decodes a string that contains HTML entities into a displayable form. + * @param aSource The string to decode. + * @returns The decoded string. + * @zh 对包含HTML实体的字符串进行解码,转换为可显示的格式。 + * @param aSource 需要解码的字符串。 + * @returns 返回解码后的字符串。 + */ + static decodeString(aSource: string): string; + /** + * @en Encodes special characters in a string to their corresponding HTML entities. + * @param str The string that contains special characters to be encoded. + * @returns The encoded string with HTML entities. + * @zh 将字符串中的特殊字符转换为对应的HTML实体。 + * @param str 包含待编码特殊字符的字符串。 + * @returns 包含HTML实体的编码后的字符串。 + */ + static encodeString(str: string): string; + /** + * @en Retrieves an attribute value from an object, and converts it to a string. If the attribute or object does not exist, the default value is used. + * @param attrs The object that contains the attribute. + * @param attrName The name of the attribute to retrieve. + * @param defValue The default value if the attribute is not found or is null. + * @returns The retrieved attribute value, or the default if the attribute is not present. + * @zh 从一个对象中检索一个属性值,并将此属性转化为字符串,如果属性不存在或对象不存在,则使用默认值。 + * @param attrs 包含待检索属性的对象。 + * @param attrName 需要检索的属性名称。 + * @param defValue 如果属性不存在或为null时的默认值。 + * @returns 检索到的属性值的字符串,如果属性不存在或对象不存在,则返回默认值。 + */ + static getString(attrs: any, attrName: string, defValue?: string): string; + /** + * @en Retrieve the attribute values in the object based on the attribute name and convert them to integers. If the attribute does not exist, use the default value. + * @param attrs The object containing the attribute. + * @param attrName The name of the attribute. + * @param defValue The default value if the attribute is not found. + * @returns If the attribute is a valid integer, return the parsed integer value; otherwise, return the default value. + * @zh 根据属性名检索对象中的属性值,并将其转换为整数,如果属性不存在,则使用默认值。 + * @param attrs 包含属性的对象。 + * @param attrName 属性的名称。 + * @param defValue 如果属性未找到,则使用的默认值。 + * @returns 如果属性是有效的整数,则返回解析后的整数值,否则返回默认值。 + */ + static getInt(attrs: any, attrName: string, defValue?: number): number; + /** + * @en Retrieve the attribute value from the object based on the attribute name and convert it to a floating-point number. If the attribute does not exist, use the default value. + * @param attrs The object containing the attribute. + * @param attrName The name of the attribute. + * @param defValue The default value if the attribute is not found. + * @returns If the attribute is a valid floating-point number, return the parsed floating-point number; otherwise, return the default value. + * @zh 根据属性名检索对象中的属性值,并将其转换为浮点数,如果属性不存在,则使用默认值。 + * @param attrs 包含属性的对象。 + * @param attrName 属性的名称。 + * @param defValue 如果属性未找到,则使用的默认值。 + * @returns 如果属性是有效的浮点数,则返回解析后的浮点数,否则返回默认值。 + */ + static getFloat(attrs: any, attrName: string, defValue?: number): number; + /** + * @en Retrieve the attribute values in the object based on the attribute name and convert them to Boolean values. If the attribute does not exist, use the default value. + * @param attrs The object containing the attribute. + * @param attrName The name of the attribute. + * @param defValue The default value if the attribute is not found. + * @returns If the attribute is a valid Boolean values, return the parsed Boolean values; otherwise, return the default value. + * @zh 根据属性名检索对象中的属性值,并将其转换为布尔值,如果属性不存在,则使用默认值。 + * @param attrs 包含属性的对象。 + * @param attrName 属性的名称。 + * @param defValue 如果属性未找到,则使用的默认值。 + * @returns 如果属性是有效的布尔值,则返回解析后的布尔值,否则返回默认值。 + */ + static getBool(attrs: any, attrName: string, defValue?: boolean): boolean; + } + /** + * @private + * @en CommandEncoder Shader variable collection + * @zh CommandEncoder Shader变量集合 + */ + class CommandEncoder { + /** + * @en Constructor method, initialize CommandEncoder object + * @zh 构造方法,初始化CommandEncoder对象 + */ + constructor(); + } + /** + * @en Package GL commands + * @zh 封装GL命令 + */ + class LayaGL { + static textureContext: ITextureContext; + static renderEngine: IRenderEngine; + static renderOBJCreate: IRenderEngineFactory; + static render2DRenderPassFactory: I2DRenderPassFactory; + static renderDeviceFactory: IRenderDeviceFactory; + static unitRenderModuleDataFactory: IUnitRenderModuleDataFactory; + } + /** + * @en QuickTestTool class for rendering and performance testing. + * @zh 用于渲染和性能测试的 QuickTestTool 类。 + */ + class QuickTestTool { + private static showedDic; + private static _rendertypeToStrDic; + private static _typeToNameDic; + /** + * @en Get the name of a specific render command type. + * @param type The render command type. + * @returns The name of the render command type. + * @zh 获取特定渲染命令类型的名称。 + * @param type 渲染命令类型。 + * @returns 渲染命令类型的名称。 + */ + static getMCDName(type: number): string; + /** + * @en Show render type information. + * @param type The render type. + * @param force Whether to force display even if it has been shown before. + * @zh 显示渲染类型信息。 + * @param type 渲染类型。 + * @param force 是否强制显示,即使之前已经显示过。 + */ + static showRenderTypeInfo(type: any, force?: boolean): void; + static __init__(): void; + _renderType: number; + _repaint: number; + _x: number; + _y: number; + constructor(); + /** + * @en Update and render the display object. Called by the system. + * @param context The rendering context reference. + * @param x The X-axis coordinate. + * @param y The Y-axis coordinate. + * @zh 更新、呈现显示对象。由系统调用。 + * @param context 渲染的上下文引用。 + * @param x X轴坐标。 + * @param y Y轴坐标。 + */ + render(context: Context, x: number, y: number): void; + private static _PreStageRender; + private static _countDic; + private static _countStart; + private static _i; + private static _countEnd; + /** + * @en Show count information for render types. + * @zh 显示渲染类型的计数信息。 + */ + static showCountInfo(): void; + /** + * @en Enable quick test mode. + * @zh 启用快速测试模式。 + */ + static enableQuickTest(): void; + } + /** + * @private 场景辅助类 + */ + class LegacyUIParser { + /**@private */ + private static _funMap; + /**@private */ + private static _parseWatchData; + /**@private */ + private static _parseKeyWord; + static parse(data: any, options: any): Sprite; + /** + * @private 根据字符串,返回函数表达式 + */ + static getBindFun(value: string): Function; + /** + * @private + * 通过视图数据创建视图。 + * @param uiView 视图数据信息。 + */ + static createByData(root: Sprite, uiView: any): Sprite; + static createInitTool(): InitTool; + /** + * 根据UI数据实例化组件。 + * @param uiView UI数据。 + * @param comp 组件本体,如果为空,会新创建一个。 + * @param view 组件所在的视图实例,用来注册var全局变量,如果值为空则不注册。 + * @return 一个 Component 对象。 + */ + static createComp(uiView: any, comp?: Sprite, view?: Sprite, dataMap?: any[], initTool?: InitTool): any; + /** + * @private + * 设置组件的属性值。 + * @param comp 组件实例。 + * @param prop 属性名称。 + * @param value 属性值。 + * @param view 组件所在的视图实例,用来注册var全局变量,如果值为空则不注册。 + */ + private static setCompValue; + /** + * @private + * 通过组建UI数据,获取组件实例。 + * @param json UI数据。 + * @return Component 对象。 + */ + static getCompInstance(json: any): any; + static collectResourceLinks(uiView: any): string[]; + /** + * 根据指定的 json 数据创建节点对象。 + * 比如: + * { + * "type":"Sprite", + * "props":{ + * "x":100, + * "y":50, + * "name":"item1", + * "scale":[2,2] + * }, + * "customProps":{ + * "x":100, + * "y":50, + * "name":"item1", + * "scale":[2,2] + * }, + * "child":[ + * { + * "type":"Text", + * "props":{ + * "text":"this is a test", + * "var":"label", + * "rumtime":"" + * } + * } + * ] + * } + * @param json json字符串或者Object对象。 + * @param node node节点,如果为空,则新创建一个。 + * @param root 根节点,用来设置var定义。 + * @return 生成的节点。 + */ + static createByJson(json: any, node?: any, root?: Node, customHandler?: Handler, instanceHandler?: Handler): any; + /** + * @private + */ + private static _getGraphicsFromSprite; + /** + * @private + */ + private static _getTransformData; + /** + * @private + */ + private static _addGraphicToGraphics; + /** + * @private + */ + private static _adptLineData; + /** + * @private + */ + private static _adptTextureData; + /** + * @private + */ + private static _adptLinesData; + /** + * @private + */ + private static _getParams; + /**@private */ + private static DrawTypeDic; + /**@private */ + private static _temParam; + /**@private */ + private static _tM; + /**@private */ + private static _alpha; + /** + * @private + */ + private static _getObjVar; + } + class InitTool { + /**@private */ + private _nodeRefList; + /**@private */ + private _initList; + reset(): void; + recover(): void; + static create(): InitTool; + /**@private */ + addNodeRef(node: any, prop: string, referStr: string): void; + /**@private */ + setNodeRef(): void; + /**@private */ + getReferData(referStr: string): any; + /**@private */ + addInitItem(item: any): void; + /**@private */ + doInits(): void; + /**@private */ + finish(): void; + } + class HierarchyLoader implements IResourceLoader { + static v3: IHierarchyParserAPI; + static v2: IHierarchyParserAPI; + static legacySceneOrPrefab: IHierarchyParserAPI & { + createByData(root: Sprite, uiView: any): Sprite; + createComp(uiView: any, comp: Sprite, view: Sprite, dataMap: any[], initTool?: any): any; + }; + load(task: ILoadTask): Promise; + protected _load(api: IHierarchyParserAPI, task: ILoadTask, data: any, version: number, fromDCC: boolean): Promise; + } + class HierarchyParser { + static parse(data: any, options?: Record, errors?: Array): Array; + static collectResourceLinks(data: any, basePath: string): (string | ILoadURL)[]; + } + class MaterialLoader implements IResourceLoader { + load(task: ILoadTask): Promise; + private load2; + private move; + } + class MaterialParser { + static parse(data: any): Material; + static collectLinks(data: any, basePath: string): ILoadURL[]; + /** + * @deprecated + * @inheritDoc + */ + static parseLegacy(data: any): Material; + /** + * @deprecated + * 兼容Blend数据 + */ + private static _getRenderStateParams; + } + class NullLoader implements IResourceLoader { + load(task: ILoadTask): Promise; + } + const TypedArrayClasses: Record; + interface IDecodeObjOptions { + outErrors?: Array; + getNodeByRef?: (id: string | string[]) => Node; + getNodeData?: (node: Node) => any; + } + class SerializeUtil { + static isDeserializing: boolean; + static decodeObj(data: any, obj?: any, options?: IDecodeObjOptions): any; + private static _decodeObj; + static getLoadTypeByEngineType(type: string): string; + static bakeOverrideData(overrideData: any): Record; + static applyOverrideData(nodeData: any, overrideDataMap: Record>): any; + } + class ShaderParser { + static parse(data: string, basePath?: string): Shader3D; + static compileToTree(sliceFlag: string[], data: string, sliceIndex: number): string[]; + static getMapKey(value: string): string; + /** + * get Shader Data + */ + static getShaderBlock(source: string): IShaderObjStructor; + /** + * get CG data for map + * @param source + * @returns + */ + static getCGBlock(source: string): { + [key: string]: string; + }; + static bindCG(shaderObj: IShaderObjStructor, cgmap: { + [key: string]: string; + }): void; + /** + * trans string to ShaderDataType + * @param value + * @returns + */ + static getShaderDataType(value: string): ShaderDataType; + /** + * set ShaderData Value + * @param type + * @param data + * @returns + */ + static getDefaultData(type: ShaderDataType, data: any): any; + } + class Texture2DLoader implements IResourceLoader { + constructor(); + load(task: ILoadTask): Promise; + protected load2(task: ILoadTask, meta: any): Promise; + protected move(obsoluteInst: BaseTexture, tex: BaseTexture): BaseTexture; + } + class RenderTextureLoader implements IResourceLoader { + load(task: ILoadTask): Promise; + } + class VideoTextureLoader implements IResourceLoader { + load(task: ILoadTask): Promise; + } + class TextureLoader implements IResourceLoader { + wrapTex2D(task: ILoadTask, tex2D: Texture2D): Texture; + load(task: ILoadTask): Promise; + } + /** + * @en Each layer of the map is rendered in chunks. This class represents the chunk data of the map. + * @zh 地图的每层都会分块渲染处理,本类就是地图的块数据。 + */ + class GridSprite extends Sprite { + /** + * @en The coordinate relative to the X-axis of the map. + * @zh 相对于地图X轴的坐标。 + */ + relativeX: number; + /** + * @en The coordinate relative to the Y-axis of the map. + * @zh 相对于地图Y轴的坐标。 + */ + relativeY: number; + /** + * @en Indicates whether the object is an independent entity within the object layer. + * @zh 是否用于对象层的独立物件。 + */ + isAloneObject: boolean; + /** + * @en Indicates whether there is an animation in the current GRID. + * @zh 当前GRID中是否有动画。 + */ + isHaveAnimation: boolean; + /** + * @en The array containing animations within the current GRID. + * @zh 当前GRID包含的动画数组。 + */ + aniSpriteArray: any[]; + /** + * @en The number of TILEs (including animations) included in the current GRID. + * @zh 当前GRID包含多少个TILE(包含动画)。 + */ + drawImageNum: number; + /** + * @en Reference to the current map object. + * @zh 当前地图对象的引用。 + */ + private _map; + /** + * @en Initialize the data with necessary parameters for clipping and confirming the type of this object. + * @param map The reference to the map, used for some clipping calculations. + * @param objectKey If true, indicates that the current GridSprite is an active object that can be controlled; if false, it is a block of the map layer. + * @zh 传入必要的参数,用于裁剪,跟确认此对象类型。 + * @param map 把地图的引用传进来,参与一些裁剪计算。 + * @param objectKey true:表示当前GridSprite是个活动对象,可以控制,false:地图层的组成块。 + */ + initData(map: TiledMap, objectKey?: boolean): void; + /** + * @en Bind an animation object to the current GridSprite. + * @param sprite The display object of the animation. + * @zh 把一个动画对象绑定到当前GridSprite。 + * @param sprite 动画的显示对象。 + */ + addAniSprite(sprite: TileAniSprite): void; + /** + * @en Display the current GridSprite and show all animations on it. + * @zh 显示当前GridSprite,并把上面的动画全部显示。 + */ + show(): void; + /** + * @en Hide the current GridSprite and remove all animations bound to it. + * @zh 隐藏当前GridSprite,并把上面绑定的动画全部移除。 + */ + hide(): void; + /** + * @en Refresh the position coordinates. Call this function manually to refresh when you control the movement of a GridSprite. + * @zh 当我们自己控制一个GridSprite移动时,需要调用此函数,手动刷新坐标。 + */ + updatePos(): void; + /** + * @en Reset all properties of the current object. + * @zh 重置当前对象的所有属性。 + */ + clearAll(): void; + } + /** + * @en The `MapLayer` class represents layer within a map that supports multi-layer rendering, such as terrain, vegetation, and building layers. This class is a hierarchical class + * @zh `MapLayer` 类代表地图中的层级,支持多层渲染,例如地表层、植被层、建筑层等。本类就是层级类。 + */ + class MapLayer extends Sprite { + private _map; + private _tileWidthHalf; + private _tileHeightHalf; + private _mapWidthHalf; + private _mapHeightHalf; + private _objDic; + private _dataDic; + private _tempMapPos; + private _properties; + /** + * @en The target layer that this layer is merged with. + * @zh 被合并到的目标层。 + */ + tarLayer: MapLayer; + /** + * @en The name of the current layer. + * @zh 当前层的名称。 + */ + layerName: string; + /** + * @en Parse the LAYER data and initialize some data. + * @param layerData Reference to the layer data within the map data. + * @param map Reference to the map. + * @zh 解析LAYER数据,以及初始化一些数据。 + * @param layerData 地图数据中,layer数据的引用。 + * @param map 地图的引用。 + */ + init(layerData: any, map: TiledMap): void; + /******************************************对外接口*********************************************/ + /** + * @en Retrieve a control object by name; returns null if not found. + * @param objName The name of the object to retrieve. + * @zh 通过名字获取控制对象,如果找不到返回null。 + * @param objName 所要获取对象的名字。。 + */ + getObjectByName(objName: string): GridSprite; + /** + * @en Retrieve data by name; returns null if not found. + * @param objName The name of the object whose data is to be retrieved. + * @zh 通过名字获取数据,如果找不到返回null。 + * @param objName 所要获取数据的对象名。 + */ + getObjectDataByName(objName: string): any; + /** + * @en Get the custom properties of the map layer. + * @param name The property name. + * @zh 获取地图层的自定义属性。 + * @param name 属性名。 + */ + getLayerProperties(name: string): any; + /** + * @en Get the data of the specified tile. + * @param tileX The X coordinate of the tile. + * @param tileY The Y coordinate of the tile. + * @returns The data of the tile or 0 if out of bounds. + * @zh 获取指定格子的数据。 + * @param tileX 格子坐标X + * @param tileY 格子坐标Y + * @returns 格子数据,如果越界,返回0 + */ + getTileData(tileX: number, tileY: number): number; + /** + * @en Convert map coordinates to screen coordinates. + * @param tileX The X coordinate on the map grid. + * @param tileY The Y coordinate on the map grid. + * @param screenPos The Point object to store the calculated screen coordinates. + * @zh 通过地图坐标得到屏幕坐标。 + * @param tileX 格子坐标X + * @param tileY 格子坐标Y + * @param screenPos 把计算好的屏幕坐标数据,放到此对象中 + */ + getScreenPositionByTilePos(tileX: number, tileY: number, screenPos?: Point): void; + /** + * @en Retrieve the data of the tile selected by screen coordinates. + * @param screenX The x-coordinate on the screen. + * @param screenY The y-coordinate on the screen. + * @zh 通过屏幕坐标来获取选中格子的数据。 + * @param screenX 屏幕坐标x + * @param screenY 屏幕坐标y + */ + getTileDataByScreenPos(screenX: number, screenY: number): number; + /** + * @en Get the index of the tile selected by screen coordinates. + * @param screenX The x-coordinate on the screen. + * @param screenY The y-coordinate on the screen. + * @param result The Point object to store the calculated tile coordinates. + * @zh 通过屏幕坐标来获取选中格子的索引。 + * @param screenX 屏幕坐标x + * @param screenY 屏幕坐标y + * @param result 计算好的格子坐标,放到此对象中 + */ + getTilePositionByScreenPos(screenX: number, screenY: number, result?: Point): boolean; + /***********************************************************************************************/ + /** + * @en Retrieve a GridSprite based on grid indices. + * @param gridX The X-axis index of the current Grid. + * @param gridY The Y-axis index of the current Grid. + * @returns A GridSprite object. + * @zh 根据网格的X轴和Y轴索引获取一个GridSprite对象。 + * @param gridX 当前网格的X轴索引 + * @param gridY 当前网格的Y轴索引 + * @returns 一个GridSprite对象 + */ + getDrawSprite(gridX: number, gridY: number): GridSprite; + /** + * @en Update the coordinates of the blocks in this layer. The purpose of manual refresh is to keep the width and height of the hierarchy to a minimum and accelerate rendering. + * @zh 更新此层中块的坐标。手动刷新的目的是,保持层级的宽和高保持最小,加快渲染。 + */ + updateGridPos(): void; + /** + * @private + * @en Draw a tile onto a specified display object. + * @param gridSprite The target display object to draw on. + * @param tileX The X-coordinate of the tile. + * @param tileY The Y-coordinate of the tile. + * @returns A boolean indicating whether the tile was successfully drawn. + * @zh 把tile画到指定的显示对象上。 + * @param gridSprite 要绘制的目标显示对象 + * @param tileX 格子的X轴坐标 + * @param tileY 格子的Y轴坐标 + * @returns 一个布尔值,表示是否成功绘制了tile + */ + drawTileTexture(gridSprite: GridSprite, tileX: number, tileY: number): boolean; + /** + * @private + * @en Clear all properties and references of the current object to free up resources. + * @zh 清理当前对象,释放资源。 + */ + clearAll(): void; + } + /** + * @en The `TileAniSprite` class represents an animation display object within a `TiledMap`. An animation set (represented by `TileTexSet`) can be associated with multiple animation display objects (`TileAniSprite`). + * @zh `TileAniSprite` 类是 `TiledMap` 的动画显示对象。一个动画集合(由 `TileTexSet` 表示)可以绑定多个动画显示对象(`TileAniSprite`)。 + */ + class TileAniSprite extends Sprite { + /** + * @en Reference to the animation set. + * @zh 动画的引用。 + */ + private _tileTextureSet; + /** + * @en The unique name of the current animation display object. + * @zh 当前动画显示对象的唯一名称。 + */ + private _aniName; + /** + * @en Set the name of the current display object and which animation set it belongs to. + * @param aniName The unique name of the current animation display object. + * @param tileTextureSet The animation set that the current display object belongs to. + * @zh 确定当前显示对象的名称以及属于哪个动画。 + * @param aniName 当前动画显示对象的名字,名字唯一 + * @param tileTextureSet 当前显示对象属于哪个动画(一个动画,可以绑定多个同类显示对象) + */ + setTileTextureSet(aniName: string, tileTextureSet: TileTexSet): void; + /** + * @en Add the current animation to the corresponding animation refresh list. + * @zh 把当前动画加入到对应的动画刷新列表中。 + */ + show(): void; + /** + * @en Remove the current animation from the corresponding animation refresh list. + * @zh 把当前动画从对应的动画刷新列表中移除。 + */ + hide(): void; + /** + * @en Clear all properties and references of the current object to free up resources. + * @zh 清理当前对象的所有属性和引用,释放资源。 + */ + clearAll(): void; + } + /** + * @en The `TiledMap` class is the core of the entire map system. + * - The map is divided into layers (e.g., terrain layer, vegetation layer, building layer), and each layer is further divided into grid sprites for display object management, showing only the areas within the viewport. Each grid sprite contains an N*N grid of tiles, which can be either animated tiles or image tiles. + * @zh `TiledMap` 类是整个地图系统的核心。 + * - 地图以层级划分(例如:地表层、植被层、建筑层), + * - 每层进一步划分为网格精灵来管理显示对象,只显示视口区域内的部分。 + * - 每个网格精灵包含 N*N 个格子,格子类型分为动画格子和图片格子两种。 + */ + class TiledMap { + /** + * @en Orthogonal map. + * @zh 四边形地图。 + */ + static ORIENTATION_ORTHOGONAL: string; + /** + * @en Diamond map. + * @zh 菱形地图。 + */ + static ORIENTATION_ISOMETRIC: string; + /** + * @en 45 degree interleaved map. + * @zh 45度交错地图。 + */ + static ORIENTATION_STAGGERED: string; + /** + * @en Hexagonal map. + * @zh 六边形地图。 + */ + static ORIENTATION_HEXAGONAL: string; + /** + * @en The map grid is rendered starting from the top left corner. + * @zh 地图格子从左上角开始渲染。 + */ + static RENDERORDER_RIGHTDOWN: string; + /** + * @en The map grid is rendered starting from the bottom left corner. + * @zh 地图格子从左下角开始渲染。 + */ + static RENDERORDER_RIGHTUP: string; + /** + * @en The map grid is rendered starting from the top right corner. + * @zh 地图格子从右上角开始渲染。 + */ + static RENDERORDER_LEFTDOWN: string; + /** + * @en The map grid is rendered starting from the bottom right corner. + * @zh 地图格子从右下角开始渲染。 + */ + static RENDERORDER_LEFTUP: string; + /** + * @en The internal JSON data used by the map. + * @zh 地图使用的内部JSON数据。 + */ + private _jsonData; + /** + * @en An array to store all the sub-texture data used in the map. + * @zh 存放地图中用到的所有子纹理数据的数组。 + */ + private _tileTexSetArr; + /** + * @en The main texture data, primarily used when releasing texture resources. + * @zh 主纹理数据,主要在释放纹理资源时使用。 + */ + private _texArray; + private _x; + private _y; + private _width; + private _height; + private _mapW; + private _mapH; + private _mapTileW; + private _mapTileH; + private _rect; + private _paddingRect; + private _mapSprite; + private _layerArray; + private _renderLayerArray; + private _gridArray; + private _showGridKey; + private _totalGridNum; + private _gridW; + private _gridH; + private _gridWidth; + private _gridHeight; + private _tileSetArray; + private _currTileSet; + private _completeHandler; + private _mapRect; + private _mapLastRect; + private _index; + private _animationDic; + private _properties; + private _tileProperties; + private _tileProperties2; + private _orientation; + private _renderOrder; + private _colorArray; + private _scale; + private _pivotScaleX; + private _pivotScaleY; + private _centerX; + private _centerY; + private _viewPortWidth; + private _viewPortHeight; + private _enableLinear; + private _resPath; + private _pathArray; + private _limitRange; + /** + * @en Whether to automatically cache tiles that do not have animations. + * @zh 是否自动缓存没有动画的地块。 + */ + autoCache: boolean; + /** + * @en The type of automatic caching. For larger maps, "normal" is recommended. + * @zh 自动缓存类型,地图较大时建议使用 "normal"。 + */ + autoCacheType: string; + /** + * @en Whether to enable layer merging. When layer merging is enabled, you can add a "layer" property in the layer attributes. At runtime, layers with the same "layer" attribute will be merged to improve performance. + * @zh 是否合并图层。开启合并图层时,图层属性内可添加 "layer" 属性,运行时将会将相邻的 "layer" 属性相同的图层进行合并以提高性能。 + */ + enableMergeLayer: boolean; + /** + * @en Whether to remove covered tiles. Tiles can have a "type" property; a "type" other than 0 indicates opacity. Tiles that are covered by opaque tiles will be culled to improve performance. + * @zh 是否移除被覆盖的格子。地块可添加 "type" 属性,"type" 不为 0 时表示不透明,被不透明地块遮挡的地块将会被剔除以提高性能。 + */ + removeCoveredTile: boolean; + /** + * @en Whether to display the number of textures shown in large grids. + * @zh 是否在大格子里显示显示的贴图数量。 + */ + showGridTextureCount: boolean; + /** + * @en Whether to adjust tile edges to eliminate gaps caused by scaling. + * @zh 是否调整地块边缘消除缩放导致的缝隙。 + */ + antiCrack: boolean; + /** + * @en Whether to cache all large grids after initialization is complete. + * @zh 是否在加载完成之后 cache 所有大格子。 + */ + cacheAllAfterInit: boolean; + /** @ignore */ + constructor(); + /** + * @en Create a map with the specified parameters. + * @param mapName The name of the JSON file. + * @param viewRect The viewport area. + * @param completeHandler The callback function when the map is created. + * @param viewRectPadding The expanded viewport area to prevent exposure when the viewport moves. + * @param gridSize The size of the grid. + * @param enableLinear Whether to enable linear sampling to improve texture quality. + * @param limitRange Whether to restrict the map to the display area. + * @zh 使用指定参数创建地图。 + * @param mapName JSON文件名字 + * @param viewRect 视口区域 + * @param completeHandler 地图创建完成的回调函数 + * @param viewRectPadding 视口扩充区域,把视口区域上、下、左、右扩充一下,防止视口移动时的穿帮 + * @param gridSize grid大小 + * @param enableLinear 是否开启线性取样(为false时,可以解决地图黑线的问题,但画质会锐化) + * @param limitRange 把地图限制在显示区域 + */ + createMap(mapName: string, viewRect: Rectangle, completeHandler: Handler, viewRectPadding?: Rectangle, gridSize?: Point, enableLinear?: boolean, limitRange?: boolean): void; + /** + * @en Parse the texture data inside the JSON file after successful reading, and start loading. + * @param tJsonData The JSON data. + * @zh JSON文件读取成功后,解析里面的纹理数据,进行加载。 + * @param tJsonData JSON数据 + */ + private onJsonComplete; + /** + * @en Merge resource paths. + * @param resPath The base resource path. + * @param relativePath The relative path to merge with the base path. + * @returns The resolved path. + * @zh 合并路径。 + * @param resPath 基础资源路径 + * @param relativePath 相对路径 + * @return 解析后的路径 + */ + private mergePath; + private _texutreStartDic; + /** + * @en Handle the completion of texture loading. If all textures are loaded, begin initializing the map. + * @param tTexture The loaded texture. + * @zh 纹理加载完成的处理。如果所有纹理都加载完成,开始初始化地图。 + * @param tTexture 纹理数据 + */ + private onTextureComplete; + private adptTexture; + /** + * @en Initialize map + * @zh 初始化地图 + */ + private initMap; + private addTileProperties; + /** + * @en Retrieve user data associated with a specific tile by its ID and a sign, with an option for a default value. + * @param id The unique ID of the tile. + * @param sign The key for the user data within the tile's data. + * @param defaultV The default value to return if the specified user data does not exist. + * @returns The retrieved user data or the default value if not found. + * @zh 根据地块的ID和标识符检索与之关联的用户数据,并可选择提供默认值。 + * @param id 地块的唯一ID + * @param sign 用户数据在地块数据中的标识符 + * @param defaultV 默认值,如果指定的用户数据不存在则返回 + * @return 得到的用户数据或默认值 + */ + getTileUserData(id: number, sign: string, defaultV?: any): any; + private adptTiledMapData; + private removeCoverd; + private collectCovers; + /** + * @en Retrieve a map texture by its index. + * @param index The index of the texture. Default to starting from 1. + * @returns The TileTexSet object at the specified index, or null if not found. + * @zh 通过索引值获取一块指定的地图纹理,默认索引从1开始。 + * @param index 纹理的索引值。 + * @return 索引处的TileTexSet对象,如果没有找到则返回null + */ + getTexture(index: number): TileTexSet; + /** + * @en Get the custom properties of the map. + * @param name The name of the property to retrieve. + * @returns The value of the specified property, or null if not found. + * @zh 获取地图的自定义属性。 + * @param name 属性名称 + * @return 得到的属性值,如果没有找到则返回null + */ + getMapProperties(name: string): any; + /** + * @en Get custom properties of a tile. + * @param index The index of the tile data. + * @param id The specific TileSetID of the tile. + * @param name The name of the property to retrieve. + * @returns The value of the specified property for the given tile, or null if not found. + * @zh 获取tile的自定义属性。 + * @param index 地图块索引 + * @param id 具体的TileSetID + * @param name 属性名称 + * @returns 给定tile的指定属性值,如果没有找到则返回null + */ + getTileProperties(index: number, id: number, name: string): any; + /** + * @en Generate a controllable sprite using the texture index. + * @param index The index of the texture. Starting from 1 by default. + * @param width The width of the sprite. + * @param height The height of the sprite. + * @returns The created GridSprite object, or null if not created. + * @zh 通过纹理索引生成一个可控制物件。 + * @param index 纹理索引,默认从1开始 + * @param width 精灵的宽 + * @param height 精灵的高 + * @returns 生成的GridSprite对象,如果没有生成则返回null + */ + getSprite(index: number, width: number, height: number): GridSprite; + /** + * @en Set the viewport pivot point based on scale, useful for centering the scaling origin. + * @param scaleX The horizontal scale value for the pivot point. + * @param scaleY The vertical scale value for the pivot point. + * @zh 根据缩放值设置视口的缩放中心点,例如:scaleX= scaleY= 0.5 表示以视口中心缩放。 + * @param scaleX 水平缩放值 + * @param scaleY 垂直缩放值 + */ + setViewPortPivotByScale(scaleX: number, scaleY: number): void; + /** + * @en Set the map's scale, which affects the size of the map within the viewport. + * @param scale The new scale value. Scale less than or equal to zero will be ignored. + * @zh 设置地图缩放,影响地图在视口中的大小。 + * @param scale 新的缩放值,小于等于0的缩放值将被忽略 + */ + set scale(scale: number); + /** + * @en Get the current scale of the map. + * @zh 获取当前地图的缩放比例。 + */ + get scale(): number; + /** + * @en Move the viewport to a new position. + * @param moveX The new x-coordinate for the viewport. + * @param moveY The new y-coordinate for the viewport. + * @zh 移动视口到新的位置。 + * @param moveX 视口的新x坐标 + * @param moveY 视口的新y坐标 + */ + moveViewPort(moveX: number, moveY: number): void; + /** + * @en Change the size and/or position of the viewport. + * @zh 改变视口的大小和/或位置。 + * @param moveX The new x-coordinate for the viewport. + * @param moveY The new y-coordinate for the viewport. + * @param width The new width of the viewport. + * @param height The new height of the viewport. + * @zh 改变视口的大小和/或位置。 + * @param moveX 视口的坐标x + * @param moveY 视口的坐标y + * @param width 视口的宽 + * @param height 视口的高 + */ + changeViewPort(moveX: number, moveY: number, width: number, height: number): void; + /** + * @en Change the viewport based on width and height, calculated from the anchor point. + * @param width The new width for the viewport. + * @param height The new height for the viewport. + * @param rect The Rectangle object to store the result (optional). + * @returns The resulting Rectangle with the new viewport dimensions and position. + * @zh 基于锚点计算,通过宽和高来重新计算视口。 + * @param width 新视口宽 + * @param height 新视口高 + * @param rect 返回的结果 + * @returns 返回的Rectangle对象,包含新的视口的宽高和位置 + */ + changeViewPortBySize(width: number, height: number, rect?: Rectangle): Rectangle; + /** + * @en Refresh Viewport + * @zh 刷新视口 + */ + private updateViewPort; + /** + * @en GRID cropping + * @zh GRID裁剪 + */ + private clipViewPort; + /** + * @en Display the specified grid on the map. + * @param gridX The X-coordinate of the grid. + * @param gridY The Y-coordinate of the grid. + * @zh 显示地图中指定的网格。 + * @param gridX 网格的X坐标 + * @param gridY 网格的Y坐标 + */ + private showGrid; + /** + * @en Cache all grids in the map to improve rendering performance. + * @zh 缓存地图中的所有网格以提高渲染性能。 + */ + private cacheAllGrid; + private static _tempCanvas; + /** + * @en Cache an array of grids by rendering them to an off-screen canvas. + * @param arr An array of GridSprite objects to cache. + * @zh 通过将网格渲染到离屏画布上来缓存网格数组。 + * @param arr 要缓存的GridSprite数组。 + */ + private cacheGridsArray; + /** + * @en Retrieve or initialize the array of grid sprites for a specific grid position on the map. + * @param gridX The X-coordinate of the grid position. + * @param gridY The Y-coordinate of the grid position. + * @returns An array of grid sprites for the specified grid position. + * @zh 检索或初始化地图中特定网格位置的网格精灵数组。 + * @param gridX 网格位置的X坐标 + * @param gridY 网格位置的Y坐标 + * @return 指定网格位置的网格精灵数组 + */ + private getGridArray; + /** + * @en Hide the specified grid on the map. + * @param gridX The X-coordinate of the grid to hide. + * @param gridY The Y-coordinate of the grid to hide. + * @zh 隐藏地图中指定的网格。 + * @param gridX 要隐藏的网格的X坐标 + * @param gridY 要隐藏的网格的Y坐标 + */ + private hideGrid; + /** + * @en Retrieve an object from a specific layer by its name. + * @param layerName The name of the layer where the object resides. + * @param objectName The name of the object to find. + * @returns The GridSprite object if found, or null if not found. + * @zh 根据名称从特定层中获取一个对象。 + * @param layerName 物体所在层的名称 + * @param objectName 要查找的物体的名称 + * @return 找到的GridSprite对象,如果没找到则返回null + */ + getLayerObject(layerName: string, objectName: string): GridSprite; + /** + * @en Destroy and cleanup the map, releasing all resources. + * @zh 销毁地图并清理资源。 + */ + destroy(): void; + /****************************地图的基本数据***************************/ + /** + * @en Gets the width of a tile. + * @zh 获取格子的宽度。 + */ + get tileWidth(): number; + /** + * @en Gets the height of a tile. + * @zh 获取格子的高度。 + */ + get tileHeight(): number; + /** + * @en Gets the width of the map. + * @zh 获取地图的宽度。 + */ + get width(): number; + /** + * @en Gets the height of the map. + * @zh 获取地图的高度。 + */ + get height(): number; + /** + * @en Gets the number of horizontal tiles in the map. + * @zh 获取地图横向的格子数。 + */ + get numColumnsTile(): number; + /** + * @en Gets the number of vertical tiles in the map. + * @zh 获取地图竖向的格子数。 + */ + get numRowsTile(): number; + /** + * @private + * @en Gets the viewport's x-coordinate. + * @zh 获取视口的x坐标。 + */ + get viewPortX(): number; + /** + * @private + * @en Gets the viewport's y-coordinate. + * @zh 获取视口的y坐标。 + */ + get viewPortY(): number; + /** + * @private + * @en Gets the width of the viewport. + * @zh 获取视口的宽度。 + */ + get viewPortWidth(): number; + /** + * @private + * @en Gets the height of the viewport. + * @zh 获取视口的高度。 + */ + get viewPortHeight(): number; + /** + * @en Gets the x-coordinate of the map. + * @zh 获取地图的x坐标。 + */ + get x(): number; + /** + * @en Gets the y-coordinate of the map. + * @zh 获取地图的y坐标。 + */ + get y(): number; + /** + * @en Gets the width of a grid block. + * @zh 获取块的宽度。 + */ + get gridWidth(): number; + /** + * @en Gets the height of a grid block. + * @zh 获取块的高度。 + */ + get gridHeight(): number; + /** + * @en Gets the number of horizontal grid blocks in the map. + * @zh 获取地图的横向块数。 + */ + get numColumnsGrid(): number; + /** + * @en Gets the number of vertical grid blocks in the map. + * @zh 获取地图的坚向块数。 + */ + get numRowsGrid(): number; + /** + * @en Gets the current map orientation type. + * @zh 获取当前地图类型。 + */ + get orientation(): string; + /** + * @en Gets the tile rendering order. + * @zh 获取tile渲染顺序。 + */ + get renderOrder(): string; + /*****************************************对外接口**********************************************/ + /** + * @en Gets the display container for the entire map. + * @zh 获取整个地图的显示容器。 + */ + mapSprite(): Sprite; + /** + * @en Retrieves a `MapLayer` by its name. + * @param layerName The name of the layer to find. + * @returns The found `MapLayer` or null if not found. + * @zh 通过名称获取指定的`MapLayer`。 + * @param layerName 要查找的层的名称。 + * @returns 找到的`MapLayer`对象,如果没找到则返回null。 + */ + getLayerByName(layerName: string): MapLayer; + /** + * @en Retrieves a `MapLayer` by its index. + * @param index The index of the layer to retrieve. + * @zh 通过索引获取`MapLayer`。 + * @param index 要检索的层的索引。 + */ + getLayerByIndex(index: number): MapLayer; + } + /** + * @en The `TileTexSet` class is a sub-texture class that also manages animations of the same type. + * TiledMap divides textures into numerous sub-textures and can replace a specific sub-texture with an animation sequence. + * The implementation of this class sets the `animationKey` to true if a sub-texture is replaced with an animation sequence. + * That is, if `animationKey` is true, use `TileAniSprite` for display, and draw the animation sequence onto `TileAniSprite` according to time. + * @zh `TileTexSet` 类是一个子纹理类,同时管理同类型动画。 + * TiledMap 将纹理分割成许多子纹理,并且可以将其中的某个子纹理替换为动画序列。 + * 如果发现子纹理被替换为动画序列,本类的实现会将 `animationKey` 设置为 true。 + * 即如果 `animationKey` 为 true,则使用 `TileAniSprite` 来显示,并将动画序列根据时间绘制到 `TileAniSprite` 上。 + */ + class TileTexSet { + /** + * @en The unique identifier for the tile texture set. + * @zh 子纹理集的唯一标识。 + */ + gid: number; + /** + * @en The reference to the sub-texture. + * @zh 子纹理的引用。 + */ + texture: Texture; + /** + * @en The X coordinate offset when displaying the texture. + * @zh 纹理显示时的X坐标偏移。 + */ + offX: number; + /** + * @en The Y coordinate offset when displaying the texture. + * @zh 纹理显示时的Y坐标偏移。 + */ + offY: number; + /** + * @en The array of textures to be displayed for the current animation. + * @zh 当前要播放的动画纹理序列。 + */ + textureArray: any[]; + /** + * @en The duration of each frame in the current animation. + * @zh 当前动画每帧的时间间隔。 + */ + durationTimeArray: any[]; + /** + * @en The total duration of the animation. + * @zh 动画播放的总时间。 + */ + animationTotalTime: number; + /** + * @en Indicates whether the current texture is an animation sequence (true) or a single texture (false). + * @zh 表示当前纹理是一组动画(true)还是单个纹理(false)。 + */ + isAnimation: boolean; + /** + * @en The number of display objects in the current animation. + * @zh 当前动画的显示对象数量。 + */ + private _spriteNum; + /** + * @en A dictionary to save display objects by their unique name. + * @zh 通过显示对象的唯一名字保存显示对象的字典。 + */ + private _aniDic; + /** + * @en The current frame index in the animation sequence. + * @zh 当前动画播放到的帧索引。 + */ + private _frameIndex; + /** + * @en The elapsed time since the last animation refresh. + * @zh 距离上次动画刷新过了多少时间。 + */ + private _time; + /** + * @en The interval time for refreshing each frame. + * @zh 每帧刷新的时间间隔。 + */ + private _interval; + /** + * @en The timestamp of the last frame refresh. + * @zh 上一帧刷新的时间戳。 + */ + private _preFrameTime; + /** + * @en Adds an animation display object to this animation. + * @param aniName The name of the display object. + * @param sprite The display object. + * @zh 将一个动画显示对象加入到此动画中。 + * @param aniName 显示对象的名字。 + * @param sprite 显示对象。 + */ + addAniSprite(aniName: string, sprite: TileAniSprite): void; + /** + * @en Draws the animation to all registered sprites. + * @zh 把动画画到所有注册的显示对象上。 + */ + private animate; + /** + * @en Draws the texture to the specified sprite. + * @param sprite The sprite to draw the texture on. + * @param tileTextSet The tile texture set to draw. + * @zh 将纹理绘制到指定的显示对象上。 + * @param sprite 要绘制纹理的显示对象。 + * @param tileTextSet 要绘制的子纹理集。 + */ + private drawTexture; + /** + * @en Removes the sprite that no longer needs to be updated. + * @param _name The name of the sprite to remove. + * @zh 移除不再需要更新的显示对象。 + * @param _name 要移除的显示对象的名字。 + */ + removeAniSprite(_name: string): void; + /** + * @en Displays the current usage of the animation. + * @returns A string containing the debug information. + * @zh 显示当前动画的使用情况。 + * @returns 包含调试信息的字符串。 + */ + showDebugInfo(): string; + /** + * @en Clears all properties of the tile texture set. + * @zh 清理子纹理集的所有属性。 + */ + clearAll(): void; + } + /** + * @private + * @en Utility class for calculating Bezier curves. + * @zh 计算贝塞尔曲线的工具类。 + */ + class Bezier { + /** + * @en Singleton instance of the utility class + * @zh 工具类单例 + */ + static I: Bezier; + /** @private */ + private _controlPoints; + /** @private */ + private _calFun; + /** @private */ + private _switchPoint; + /** + * @en Calculate quadratic Bezier point. + * @param t The parameter in the range [0, 1] + * @param rst The array to store the result + * @zh 计算二次贝塞尔点。 + * @param t 用于计算的参数,范围[0, 1] + * @param rst 用于存结果的数组 + */ + getPoint2(t: number, rst: any[]): void; + /** + * @en Calculate cubic Bezier point + * @param t The parameter in the range [0, 1] + * @param rst The array to store the result + * @zh 计算三次贝塞尔点 + * @param t 用于计算的参数,范围[0, 1] + * @param rst 用于存结果的数组 + */ + getPoint3(t: number, rst: any[]): void; + /** + * @en Calculate a sequence of Bezier points + * @param count The number of points to insert + * @param rst The array to store the result + * @zh 计算贝塞尔点序列 + * @param count 输入的点的数量 + * @param rst 用于存结果的数组 + */ + insertPoints(count: number, rst: any[]): void; + /** + * @en Get points on the Bezier curve. + * @param pList Control points [x0,y0,x1,y1...] + * @param inSertCount The number of interpolation points for each curve segment + * @param count The order of the Bezier curve (2 for quadratic, 3 for cubic) + * @returns An array of points on the Bezier curve + * @zh 获取贝塞尔曲线上的点。 + * @param pList 控制点[x0,y0,x1,y1...] + * @param inSertCount 每次曲线的插值数量 + * @param count 贝塞尔曲线的阶数(2表示二次曲线,3表示三次曲线) + * @returns 贝塞尔曲线上的点组成的数组 + */ + getBezierPoints(pList: any[], inSertCount?: number, count?: number): any[]; + } + /** + * @en The Color class is used to create color instances. + * @zh Color类用于创建颜色实例。 + */ + class Color implements IClone { + /** + * @en Red color + * @zh 红色 + */ + static RED: Color; + /** + * @en Green color + * @zh 绿色 + */ + static GREEN: Color; + /** + * @en Blue color + * @zh 蓝色 + */ + static BLUE: Color; + /** + * @en Cyan color + * @zh 蓝绿色 + */ + static CYAN: Color; + /** + * @en Yellow color + * @zh 黄色 + */ + static YELLOW: Color; + /** + * @en Magenta color + * @zh 品红色 + */ + static MAGENTA: Color; + /** + * @en Gray color + * @zh 灰色 + */ + static GRAY: Color; + /** + * @en White color + * @zh 白色 + */ + static WHITE: Color; + /** + * @en Black color + * @zh 黑色 + */ + static BLACK: Color; + /** + * @en Fully transparent + * @zh 全透明 + */ + static CLEAR: Color; + /** + * @en Convert gamma space value to linear space. + * @param value The value in gamma space. + * @returns The value in linear space. + * @zh 将 Gamma 空间值转换为线性空间值。 + * @param value Gamma 空间值。 + * @returns 线性空间值。 + */ + static gammaToLinearSpace(value: number): number; + /** + * @en Convert linear space value to gamma space. + * @param value The value in linear space. + * @returns The value in gamma space. + * @zh 将线性空间值转换为 Gamma 空间值。 + * @param value 线性空间值。 + * @returns Gamma 空间值。 + */ + static linearToGammaSpace(value: number): number; + /** + * @en Red component + * @zh 红色分量 + */ + r: number; + /** + * @en Green component + * @zh 绿色分量 + */ + g: number; + /** + * @en Blue component + * @zh 蓝色分量 + */ + b: number; + /** + * @en Alpha component + * @zh 透明度分量 + */ + a: number; + /** + * @en Constructor method Color. + * @param r Red component (0-1). + * @param g Green component (0-1). + * @param b Blue component (0-1). + * @param a Alpha component (0-1). + * @zh 构造函数,初始化颜色实例。 + * @param r 红色分量(0-1)。 + * @param g 绿色分量(0-1)。 + * @param b 蓝色分量(0-1)。 + * @param a 透明度分量(0-1)。 + */ + constructor(r?: number, g?: number, b?: number, a?: number); + /** + * @en Check if two colors are equal. + * @param c The color to compare with. + * @returns True if the colors are equal, false otherwise. + * @zh 判断两个颜色是否相等。 + * @param c 要比较的颜色。 + * @returns 如果颜色相等则返回 true,否则返回 false。 + */ + equal(c: Color): boolean; + /** + * @en Convert from gamma space to linear space. + * @param out The output color in linear space. + * @zh 从 Gamma 空间转换到线性空间。 + * @param out 输出的线性空间颜色。 + */ + toLinear(out: Color): void; + /** + * @en Convert from linear space to gamma space. + * @param out The output color in gamma space. + * @zh 从线性空间转换到 Gamma 空间。 + * @param out 输出的 Gamma 空间颜色。 + */ + toGamma(out: Color): void; + /** + * @en Clone the color to another object. + * @param destObject The target object to clone to. + * @zh 克隆颜色到目标对象。 + * @param destObject 目标克隆对象。 + */ + cloneTo(destObject: Color): void; + /** + * @en Scale the color. + * @param value The scale value. + * @returns The scaled color. + * @zh 缩放颜色。 + * @param value 缩放值。 + * @returns 缩放后的颜色。 + */ + scale(value: number): Color; + /** + * @en Set the color components (0-1). + * @param r Red component. + * @param g Green component. + * @param b Blue component. + * @param a Alpha component. + * @zh 设置颜色分量(0-1)。 + * @param r 红色分量。 + * @param g 绿色分量。 + * @param b 蓝色分量。 + * @param a 透明度分量。 + */ + setValue(r: number, g: number, b: number, a: number): void; + /** + * @en Convert from Array to color. + * @param array The source array. + * @param offset The offset of the array. + * @zh 从Array数组拷贝值。 + * @param array 数组。 + * @param offset 数组偏移。 + */ + fromArray(array: any[], offset?: number): void; + /** + * @en Convert to Array. + * @returns An array representing the color [r, g, b, a]. + * @zh 转换为Array数组 + * @returns 表示颜色的数组 [r, g, b, a]。 + */ + toArray(): Array; + /** + * @en Clone the color. + * @returns The cloned color. + * @zh 克隆颜色。 + * @returns 克隆副本。 + */ + clone(): any; + } + /** + * @private + * @en Graham Scan algorithm for convex hull calculation. + * @zh 凸包算法。 + */ + class GrahamScan { + private static _mPointList; + private static _tempPointList; + private static _temPList; + private static _temArr; + /** + * @en Calculate the cross product of two two-dimensional vectors. + * @param p1 End point 1. + * @param p2 End point 2. + * @param p0 Start point. + * @returns The cross product value. + * @zh 计算两个二维向量的叉积。 + * @param p1 终点1。 + * @param p2 终点2。 + * @param p0 起点。 + * @returns 叉积的值。 + */ + static multiply(p1: Point, p2: Point, p0: Point): number; + /** + * @en Calculate the squared distance between two points. + * @param p1 The Start point. + * @param p2 The End point. + * @returns The squared distance. + * @zh 计算两个点距离的平方。 + * @param p1 起点 + * @param p2 终点 + * @returns 距离的平方。 + */ + static dis(p1: Point, p2: Point): number; + private static _getPoints; + /** + * @en Take cout items from the src array at index 0 and add them to the tail of the tst array. + * @param rst The original array is used to add new child elements. + * @param src An array used to retrieve child elements. + * @param count The number of child elements to add. + * @returns Add the RST object of the child elements. + * @zh 将数组src从索引0位置,依次取cout个项添加至tst数组的尾部。 + * @param rst 原始数组,用于添加新的子元素。 + * @param src 用于取子元素的数组。 + * @param count 需要取得子元素个数。 + * @returns 添加完子元素的 rst 对象。 + */ + static getFrom(rst: any[], src: any[], count: number): any[]; + /** + * @en Take cout items from the end index position to the head index position of the src array and add them to the tail of the tst array. + * @param rst The original array is used to add new child elements. + * @param src An array used to retrieve child elements. + * @param count The number of child elements to add. + * @returns Add the RST object of the child elements. + * @zh 将数组src从末尾索引位置往头部索引位置方向,依次取cout个项添加至tst数组的尾部。 + * @param rst 原始数组,用于添加新的子元素。 + * @param src 用于取子元素的数组。 + * @param count 需要取得子元素个数。 + * @returns 添加完子元素的 rst 对象。 + */ + static getFromR(rst: any[], src: any[], count: number): any[]; + /** + * @en Convert a list of [x,y...] to a list of Points. + * @param pList The Point list. + * @param tempUse Whether to use temporary storage. + * @returns A list of [x,y...]. + * @zh 将 [x,y...] 列表转换为 Point 列表。 + * @param pList Point列表。 + * @param tempUse 是否使用临时存储。 + * @returns [x,y...]列表 + */ + static pListToPointList(pList: any[], tempUse?: boolean): any[]; + /** + * @en Convert a list of Points to a [x,y...] list. + * @param pointList The list of Points. + * @returns The [x,y...] list. + * @zh 将 Point 列表转换为 [x,y...] 列表。 + * @param pointList Point列表 + * @returns [x,y...]列表 + */ + static pointListToPlist(pointList: any[]): any[]; + /** + * @en Find the minimum polygon vertex set that includes all points. + * @param pList The [x,y...] list. + * @returns The minimum polygon vertex set. + * @zh 寻找包括所有点的最小多边形顶点集合。 + * @param pList 形如[x0,y0,x1,y1...]的点列表。 + * @returns 最小多边形顶点集合。 + */ + static scanPList(pList: any[]): any[]; + /** + * @en Find the minimum polygon vertex set that includes all points. + * @param PointSet The Point list. + * @returns The minimum polygon vertex set. + * @zh 寻找包括所有点的最小多边形顶点集合。 + * @param PointSet Point列表 + * @return 最小多边形顶点集合 + */ + static scan(PointSet: any[]): any[]; + } + /** + * @private + * @en The MathUtil class is a utility class for data processing. + * @zh MathUtil 是一个数据处理工具类。 + */ + class MathUtil { + /** + * @en Subtracts two 3D vectors. + * @param l The left vector. + * @param r The right vector. + * @param o The output vector to store the result. + * @zh 计算两个三维向量的差。 + * @param l 左向量。 + * @param r 右向量。 + * @param o 用于存储结果的输出向量。 + */ + static subtractVector3(l: Float32Array, r: Float32Array, o: Float32Array): void; + /** + * @en Performs linear interpolation between two values. + * @param left The start value. + * @param right The end value. + * @param amount The interpolation amount (0-1). + * @returns The interpolated value. + * @zh 在两个值之间进行线性插值。 + * @param left 起始值。 + * @param right 终止值。 + * @param amount 插值比率(0-1)。 + * @returns 插值结果。 + */ + static lerp(left: number, right: number, amount: number): number; + /** + * @en Scales a 3D vector by a scalar value. + * @param f The input vector. + * @param b The scalar value. + * @param e The output vector to store the result. + * @zh 将三维向量乘以一个标量值。 + * @param f 输入向量。 + * @param b 标量值。 + * @param e 用于存储结果的输出向量。 + */ + static scaleVector3(f: Float32Array, b: number, e: Float32Array): void; + /** + * @en Performs linear interpolation between two 3D vectors. + * @param l The start vector. + * @param r The end vector. + * @param t The interpolation amount (0-1). + * @param o The output vector to store the result. + * @zh 在两个三维向量之间进行线性插值。 + * @param l 起始向量。 + * @param r 终止向量。 + * @param t 插值比率(0-1)。 + * @param o 用于存储结果的输出向量。 + */ + static lerpVector3(l: Float32Array, r: Float32Array, t: number, o: Float32Array): void; + /** + * @en Performs linear interpolation between two 4D vectors. + * @param l The start vector. + * @param r The end vector. + * @param t The interpolation amount (0-1). + * @param o The output vector to store the result. + * @zh 在两个四维向量之间进行线性插值。 + * @param l 起始向量。 + * @param r 终止向量。 + * @param t 插值比率(0-1)。 + * @param o 用于存储结果的输出向量。 + */ + static lerpVector4(l: Float32Array, r: Float32Array, t: number, o: Float32Array): void; + /** + * @en Performs spherical linear interpolation (slerp) between two quaternions. + * @param a The start quaternion array. + * @param Offset1 The offset in the start quaternion array. + * @param b The end quaternion array. + * @param Offset2 The offset in the end quaternion array. + * @param t The interpolation amount (0-1). + * @param out The output quaternion array to store the result. + * @param Offset3 The offset in the output quaternion array. + * @returns The output quaternion array. + * @zh 在两个四元数之间进行球面线性插值(slerp)。 + * @param a 起始四元数数组。 + * @param Offset1 起始四元数数组的偏移量。 + * @param b 终止四元数数组。 + * @param Offset2 终止四元数数组的偏移量。 + * @param t 插值比率(0-1)。 + * @param out 用于存储结果的输出四元数数组。 + * @param Offset3 输出四元数数组的偏移量。 + * @returns 输出四元数数组。 + */ + static slerpQuaternionArray(a: Float32Array, Offset1: number, b: Float32Array, Offset2: number, t: number, out: Float32Array, Offset3: number): Float32Array; + /** + * @en Gets the angle value of the line segment formed by two specified points. + * @param x0 The X coordinate of the first point. + * @param y0 The Y coordinate of the first point. + * @param x1 The X coordinate of the second point. + * @param y1 The Y coordinate of the second point. + * @returns The angle value in degrees. + * @zh 获取由两个指定点组成的线段的角度值。 + * @param x0 第一个点的 X 坐标。 + * @param y0 第一个点的 Y 坐标。 + * @param x1 第二个点的 X 坐标。 + * @param y1 第二个点的 Y 坐标。 + * @returns 角度值,单位为度。 + */ + static getRotation(x0: number, y0: number, x1: number, y1: number): number; + /** + * @en A comparison function to determine the sorting order of array elements. + * @param a The first number to compare. + * @param b The second number to compare. + * @returns 0 if a equals b, 1 if b > a, -1 if b < a. + * @zh 一个用来确定数组元素排序顺序的比较函数。 + * @param a 待比较数字。 + * @param b 待比较数字。 + * @returns 如果a等于b 则值为0;如果b>a则值为1;如果b<则值为-1。 + */ + static sortBigFirst(a: number, b: number): number; + /** + * @en A comparison function to determine the sorting order of array elements. + * @param a The first number to compare. + * @param b The second number to compare. + * @returns 0 if a equals b, -1 if b > a, 1 if b < a. + * @zh 一个用来确定数组元素排序顺序的比较函数。 + * @param a 待比较数字。 + * @param b 待比较数字。 + * @returns 如果a等于b 则值为0;如果b>a则值为-1;如果b<则值为1。 + */ + static sortSmallFirst(a: number, b: number): number; + /** + * @en Compares the specified elements by converting them to numbers. + * @param a The first element to compare. + * @param b The second element to compare. + * @returns The difference between b and a as numbers (b-a). + * @zh 将指定的元素转为数字进行比较。 + * @param a 待比较元素。 + * @param b 待比较元素。 + * @returns b、a转化成数字的差值 (b-a)。 + */ + static sortNumBigFirst(a: any, b: any): number; + /** + * @en Compares the specified elements by converting them to numbers. + * @param a The first element to compare. + * @param b The second element to compare. + * @returns The difference between a and b as numbers (a-b). + * @zh 将指定的元素转为数字进行比较。 + * @param a 待比较元素。 + * @param b 待比较元素。 + * @returns a、b转化成数字的差值 (a-b)。 + */ + static sortNumSmallFirst(a: any, b: any): number; + /** + * @en Returns a comparison function for sorting objects based on a specified property. + * @param key The name of the object property to sort by. + * @param bigFirst If true, sort from big to small; otherwise, sort from small to big. + * @param forceNum If true, convert the sorting elements to numbers for comparison. + * @returns The sorting function. + * @zh 返回根据对象指定的属性进行排序的比较函数。 + * @param key 排序要依据的元素属性名。 + * @param bigFirst 如果值为true,则按照由大到小的顺序进行排序,否则按照由小到大的顺序进行排序。 + * @param forceNum 如果值为true,则将排序的元素转为数字进行比较。 + * @return 排序函数。 + */ + static sortByKey(key: string, bigFirst?: boolean, forceNum?: boolean): (a: any, b: any) => number; + } + /** + * @en The MathUtils3D class is used to create mathematical utilities. + * @zh MathUtils3D 类用于创建数学工具。 + */ + class MathUtils3D { + /** + * @en Tolerance for single-precision floating-point (float) zero. + * @zh 单精度浮点(float)零的容差。 + */ + static zeroTolerance: number; + /** + * @en Default maximum value for floating-point numbers. + * @zh 浮点数默认最大值。 + */ + static MaxValue: number; + /** + * @en Default minimum value for floating-point numbers. + * @zh 浮点数默认最小值。 + */ + static MinValue: number; + /** + * @en Coefficient for converting degrees to radians. + * @zh 角度转弧度系数。 + */ + static Deg2Rad: number; + /** + * @en Constructor of MathUtils3D. + * @zh MathUtils3D 的构造函数。 + */ + constructor(); + /** + * @en Determines if a value is approximately zero within the tolerance range. + * @param v The value to be checked. + * @returns Whether the value is approximately zero. + * @zh 是否在容差的范围内近似于0。 + * @param v 要判断的值。 + * @returns 是否近似于0。 + */ + static isZero(v: number): boolean; + /** + * @en Determines if two values are approximately equal within the tolerance range. + * @param n1 The first value to compare. + * @param n2 The second value to compare. + * @returns Whether the two values are approximately equal. + * @zh 两个值是否在容差的范围内近似相等Sqr Magnitude。 + * @param n1 要比较的第一个值。 + * @param n2 要比较的第二个值。 + * @returns 两个值是否近似相等。 + */ + static nearEqual(n1: number, n2: number): boolean; + /** + * @en Calculate the reciprocal of the square root of a non-zero number. + * @param value The input value. + * @returns The reciprocal of the square root of the input value. + * @zh 计算一个非0数的平方根的倒数。 + * @param value 输入值。 + * @returns 输入值的平方根倒数。 + */ + static fastInvSqrt(value: number): number; + } + /** + * @en Represents a transformation matrix that determines how to map points from one coordinate space to another. + * You can perform various graphical transformations on a display object by setting the properties of a Matrix object, applying it to the matrix property of a Transform object, and then applying that Transform object as the transform property of the display object. + * These transformation functions include translation (x and y repositioning), rotation, scaling, and skewing. + * @zh 表示一个转换矩阵,它确定如何将点从一个坐标空间映射到另一个坐标空间。 + * 您可以对一个显示对象执行不同的图形转换,方法是设置 Matrix 对象的属性,将该 Matrix 对象应用于 Transform 对象的 matrix 属性, + * 然后应用该 Transform 对象作为显示对象的 transform 属性。这些转换函数包括平移(x 和 y 重新定位)、旋转、缩放和倾斜。 + */ + class Matrix { + /** + * @private + * @en An initialized Matrix object. The content of this object is not allowed to be modified. + * @zh 一个初始化的 Matrix 对象,不允许修改此对象内容。 + */ + static EMPTY: Matrix; + /** + * @en A Matrix object used for temporary operations. + * @zh 用于中转使用的 Matrix 对象。 + */ + static TEMP: Matrix; + /** + * @en The value that affects the positioning of pixels along the x axis when scaling or rotating an image. + * @zh 缩放或旋转图像时影响像素沿 x 轴定位的值。 + */ + a: number; + /** + * @en The value that affects the positioning of pixels along the y axis when rotating or skewing an image. + * @zh 旋转或倾斜图像时影响像素沿 y 轴定位的值。 + */ + b: number; + /** + * @en The value that affects the positioning of pixels along the x axis when rotating or skewing an image. + * @zh 旋转或倾斜图像时影响像素沿 x 轴定位的值。 + */ + c: number; + /** + * @en The value that affects the positioning of pixels along the y axis when scaling or rotating an image. + * @zh 缩放或旋转图像时影响像素沿 y 轴定位的值。 + */ + d: number; + /** + * @en The distance by which to translate each point along the x axis. + * @zh 沿 x 轴平移每个点的距离。 + */ + tx: number; + /** + * @en The distance by which to translate each point along the y axis. + * @zh 沿 y 轴平移每个点的距离。 + */ + ty: number; + /** + * @en Constructs method, initialize matrix. + * @param a (Optional) The value that affects the positioning of pixels along the x axis when scaling or rotating an image. + * @param b (Optional) The value that affects the positioning of pixels along the y axis when rotating or skewing an image. + * @param c (Optional) The value that affects the positioning of pixels along the x axis when rotating or skewing an image. + * @param d (Optional) The value that affects the positioning of pixels along the y axis when scaling or rotating an image. + * @param tx (Optional) The distance by which to translate each point along the x axis. + * @param ty (Optional) The distance by which to translate each point along the y axis. + * @param nums (Optional) Additional parameter. + * @zh 构造方法,初始化矩阵。 + * @param a (可选)缩放或旋转图像时影响像素沿 x 轴定位的值。 + * @param b (可选)旋转或倾斜图像时影响像素沿 y 轴定位的值。 + * @param c (可选)旋转或倾斜图像时影响像素沿 x 轴定位的值。 + * @param d (可选)缩放或旋转图像时影响像素沿 y 轴定位的值。 + * @param tx (可选)沿 x 轴平移每个点的距离。 + * @param ty (可选)沿 y 轴平移每个点的距离。 + * @param nums (可选) 附加参数。 + */ + constructor(a?: number, b?: number, c?: number, d?: number, tx?: number, ty?: number, nums?: number); + /** + * @en Sets this matrix to an identity matrix. + * @returns The current matrix. + * @zh 将本矩阵设置为单位矩阵。 + * @return 返回当前矩形。 + */ + identity(): Matrix; + /** + * @en Sets the translation along the x and y axes. + * @param x The distance to translate along the x axis. + * @param y The distance to translate along the y axis. + * @returns The current matrix object. + * @zh 设置沿 x 、y 轴平移每个点的距离。 + * @param x 沿 x 轴平移每个点的距离。 + * @param y 沿 y 轴平移每个点的距离。 + * @return 返回对象本身 + */ + setTranslate(x: number, y: number): Matrix; + /** + * @en Translates the matrix along the x and y axes, as specified by the x and y parameters. + * @param x The amount to move along the x axis (in pixels). + * @param y The amount to move along the y axis (in pixels). + * @returns The current matrix object. + * @zh 沿 x 和 y 轴平移矩阵,平移的变化量由 x 和 y 参数指定。 + * @param x 沿 x 轴向右移动的量(以像素为单位)。 + * @param y 沿 y 轴向下移动的量(以像素为单位)。 + * @return 返回此矩形对象。 + */ + translate(x: number, y: number): Matrix; + /** + * @en Applies a scaling transformation to the matrix. + * @param x The multiplier used to scale the object along the x axis. + * @param y The multiplier used to scale the object along the y axis. + * @returns The current matrix object. + * @zh 对矩阵应用缩放转换。 + * @param x 用于沿 x 轴缩放对象的乘数。 + * @param y 用于沿 y 轴缩放对象的乘数。 + * @return 返回矩阵对象本身 + */ + scale(x: number, y: number): Matrix; + /** + * @en Applies a rotation transformation to the Matrix object. + * @param angle The rotation angle in radians. + * @returns The current matrix objec. + * @zh 对 Matrix 对象应用旋转转换。 + * @param angle 以弧度为单位的旋转角度。 + * @return 返回矩阵对象本身 + */ + rotate(angle: number): Matrix; + /** + * @en Applies a skew transformation to the Matrix object. + * @param x The 2D skew angle along the X axis in radians. + * @param y The 2D skew angle along the Y axis in radians. + * @returns The current Matrix object. + * @zh 对 Matrix 对象应用倾斜转换。 + * @param x 沿着 X 轴的 2D 倾斜弧度。 + * @param y 沿着 Y 轴的 2D 倾斜弧度。 + * @returns 当前 Matrix 对象。 + */ + skew(x: number, y: number): Matrix; + /** + * @en Applies the inverse transformation of the current matrix to the specified point and returns this point. + * @param out The Point object to be transformed. + * @returns The transformed out Point object. + * @zh 对指定的点应用当前矩阵的逆转化并返回此点。 + * @param out 待转化的点 Point 对象。 + * @returns 返回out + */ + invertTransformPoint(out: Point): Point; + /** + * @en Applies the geometric transformation represented by the Matrix object to the specified point. + * @param out The point used to set the output result. + * @returns The transformed out Point object. + * @zh 将 Matrix 对象表示的几何转换应用于指定点。 + * @param out 用来设定输出结果的点。 + * @returns 返回out + */ + transformPoint(out: Point): Point; + /** + * @en Applies the geometric transformation represented by the Matrix object to the specified point, ignoring tx and ty. + * @param out The point used to set the output result. + * @returns The transformed out Point object. + * @zh 将 Matrix 对象表示的几何转换应用于指定点,忽略tx、ty。 + * @param out 用来设定输出结果的点。 + * @returns 返回out + */ + transformPointN(out: Point): Point; + /** + * @en Gets the X-axis scaling value. + * @zh 获取 X 轴缩放值。 + */ + getScaleX(): number; + /** + * @en Gets the Y-axis scaling value. + * @zh 获取 Y 轴缩放值。 + */ + getScaleY(): number; + /** + * @en Perform the inverse transformation of the original matrix. + * @returns The current matrix object. + * @zh 执行原始矩阵的逆转换。 + * @returns 当前矩阵对象。 + */ + invert(): Matrix; + /** + * @en Sets the members of Matrix to the specified values. + * @param a The value that affects the positioning of pixels along the x axis when scaling or rotating an image. + * @param b The value that affects the positioning of pixels along the y axis when rotating or skewing an image. + * @param c The value that affects the positioning of pixels along the x axis when rotating or skewing an image. + * @param d The value that affects the positioning of pixels along the y axis when scaling or rotating an image. + * @param tx The distance by which to translate each point along the x axis. + * @param ty The distance by which to translate each point along the y axis. + * @returns The current matrix object. + * @zh 将 Matrix 的成员设置为指定值。 + * @param a 缩放或旋转图像时影响像素沿 x 轴定位的值。 + * @param b 旋转或倾斜图像时影响像素沿 y 轴定位的值。 + * @param c 旋转或倾斜图像时影响像素沿 x 轴定位的值。 + * @param d 缩放或旋转图像时影响像素沿 y 轴定位的值。 + * @param tx 沿 x 轴平移每个点的距离。 + * @param ty 沿 y 轴平移每个点的距离。 + * @return 当前矩阵对象。 + */ + setTo(a: number, b: number, c: number, d: number, tx: number, ty: number): Matrix; + /** + * @en Concatenates the specified matrix with the current matrix, effectively combining the geometric effects of the two. + * @param matrix The matrix to be concatenated to the source matrix. + * @returns The current matrix. + * @zh 将指定矩阵与当前矩阵连接,从而将这两个矩阵的几何效果有效地结合在一起。 + * @param matrix 要连接到源矩阵的矩阵。 + * @return 当前矩阵。 + */ + concat(matrix: Matrix): Matrix; + /** + * @en Multiplies the specified two matrices and assigns the result to the specified output object. + * @param m1 The first matrix. + * @param m2 The second matrix. + * @param out The output object. + * @returns The result output object out. + * @zh 将指定的两个矩阵相乘后的结果赋值给指定的输出对象。 + * @param m1 矩阵一。 + * @param m2 矩阵二。 + * @param out 输出对象。 + * @return 结果输出对象 out。 + */ + static mul(m1: Matrix, m2: Matrix, out: Matrix): Matrix; + /** + * @en Multiplies the specified two matrices and assigns the result to the specified output array of length 16. + * @param m1 The first matrix. + * @param m2 The second matrix. + * @param out The output Array object. + * @returns The result output object out. + * @zh 将指定的两个矩阵相乘,结果赋值给指定的输出数组,长度为16。 + * @param m1 矩阵一。 + * @param m2 矩阵二。 + * @param out 输出对象Array。 + * @returns 结果输出对象 out。 + */ + static mul16(m1: Matrix, m2: Matrix, out: any[]): any[]; + /** + * @private + * @en Applies a scaling transformation to the matrix. Reverse multiplication. + * @param x The multiplier used to scale the object along the x axis. + * @param y The multiplier used to scale the object along the y axis. + * @zh 对矩阵应用缩放转换。反向相乘 + * @param x 用于沿 x 轴缩放对象的乘数。 + * @param y 用于沿 y 轴缩放对象的乘数。 + */ + scaleEx(x: number, y: number): void; + /** + * @private + * @en Applies a rotation transformation to the Matrix object. Reverse multiplication. + * @param angle The rotation angle in radians. + * @zh 对 Matrix 对象应用旋转转换。反向相乘 + * @param angle 以弧度为单位的旋转角度。 + */ + rotateEx(angle: number): void; + /** + * @en Returns a copy of this Matrix object. + * @returns A new Matrix instance with exactly the same properties as the original instance. + * @zh 返回此 Matrix 对象的副本。 + * @returns 与原始实例具有完全相同的属性的新 Matrix 实例。 + */ + clone(): Matrix; + /** + * @en Copy all matrix data from the current Matrix object to the specified Matrix object. + * @param dec The Matrix object to copy the current matrix data to. + * @returns The Matrix object with the copied matrix data. + * @zh 将当前 Matrix 对象中的所有矩阵数据复制到指定的 Matrix 对象中。 + * @param dec 要复制当前矩阵数据的 Matrix 对象。 + * @returns 已复制当前矩阵数据的 Matrix 对象。 + */ + copyTo(dec: Matrix): Matrix; + /** + * @en Return a string that lists the properties of this Matrix object. + * @returns A string containing the property values of the Matrix object: a, b, c, d, tx, and ty. + * @zh 返回列出该 Matrix 对象属性的文本值。 + * @returns 一个字符串,它包含 Matrix 对象的属性值:a、b、c、d、tx 和 ty。 + */ + toString(): string; + /** + * @en Destroy this object. + * @zh 销毁此对象。 + */ + destroy(): void; + /** + * @en Recycle to the object pool for reuse. + * @zh 回收到对象池,方便复用。 + */ + recover(): void; + /** + * @en Create a Matrix object from the object pool. + * @returns A Matrix object. + * @zh 从对象池中创建一个 Matrix 对象。 + * @returns 返回一个 Matrix 对象。 + */ + static create(): Matrix; + } + /** + * @en The Matrix3x3 class is used to create a 3x3 matrix. + * @zh Matrix3x3 类用于创建 3x3 矩阵。 + */ + class Matrix3x3 implements IClone { + /** + * @en Default value + * @zh 默认值 + */ + static readonly DEFAULT: Readonly; + /** + * @en Temporary variable + * @zh 临时变量 + */ + static Temp: Matrix3x3; + /** + * @en Create a rotation matrix from a quaternion. + * @param rotation The rotation quaternion. + * @param out The output rotation matrix. + * @zh 通过四元数创建旋转矩阵。 + * @param rotation 旋转四元数。 + * @param out 输出的旋转矩阵。 + */ + static createRotationQuaternion(rotation: Quaternion, out: Matrix3x3): void; + /** + * @en Generate a 3x3 matrix based on the specified translation. + * @param trans The translation vector. + * @param out The output matrix. + * @zh 根据指定平移生成 3x3 矩阵。 + * @param trans 平移向量。 + * @param out 输出矩阵。 + */ + static createFromTranslation(trans: Vector2, out: Matrix3x3): void; + /** + * @en Generate a 3x3 matrix based on the specified rotation. + * @param rad The rotation value. + * @param out The output matrix. + * @zh 根据指定旋转生成 3x3 矩阵。 + * @param rad 旋转值。 + * @param out 输出矩阵。 + */ + static createFromRotation(rad: number, out: Matrix3x3): void; + /** + * @en Generate a 3x3 matrix based on the specified scaling. + * @param scale The scaling vector. + * @param out The output matrix. + * @zh 根据指定缩放生成 3x3 矩阵。 + * @param scale 缩放向量。 + * @param out 输出矩阵。 + */ + static createFromScaling(scale: Vector3, out: Matrix3x3): void; + /** + * @en Convert a 4x4 matrix to a 3x3 matrix (upper-left principle, ignoring the fourth row and column). + * @param sou The source 4x4 matrix. + * @param out The output 3x3 matrix. + * @zh 从 4x4 矩阵转换为一个 3x3 的矩阵(原则为 upper-left,忽略第四行四列)。 + * @param sou 4x4 源矩阵。 + * @param out 3x3 输出矩阵。 + */ + static createFromMatrix4x4(sou: Matrix4x4, out: Matrix3x3): void; + /** + * @en Multiply two 3x3 matrices. + * @param left The left matrix. + * @param right The right matrix. + * @param out The output matrix. + * @zh 两个 3x3 矩阵的相乘。 + * @param left 左矩阵。 + * @param right 右矩阵。 + * @param out 输出矩阵。 + */ + static multiply(left: Matrix3x3, right: Matrix3x3, out: Matrix3x3): void; + /** + * @en Matrix element array + * @zh 矩阵元素数组 + */ + elements: Float32Array; + constructor(createElement?: boolean); + /** + * @en Clone the matrix by array. + * @param destObject The target array to clone to. + * @zh 通过数组克隆矩阵。 + * @param destObject 克隆目标数组。 + */ + cloneByArray(destObject: Float32Array): void; + /** + * @en Calculate the determinant of the 3x3 matrix. + * @returns The determinant of the matrix. + * @zh 计算 3x3 矩阵的行列式。 + * @returns 返回矩阵的行列式。 + */ + determinant(): number; + /** + * @en Transform the 3x3 matrix by a two-dimensional vector. + * @param trans The translation vector. + * @param out The output matrix. + * @zh 通过一个二维向量转换 3x3 矩阵。 + * @param trans 转换向量。 + * @param out 输出矩阵。 + */ + translate(trans: Vector2, out: Matrix3x3): void; + /** + * @en Rotate the 3x3 matrix by a specified angle. + * @param rad The rotation angle in radians. + * @param out The output matrix. + * @zh 根据指定角度旋转 3x3 矩阵。 + * @param rad 旋转角度(弧度)。 + * @param out 输出矩阵。 + */ + rotate(rad: number, out: Matrix3x3): void; + /** + * @en Scale the 3x3 matrix by a specified value. + * @param scale The scaling vector. + * @param out The output matrix. + * @zh 根据指定缩放值缩放 3x3 矩阵。 + * @param scale 缩放向量。 + * @param out 输出矩阵。 + */ + scale(scale: Vector2, out: Matrix3x3): void; + /** + * @en Calculate the inverse of the 3x3 matrix. + * @param out The output inverse matrix. + * @zh 计算 3x3 矩阵的逆矩阵。 + * @param out 输出的逆矩阵。 + */ + invert(out: Matrix3x3): void; + /** + * @en Calculate the transpose of the 3x3 matrix. + * @param out The output matrix. + * @zh 计算 3x3 矩阵的转置矩阵。 + * @param out 输出矩阵。 + */ + transpose(out: Matrix3x3): void; + /** + * @en Set the existing matrix to an identity matrix. + * @zh 设置已有的矩阵为单位矩阵。 + */ + identity(): void; + /** + * @en Clone the matrix. + * @param destObject The clone target. + * @zh 克隆矩阵。 + * @param destObject 克隆目标。 + */ + cloneTo(destObject: Matrix3x3): void; + /** + * @en Clone the matrix. + * @returns A clone of the matrix. + * @zh 克隆矩阵。 + * @returns 矩阵的克隆副本。 + */ + clone(): any; + /** + * @en Calculate the 3x3 view matrix. + * @param eye The position of the observer. + * @param target The position of the target. + * @param up The up vector. + * @param out The output 3x3 matrix. + * @zh 计算观察3x3矩阵。 + * @param eye 观察者位置。 + * @param target 目标位置。 + * @param up 上向量。 + * @param out 输出3x3矩阵。 + */ + static lookAt(eye: Vector3, target: Vector3, up: Vector3, out: Matrix3x3): void; + /** + * @en Calculate the 3x3 view matrix with forward direction looking at target. Forward is defined as the z-axis here. + * @param eye The starting point. + * @param target The target point. + * @param up The up vector. + * @param out The output matrix. + * @zh 计算前向看向目标的3x3观察矩阵。这里规定前向为z轴。 + * @param eye 起始点。 + * @param target 目标点。 + * @param up 向上轴。 + * @param out 输出矩阵。 + */ + static forwardLookAt(eye: Vector3, target: Vector3, up: Vector3, out: Matrix3x3): void; + } + /** + * @en The `Matrix4x4` class is used to create 4x4 matrices. + * @zh `Matrix4x4` 类用于创建4x4矩阵。 + */ + class Matrix4x4 implements IClone { + /** + * @en Default matrix. Do not modify. + * @zh 默认矩阵,禁止修改。 + */ + static readonly DEFAULT: Readonly; + /** + * @en Inverse of the default matrix. Do not modify. + * @zh 默认值的逆矩阵,禁止修改。 + */ + static readonly DEFAULTINVERT: Readonly; + /** + * @en Default matrix. Do not modify. + * @zh 默认矩阵,禁止修改。 + */ + static readonly ZERO: Readonly; + /** + * @en Create a rotation matrix around the X axis. + * @param rad The rotation angle. + * @param out The output matrix. + * @zh 创建绕X轴旋转的矩阵。 + * @param rad 旋转角度。 + * @param out 输出矩阵。 + */ + static createRotationX(rad: number, out: Matrix4x4): void; + /** + * @en Create a rotation matrix around the Y axis. + * @param rad The rotation angle. + * @param out The output matrix. + * @zh 创建绕Y轴旋转的矩阵。 + * @param rad 旋转角度。 + * @param out 输出矩阵。 + */ + static createRotationY(rad: number, out: Matrix4x4): void; + /** + * @en Create a rotation matrix around the Z axis. + * @param rad The rotation angle. + * @param out The output matrix. + * @zh 创建绕Z轴旋转的矩阵。 + * @param rad 旋转角度。 + * @param out 输出矩阵。 + */ + static createRotationZ(rad: number, out: Matrix4x4): void; + /** + * @en Create a rotation matrix from yaw, pitch, and roll angles. + * @param yaw The rotation angle around the vertical axis (Y-axis). + * @param pitch The rotation angle around the transverse axis (X-axis). + * @param roll The rotation angle around the longitudinal axis (Z-axis). + * @param result The output result matrix. + * @zh 通过yaw、pitch、roll角度创建旋转矩阵。 + * @param yaw 绕垂直轴(Y轴)的旋转角度。 + * @param pitch 绕横向轴(X轴)的旋转角度。 + * @param roll 绕纵向轴(Z轴)的旋转角度。 + * @param result 输出结果矩阵。 + */ + static createRotationYawPitchRoll(yaw: number, pitch: number, roll: number, result: Matrix4x4): void; + /** + * @en Create a rotation matrix from an axis and an angle. + * @param axis The rotation axis, assumed to be normalized. + * @param angle The rotation angle. + * @param result The output result matrix. + * @zh 通过旋转轴和旋转角度计算旋转矩阵。 + * @param axis 旋转轴,假定已经归一化。 + * @param angle 旋转角度。 + * @param result 输出结果矩阵。 + */ + static createRotationAxis(axis: Vector3, angle: number, result: Matrix4x4): void; + /** + * @en Create a rotation matrix from a quaternion. + * @param rotation The rotation quaternion. + * @param result The output rotation matrix. + * @zh 通过四元数创建旋转矩阵。 + * @param rotation 旋转四元数。 + * @param result 输出旋转矩阵。 + */ + static createRotationQuaternion(rotation: Quaternion, result: Matrix4x4): void; + /** + * @en Create a translation matrix. + * @param trans The translation vector. + * @param out The output matrix. + * @zh 根据平移向量创建平移矩阵。 + * @param trans 平移向量。 + * @param out 输出矩阵。 + */ + static createTranslate(trans: Vector3, out: Matrix4x4): void; + /** + * @en Create a scaling matrix. + * @param scale The scaling values. + * @param out The output matrix. + * @zh 根据缩放值创建缩放矩阵。 + * @param scale 缩放值。 + * @param out 输出矩阵。 + */ + static createScaling(scale: Vector3, out: Matrix4x4): void; + /** + * @en Multiply two matrices. + * @param left The left matrix. + * @param right The right matrix. + * @param out The output matrix. + * @zh 计算两个矩阵的乘法。 + * @param left 左矩阵。 + * @param right 右矩阵。 + * @param out 输出矩阵。 + */ + static multiply(left: Matrix4x4, right: Matrix4x4, out: Matrix4x4): void; + /** + * @en Calculate the rotation matrix from a quaternion. + * @param rotation The input quaternion. + * @param out The output matrix. + * @zh 从四元数计算旋转矩阵。 + * @param rotation 输入的四元数。 + * @param out 输出矩阵。 + */ + static createFromQuaternion(rotation: Quaternion, out: Matrix4x4): void; + /** + * @en Calculate the affine transformation matrix. + * @param trans The translation vector. + * @param rot The rotation quaternion. + * @param scale The scale vector. + * @param out The output matrix. + * @zh 计算仿射变换矩阵。 + * @param trans 平移向量。 + * @param rot 旋转四元数。 + * @param scale 缩放向量。 + * @param out 输出矩阵。 + */ + static createAffineTransformation(trans: Vector3, rot: Quaternion, scale: Vector3, out: Matrix4x4): void; + /** + * @en Calculate the view matrix. + * @param eye The position of the viewer's eye. + * @param target The position of the target point. + * @param up The up vector. + * @param out The output matrix. + * @zh 计算观察矩阵。 + * @param eye 视点位置。 + * @param target 视点目标。 + * @param up 向上向量。 + * @param out 输出矩阵。 + */ + static createLookAt(eye: Vector3, target: Vector3, up: Vector3, out: Matrix4x4): void; + /** + * @en Create a perspective projection matrix using FOV. + * @param fov The field of view in radians. + * @param aspect The aspect ratio (width / height). + * @param znear The near clipping plane. + * @param zfar The far clipping plane. + * @param out The output matrix. + * @zh 通过FOV创建透视投影矩阵。 + * @param fov 视角(以弧度为单位)。 + * @param aspect 横纵比(宽/高)。 + * @param znear 近裁面。 + * @param zfar 远裁面。 + * @param out 输出矩阵。 + */ + static createPerspective(fov: number, aspect: number, znear: number, zfar: number, out: Matrix4x4): void; + /** + * @en Create a perspective projection matrix. + * @param left The left boundary of the frustum. + * @param right The right boundary of the frustum. + * @param bottom The bottom boundary of the frustum. + * @param top The top boundary of the frustum. + * @param znear The near boundary of the frustum. + * @param zfar The far boundary of the frustum. + * @param out The output matrix. + * @zh 创建透视投影矩阵。 + * @param left 视椎左边界。 + * @param right 视椎右边界。 + * @param bottom 视椎底边界。 + * @param top 视椎顶边界。 + * @param znear 视椎近边界。 + * @param zfar 视椎远边界。 + * @param out 输出矩阵。 + */ + static createPerspectiveOffCenter(left: number, right: number, bottom: number, top: number, znear: number, zfar: number, out: Matrix4x4): void; + /** + * @en Calculate the orthographic projection matrix. + * @param left The left boundary of the frustum. + * @param right The right boundary of the frustum. + * @param bottom The bottom boundary of the frustum. + * @param top The top boundary of the frustum. + * @param znear The near boundary of the frustum. + * @param zfar The far boundary of the frustum. + * @param out The output matrix. + * @zh 计算正交投影矩阵。 + * @param left 视椎左边界。 + * @param right 视椎右边界。 + * @param bottom 视椎底边界。 + * @param top 视椎顶边界。 + * @param znear 视椎近边界。 + * @param zfar 视椎远边界。 + * @param out 输出矩阵。 + */ + static createOrthoOffCenter(left: number, right: number, bottom: number, top: number, znear: number, zfar: number, out: Matrix4x4): void; + /** + * @en Matrix elements array. + * @zh 矩阵元素数组。 + */ + elements: Float32Array; + /** + * @en Constructor method. + * @zh 构造方法 + */ + constructor(m11?: number, m12?: number, m13?: number, m14?: number, m21?: number, m22?: number, m23?: number, m24?: number, m31?: number, m32?: number, m33?: number, m34?: number, m41?: number, m42?: number, m43?: number, m44?: number, elements?: Float32Array); + /** + * @en Generate matrix from quaternion. + * @param rotation The rotation quaternion. + * @zh 从四元数生成矩阵。 + * @param rotation 旋转四元数。 + */ + setRotation(rotation: Quaternion): void; + /** + * @en Set the position of the matrix. + * @param position The position vector. + * @zh 设置矩阵的位置。 + * @param position 位置向量。 + */ + setPosition(position: Vector3): void; + /** + * @en Determine if two 4x4 matrices have equal values. + * @param other The other 4x4 matrix to compare. + * @returns True if the matrices are equal, false otherwise. + * @zh 判断两个4x4矩阵的值是否相等。 + * @param other 要比较的另一个4x4矩阵。 + * @returns 如果矩阵相等则返回true,否则返回false。 + */ + equalsOtherMatrix(other: Matrix4x4): boolean; + /** + * @en Decompose the matrix into translation vector, rotation quaternion, and scale vector. + * @param translation The translation vector. + * @param rotation The rotation quaternion. + * @param scale The scale vector. + * @returns Whether the decomposition was successful. + * @zh 分解矩阵为平移向量、旋转四元数、缩放向量。 + * @param translation 平移向量。 + * @param rotation 旋转四元数。 + * @param scale 缩放向量。 + * @returns 是否分解成功。 + */ + decomposeTransRotScale(translation: Vector3, rotation: Quaternion, scale: Vector3): boolean; + /** + * @en Decompose the matrix into translation vector, rotation matrix, and scale vector. + * @param translation The translation vector. + * @param rotationMatrix The rotation matrix. + * @param scale The scale vector. + * @returns Whether the decomposition was successful. + * @zh 分解矩阵为平移向量、旋转矩阵、缩放向量。 + * @param translation 平移向量。 + * @param rotationMatrix 旋转矩阵。 + * @param scale 缩放向量。 + * @returns 是否分解成功。 + */ + decomposeTransRotMatScale(translation: Vector3, rotationMatrix: Matrix4x4, scale: Vector3): boolean; + /** + * @en Decompose the rotation matrix into Yaw-Pitch-Roll Euler angles. + * @param yawPitchRoll Vector3 to store the resulting Euler angles (in radians). + * @zh 分解旋转矩阵为Yaw-Pitch-Roll欧拉角。 + * @param yawPitchRoll 用于存储结果欧拉角的Vector3(单位为弧度)。 + */ + decomposeYawPitchRoll(yawPitchRoll: Vector3): void; + /** + * @en Normalize the matrix. + * @zh 归一化矩阵。 + */ + normalize(): void; + /** + * @en Calculate the transpose of the matrix. + * @returns The transposed matrix. + * @zh 计算矩阵的转置矩阵。 + * @returns 转置后的矩阵。 + */ + transpose(): Matrix4x4; + /** + * @en Calculate the inverse of a matrix. + * @param out The output matrix to store the result. + * @zh 计算矩阵的逆矩阵。 + * @param out 用于存储结果的输出矩阵。 + */ + invert(out: Matrix4x4): void; + /** + * @en Calculate the Billboard matrix + * @param objectPosition The position of the object + * @param cameraPosition The position of the camera + * @param cameraUp The up vector of the camera + * @param cameraForward The forward vector of the camera + * @param mat The transformation matrix to store the result + * @zh 计算Billboard矩阵 + * @param objectPosition 物体位置 + * @param cameraPosition 相机位置 + * @param cameraUp 相机上向量 + * @param cameraForward 相机前向量 + * @param mat 用于存储结果的变换矩阵 + */ + static billboard(objectPosition: Vector3, cameraPosition: Vector3, cameraUp: Vector3, cameraForward: Vector3, mat: Matrix4x4): void; + /** + * @en Normalization + * @zh 归一化 + */ + identity(): void; + /** + * @en Check if the matrix is an identity matrix + * @zh 判断是否是单位矩阵 + */ + isIdentity(): boolean; + /** + * @en Clone the matrix to another object + * @param destObject Clone Source + * @zh 克隆矩阵到另一个对象 + * @param destObject 克隆源。 + */ + cloneTo(destObject: Matrix4x4): void; + /** + * @en Clone the matrix from a Float32Array + * @param destObject The Float32Array to clone from + * @zh 从Float32Array克隆矩阵 + * @param destObject 要克隆的Float32Array + */ + cloneByArray(destObject: Float32Array): void; + /** + * @en Clone the matrix + * @returns A new Matrix4x4 object with the same values + * @zh 克隆矩阵 + * @returns 一个具有相同值的新Matrix4x4对象 + */ + clone(): any; + /** + * @en Convert a coordinate matrix + * @param v3 Coordinate points + * @param out The output matrix + * @zh 转换一个坐标位矩阵 + * @param v3 坐标点 + * @param out 输出矩阵 + */ + static translation(v3: Vector3, out: Matrix4x4): void; + /** + * @en Get the translation vector from the matrix + * @param out The output vector to store the translation + * @zh 获取矩阵中的平移向量 + * @param out 用于存储平移向量的输出向量 + */ + getTranslationVector(out: Vector3): void; + /** + * @en Set the translation vector of the matrix + * @param translate The vector representing the translation + * @zh 设置矩阵的平移向量 + * @param translate 表示平移的向量 + */ + setTranslationVector(translate: Vector3): void; + /** + * @en Get the forward vector from the matrix + * @param out The output vector to store the forward vector + * @zh 获取矩阵的前向量 + * @param out 用于存储前向量的输出向量 + */ + getForward(out: Vector3): void; + /** + * @en Set the forward vector of the matrix + * @param forward The vector representing the forward direction + * @zh 设置矩阵的前向量 + * @param forward 表示前向方向的向量 + */ + setForward(forward: Vector3): void; + /** + * @en Determine if this matrix is an inverted matrix + * @returns True if the matrix is inverted, false otherwise + * @zh 判断此矩阵是否是反向矩阵 + * @returns 如果矩阵是反向的返回true,否则返回false + */ + getInvertFront(): boolean; + } + /** + * @en The `Point` object represents a location in a two-dimensional coordinate system, where x represents the horizontal axis and y represents the vertical axis. + * @zh `Point` 对象表示二维坐标系统中的某个位置,其中 x 表示水平轴,y 表示垂直轴。 + */ + class Point { + /** + * @en Temporary public object for reuse. + * @zh 临时使用的公用对象。 + */ + static TEMP: Point; + /** + * @private + * @en Global empty point object (x=0, y=0), the content of this object is not allowed to be modified. + * @zh 全局空的point对象(x=0,y=0),不允许修改此对象内容。 + */ + static EMPTY: Point; + /** + * @en The horizontal coordinate of this point. + * @zh 该点的水平坐标。 + */ + x: number; + /** + * @en The vertical coordinate of this point. + * @zh 该点的垂直坐标。 + */ + y: number; + /** + * @en Creates a new Point object based on the specified coordinates. + * @param x The horizontal coordinate. Default is 0. + * @param y The vertical coordinate. Default is 0. + * @zh 根据指定坐标,创建一个新的 Point 对象。 + * @param x 水平坐标。默认值为0。 + * @param y 垂直坐标。默认值为0。 + */ + constructor(x?: number, y?: number); + /** + * @en Create from object pool + * @returns A Point object from the pool + * @zh 从对象池创建 + * @returns 从对象池中获取的Point对象 + */ + static create(): Point; + /** + * @en Sets the members of Point to the specified values. + * @param x The horizontal coordinate. + * @param y The vertical coordinate. + * @returns The current Point object. + * @zh 将 Point 的成员设置为指定值。 + * @param x 水平坐标。 + * @param y 垂直坐标。 + * @returns 当前 Point 对象。 + */ + setTo(x: number, y: number): Point; + /** + * @en Reset the point to (0, 0) + * @returns The current Point object. + * @zh 重置点为(0, 0) + * @returns 当前 Point 对象。 + */ + reset(): Point; + /** + * @en Recycle to the object pool for reuse + * @zh 回收到对象池,方便复用 + */ + recover(): void; + /** + * @en Calculate the distance between the current point and the target point (x, y). + * @param x The horizontal coordinate of the target point. + * @param y The vertical coordinate of the target point. + * @returns The distance between the current point and the target point. + * @zh 计算当前点和目标点(x,y)的距离。 + * @param x 目标点的水平坐标。 + * @param y 目标点的垂直坐标。 + * @returns 返回当前点和目标点之间的距离。 + */ + distance(x: number, y: number): number; + /** + * @en Returns a string that contains the values of the x and y coordinates. + * @zh 返回包含 x 和 y 坐标的值的字符串。 + */ + toString(): string; + /** + * @en Normalize the vector. + * @zh 标准化向量。 + */ + normalize(): void; + /** + * @en Copy coordinates from another point + * @param point The point to be copied from + * @returns The current Point object. + * @zh 复制另一个点的坐标 + * @param point 需要被复制的点 + * @returns 当前 Point 对象。 + */ + copy(point: Point): Point; + } + /** + * @en The `Quaternion` class is used to create quaternions. + * @zh `Quaternion` 类用于创建四元数。 + */ + class Quaternion implements IClone { + /** + * @en Default quaternion, read-only. + * @zh 默认四元数,只读。 + */ + static readonly DEFAULT: Readonly; + /** + * @en Invalid quaternion, read-only. + * @zh 无效四元数,只读。 + */ + static readonly NAN: Readonly; + /** + * @en Generate a quaternion from Euler angles (order is Yaw, Pitch, Roll) + * @param yaw The yaw value + * @param pitch The pitch value + * @param roll The roll value + * @param out The output quaternion + * @zh 从欧拉角生成四元数(顺序为Yaw、Pitch、Roll) + * @param yaw yaw值 + * @param pitch pitch值 + * @param roll roll值 + * @param out 输出四元数 + */ + static createFromYawPitchRoll(yaw: number, pitch: number, roll: number, out: Quaternion): void; + /** + * @en Multiply two quaternions + * @param left The left quaternion + * @param right The right quaternion + * @param out The output quaternion + * @zh 计算两个四元数相乘 + * @param left left四元数 + * @param right right四元数 + * @param out 输出四元数 + */ + static multiply(left: Quaternion, right: Quaternion, out: Quaternion): void; + /** + * @en Calculate a quaternion that rotates around an arbitrary axis. + * @param axis The rotation axis + * @param rad The rotation angle in radians + * @param out The output quaternion after rotation + * @zh 计算绕任意轴旋转的四元数。 + * @param axis 旋转轴 + * @param rad 旋转角度(以弧度为单位) + * @param out 旋转后的输出四元数 + */ + static rotationAxisAngle(axis: Vector3, rad: number, out: Quaternion): void; + private static arcTanAngle; + private static angleTo; + /** + * @en Calculate a quaternion from the specified axis and angle. + * @param axis The axis vector. + * @param rad The angle in radians. + * @param out The output quaternion. + * @zh 从指定的轴和角度计算四元数。 + * @param axis 轴向量。 + * @param rad 角度(以弧度为单位)。 + * @param out 输出的四元数。 + */ + static createFromAxisAngle(axis: Vector3, rad: number, out: Quaternion): void; + /** + * @en Calculate a quaternion from a rotation matrix. + * @param mat The rotation matrix. + * @param out The output quaternion. + * @zh 从旋转矩阵计算四元数。 + * @param mat 旋转矩阵。 + * @param out 输出的四元数。 + */ + static createFromMatrix4x4(mat: Matrix4x4, out: Quaternion): void; + /** + * @en Spherical linear interpolation between two quaternions. + * @param left The left quaternion. + * @param right The right quaternion. + * @param t The interpolation factor, ranging from 0 to 1. + * @param out The output quaternion. + * @returns The output quaternion. + * @zh 两个四元数之间的球面线性插值。 + * @param left 左侧四元数。 + * @param right 右侧四元数。 + * @param t 插值因子,范围从0到1。 + * @param out 输出的四元数。 + * @returns 输出的四元数。 + */ + static slerp(left: Quaternion, right: Quaternion, t: number, out: Quaternion): Quaternion; + /** + * @en Calculate the linear interpolation between two quaternions. + * @param left The left quaternion. + * @param right The right quaternion. + * @param amount The interpolation factor, ranging from 0 to 1. + * @param out The output quaternion. + * @zh 计算两个四元数的线性插值。 + * @param left 左侧四元数。 + * @param right 右侧四元数。 + * @param amount 插值因子,范围从0到1。 + * @param out 输出的四元数。 + */ + static lerp(left: Quaternion, right: Quaternion, amount: number, out: Quaternion): void; + /** + * @en Calculate the sum of two quaternions. + * @param left The left quaternion. + * @param right The right quaternion. + * @param out The output quaternion. + * @zh 计算两个四元数的和。 + * @param left 左侧四元数。 + * @param right 右侧四元数。 + * @param out 输出的四元数。 + */ + static add(left: Quaternion, right: Quaternion, out: Quaternion): void; + /** + * @en Calculate the dot product of two quaternions. + * @param left The left quaternion. + * @param right The right quaternion. + * @returns The dot product. + * @zh 计算两个四元数的点积。 + * @param left 左侧四元数。 + * @param right 右侧四元数。 + * @returns 点积结果。 + */ + static dot(left: Quaternion, right: Quaternion): number; + /** + * @en X-axis coordinate. + * @zh X轴坐标。 + */ + x: number; + /** + * @en Y-axis coordinate. + * @zh Y轴坐标。 + */ + y: number; + /** + * @en Z-axis coordinate. + * @zh Z轴坐标。 + */ + z: number; + /** + * @en W-axis coordinate. + * @zh W轴坐标。 + */ + w: number; + /** + * @en Constructor method, initializes the default value. + * @param x The x value of the quaternion. Default is 0. + * @param y The y value of the quaternion. Default is 0. + * @param z The z value of the quaternion. Default is 0. + * @param w The w value of the quaternion. Default is 1. + * @zh 构造方法,初始化为默认值。 + * @param x 四元数的x值。默认为0。 + * @param y 四元数的y值。默认为0。 + * @param z 四元数的z值。默认为0。 + * @param w 四元数的w值。默认为1。 + */ + constructor(x?: number, y?: number, z?: number, w?: number); + /** + * @en Set the values of the quaternion. + * @param x The X value. + * @param y The Y value. + * @param z The Z value. + * @param w The W value. + * @zh 设置四元数的值。 + * @param x X值。 + * @param y Y值。 + * @param z Z值。 + * @param w W值。 + */ + setValue(x: number, y: number, z: number, w: number): void; + /** + * @en Set the values of the quaternion and return itself. + * @param x The X value. + * @param y The Y value. + * @param z The Z value. + * @param w The W value. + * @returns The quaternion itself. + * @zh 设置四元数的值并返回自身。 + * @param x X值。 + * @param y Y值。 + * @param z Z值。 + * @param w W值。 + * @returns 四元数自身。 + */ + set(x: number, y: number, z: number, w: number): this; + /** + * @en Scale the quaternion by a scalar value. + * @param scaling The scalar value to scale by. + * @param out The output quaternion. + * @zh 根据缩放值缩放四元数。 + * @param scaling 缩放值。 + * @param out 输出的四元数。 + */ + scaling(scaling: number, out: Quaternion): void; + /** + * @en Normalize the quaternion. + * @param out The output normalized quaternion. + * @zh 归一化四元数。 + * @param out 输出的归一化四元数。 + */ + normalize(out: Quaternion): void; + /** + * @en Calculate the length of the quaternion. + * @returns The length of the quaternion. + * @zh 计算四元数的长度。 + * @returns 四元数的长度。 + */ + length(): number; + /** + * @en Rotate the quaternion around the X axis. + * @param rad The angle of rotation. + * @param out The output rotated quaternion. + * @zh 根据绕X轴的角度旋转四元数。 + * @param rad 旋转角度。 + * @param out 输出的旋转后的四元数。 + */ + rotateX(rad: number, out: Quaternion): void; + /** + * @en Rotate the quaternion around the Y axis by a specified angle. + * @param rad The angle of rotation. + * @param out The output rotated quaternion. + * @zh 根据绕Y轴的指定角度旋转四元数。 + * @param rad 旋转角度。 + * @param out 输出的旋转后的四元数。 + */ + rotateY(rad: number, out: Quaternion): void; + /** + * @en Rotate the quaternion around the Z axis by a specified angle. + * @param rad The angle of rotation. + * @param out The output rotated quaternion. + * @zh 根据绕Z轴的指定角度旋转四元数。 + * @param rad 旋转角度。 + * @param out 输出的旋转后的四元数。 + */ + rotateZ(rad: number, out: Quaternion): void; + /** + * @en Decompose the quaternion into Euler angles (in the order of Yaw, Pitch, Roll). + * Note: This method may produce sudden flips when rotating around the X axis beyond ±90 degrees. + * @param out The output Vector3 to store the Euler angles. + * @zh 将四元数分解为欧拉角(按Yaw、Pitch、Roll的顺序)。 + * 注意:当绕X轴旋转超过±90度时,此方法可能会产生突然的翻转。 + * @param out 用于存储欧拉角的输出Vector3。 + */ + getYawPitchRoll(out: Vector3): void; + /** + * @en Calculate the inverse of the quaternion. + * @param out The output inverted quaternion. + * @zh 计算四元数的逆。 + * @param out 输出的逆四元数。 + */ + invert(out: Quaternion): void; + /** + * @en Set the quaternion to identity quaternion. + * @zh 将四元数设置为单位四元数。 + */ + identity(): void; + /** + * @en Copy values from an array. + * @param array The source array. + * @param offset The start offset in the array. Default is 0. + * @zh 从数组中拷贝值。 + * @param array 源数组。 + * @param offset 数组中的起始偏移量。默认为0。 + */ + fromArray(array: any[], offset?: number): void; + /** + * @en Clone the quaternion to a destination object. + * @param destObject The destination object. + * @zh 克隆四元数到目标对象。 + * @param destObject 目标对象。 + */ + cloneTo(destObject: Quaternion): void; + /** + * @en Clone the quaternion. + * @returns A new quaternion with the same values as this one. + * @zh 克隆四元数。 + * @returns 一个与当前四元数值相同的新四元数。 + */ + clone(): any; + /** + * @en Determines if two quaternions are equal. + * @param b The quaternion to compare with. + * @zh 如果四元数相等则返回true,否则返回false。 + * @param b 对比四元数 + */ + equals(b: Quaternion): boolean; + /** + * @en Calculates a rotation quaternion to look at a direction. + * @param forward The forward direction. + * @param up The up vector. + * @param out The output quaternion. + * @zh 计算旋转观察四元数。 + * @param forward 方向 + * @param up 上向量 + * @param out 输出四元数 + */ + static rotationLookAt(forward: Vector3, up: Vector3, out: Quaternion): void; + /** + * @en Calculates a look-at quaternion (suitable for Camera and Light). + * @param eye The position of the observer. + * @param target The target position to look at. + * @param up The up vector. + * @param out The output quaternion. + * @zh 计算观察四元数(适用于相机和灯光)。 + * @param eye 观察者位置 + * @param target 目标位置 + * @param up 上向量 + * @param out 输出四元数 + */ + static lookAt(eye: Vector3, target: Vector3, up: Vector3, out: Quaternion): void; + /** + * @en Calculates a look-at quaternion (suitable for GameObject). + * @param eye The position of the observer. + * @param target The target position to look at. + * @param up The up vector. + * @param out The output quaternion. + * @zh 计算观察四元数(适用于游戏对象)。 + * @param eye 观察者位置 + * @param target 目标位置 + * @param up 上向量 + * @param out 输出四元数 + */ + static forwardLookAt(eye: Vector3, target: Vector3, up: Vector3, out: Quaternion): void; + /** + * @en Calculates the squared length of the quaternion. + * @returns The squared length of the quaternion. + * @zh 计算四元数长度的平方。 + * @returns 四元数长度的平方。 + */ + lengthSquared(): number; + /** + * @en Calculates the inverse of a quaternion. + * @param value The input quaternion. + * @param out The output inverse quaternion. + * @zh 计算四元数的逆四元数。 + * @param value 四元数。 + * @param out 逆四元数。 + */ + static invert(value: Quaternion, out: Quaternion): void; + /** + * @en Creates a quaternion from a 3x3 rotation matrix. + * @param matrix3x3 The 3x3 rotation matrix. + * @param out The output quaternion. + * @zh 通过一个3x3旋转矩阵创建一个四元数。 + * @param matrix3x3 3x3矩阵 + * @param out 四元数 + */ + static rotationMatrix(matrix3x3: Matrix3x3, out: Quaternion): void; + } + /** + * @en The `Rectangle` object is an area defined by its position, as indicated by its top-left corner point (x, y), and by its width and height. + * The x, y, width, and height properties of the Rectangle class are independent of each other; changing the value of one property has no effect on the others. + * @zh `Rectangle` 对象是按其位置(由它左上角的点 (x, y) 确定)以及宽度和高度定义的区域。 + * Rectangle 类的 x、y、width 和 height 属性相互独立;更改一个属性的值不会影响其他属性。 + */ + class Rectangle implements IClone { + /** + * @private + * @en Global empty rectangle area with x=0, y=0, width=0, height=0. The content of this object is not allowed to be modified. + * @zh 全局空的矩形区域,x=0, y=0, width=0, height=0。不允许修改此对象内容。 + */ + static EMPTY: Rectangle; + /** + * @en Global temporary rectangle area. This object is used for global reuse to reduce object creation. + * @zh 全局临时的矩形区域,此对象用于全局复用,以减少对象创建。 + */ + static TEMP: Rectangle; + /** + * @en The x coordinate of the top-left corner of the rectangle. + * @zh 矩形左上角的 X 轴坐标。 + */ + x: number; + /** + * @en The y coordinate of the top-left corner of the rectangle. + * @zh 矩形左上角的 Y 轴坐标。 + */ + y: number; + /** + * @en The width of the rectangle. + * @zh 矩形的宽度。 + */ + width: number; + /** + * @en The height of the rectangle. + * @zh 矩形的高度。 + */ + height: number; + /** + * @en Constructor method. + * @param x The x coordinate of the top-left corner of the rectangle. + * @param y The y coordinate of the top-left corner of the rectangle. + * @param width The width of the rectangle. + * @param height The height of the rectangle. + * @zh 构造方法 + * @param x 矩形左上角的 X 轴坐标。 + * @param y 矩形左上角的 Y 轴坐标。 + * @param width 矩形的宽度。 + * @param height 矩形的高度。 + */ + constructor(x?: number, y?: number, width?: number, height?: number); + /** + * @en The x-coordinate of the right side of this rectangle. It is equal to the sum of the x and width properties. + * @zh 此矩形右侧的 X 轴坐标。等于 x 和 width 属性的和。 + */ + get right(): number; + /** + * @en The y-coordinate of the bottom side of this rectangle. It is equal to the sum of the y and height properties. + * @zh 此矩形底端的 Y 轴坐标。等于 y 和 height 属性的和。 + */ + get bottom(): number; + /** + * @en Sets the properties of the Rectangle to the specified values. + * @param x The x-coordinate of the top-left corner of the rectangle. + * @param y The y-coordinate of the top-left corner of the rectangle. + * @param width The width of the rectangle. + * @param height The height of the rectangle. + * @return The rectangle object itself after the property values have been modified. + * @zh 将 Rectangle 的属性设置为指定值。 + * @param x x 矩形左上角的 X 轴坐标。 + * @param y x 矩形左上角的 Y 轴坐标。 + * @param width 矩形的宽度。 + * @param height 矩形的高。 + * @return 返回属性值修改后的矩形对象本身。 + */ + setTo(x: number, y: number, width: number, height: number): Rectangle; + /** + * @en Resets the rectangle to default values (x=0, y=0, width=0, height=0). + * @zh 重置矩形为默认值(x=0, y=0, width=0, height=0)。 + */ + reset(): Rectangle; + /** + * @en Recycles the rectangle object. + * @zh 回收矩形对象。 + */ + recover(): void; + /** + * @en Creates a new Rectangle object from the object pool. + * @zh 从对象池中创建一个新的 Rectangle 对象。 + */ + static create(): Rectangle; + /** + * @en Copies the property values from the source Rectangle object to this rectangle object. + * @param source The source Rectangle object. + * @returns The rectangle object itself after the property values have been modified. + * @zh 复制源 Rectangle 对象的属性值到此矩形对象中。 + * @param source 源 Rectangle 对象。 + * @return 返回属性值修改后的矩形对象本身。 + */ + copyFrom(source: Rectangle): Rectangle; + /** + * @en Determines whether the specified point is contained within the rectangular region defined by this Rectangle object. + * @param x The x-coordinate of the point (horizontal position). + * @param y The y-coordinate of the point (vertical position). + * @return True if the Rectangle object contains the specified point; false otherwise. + * @zh 确定由此 Rectangle 对象定义的矩形区域内是否包含指定的点。 + * @param x 点的 X 轴坐标值(水平位置)。 + * @param y 点的 Y 轴坐标值(垂直位置)。 + * @return 如果 Rectangle 对象包含指定的点,则值为 true;否则为 false。 + */ + contains(x: number, y: number): boolean; + /** + * @en Determines whether the object specified in the rect parameter intersects with this Rectangle object. This method checks the x, y, width, and height properties of the specified Rectangle object to see if it intersects with this Rectangle object. + * @param rect The Rectangle object to compare. + * @returns True if the specified rectangle intersects with this one, false otherwise. + * @zh 确定在 rect 参数中指定的对象是否与此 Rectangle 对象相交。此方法检查指定的 Rectangle 对象的 x、y、width 和 height 属性,以查看它是否与此 Rectangle 对象相交。 + * @param rect Rectangle 对象。 + * @return 如果传入的矩形对象与此对象相交,则返回 true 值,否则返回 false。 + */ + intersects(rect: Readonly): boolean; + /** + * @en If the Rectangle object specified in the rect parameter intersects with this Rectangle object, returns the area of intersection as a Rectangle object. If the rectangles do not intersect, this method returns null. + * @param rect The rectangle to compare against. + * @param out (Optional) The rectangle object for storing the output. If null, a new one will be created. It is allowed to be the same as rect or this. + * @returns The intersection area as a Rectangle object, or null if there's no intersection. + * @zh 如果在 rect 参数中指定的 Rectangle 对象与此 Rectangle 对象相交,则返回交集区域作为 Rectangle 对象。如果矩形不相交,则此方法返回null。 + * @param rect 待比较的矩形区域。 + * @param out (可选)待输出的矩形区域。如果为空则创建一个新的。允许out与rect或者this相同。 + * @return 返回相交的矩形区域对象。 + */ + intersection(rect: Rectangle, out?: Rectangle): Rectangle; + /** + * @en Adds two rectangles together to create a new Rectangle object, by filling in the horizontal and vertical space between the two rectangles. + * Note: The union() method ignores rectangles with a height or width of 0, such as: var rect2:Rectangle = new Rectangle(300,300,50,0); + * @param source The Rectangle object to add to this Rectangle object. + * @param out The Rectangle object to store the output. If null, a new one will be created. It is allowed to be the same as rect or this. + * @returns A new Rectangle object that is the union of the two rectangles. + * @zh 矩形联合,通过填充两个矩形之间的水平和垂直空间,将这两个矩形组合在一起以创建一个新的 Rectangle 对象。 + * 注意:union() 方法忽略高度或宽度值为 0 的矩形,如:var rect2:Rectangle = new Rectangle(300,300,50,0); + * @param source 要添加到此 Rectangle 对象的 Rectangle 对象。 + * @param out 用于存储输出结果的矩形对象。如果为空,则创建一个新的。允许out与rect或者this相同。 + * @return 充当两个矩形的联合的新 Rectangle 对象。 + */ + union(source: Rectangle, out?: Rectangle): Rectangle; + /** + * @zh 缩放矩形 + * @param scaleX X缩放值 + * @param scaleY Y缩放值 + * @returns 本对象 + * @en Scales the rectangle. + * @param scaleX The scaling factor in the x-direction. + * @param scaleY The scaling factor in the y-direction. + * @returns This object. + */ + scale(scaleX: number, scaleY: number): this; + /** + * @en Returns a string representation of this Rectangle object, with the x, y, width, and height values joined by commas. + * @zh 返回当前 Rectangle 对象的字符串表示,其中水平位置 x、垂直位置 y、宽度 width 和高度 height 以逗号连接。 + */ + toString(): string; + /** + * @en Checks if the properties of the input Rectangle object are equal to the properties of the current Rectangle object (x, y, width, height). + * @param rect The Rectangle object to compare. + * @returns True if all properties are equal, false otherwise. + * @zh 检测传入的 Rectangle 对象的属性是否与当前 Rectangle 对象的属性 x、y、width、height 属性值都相等。 + * @param rect 待比较的 Rectangle 对象。 + * @return 如果判断的属性都相等,则返回 true 值,否则返回 false。 + */ + equals(rect: Rectangle): boolean; + /** + * @en Adds a point to the current rectangle object, expanding it to the smallest rectangle that contains both the current rectangle and the given point. + * This method modifies the current object. + * @param x The x-coordinate of the point. + * @param y The y-coordinate of the point. + * @return This Rectangle object. + * @zh 为当前矩形对象加一个点,以使当前矩形扩展为包含当前矩形和此点的最小矩形。 + * 此方法会修改本对象。 + * @param x 点的 X 坐标。 + * @param y 点的 Y 坐标。 + * @return 返回此 Rectangle 对象。 + */ + addPoint(x: number, y: number): Rectangle; + /** + * @en Determines whether this Rectangle object is empty. + * @returns True if the width or height of the Rectangle object is less than or equal to 0, false otherwise. + * @zh 确定此 Rectangle 对象是否为空。 + * @return 如果 Rectangle 对象的宽度或高度小于等于 0,则返回 true 值,否则返回 false。 + */ + isEmpty(): boolean; + /** + * @en Returns a new Rectangle object with the same values for the x, y, width, and height properties as the original Rectangle object. + * @param out (Optional) The rectangle object used to store the result. If null, a new one is created. Recommendation: Reuse objects as much as possible to reduce object creation overhead. The Rectangle.TEMP object can be used for object reuse. + * @returns A Rectangle object with the same values for x, y, width, and height properties as the current Rectangle object. + * @zh 返回一个新的 Rectangle 对象,其 x、y、width 和 height 属性的值与当前 Rectangle 对象的对应值相同。 + * @param out (可选)用于存储结果的矩形对象。如果为空,则创建一个新的。建议:尽量复用对象,减少对象创建消耗。Rectangle.TEMP对象用于对象复用。 + * @return 一个 Rectangle 对象,其 x、y、width 和 height 属性的值与当前 Rectangle 对象的对应值相同。 + */ + clone(out?: Rectangle | null): Rectangle; + /** + * @en Copies the properties of this Rectangle to the destination object. + * @param destObject The destination object to copy to. + * @zh 将此 Rectangle 的属性复制到目标对象。 + * @param destObject 目标对象。 + */ + cloneTo(destObject: Rectangle): void; + } + interface IV2 { + x: number; + y: number; + } + /** + * @en The `Vector2` class is used to create two-dimensional vectors. + * @zh `Vector2` 类用于创建二维向量。 + */ + class Vector2 implements IClone { + /** + * @en Zero vector, read-only. + * @zh 零向量,只读。 + */ + static readonly ZERO: Readonly; + /** + * @en One vector, read-only. + * @zh 单位向量,只读。 + */ + static readonly ONE: Readonly; + /** + * @en Temporary Vector2 for calculations. + * @zh 用于计算的临时 Vector2。 + */ + static TempVector2: Vector2; + /** + * @en X-axis coordinate. + * @zh X 轴坐标。 + */ + x: number; + /** + * @en Y-axis coordinate. + * @zh Y 轴坐标。 + */ + y: number; + /** + * @en Constructor method. + * @param x X-axis coordinate. + * @param y Y-axis coordinate. + * @zh 构造方法 + * @param x X 轴坐标。 + * @param y Y 轴坐标。 + */ + constructor(x?: number, y?: number); + /** + * @en Sets the x and y values of the vector. + * @param x The x value to set. + * @param y The y value to set. + * @zh 设置向量的 x 和 y 值。 + * @param x 要设置的 X 值。 + * @param y 要设置的 Y 值。 + */ + setValue(x: number, y: number): void; + /** + * @en Scales a two-dimensional vector. + * @param a Source two-dimensional vector. + * @param b Scale value. + * @param out Output two-dimensional vector. + * @zh 缩放二维向量。 + * @param a 源二维向量。 + * @param b 缩放值。 + * @param out 输出二维向量。 + */ + static scale(a: Vector2, b: number, out: Vector2): void; + /** + * @en Determines whether two two-dimensional vectors are equal. + * @param a First two-dimensional vector. + * @param b Second two-dimensional vector. + * @returns Whether the vectors are equal. + * @zh 判断两个二维向量是否相等。 + * @param a 第一个二维向量。 + * @param b 第二个二维向量。 + * @returns 是否相等。 + */ + static equals(a: Vector2, b: Vector2): boolean; + /** + * @en Copies values from an array. + * @param array The source array. + * @param offset The offset in the array. Default is 0. + * @zh 从数组中拷贝值。 + * @param array 源数组。 + * @param offset 数组偏移。默认值为 0。 + */ + fromArray(array: ArrayLike, offset?: number): void; + /** + * @en Converts the vector to an array. + * @returns An array representation of the vector. + * @zh 将向量转换为数组。 + * @returns 表示向量的数组。 + */ + toArray(): Array; + /** + * @en Writes the vector to a Float32Array. + * @param array The target Float32Array. + * @param offset The offset in the array. Default is 0. + * @zh 将向量写入 Float32Array 数组。 + * @param array 目标 Float32Array 数组。 + * @param offset 数组偏移。默认值为 0。 + */ + writeTo(array: Float32Array, offset?: number): void; + /** + * @en Clones the vector to another object. + * @param destObject The destination object to clone to. + * @zh 将向量克隆到另一个对象。 + * @param destObject 克隆的目标对象。 + */ + cloneTo(destObject: Vector2): void; + /** + * @en Calculates the dot product of two 2D vectors. + * @param a The left vector. + * @param b The right vector. + * @returns The dot product. + * @zh 计算两个二维向量的点积。 + * @param a 左向量。 + * @param b 右向量。 + * @returns 点积。 + */ + static dot(a: Vector2, b: Vector2): number; + /** + * @en Normalizes a 2D vector. + * @param s The source 2D vector. + * @param out The output normalized 2D vector. + * @zh 归一化二维向量。 + * @param s 源二维向量。 + * @param out 输出的归一化二维向量。 + */ + static normalize(s: Vector2, out: Vector2): void; + /** + * @en Calculates the scalar length of a 2D vector. + * @param a The source 2D vector. + * @returns The scalar length. + * @zh 计算二维向量的标量长度。 + * @param a 源二维向量。 + * @returns 标量长度。 + */ + static scalarLength(a: Vector2): number; + /** + * @en Creates a clone of this Vector2. + * @returns Cloned copy of Vector2. + * @zh 创建此Vector2的克隆。 + * @returns 克隆副本。 + */ + clone(): any; + } + /** + * @en The `Vector3` class is used to create three-dimensional vectors. + * @zh `Vector3` 类用于创建三维向量。 + */ + class Vector3 implements IClone { + /** + * @en Zero vector (0, 0, 0). + * @zh 零向量 (0, 0, 0)。 + */ + static readonly ZERO: Readonly; + /** + * @en One vector (1, 1, 1). + * @zh 单位向量 (1, 1, 1)。 + */ + static readonly ONE: Readonly; + /** + * @en Negative X axis (-1, 0, 0). + * @zh 负X轴 (-1, 0, 0)。 + */ + static readonly NegativeUnitX: Readonly; + /** + * @en Positive X axis (1, 0, 0). + * @zh 正X轴 (1, 0, 0)。 + */ + static readonly UnitX: Readonly; + /** + * @en Positive Y axis (0, 1, 0). + * @zh 正Y轴 (0, 1, 0)。 + */ + static readonly UnitY: Readonly; + /** + * @en Positive Z axis (0, 0, 1). + * @zh 正Z轴 (0, 0, 1)。 + */ + static readonly UnitZ: Readonly; + /** + * @en Forward vector in right-handed coordinate system (0, 0, -1). + * @zh 右手坐标系中的前向量 (0, 0, -1)。 + */ + static readonly ForwardRH: Readonly; + /** + * @en Forward vector in left-handed coordinate system (0, 0, 1). + * @zh 左手坐标系中的前向量 (0, 0, 1)。 + */ + static readonly ForwardLH: Readonly; + /** + * @en Up vector (0, 1, 0). + * @zh 上向量 (0, 1, 0)。 + */ + static readonly Up: Readonly; + /** + * @en Calculates the squared distance between two three-dimensional vectors. + * @param value1 The first vector. + * @param value2 The second vector. + * @returns The squared distance. + * @zh 计算两个三维向量之间距离的平方。 + * @param value1 第一个向量。 + * @param value2 第二个向量。 + * @returns 距离的平方。 + */ + static distanceSquared(value1: Vector3, value2: Vector3): number; + /** + * @en Calculates the distance between two three-dimensional vectors. + * @param value1 The first vector. + * @param value2 The second vector. + * @returns The distance. + * @zh 计算两个三维向量之间的距离。 + * @param value1 第一个向量。 + * @param value2 第二个向量。 + * @returns 距离。 + */ + static distance(value1: Vector3, value2: Vector3): number; + /** + * @en Calculates a new three-dimensional vector by taking the minimum of x, y, and z from two vectors. + * @param a The first Vector3. + * @param b The second Vector3. + * @param out The resulting Vector3. + * @zh 通过取两个三维向量的 x、y、z 的最小值计算新的三维向量。 + * @param a 第一个三维向量。 + * @param b 第二个三维向量。 + * @param out 结果三维向量。 + */ + static min(a: Vector3, b: Vector3, out: Vector3): void; + /** + * @en Calculates a new three-dimensional vector by taking the maximum of x, y, and z from two vectors. + * @param a The first Vector3. + * @param b The second Vector3. + * @param out The resulting Vector3. + * @zh 通过取两个三维向量的 x、y、z 的最大值计算新的三维向量。 + * @param a 第一个三维向量。 + * @param b 第二个三维向量。 + * @param out 结果三维向量。 + */ + static max(a: Vector3, b: Vector3, out: Vector3): void; + /** + * @en Rotates a three-dimensional vector by a quaternion. + * @param source The source vector3 to be rotated. + * @param rotation The rotation quaternion. + * @param out The output vector3. + * @zh 根据四元数旋转三维向量。 + * @param source 要旋转的源三维向量。 + * @param rotation 旋转四元数。 + * @param out 输出三维向量。 + */ + static transformQuat(source: Vector3, rotation: Quaternion, out: Vector3): void; + /** + * @en Calculates the scalar length of a vector. + * @param a The source vector. + * @returns The scalar length. + * @zh 计算向量的标量长度。 + * @param a 源向量。 + * @returns 标量长度。 + */ + static scalarLength(a: Vector3): number; + /** + * @en Calculates the squared scalar length of a vector. + * @param a The source three-dimensional vector. + * @returns The squared scalar length. + * @zh 计算标量长度的平方。 + * @param a 源三维向量。 + * @returns 标量长度的平方。 + */ + static scalarLengthSquared(a: Vector3): number; + /** + * @en Normalizes a three-dimensional vector. + * @param s The source vector to be normalized. + * @param out The output normalized vector. + * @zh 归一化三维向量。 + * @param s 要归一化的源向量。 + * @param out 输出的归一化向量。 + */ + static normalize(s: Vector3, out: Vector3): void; + /** + * @en Calculates the product of two three-dimensional vectors. + * @param a The left vector3. + * @param b The right vector3. + * @param out The output vector3. + * @zh 计算两个三维向量的乘积。 + * @param a 左侧三维向量。 + * @param b 右侧三维向量。 + * @param out 输出三维向量。 + */ + static multiply(a: Vector3, b: Vector3, out: Vector3): void; + /** + * @en Scales a three-dimensional vector. + * @param a The source vector3 to be scaled. + * @param b The scaling factor. + * @param out The output scaled vector3. + * @zh 缩放三维向量。 + * @param a 要缩放的源三维向量。 + * @param b 缩放因子。 + * @param out 输出的缩放后的三维向量。 + */ + static scale(a: Vector3, b: number, out: Vector3): void; + /** + * @en Performs a linear interpolation between two three-dimensional vectors. + * @param a The starting vector. + * @param b The ending vector. + * @param t The interpolation coefficient in the range [0, 1]. + * @param out The output interpolated vector. + * @zh 在两个三维向量之间进行线性插值。 + * @param a 起始向量。 + * @param b 结束向量。 + * @param t 插值系数,范围为 [0, 1]。 + * @param out 输出的插值向量。 + */ + static lerp(a: Vector3, b: Vector3, t: number, out: Vector3): void; + /** + * @en Transforms a three-dimensional vector to another three-dimensional vector using a matrix. + * @param vector The source vector3. + * @param transform The transformation matrix. + * @param result The output transformed vector3. + * @zh 使用矩阵将一个三维向量转换为另一个三维向量。 + * @param vector 源三维向量。 + * @param transform 变换矩阵。 + * @param result 输出的转换后的三维向量。 + */ + static transformV3ToV3(vector: Vector3, transform: Matrix4x4, result: Vector3): void; + /** + * @en Transforms a three-dimensional vector to a four-dimensional vector using a matrix. + * @param vector The source vector3. + * @param transform The transformation matrix. + * @param result The output vector4. + * @zh 使用矩阵将三维向量转换为四维向量。 + * @param vector 源三维向量。 + * @param transform 变换矩阵。 + * @param result 输出的四维向量。 + */ + static transformV3ToV4(vector: Vector3, transform: Matrix4x4, result: Vector4): void; + /** + * @en Transforms a normal three-dimensional vector to another three-dimensional vector using a normal transformation matrix. + * @param normal The source normal vector3. + * @param transform The normal transformation matrix. + * @param result The output transformed normal vector3. + * @zh 使用法线变换矩阵将法线三维向量转换为另一个三维向量。 + * @param normal 源法线三维向量。 + * @param transform 法线变换矩阵。 + * @param result 输出转换后的法线三维向量。 + */ + static TransformNormal(normal: Vector3, transform: Matrix4x4, result: Vector3): void; + /** + * @en Transforms a three-dimensional vector to another normalized three-dimensional vector using a matrix. + * @param coordinate The source three-dimensional vector. + * @param transform The transformation matrix. + * @param result The output normalized three-dimensional vector. + * @zh 使用矩阵将三维向量转换为另一个归一化的三维向量。 + * @param coordinate 源三维向量。 + * @param transform 变换矩阵。 + * @param result 输出的归一化三维向量。 + */ + static transformCoordinate(coordinate: Vector3, transform: Matrix4x4, result: Vector3): void; + /** + * @en Clamps a vector within a specified range. + * @param value The vector to be clamped. + * @param min The minimum values for each component. + * @param max The maximum values for each component. + * @param out The output clamped vector. + * @zh 将向量限制在指定范围内。 + * @param value 要限制的向量。 + * @param min 每个分量的最小值。 + * @param max 每个分量的最大值。 + * @param out 输出的限制后的向量。 + */ + static Clamp(value: Vector3, min: Vector3, max: Vector3, out: Vector3): void; + /** + * @en Calculates the sum of two three-dimensional vectors. + * @param a The left vector3. + * @param b The right vector3. + * @param out The output vector3. + * @zh 计算两个三维向量的和。 + * @param a 左侧三维向量。 + * @param b 右侧三维向量。 + * @param out 输出向量。 + */ + static add(a: Vector3, b: Vector3, out: Vector3): void; + /** + * @en Calculates the difference between two three-dimensional vectors. + * @param a The left vector3. + * @param b The right vector3. + * @param o The output vector3. + * @zh 计算两个三维向量的差。 + * @param a 左侧三维向量。 + * @param b 右侧三维向量。 + * @param o 输出向量。 + */ + static subtract(a: Vector3, b: Vector3, o: Vector3): void; + /** + * @en Calculates the cross product of two three-dimensional vectors. + * @param a The left vector3. + * @param b The right vector3. + * @param o The output vector3. + * @zh 计算两个三维向量的叉乘。 + * @param a 左侧三维向量。 + * @param b 右侧三维向量。 + * @param o 输出三维向量。 + */ + static cross(a: Vector3, b: Vector3, o: Vector3): void; + /** + * @en Calculates the dot product of two three-dimensional vectors. + * @param a The left vector3. + * @param b The right vector3. + * @returns The dot product. + * @zh 计算两个三维向量的点积。 + * @param a 左侧向量。 + * @param b 右侧向量。 + * @returns 点积。 + */ + static dot(a: Vector3, b: Vector3): number; + /** + * @en Determines whether two three-dimensional vectors are equal. + * @param a The first vector3. + * @param b The second vector3. + * @returns Whether the vectors are equal. + * @zh 判断两个三维向量是否相等。 + * @param a 第一个三维向量。 + * @param b 第二个三维向量。 + * @returns 是否相等。 + */ + static equals(a: Vector3, b: Vector3): boolean; + /** + * @en X-axis coordinate + * @zh X轴坐标 + */ + x: number; + /** + * @en Y-axis coordinate + * @zh Y轴坐标 + */ + y: number; + /** + * @en Z-axis coordinate + * @zh Z轴坐标 + */ + z: number; + /** + * @en Constructor method, 3D vector initialization. + * @param x X-axis coordinate. + * @param y Y-axis coordinate. + * @param z Z-axis coordinate. + * @zh 构造方法,初始化三维向量。 + * @param x X轴坐标。 + * @param y Y轴坐标。 + * @param z Z轴坐标。 + */ + constructor(x?: number, y?: number, z?: number); + /** + * @en Determines whether the three-dimensional vector is equal to another vector. + * @param value The vector to compare with. + * @returns Returns true if the vectors are equal, false otherwise. + * @zh 判断三维向量是否与另一个向量相等。 + * @param value 对比值 + * @returns 如果向量相等则返回 true,否则返回 false。 + */ + equal(value: Vector3): boolean; + /** + * @en Sets the x, y, and z values of the vector. + * @param x The x value. + * @param y The y value. + * @param z The z value. + * @zh 设置向量的 x、y 和 z 值。 + * @param x X值。 + * @param y Y值。 + * @param z Z值。 + */ + setValue(x: number, y: number, z: number): Vector3; + /** + * @en Sets the x, y, and z values of the vector. + * @param x The x value. + * @param y The y value. + * @param z The z value. + * @zh 设置向量的 x、y 和 z 值。 + * @param x X值。 + * @param y Y值。 + * @param z Z值。 + */ + set(x: number, y: number, z: number): this; + /** + * @en Copies values from an array. + * @param arr The source array. + * @param offset The offset in the array. Default is 0. + * @zh 从数组中拷贝值。 + * @param arr 源数组。 + * @param offset 数组偏移。默认值为 0。 + */ + fromArray(arr: ArrayLike, offset?: number): void; + /** + * @en Converts the vector to an array. + * @zh 将向量转换为数组。 + */ + toArray(): Array; + /** + * @en Writes the vector values to an array. + * @param arr The target array. + * @param offset The offset in the array. Default is 0. + * @zh 将向量值写入数组。 + * @param arr 目标数组。 + * @param offset 数组偏移。默认值为 0。 + */ + writeTo(arr: Float32Array, offset?: number): void; + /** + * @en Calculates the length of the vector. + * @zh 计算向量的长度。 + */ + length(): number; + /** + * @en Calculates the squared length of the vector. + * @zh 计算向量长度的平方。 + */ + lengthSquared(): number; + /** + * @en Subtracts a vector from this vector. + * @param b The vector to subtract. + * @param out The output vector. + * @returns The resulting vector. + * @zh 向量相减 + * @param b 被减向量。 + * @param out 输出向量。 + * @returns 相减后的结果向量。 + */ + vsub(b: Vector3, out: Vector3): Vector3; + /** + * @en Adds a vector to this vector. + * @param b The vector to add. + * @param out The output vector. + * @returns The resulting vector. + * @zh 向量相加。 + * @param b 加向量。 + * @param out 输出向量。 + * @returns returns 相加后的结果向量。 + */ + vadd(b: Vector3, out: Vector3): Vector3; + /** + * @en Scales this vector by a scalar value. + * @param s The scalar value. + * @param out The output vector. + * @returns The scaled vector. + * @zh 缩放向量。 + * @param s 缩放值。 + * @param out 输出向量。 + * @returns 缩放后的向量。 + */ + scale(s: number, out: Vector3): Vector3; + /** + * @en Normalizes this vector. + * @returns The normalized vector. + * @zh 归一化向量。 + * @returns 归一化后的向量。 + */ + normalize(): this; + /** + * @en Calculates the dot product of this vector with another vector. + * @param b The vector to dot product with. + * @returns The dot product. + * @zh 计算向量点乘。 + * @param b 点乘向量。 + * @returns 点乘结果。 + */ + dot(b: Vector3): number; + /** + * @en Calculates the cross product of this vector with another vector. + * @param b The vector to cross product with. + * @param o The output vector. + * @returns The resulting cross product vector. + * @zh 计算向量叉乘。 + * @param b 叉乘向量。 + * @param o 输出向量。 + * @returns 叉乘结果向量。 + */ + cross(b: Vector3, o: Vector3): Vector3; + /** + * @en Clones this vector to another object. + * @param destObject The destination object to clone to. + * @zh 将当前向量克隆到目标对象。 + * @param destObject 克隆的目标对象。 + */ + cloneTo(destObject: Vector3): void; + /** + * @en Creates a clone of this vector. + * @returns A new Vector3 object with the same values as this vector. + * @zh 创建当前向量的克隆。 + * @returns 返回一个新的 Vector3 对象,其值与当前向量相同。 + */ + clone(): any; + /** + * @en Sets this vector to its default value (0, 0, 0). + * @zh 将当前向量设置为默认值 (0, 0, 0)。 + */ + toDefault(): void; + } + /** + * @en The `Vector4` class is used to create four-dimensional vectors. + * @zh `Vector4` 类用于创建四维向量。 + */ + class Vector4 implements IClone { + /** + * @en Zero vector (0, 0, 0, 0). + * @zh 零向量 (0, 0, 0, 0)。 + */ + static readonly ZERO: Readonly; + /** + * @en One vector (1, 1, 1, 1). + * @zh 一向量 (1, 1, 1, 1)。 + */ + static readonly ONE: Readonly; + /** + * @en Unit X vector (1, 0, 0, 0). + * @zh X 单位向量 (1, 0, 0, 0)。 + */ + static readonly UnitX: Readonly; + /** + * @en Unit Y vector (0, 1, 0, 0). + * @zh Y 单位向量 (0, 1, 0, 0)。 + */ + static readonly UnitY: Readonly; + /** + * @en Unit Z vector (0, 0, 1, 0). + * @zh Z 单位向量 (0, 0, 1, 0)。 + */ + static readonly UnitZ: Readonly; + /** + * @en Unit W vector (0, 0, 0, 1). + * @zh W 单位向量 (0, 0, 0, 1)。 + */ + static readonly UnitW: Readonly; + /** + * @en X coordinate. + * @zh X 轴坐标。 + */ + x: number; + /** + * @en Y coordinate. + * @zh Y 轴坐标。 + */ + y: number; + /** + * @en Z coordinate. + * @zh Z 轴坐标。 + */ + z: number; + /** + * @en W coordinate. + * @zh W 轴坐标。 + */ + w: number; + /** + * @en Constructor method, initializes the vector4. + * @param x X coordinate. Default is 0. + * @param y Y coordinate. Default is 0. + * @param z Z coordinate. Default is 0. + * @param w W coordinate. Default is 0. + * @zh 构造方法,初始化四维向量。 + * @param x X 轴坐标。默认为 0。 + * @param y Y 轴坐标。默认为 0。 + * @param z Z 轴坐标。默认为 0。 + * @param w W 轴坐标。默认为 0。 + */ + constructor(x?: number, y?: number, z?: number, w?: number); + /** + * @en Sets the x, y, z, and w values of the vector. + * @param x The x value. + * @param y The y value. + * @param z The z value. + * @param w The w value. + * @zh 设置向量的 x、y、z 和 w 值。 + * @param x X值。 + * @param y Y值。 + * @param z Z值。 + * @param w W值。 + */ + setValue(x: number, y: number, z: number, w: number): void; + /** + * @en Copies values from an array. + * @param arr The source array. + * @param offset The offset in the array. Default is 0. + * @zh 从数组中拷贝值。 + * @param arr 源数组。 + * @param offset 数组偏移。默认值为 0。 + */ + fromArray(arr: ArrayLike, offset?: number): void; + /** + * @en Converts the vector to an array. + * @returns An array containing the vector components [x, y, z, w]. + * @zh 将向量转换为数组。 + * @returns 包含向量分量的数组 [x, y, z, w]。 + */ + toArray(): Array; + /** + * @en Writes the vector values to a Float32Array. + * @param arr The target Float32Array. + * @param offset The offset in the array. Default is 0. + * @zh 将向量值写入 Float32Array 数组。 + * @zh arr 目标 Float32Array 数组。 + * @zh offset 数组偏移。默认值为 0。 + */ + writeTo(arr: Float32Array, offset?: number): void; + /** + * @en Clones this vector to another object. + * @param destObject The destination object to clone to. + * @zh 将当前向量克隆到目标对象。 + * @param destObject 克隆的目标对象。 + */ + cloneTo(destObject: Vector4): void; + /** + * @en Creates a clone of this vector. + * @returns A new Vector4 object with the same values as this vector. + * @zh 创建当前向量的克隆。 + * @returns 返回一个新的 Vector4 对象,其值与当前向量相同。 + */ + clone(): any; + /** + * @en Performs a linear interpolation between two vectors. + * @param a The first vector. + * @param b The second vector. + * @param t The interpolation coefficient. + * @param out The output vector. + * @zh 在两个向量之间进行线性插值。 + * @param a 起始向量。 + * @param b 目标向量。 + * @param t 插值系数。 + * @param out 输出向量。 + */ + static lerp(a: Vector4, b: Vector4, t: number, out: Vector4): void; + /** + * @en Transforms a Vector4 by a 4x4 matrix. + * @param vector4 The vector to transform. + * @param m4x4 The transformation matrix. + * @param out The output vector. + * @zh 通过 4x4 矩阵转换一个四维向量。 + * @param vector4 待转换的四维向量。 + * @param m4x4 4x4 变换矩阵。 + * @param out 转换后的四维向量。 + */ + static transformByM4x4(vector4: Vector4, m4x4: Matrix4x4, out: Vector4): void; + /** + * @en Determines whether two Vector4 objects are equal. + * @param a The first Vector4. + * @param b The second Vector4. + * @returns True if the vectors are equal, false otherwise. + * @zh 判断两个四维向量是否相等。 + * @param a 第一个四维向量。 + * @param b 第二个四维向量。 + * @returns 如果向量相等则返回 true,否则返回 false。 + */ + static equals(a: Vector4, b: Vector4): boolean; + /** + * @en Determines whether this vector is equal to another vector. + * @param value The vector to compare with. + * @returns True if the vectors are equal, false otherwise. + * @zh 判断当前向量是否与另一个向量相等。 + * @param value 用于比较的向量。 + * @returns 如果向量相等则返回 true,否则返回 false。 + */ + equal(value: Vector4): boolean; + /** + * @en Calculates the length of the vector4. + * @returns The length of the vector4. + * @zh 计算四维向量的长度。 + * @return 四维向量的长度。 + */ + length(): number; + /** + * @en Calculates the squared length of the vector4. + * @returns The squared length of the vector4. + * @zh 计算四维向量长度的平方。 + * @returns 返回四维向量长度的平方。 + */ + lengthSquared(): number; + /** + * @en Normalize a vector4. + * @param s Source vector4. + * @param out Output vector4. + * @zh 归一化四维向量。 + * @param s 源四维向量。 + * @param out 输出四维向量。 + */ + static normalize(s: Vector4, out: Vector4): void; + /** + * @en Calculate the sum of two four-dimensional vectors. + * @param a First vector4. + * @param b Second vector4. + * @param out Output vector. + * @zh 求两个四维向量的和。 + * @param a 第一个四维向量。 + * @param b 第二个四维向量。 + * @param out 输出向量。 + */ + static add(a: Vector4, b: Vector4, out: Vector4): void; + /** + * @en Calculate the difference between two four-dimensional vectors. + * @param a First vector4. + * @param b Second vector4. + * @param out Output vector. + * @zh 求两个四维向量的差。 + * @param a 第一个四维向量。 + * @param b 第二个四维向量。 + * @param out 输出向量。 + */ + static subtract(a: Vector4, b: Vector4, out: Vector4): void; + /** + * @en Calculate the product of two four-dimensional vectors. + * @param a First vector4. + * @param b Second vector4. + * @param out Output vector. + * @zh 计算两个四维向量的乘积。 + * @param a 第一个四维向量。 + * @param b 第二个四维向量。 + * @param out 输出向量。 + */ + static multiply(a: Vector4, b: Vector4, out: Vector4): void; + /** + * @en Scale a four-dimensional vector. + * @param a Source vector4. + * @param b Scale value. + * @param out Output vector4. + * @zh 缩放四维向量。 + * @param a 源四维向量。 + * @param b 缩放值。 + * @param out 输出四维向量。 + */ + static scale(a: Vector4, b: number, out: Vector4): void; + /** + * @en Clamp a four-dimensional vector within a specified range. + * @param value Vector to be clamped. + * @param min Minimum values. + * @param max Maximum values. + * @param out Output vector. + * @zh 将四维向量限制在指定的范围内。 + * @param value 要限制的向量。 + * @param min 最小值。 + * @param max 最大值。 + * @param out 输出向量。 + */ + static Clamp(value: Vector4, min: Vector4, max: Vector4, out: Vector4): void; + /** + * @en Calculate the squared distance between two four-dimensional vectors. + * @param value1 The first vector4. + * @param value2 The second vector4. + * @returns The squared distance. + * @zh 计算两个四维向量之间距离的平方。 + * @param value1 第一个四维向量。 + * @param value2 第二个四维向量。 + * @returns 距离的平方。 + */ + static distanceSquared(value1: Vector4, value2: Vector4): number; + /** + * @en Calculate the distance between two four-dimensional vectors. + * @param value1 The first vector. + * @param value2 The second vector. + * @returns The distance. + * @zh 计算两个四维向量之间的距离。 + * @param value1 第一个向量。 + * @param value2 第二个向量。 + * @returns 距离。 + */ + static distance(value1: Vector4, value2: Vector4): number; + /** + * @en Calculate the dot product of two four-dimensional vectors. + * @param a The first vector. + * @param b The second vector. + * @returns The dot product. + * @zh 计算两个四维向量的点积。 + * @param a 第一个向量。 + * @param b 第二个向量。 + * @returns 点积。 + */ + static dot(a: Vector4, b: Vector4): number; + /** + * @en Calculate a new four-dimensional vector using the minimum values of x, y, z, and w from two vectors. + * @param a The first vector4. + * @param b The second vector4. + * @param out The resulting vector4. + * @zh 分别取两个四维向量x、y、z、w的最小值计算新的四维向量。 + * @param a 第一个四维向量。 + * @param b 第二个四维向量。 + * @param out 结果四维向量。 + */ + static min(a: Vector4, b: Vector4, out: Vector4): void; + /** + * @en Calculate a new four-dimensional vector using the maximum values of x, y, z, and w from two vectors. + * @param a The first vector4. + * @param b The second vector4. + * @param out The resulting vector4. + * @zh 分别取两个四维向量x、y、z、w的最大值计算新的四维向量。 + * @param a 第一个四维向量。 + * @param b 第二个四维向量。 + * @param out 结果四维向量。 + */ + static max(a: Vector4, b: Vector4, out: Vector4): void; + } + /** + * @en The `Viewport` class is used to create a viewport. + * @zh `Viewport` 类用于创建视口。 + */ + class Viewport { + /** + * @en X-axis coordinate + * @zh X轴坐标 + */ + x: number; + /** + * @en Y-axis coordinate + * @zh Y轴坐标 + */ + y: number; + /** + * @en Width + * @zh 宽度 + */ + width: number; + /** + * @en Height + * @zh 高度 + */ + height: number; + /** + * @en Minimum depth + * @zh 最小深度 + */ + minDepth: number; + /** + * @en Maximum depth + * @zh 最大深度 + */ + maxDepth: number; + /** + * @en Constructor method, initialize viewport. + * @param x X-axis coordinate. + * @param y Y-axis coordinate. + * @param width Width. + * @param height Height. + * @zh 构造方法,初始化视口。 + * @param x X轴坐标。 + * @param y Y轴坐标。 + * @param width 宽度。 + * @param height 高度。 + */ + constructor(x?: number, y?: number, width?: number, height?: number); + /** + * @en Project a three-dimensional vector to viewport space. + * @param source vector3. + * @param matrix Transformation matrix. + * @param out x, y, z are viewport space coordinates; in perspective projection, w is the z-axis coordinate relative to the transformation matrix. + * @zh 投影一个三维向量到视口空间。 + * @param source 三维向量。 + * @param matrix 变换矩阵。 + * @param out x、y、z为视口空间坐标,透视投影下w为相对于变换矩阵的z轴坐标。 + */ + project(source: Vector3, matrix: Matrix4x4, out: Vector4): void; + /** + * @en Unproject a three-dimensional vector. + * @param source Source vector3. + * @param matrix Transformation matrix. + * @param out Output vector3. + * @zh 反变换一个三维向量。 + * @param source 源三维向量。 + * @param matrix 变换矩阵。 + * @param out 输出三维向量。 + */ + unprojectFromMat(source: Vector3, matrix: Matrix4x4, out: Vector3): void; + /** + * @en Unproject a three-dimensional vector using World-View-Projection matrices. + * @param source Source vector3. + * @param projection Perspective projection matrix. + * @param view View matrix. + * @param world World matrix, can be set to null. + * @param out Output vector. + * @zh 使用世界-视图-投影矩阵反变换一个三维向量。 + * @param source 源三维向量。 + * @param projection 透视投影矩阵。 + * @param view 视图矩阵。 + * @param world 世界矩阵,可设置为null。 + * @param out 输出向量。 + */ + unprojectFromWVP(source: Vector3, projection: Matrix4x4, view: Matrix4x4, world: Matrix4x4, out: Vector3): void; + /** + * @en Set viewport values. + * @param x X-axis coordinate. + * @param y Y-axis coordinate. + * @param width Width. + * @param height Height. + * @zh 设置视口值。 + * @param x X轴坐标。 + * @param y Y轴坐标。 + * @param width 宽度。 + * @param height 高度。 + */ + set(x: number, y: number, width: number, height: number): void; + /** + * @en Clone the viewport. + * @param out Output viewport. + * @zh 克隆视口。 + * @param out 输出视口。 + */ + cloneTo(out: Viewport): void; + } + /** + * @en Use Audio tag to play sound + * @zh 使用Audio标签播放声音 + */ + class AudioSound extends EventDispatcher { + private static _audioCache; + /** + * @en Sound URL + * @zh 声音URL + */ + url: string; + /** + * @en Audio tag used for playback + * @zh 播放用的audio标签 + */ + audio: HTMLAudioElement; + /** + * @en Whether it has been loaded + * @zh 是否已加载完成 + */ + loaded: boolean; + /** + * @en Release the sound + * @zh 释放声音 + */ + dispose(): void; + private static _makeMusicOK; + /** + * @en Load the sound + * @param url The URL of the sound to load + * @zh 加载声音 + * @param url 要加载的声音的URL + */ + load(url: string): void; + /** + * @en Play the sound + * @param startTime The start time of playback + * @param loops The number of times to loop the sound + * @returns The sound channel + * @zh 播放声音 + * @param startTime 播放的起始时间 + * @param loops 循环播放次数 + * @returns 声音通道 + */ + play(startTime?: number, loops?: number): SoundChannel; + /** + * @en Total time + * @zh 总时间。 + */ + get duration(): number; + } + /** + * @en Audio tag sound track control for playing sounds + * @zh audio标签播放声音的音轨控制 + */ + class AudioSoundChannel extends SoundChannel { + /** + * 播放用的audio标签 + */ + private _audio; + private _onEnd; + private _resumePlay; + private _src; + /** @ignore */ + constructor(audio: HTMLAudioElement); + private __onEnd; + private __resumePlay; + /** + * @en Play the sound + * @zh 播放声音 + */ + play(): void; + /** + * @en The current playback position, in seconds. + * @zh 当前播放到的位置,单位为秒 + */ + get position(): number; + /** + * @en The total duration of the sound, in seconds. + * @zh 声音的总时长,单位为秒。 + */ + get duration(): number; + /** + * @en Stop playing + * @zh 停止播放 + */ + stop(): void; + /** + * @en Pause the sound playback + * @zh 暂停声音播放 + */ + pause(): void; + /** + * @en Resume the sound playback + * @zh 恢复声音播放 + */ + resume(): void; + /** + * @en The volume of the sound + * @zh 声音的音量 + */ + get volume(): number; + set volume(v: number); + } + /** + * @en `Sound` is an abstract base class for controlling sound. + * @zh `Sound`是播放控制声音的抽象基类。 + */ + class Sound extends EventDispatcher { + /** + * @en Load the sound. + * @param url The URL of the sound file. + * @zh 加载声音。 + * @param url 声音文件的地址。 + */ + load(url: string): void; + /** + * @en Play the sound. + * @param startTime The start time in seconds. + * @param loops The number of times to loop the sound. 0 means loop indefinitely. + * @returns A SoundChannel object representing the sound channel. + * @zh 播放声音。 + * @param startTime 开始时间,单位为秒。 + * @param loops 循环次数,0表示一直循环。 + * @returns 声道 SoundChannel 对象。 + */ + play(startTime?: number, loops?: number): SoundChannel; + /** + * @en The total duration of the sound in seconds. + * @zh 声音的总时间,以秒为单位。 + */ + get duration(): number; + /** + * @en Release the sound resources. + * @zh 释放声音资源。 + */ + dispose(): void; + } + /** + * @en The `SoundChannel` class is used to control sounds in the program. Each sound is assigned to a channel, and an application can have multiple channels mixed together. + * The `SoundChannel` class contains methods for controlling sound playback, pause, stop, volume, as well as methods for getting information about the sound's playback status, total time, current playback time, total loop count, and playback address. + * @zh `SoundChannel` 用来控制程序中的声音。每个声音均分配给一个声道,而且应用程序可以具有混合在一起的多个声道。 + * `SoundChannel` 类包含控制声音的播放、暂停、停止、音量的方法,以及获取声音的播放状态、总时间、当前播放时间、总循环次数、播放地址等信息的方法。 + */ + class SoundChannel extends EventDispatcher { + /** + * @en The URL of the sound. + * @zh 声音地址。 + */ + url: string; + /** + * @en The number of loops. + * @zh 循环次数。 + */ + loops: number; + /** + * @en The start time of sound playback. + * @zh 播放声音开始时间。 + */ + startTime: number; + /** + * @en Indicates whether the sound is paused. + * @zh 表示声音是否已暂停。 + */ + isStopped: boolean; + /** + * @en The handler for playback completion. + * @zh 播放完成处理器。 + */ + completeHandler: Handler; + /** + * @en The volume. The volume range is from 0 (mute) to 1 (maximum volume). + * @zh 音量。音量范围从 0(静音)至 1(最大音量)。 + */ + get volume(): number; + set volume(v: number); + /** + * @en The current playback time in seconds. + * @zh 当前播放时间,单位是秒。 + */ + get position(): number; + /** + * @en The total duration in seconds. + * @zh 总时间,单位是秒。 + */ + get duration(): number; + /** + * @en Play the sound. + * @zh 播放声音。 + */ + play(): void; + /** + * @en Stop playing the sound. + * @zh 停止播放。 + */ + stop(): void; + /** + * @en Pause the sound playback. + * @zh 暂停播放。 + */ + pause(): void; + /** + * @en Resume the sound playback. + * @zh 继续播放。 + */ + resume(): void; + protected __runComplete(handler: Handler): void; + } + /** + * @en The `SoundManager` is a sound management class. It provides control methods for playing background music and sound effects. + * - The engine has two default sound schemes: WebAudio and H5Audio. + * - For playing sound effects, WebAudio is prioritized. If WebAudio is not available, H5Audio is used. H5Audio may have compatibility issues on some devices (such as inability to mix sounds or playback delays). + * - For playing background music, H5Audio is used (using WebAudio would significantly increase memory usage and cause a delay as it needs to wait for the sound to load completely before playing). + * - It is recommended to use mp3 format for background music and wav or mp3 format for sound effects (if packaging as an app, only wav format can be used for sound effects). + * @zh `SoundManager` 是一个声音管理类。提供了对背景音乐、音效的播放控制方法。 + * - 引擎默认有两套声音方案:WebAudio和H5Audio。 + * - 播放音效时,优先使用WebAudio播放声音,如果WebAudio不可用,则用H5Audio播放。H5Audio在部分机器上有兼容问题(比如不能混音,播放有延迟等)。 + * - 播放背景音乐时,则使用H5Audio播放(使用WebAudio会增加特别大的内存,并且要等加载完毕后才能播放,有延迟)。 + * - 建议背景音乐用mp3类型,音效用wav或者mp3类型(如果打包为app,音效只能用wav格式)。 + */ + class SoundManager { + /** + * @en Background music volume. default value is 1. + * @zh 背景音乐音量。默认值为1。 + */ + static musicVolume: number; + /** + * @en Sound effect volume. default value is 1. + * @zh 音效音量。默认值为1。 + */ + static soundVolume: number; + /** + * @en Sound playback rate. default value is 1. + * @zh 声音播放速率。默认值为1。 + */ + static playbackRate: number; + /** + * @en Background music uses the Audio tag for playback. The default is true. + * @zh 背景音乐使用 Audio 标签播放。 默认值为true。 + */ + private static _useAudioMusic; + /** + * @en Indicates whether the audio is muted. The default is false. + * @zh 是否静音,默认为 false。 + */ + private static _muted; + /** + * @en Indicates whether sound effects are muted. The default is false. + * @zh 是否音效静音,默认为 false。 + */ + private static _soundMuted; + /** + * @en Indicates whether background music is muted. The default is false. + * @zh 是否背景音乐静音,默认为 false。 + */ + private static _musicMuted; + /** + * @en The current background music URL. + * @zh 当前背景音乐 URL。 + */ + static _bgMusic: string; + /** + * @en The current background music channel. + * @zh 当前背景音乐声道。 + */ + static _musicChannel: SoundChannel; + /** + * @en The list of currently playing channels. + * @zh 当前播放的 Channel 列表。 + */ + private static _channels; + private static _autoStopMusic; + private static _blurPaused; + private static _isActive; + private static _lastSoundUsedTimeDic; + private static _isCheckingDispose; + private static _soundCache; + /** + * @en Automatically delete sound effects after playing.default value is true. + * @zh 音效播放后自动删除。默认值是 true。 + */ + static autoReleaseSound: boolean; + /** + * @en Add a playing sound instance. + * @param channel The `SoundChannel` object. + * @zh 添加播放的声音实例。 + * @param channel `SoundChannel` 对象。 + */ + static addChannel(channel: SoundChannel): void; + /** + * @en Remove a playing sound instance. + * @param channel The `SoundChannel` object. + * @zh 移除播放的声音实例。 + * @param channel `SoundChannel` 对象。 + */ + static removeChannel(channel: SoundChannel): void; + static disposeSoundLater(url: string): void; + private static _checkDisposeSound; + static disposeSoundIfNotUsed(url: string): void; + /** + * @en Whether to automatically stop background music when losing focus. + * @zh 失去焦点后是否自动停止背景音乐。 + */ + static get autoStopMusic(): boolean; + static set autoStopMusic(v: boolean); + private static _visibilityChange; + private static _stageOnBlur; + private static _recoverWebAudio; + private static _stageOnFocus; + /** + * @en Whether background music and all sound effects are muted. + * @zh 背景音乐和所有音效是否静音。 + */ + static get muted(): boolean; + static set muted(value: boolean); + /** + * @en Whether all sound effects (excluding background music) are muted. + * @zh 所有音效(不包括背景音乐)是否静音。 + */ + static get soundMuted(): boolean; + static set soundMuted(value: boolean); + /** + * @en Whether background music (excluding sound effects) is muted. + * @zh 背景音乐(不包括音效)是否静音。 + */ + static get musicMuted(): boolean; + static set musicMuted(value: boolean); + /** + * @en Determines whether background music is played using the Audio tag. + * @zh 背景音乐是否使用Audio标签播放。 + */ + static get useAudioMusic(): boolean; + static set useAudioMusic(value: boolean); + /** + * @en Play a sound effect. Multiple sound effects can be played simultaneously. + * @param url The URL of the sound file. + * @param loops The number of times to loop the sound. 0 means infinite loop. + * @param complete The callback function when the sound playback is complete. It should be a Handler object. + * @param soundClass The sound class to use for playback. If null, it will be automatically selected. + * @param startTime The start time of the sound playback. + * @returns A SoundChannel object, through which you can control the sound and get sound information. + * @zh 播放音效。音效可以同时播放多个。 + * @param url 声音文件地址。 + * @param loops 循环次数,0表示无限循环。 + * @param complete 声音播放完成回调,应为Handler对象。 + * @param soundClass 使用哪个声音类进行播放,null表示自动选择。 + * @param startTime 声音播放起始时间。 + * @returns SoundChannel对象,通过此对象可以对声音进行控制,以及获取声音信息。 + */ + static playSound(url: string, loops?: number, complete?: Handler, soundClass?: new () => any, startTime?: number): SoundChannel; + /** + * @en Release sound resources. + * @param url The URL of the sound file to be released. + * @zh 释放声音资源。 + * @param url 要释放的声音文件地址。 + */ + static destroySound(url: string): void; + /** + * @en Play background music. Only one background music can be played at a time. If this method is called while background music is already playing, the previous music will be stopped before playing the current one. + * @param url The URL of the sound file. + * @param loops The number of times to loop the music. 0 means infinite loop. + * @param complete The callback function when the music playback is complete. The result parameter is true if playback is completed, false/undefined if triggered by stop. + * @param startTime The start time of the music playback. + * @returns A SoundChannel object, through which you can control the sound and get sound information. + * @zh 播放背景音乐。背景音乐同时只能播放一个,如果在播放背景音乐时再次调用本方法,会先停止之前的背景音乐,再播放当前的背景音乐。 + * @param url 声音文件地址。 + * @param loops 循环次数,0表示无限循环。 + * @param complete 声音播放完成回调,complete 结果参数 true: 播放完成, false/undefined:stop触发的complete。 + * @param startTime 声音播放起始时间。 + * @returns SoundChannel对象,通过此对象可以对声音进行控制,以及获取声音信息。 + */ + static playMusic(url: string, loops?: number, complete?: Handler, startTime?: number): SoundChannel; + /** + * @en Stop playing a specific sound. This method can stop the playback of any sound (including background music and sound effects) by providing the corresponding sound file address. + * @param url The URL of the sound file. + * @zh 停止声音播放。此方法能够停止任意声音的播放(包括背景音乐和音效),只需传入对应的声音播放地址。 + * @param url 声音文件地址。 + */ + static stopSound(url: string): void; + /** + * @en Stop playing all sounds (including background music and sound effects). + * @zh 停止播放所有声音(包括背景音乐和音效)。 + */ + static stopAll(): void; + /** + * @en Stop playing all sound effects (excluding background music). + * @zh 停止播放所有音效(不包括背景音乐)。 + */ + static stopAllSound(): void; + /** + * @en Stop playing background music (excluding sound effects). + * @zh 停止播放背景音乐(不包括音效)。 + */ + static stopMusic(): void; + /** + * @en Set the volume of sounds. Depending on the parameters, it can set the volume for a specific sound (background music or sound effect) or all sound effects (excluding background music). + * @param volume The volume. Initial value is 1. Volume range is from 0 (mute) to 1 (maximum volume). + * @param url (default = null) The URL of the sound file. If null, it sets the volume for all sound effects (excluding background music). If not null, it sets the volume for the specified sound (background music or sound effect). + * @zh 设置声音音量。根据参数不同,可以分别设置指定声音(背景音乐或音效)音量或者所有音效(不包括背景音乐)音量。 + * @param volume 音量。初始值为1。音量范围从 0(静音)至 1(最大音量)。 + * @param url (默认为 null) 声音播放地址。为空表示设置所有音效(不包括背景音乐)的音量,不为空表示设置指定声音(背景音乐或音效)的音量。 + */ + static setSoundVolume(volume: number, url?: string): void; + /** + * @en Set the volume of background music. Volume range is from 0 (mute) to 1 (maximum volume). + * @param volume The volume. Initial value is 1. Volume range is from 0 (mute) to 1 (maximum volume). + * @zh 设置背景音乐音量。音量范围从 0(静音)至 1(最大音量)。 + * @param volume 音量。初始值为1。音量范围从 0(静音)至 1(最大音量)。 + */ + static setMusicVolume(volume: number): void; + /** + * @en Set the volume for a specified sound. + * @param url The URL of the sound file. + * @param volume The volume level, with an initial value of 1. + * @zh 设置指定声音的音量。 + * @param url 声音文件 URL。 + * @param volume 音量。初始值为 1。 + */ + private static _setVolume; + } + /** + * @en Nodes used for playing background music or sound effects + * @zh 用于播放背景音乐或者音效的节点 + */ + class SoundNode extends Sprite { + private _channel; + private _tar; + private _playEvents; + private _stopEvents; + private _source; + private _isMusic; + private _autoPlay; + private _loop; + constructor(); + /** + * @en Audio source + * @zh 音频源 + */ + get source(): string; + set source(value: string); + /** + * @en Determines if the audio type is background music. If true, it's background music; otherwise, it's a sound effect. + * @zh 确定音频类型是否为背景音乐。如果为true,音乐类型为背景音乐,否则为音效 + */ + get isMusic(): boolean; + set isMusic(value: boolean); + /** + * @en The number of times the audio should loop + * @zh 循环次数 + */ + get loop(): number; + set loop(value: number); + /** + * @en Determines if the audio should auto-play + * @zh 是否自动播放 + */ + get autoPlay(): boolean; + set autoPlay(value: boolean); + private _onParentChange; + /** + * @en Play the audio + * @param loops The number of times to loop the audio + * @param complete The callback function to be called when playback is complete + * @zh 播放音频 + * @param loops 循环次数 + * @param complete 完成回调函数 + */ + play(loops?: number, complete?: Handler): void; + /** + * @en Stop playing the audio + * @zh 停止播放音频 + */ + stop(): void; + private _setPlayAction; + private _setPlayActions; + /** + * @en The events string that trigger audio playback + * @zh 触发播放的事件字符串 + */ + set playEvent(events: string); + /** + * @en The target sprite object that controls audio playback + * @zh 控制播放的精灵对象 + */ + set target(tar: Sprite); + /** + * @en Set the events string that trigger audio stop + * @zh 设置触发停止的事件字符串 + */ + set stopEvent(events: string); + } + /** + * @en VideoNode displays video on Canvas. Video may not be effective in all browsers. + * For all events supported by Video, see: https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement + * Note: + * On PC, you can call play() at any time, so the Video can start playing as soon as the program starts running. + * However, on mobile devices, play() can only be called after the user's first touch on the screen, so it's not possible to automatically start playing Video when the program starts running on mobile devices. + * MDN Video link: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video + * @zh VideoNode将视频显示到Canvas上。Video可能不会在所有浏览器有效。 + * 关于Video支持的所有事件,请参见:https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement + * 注意: + * 在PC端可以在任何时机调用play(),因此可以在程序开始运行时就使Video开始播放。 + * 但是在移动端,只有在用户第一次触碰屏幕后才可以调用play(),所以移动端不可能在程序开始运行时就自动开始播放Video。 + * MDN Video链接:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video + */ + class VideoNode extends Sprite { + private _videoTexture; + private _internalTex; + /** @ignore */ + constructor(); + /** + * @en Video texture + * @zh 视频纹理 + */ + get videoTexture(): VideoTexture; + set videoTexture(value: VideoTexture); + /** + * @en Video source + * @zh 视频源 + */ + get source(): string; + set source(value: string); + private _checkCachAs; + private _repaintCachAs; + /** + * @en Set playback source + * @param url Play source path. + * @zh 设置播放源。 + * @param url 播放源路径。 + */ + load(url: string): void; + /** + * @en Start playing the video + * @zh 开始播放视频 + */ + play(): void; + /** + * @en Pause video playback + * @zh 暂停视频播放 + */ + pause(): void; + /** + * @en Reload the video + * @zh 重新加载视频 + */ + reload(): void; + /** + * @en Check if the specified video format is supported for playback. + * @param type The video format type, such as "mp4", "ogg", "webm", "m3u8", etc. + * @returns The level of support. Possible values: + * - "probably": The browser most likely supports this audio/video type + * - "maybe": The browser might support this audio/video type + * - "": (empty string) The browser does not support this audio/video type + * @zh 检测是否支持播放指定格式视频。 + * @param type 视频格式类型,如 "mp4"、"ogg"、"webm"、"m3u8" 等。 + * @returns 表示支持的级别。可能的值: + * - "probably":浏览器最可能支持该音频/视频类型 + * - "maybe":浏览器也许支持该音频/视频类型 + * - "":(空字符串)浏览器不支持该音频/视频类型 + */ + canPlayType(type: string): CanPlayTypeResult; + private onVideoMetaLoaded; + /** + * @en Get the TimeRanges object representing the buffered parts of the video. + * The TimeRanges object represents the time ranges of the buffered audio/video. If the user jumps to different parts of the audio/video, multiple buffer ranges may be created. + * buffered.length returns the number of buffer ranges. + * To get the first buffer range, use buffered.start(0) and buffered.end(0). Values are in seconds. + * @returns TimeRanges object + * @zh 获取表示视频已缓冲部分的 TimeRanges 对象。 + * TimeRanges 对象表示用户的音视频缓冲范围。缓冲范围指的是已缓冲音视频的时间范围。如果用户在音视频中跳跃播放,会得到多个缓冲范围。 + * buffered.length 返回缓冲范围个数。 + * 如获取第一个缓冲范围则是 buffered.start(0) 和 buffered.end(0)。以秒计。 + * @returns TimeRanges 对象 + */ + get buffered(): any; + /** + * @en The current video source path. + * @zh 当前播放源路径。 + */ + get currentSrc(): string; + /** + * @en The current playback position in seconds. + * @zh 当前播放头位置(以秒为单位)。 + */ + get currentTime(): number; + set currentTime(value: number); + /** + * @en The current volume level. + * @zh 当前音量。 + */ + get volume(): number; + set volume(value: number); + /** + * @en The ready state of the video element: + * - 0 = HAVE_NOTHING - No information is available about the audio/video readiness + * - 1 = HAVE_METADATA - Metadata about the audio/video is ready + * - 2 = HAVE_CURRENT_DATA - Data for the current playback position is available, but not enough to play the next frame/millisecond + * - 3 = HAVE_FUTURE_DATA - Data for the current and at least the next frame is available + * - 4 = HAVE_ENOUGH_DATA - Enough data is available to begin playback + * @zh 视频元素的就绪状态: + * - 0 = HAVE_NOTHING - 没有关于音频/视频是否就绪的信息 + * - 1 = HAVE_METADATA - 关于音频/视频就绪的元数据 + * - 2 = HAVE_CURRENT_DATA - 关于当前播放位置的数据是可用的,但没有足够的数据来播放下一帧/毫秒 + * - 3 = HAVE_FUTURE_DATA - 当前及至少下一帧的数据是可用的 + * - 4 = HAVE_ENOUGH_DATA - 可用数据足以开始播放 + */ + get readyState(): any; + /** + * @en The video source width. Available after the ready event is triggered. + * @zh 视频源宽度。ready 事件触发后可用。 + */ + get videoWidth(): number; + /** + * @en The video source height. Available after the ready event is triggered. + * @zh 视频源高度。ready 事件触发后可用。 + */ + get videoHeight(): number; + /** + * @en The video duration in seconds. Available after the ready event is triggered. + * @zh 视频长度(秒)。ready 事件触发后可用。 + */ + get duration(): number; + /** + * @en Returns whether the playback of the audio/video has ended. + * @zh 返回音频/视频的播放是否已结束。 + */ + get ended(): boolean; + /** + * @en Returns a MediaError object representing the audio/video error state. + * @zh 返回表示音频/视频错误状态的 MediaError 对象。 + */ + get error(): MediaError; + /** + * @en Whether the audio/video should loop when it ends. + * @zh 音频/视频是否应在结束时重新播放。 + */ + get loop(): boolean; + set loop(value: boolean); + /** + * @en The current playback speed of the audio/video. For example: + * - 1.0: Normal speed + * - 0.5: Half speed (slower) + * - 2.0: Double speed (faster) + * - -1.0: Backwards, normal speed + * - -0.5: Backwards, half speed + * Note: Only Google Chrome and Safari support the playbackRate property. + * @zh 音频/视频的当前播放速度。例如: + * - 1.0:正常速度 + * - 0.5:半速(更慢) + * - 2.0:倍速(更快) + * - -1.0:向后,正常速度 + * - -0.5:向后,半速 + * 注意:只有 Google Chrome 和 Safari 支持 playbackRate 属性。 + */ + get playbackRate(): number; + set playbackRate(value: number); + /** + * @en The muted state of the video. + * @zh 视频的静音状态。 + */ + get muted(): boolean; + set muted(value: boolean); + /** + * @en If the video is paused. + * @zh 视频是否暂停。 + */ + get paused(): boolean; + /** + * @en The preload attribute. This specifies how the video should be loaded when the page loads. + * Possible values: + * - "auto": Indicates that the video should be loaded entirely when the page loads. + * - "metadata": Indicates that only metadata should be loaded when the page loads. + * - "none": Indicates that the video should not be loaded when the page loads. + * @zh preload 属性。这指定了页面加载时应如何加载视频。 + * 可能的值: + * - "auto":指示一旦页面加载,则开始加载整个视频。 + * - "metadata":指示当页面加载后仅加载音频/视频的元数据。 + * - "none":指示页面加载后不应加载音频/视频。 + */ + get preload(): string; + set preload(value: string); + /** + * @en Used to represent the currently loaded and seekable time range in a video, helping the player or script to know which parts are immediately accessible. + * @zh 用于表示视频中当前已加载且可以跳转的时间范围,帮助播放器或脚本知道哪些部分可以立即访问。 + * @see http://www.w3school.com.cn/tags/av_prop_seekable.asp + */ + get seekable(): any; + /** + * @en Check if the user is currently seeking in the audio/video. + * Seeking means that the user is moving/skipping to a new position in the audio/video. + * @zh 检查用户当前是否正在音频/视频中寻址。 + * 寻址指的是用户在音频/视频中移动/跳跃到新的位置。 + */ + get seeking(): boolean; + /** + * @en Destroy the internal event bindings and optionally destroy child nodes + * @param destroyChildren Whether to destroy child nodes + * @zh 销毁内部事件绑定,并可选择是否删除子节点 + * @param destroyChildren 是否删除子节点 + */ + destroy(destroyChildren?: boolean): void; + } + /** + * @en VideoTexture Multimedia texture + * @zh VideoTexture 多媒体纹理 + */ + class VideoTexture extends BaseTexture { + readonly element: HTMLVideoElement; + static videoEvent_update: string; + private _source; + private _listeningEvents; + private immediatelyPlay; + /** + * 是否开发者自己调用Render + */ + private _frameRender; + private _frameDelty; + private _updateFrame; + private _useFrame; + private _lastTimer; + /** + * @en videoTexture update frame + * @zh 视频纹理更新帧率 + */ + set updateFrame(value: number); + get updateFrame(): number; + set useFrame(value: boolean); + get useFrame(): boolean; + /** + * @ignore + * @en Creates an inst + * @zh VideoTexture对象的构造方法 + */ + constructor(); + private isNeedUpdate; + /** + * @en Handle the loadedmetadata event of the video element. + * Processes the initialization work after the video resource is loaded, ensuring that necessary texture and playback settings are made so that the video can be properly handled during rendering. + * @zh 视频元素的 loadedmetadata 事件的回调方法。 + * 处理视频资源加载完毕后的初始化工作,用于在视频正确加载后,做必要的纹理和播放设置,确保视频能在渲染时被正确处理。 + */ + loadedmetadata(): void; + /** + * @en The gamma correction value + * @zh gamma 校正值 + */ + get gammaCorrection(): number; + /** + * @en The source URL for the video + * @zh 视频的源 URL + */ + get source(): string; + set source(url: string); + private appendSource; + /** + * @en Whether to render every frame + * @zh 是否每一帧都渲染 + */ + get frameRender(): boolean; + set frameRender(value: boolean); + /** + * @en Start playing the video + * @zh 开始播放视频 + */ + play(): void; + _getSource(): any; + /** + * @en The default texture + * @zh 默认纹理 + */ + get defaultTexture(): Texture2D; + /** + * @en Pause the video playback + * @zh 暂停播放视频 + */ + pause(): void; + /** + * @en Reload the video + * @zh 重新加载视频 + */ + load(): void; + /** + * @en Check if the specified video format is supported for playback + * @param type Video format type, such as "mp4", "ogg", "webm", "m3u8", etc. + * @returns The level of support. Possible values: + * - "probably": The browser most likely supports this audio/video type + * - "maybe": The browser might support this audio/video type + * - "": (empty string) The browser does not support this audio/video type + * @zh 检测是否支持播放指定格式视频 + * @param type 视频格式类型 "mp4","ogg","webm","m3u8"等。 + * @return 表示支持的级别。可能的值: + * - "probably": 浏览器最可能支持该音频/视频类型 + * - "maybe": 浏览器也许支持该音频/视频类型 + * - "": (空字符串)浏览器不支持该音频/视频类型 + */ + canPlayType(type: string): CanPlayTypeResult; + /** + * @en Get the TimeRanges object representing the buffered parts of the audio/video + * The TimeRanges object represents the buffered time ranges of the audio/video. If the user skips around in the audio/video, multiple buffered ranges may be created. + * buffered.length returns the number of buffered ranges. + * To get the first buffered range, use buffered.start(0) and buffered.end(0). Values are in seconds. + * @returns The TimeRanges object + * @zh 获取表示音视频已缓冲部分的 TimeRanges 对象 + * TimeRanges 对象表示用户的音视频缓冲范围。缓冲范围指的是已缓冲音视频的时间范围。如果用户在音视频中跳跃播放,会得到多个缓冲范围。 + * buffered.length 返回缓冲范围个数。如获取第一个缓冲范围则是 buffered.start(0) 和 buffered.end(0)。以秒计。 + * @returns TimeRanges(JS)对象 + */ + get buffered(): any; + /** + * @en The current source URL of the video + * @zh 当前播放源路径 + */ + get currentSrc(): string; + /** + * @en The current playback position in seconds + * @zh 当前播放头位置(以秒为单位) + */ + get currentTime(): number; + set currentTime(value: number); + /** + * @en The current volume level + * @zh 当前音量 + */ + get volume(): number; + set volume(value: number); + /** + * @en The readiness state of the video element: + * - 0 = HAVE_NOTHING - No information is available about the audio/video + * - 1 = HAVE_METADATA - Metadata for the audio/video is ready + * - 2 = HAVE_CURRENT_DATA - Data for the current playback position is available, but not enough to play the next frame/millisecond + * - 3 = HAVE_FUTURE_DATA - Data for the current and at least the next frame is available + * - 4 = HAVE_ENOUGH_DATA - Enough data is available to start playing + * @zh 视频元素的就绪状态: + * - 0 = HAVE_NOTHING - 没有关于音频/视频是否就绪的信息 + * - 1 = HAVE_METADATA - 关于音频/视频就绪的元数据 + * - 2 = HAVE_CURRENT_DATA - 关于当前播放位置的数据是可用的,但没有足够的数据来播放下一帧/毫秒 + * - 3 = HAVE_FUTURE_DATA - 当前及至少下一帧的数据是可用的 + * - 4 = HAVE_ENOUGH_DATA - 可用数据足以开始播放 + */ + get readyState(): any; + /** + * @en The width of the video source. Available after the ready event is triggered. + * @zh 视频源宽度。ready 事件触发后可用。 + */ + get videoWidth(): number; + /** + * @en The height of the video source. Available after the ready event is triggered. + * @zh 视频源高度。ready 事件触发后可用。 + */ + get videoHeight(): number; + /** + * @en The duration of the video in seconds. Available after the ready event is triggered. + * @zh 视频长度(秒)。ready 事件触发后可用。 + */ + get duration(): number; + /** + * @en If the playback of the audio/video has ended + * @zh 音频/视频的播放是否已结束 + */ + get ended(): boolean; + /** + * @en Return the MediaError object representing the error state of the audio/video + * @zh 返回表示音频/视频错误状态的 MediaError 对象 + */ + get error(): MediaError; + /** + * @en Whether the audio/video should loop when it reaches the end + * @zh 音频/视频是否应在结束时重新播放 + */ + get loop(): boolean; + set loop(value: boolean); + /** + * @en The current playback speed of the audio/video. For example: + * - 1.0: Normal speed + * - 0.5: Half speed (slower) + * - 2.0: Double speed (faster) + * - -1.0: Backwards, normal speed + * - -0.5: Backwards, half speed + * Note: Only Google Chrome and Safari support the playbackRate property. + * @zh 音频/视频的当前播放速度。如: + * - 1.0:正常速度 + * - 0.5:半速(更慢) + * - 2.0:倍速(更快) + * - -1.0:向后,正常速度 + * - -0.5:向后,半速 + * 注意:只有 Google Chrome 和 Safari 支持 playbackRate 属性。 + */ + get playbackRate(): number; + set playbackRate(value: number); + /** + * @en The muted state of the video + * @zh 视频的静音状态 + */ + get muted(): boolean; + set muted(value: boolean); + /** + * @en If the video is paused + * @zh 视频是否暂停 + */ + get paused(): boolean; + /** + * @en The preload attribute of the video. Possible values: + * - "auto": Indicates that the video should be loaded as soon as the page loads + * - "metadata": Indicates that only metadata should be loaded when the page loads + * - "none": Indicates that the video should not be loaded when the page loads + * @zh 视频的预加载属性。可赋值如下: + * - "auto":指示一旦页面加载,则开始加载视频 + * - "metadata":指示当页面加载后仅加载音频/视频的元数据 + * - "none":指示页面加载后不应加载音频/视频 + */ + get preload(): string; + set preload(value: string); + /** + * @en see: http://www.w3school.com.cn/tags/av_prop_seekable.asp象 + * @zh 参见:http://www.w3school.com.cn/tags/av_prop_seekable.asp + */ + get seekable(): any; + /** + * @en Returns whether the user is currently seeking in the audio/video. + * Seeking refers to the user moving/jumping to a new position in the audio/video. + * @zh 返回用户目前是否在音频/视频中寻址。 + * 寻址(Seeking)指的是用户在音频/视频中移动/跳跃到新的位置。 + */ + get seeking(): boolean; + protected onStartListeningToType(type: string): void; + /** + * @en Destroys the current instance and releases resources. + * @zh 销毁当前实例并释放资源。 + */ + destroy(): void; + } + /** + * @en Web Audio API for playing sounds + * @zh Web Audio API 方式播放声音 + */ + class WebAudioSound extends EventDispatcher { + /** + * @en Audio playback device + * @zh 音频播放设备 + */ + static ctx: AudioContext; + /** + * @en Used to unlock sound playback and resolve memory release issues in iOS 9 + * @zh 用于解锁声音播放以及解决 iOS 9 版本的内存释放问题 + */ + static _miniBuffer: any; + /** + * @en Indicates whether the sound is unlocked + * @zh 是否已解锁声音播放 + */ + private static _unlocked; + /** + * @en URL of the sound file + * @zh 声音文件的 URL + */ + url: string; + /** + * @en Indicates whether the sound has finished loading + * @zh 指示声音是否已加载完成 + */ + loaded: boolean; + /** + * @en Original audio file data + * @zh 声音原始文件数据 + */ + audioBuffer: AudioBuffer; + /** + * @en Channel list to be played + * @zh 待播放的声音列表 + */ + private __toPlays; + private _disposed; + /** + * @en Play a sound to unlock audio on iOS. + * @zh 播放声音以解锁IOS的声音播放。 + */ + private static _playEmptySound; + /** + * @en Try to unlock the sound + * @zh 尝试解锁声音 + */ + private static _unlock; + /** + * @en Initialize Web Audio + * @zh 初始化 Web Audio + */ + static initWebAudio(): void; + /** + * @en Load the sound + * @param url The URL of the sound file to load + * @zh 加载声音 + * @param url 要加载的声音文件的 URL + */ + load(url: string): void; + private _loaded; + private __playAfterLoaded; + /** + * @en Play the sound + * @param startTime The start time of the sound playback + * @param loops The number of times to loop the sound + * @param channel The WebAudioSoundChannel to use for playback + * @returns The SoundChannel used for playback + * @zh 播放声音 + * @param startTime 声音播放的起始时间 + * @param loops 声音循环播放的次数 + * @param channel 用于播放的 WebAudioSoundChannel + * @returns 用于播放的 SoundChannel + */ + play(startTime?: number, loops?: number, channel?: WebAudioSoundChannel): SoundChannel; + /** + * @en The duration of the sound in seconds + * @zh 声音的持续时间,以秒为单位 + */ + get duration(): number; + /** + * @en Dispose of the sound and release resources + * @zh 销毁声音并释放资源 + */ + dispose(): void; + } + /** + * @en Sound track control for playing sounds using Web Audio API + * @zh 使用 Web Audio API 方式播放声音的音轨控制 + */ + class WebAudioSoundChannel extends SoundChannel { + /** + * @en Original audio file data + * @zh 声音原始文件数据 + */ + audioBuffer: any; + /** + * @en Gain node for audio processing. + * @zh gain 节点 + */ + private gain; + /** + * @en Buffer source for playback. + * @zh 播放用的数据 + */ + private bufferSource; + /** + * @en The current playback time. + * @zh 当前时间 + */ + private _currentTime; + /** + * @en The current volume level. + * @zh 当前音量 + */ + private _volume; + /** + * @en Timestamp when playback starts. + * @zh 播放开始时的时间戳 + */ + private _startTime; + private _pauseTime; + /** + * @en The audio playback device. + * @zh 播放设备 + */ + private context; + private _onPlayEnd; + private static _tryCleanFailed; + /** + * @en Target delay for audio playback (in seconds) + * @zh 音频播放的目标延迟时间(以秒为单位) + */ + static SetTargetDelay: number; + /**@ignore */ + constructor(); + /** + * @en Play the sound + * @zh 播放声音 + */ + play(): void; + private __onPlayEnd; + /** + * @en The current playback position in seconds + * @zh 当前播放位置,以秒为单位 + */ + get position(): number; + /** + * @en The duration of the audio in seconds + * @zh 音频的持续时间,以秒为单位 + */ + get duration(): number; + private _clearBufferSource; + private _tryClearBuffer; + /** + * @en Stop playing + * @zh 停止播放 + */ + stop(): void; + /** + * @en Pause the audio playback + * @zh 暂停音频播放 + */ + pause(): void; + /** + * @en Resume the audio playback + * @zh 恢复音频播放 + */ + resume(): void; + /** + * @en The volume of the audio + * @zh 音频的音量 + */ + get volume(): number; + set volume(v: number); + } + /** + * @en Indicate the navigation area types that the agent can pass through. + * @zh 表示代理可以通过的导航区域类型。 + */ + class AreaMask { + /** + * @en The exclude flag. + * @zh 排除标志。 + */ + get excludeflag(): number; + /** + * @en The current flag. + * @zh 获取当前标志。 + */ + get flag(): number; + set flag(value: number); + /** + * @en Creates a new instance of AreaMask. + * @zh 创建 AreaMask 的新实例。 + */ + constructor(); + } + enum ObstacleAvoidanceType { + NoObstacle = 0, + LowQuality = 1, + MedQuality = 2, + GoodQuality = 3, + HighQuality = 4 + } + /** + * @en Class used to instantiate a navigation agent + * @zh 类用来实例化一个寻路代理 + */ + class NavAgent extends Component { + _navAgentLinkAnim: NavAgentLinkAnim; + /** + * @en Radius of the agent. + * @zh 代理的半径。 + */ + set radius(value: number); + get radius(): number; + /** + * @en Height of the agent. + * @zh 代理的高度。 + */ + set height(value: number); + get height(): number; + /** + * @en Movement speed of the agent. + * @zh 代理的移动速度。 + */ + set speed(value: number); + get speed(): number; + /** + * @en Maximum acceleration of the agent. + * @zh 代理的最大加速度。 + */ + set maxAcceleration(value: number); + get maxAcceleration(): number; + /** + * @en Angular speed of the agent. + * @zh 代理的转身速度。 + */ + set angularSpeed(value: number); + get angularSpeed(): number; + /** + * @en Offset of the pivot point. + * @zh 轴心点的偏移。 + */ + set baseOffset(value: number); + get baseOffset(): number; + /** + * @en Obstacle avoidance quality level. + * @zh 障碍物规避品质级别。 + */ + set quality(value: ObstacleAvoidanceType); + get quality(): ObstacleAvoidanceType; + /** + * @en Avoidance priority level. + * @zh 规避优先级别。 + */ + set priority(value: number); + get priority(): number; + /** + * @en Whether the agent is bound to a navigation mesh. + * @zh 代理是否绑定到导航网格。 + */ + get isOnNavMesh(): boolean; + /** + * @en Whether the agent is currently on an OffMeshLink. + * @zh 代理当前是否位于 OffMeshLink 上。 + */ + get isOnOffMeshLink(): boolean; + /** + * @en Set the destination for the agent. + * @param value The destination vector. + * @zh 设置代理的目的地。 + * @param value 目的地位置向量。 + */ + set destination(value: Vector3); + get destination(): Vector3; + /** + * @en Set the agent type. + * @param value The agent type. + * @zh 设置代理类型。 + * @param value 代理类型。 + */ + set agentType(value: string); + get agentType(): string; + /** + * @en Set the area mask for the agent. + * @zh 设置代理的区域掩码。 + */ + set areaMask(value: number); + get areaMask(): number; + /** + * @en Create a new NavAgent instance. + * @zh 创建一个新的 NavAgent 实例。 + */ + constructor(); + /** + * @private + */ + _getUpdateFlags(): number; + /** + * @private + */ + _onDestroy(): void; + /** + * @en Update method called every frame. + * @zh 每帧调用的更新方法。 + */ + onUpdate(): void; + /** + * @en Whether the agent has stopped moving. + * @zh 代理是否已停止移动。 + */ + isStop(): boolean; + /** + * @en Get the current path of the agent. + * @zh 获取代理的当前路径。 + */ + getCurrentPath(): Array; + /** + * @en Set the position of the agent in world coordinates. + * @param pos The new position in world coordinates. + * @zh 在世界坐标中设置代理的位置。 + * @param pos 世界坐标系下的新位置。 + */ + setPosition(pos: Vector3): void; + /** + * @en Find the distance to the nearest wall. + * @returns {dist:distance, pos:collision point, normal:Normal vector} + * @zh 查找到最近墙面的距离。 + * @returns {dist:距离, pos:碰撞点, normal:法向量} + */ + findDistanceToWall(): { + dist: number; + pos: Array; + normal: Array; + }; + } + /** + * @en NavMeshLink represents a connection between two points outside the navigation mesh. + * @zh NavMeshLink 表示导航网格外的两点之间的连接。 + */ + class NavMeshLink extends Component { + /** + * @en The start position of the link + * @zh 链接的起始位置 + */ + set start(value: Vector3); + get start(): Vector3; + /** + * @en The end position of the link + * @zh 链接的结束位置 + */ + set end(value: Vector3); + get end(): Vector3; + /** + * @en The width of the link + * @zh 链接的宽度 + */ + set width(value: number); + get width(): number; + /** + * @en The area flag of the link + * @zh 链接的区域标记 + */ + set areaFlag(value: string); + get areaFlag(): string; + /** + * @en The agent type that can use this link + * @zh 可以使用此链接的代理类型 + */ + set agentType(value: string); + get agentType(): string; + /** + * @en Whether the link is bidirectional + * @zh 链接是否为双向 + */ + set bidirectional(value: boolean); + get bidirectional(): boolean; + /** + * @ignore + * @en Creates a new NavMeshLink instance. + * @zh 创建一个新的 NavMeshLink 实例。 + */ + constructor(); + } + /** + * @en NavMeshModifierVolume is a component that modifies the navigation mesh in a specific volume. + * @zh NavMeshModifierVolume 是一个在特定体积内修改导航网格的组件。 + */ + class NavMeshModifierVolume extends Component { + /** + * @en The center of the modifier volume. + * @zh 修改体积的中心点。 + */ + get center(): Vector3; + set center(value: Vector3); + /** + * @en The size of the modifier volume. + * @zh 修改体积的大小。 + */ + get size(): Vector3; + set size(value: Vector3); + /** + * @en The agent type that this volume applies to. + * @zh 该体积适用的代理类型。 + */ + set agentType(value: string); + get agentType(): string; + /** + * @en The area flag for this volume. + * @zh 该体积的区域标志。 + */ + set areaFlag(value: string); + get areaFlag(): string; + /** + * @en Creates a new NavMeshModifierVolume instance. + * @zh 创建一个新的 NavMeshModifierVolume 实例。 + */ + constructor(); + } + /** + * @en NavMeshModifileSurface is a component that modifies the navigation mesh surface. + * @zh NavMeshModifileSurface 是一个修改导航网格表面的组件。 + */ + class NavMeshModifileSurface extends NavModifleBase { + /** @ignore */ + constructor(); + /** + * @en Sets or gets the baked navigation data. + * @param value The TextResource containing the navigation data. + * @returns The TextResource containing the navigation data. + * @zh 设置或获取烘焙的导航数据。 + * @param value 包含导航数据的 TextResource。 + * @returns 包含导航数据的 TextResource。 + */ + set datas(value: TextResource); + get datas(): TextResource; + } + /** + * @en Enum for the different types of obstacle meshes supported by the navigation system. + * @zh 导航系统支持的不同类型的障碍物网格枚举。 + */ + enum NavObstaclesMeshType { + BOX = 0, + CAPSULE = 1, + Num = 2 + } + /** + * @en NavMeshObstacles Common shapes for navigation mesh obstacles. + * @zh NavMeshObstacles 常用的导航网格障碍物形状。 + */ + class NavMeshObstacles extends NavModifleBase { + static _defaltMax: Vector3; + /** + * @en The mesh type of the obstacle. + * @zh 障碍物的网格类型。 + */ + get meshType(): NavObstaclesMeshType; + set meshType(value: NavObstaclesMeshType); + /** + * @en The center offset of the obstacle. + * @zh 障碍物的中心偏移。 + */ + get center(): Vector3; + set center(value: Vector3); + /** + * @en The size of the box obstacle.= + * @zh 盒型障碍物的大小。= + */ + get size(): Vector3; + set size(value: Vector3); + /** + * @en The height of the capsule obstacle. + * @zh 胶囊障碍物的圆柱高度。 + */ + get height(): number; + set height(value: number); + /** + * @en Set the radius of the capsule obstacle. + * @zh 设置胶囊障碍物的圆柱半径。 + */ + get radius(): number; + set radius(value: number); + /** + * @ignore + * @en Create a new NavMeshObstacles instance. + * @zh 创建NavMeshObstacles的一个新实例。 + */ + constructor(); + } + /** + * @en Data partitioning algorithm + * @zh 数据分块算法 + */ + enum PartitionType { + PARTITION_WATERSHED = 0, + PARTITION_MONOTONE = 1, + PARTITION_LAYERS = 2 + } + /** + * @en NavMeshSurface is a component used to generate navigation mesh. + * @zh NavMeshSurface 是一个用于生成导航网格的组件。 + */ + class NavMeshSurface extends Component { + /** + * @en Find all NavMeshSurface components that match the given agent flags in the sprite hierarchy. + * @param surfaces An array to store the found NavMeshSurface components. + * @param sprite The starting Sprite3D to search from. + * @param agentFlags An array of agent types to filter the NavMeshSurface components. + * @zh 在精灵层级中查找所有匹配给定代理标志的 NavMeshSurface 组件。 + * @param surfaces 用于存储找到的 NavMeshSurface 组件的数组。 + * @param sprite 开始搜索的 Sprite3D 对象。 + * @param agentFlags 用于过滤 NavMeshSurface 组件的代理类型数组。 + */ + static findNavMeshSurface(surfaces: Array, sprite: Sprite3D, agentFlags: string[]): void; + /** + * @en Agent type + * @zh 代理类型 + */ + set agentType(value: string); + get agentType(): string; + /** + * @en Area type + * @zh 区域类型 + */ + set areaFlag(value: string); + get areaFlag(): string; + /** + * @en Whether asynchronous processing is needed + * @zh 是否需要异步处理 + */ + set asyn(value: boolean); + get asyn(): boolean; + /** + * @en Set the method for generating navMesh + * @zh 设置生成导航网格的方法 + */ + set partitionType(value: PartitionType); + get partitionType(): PartitionType; + /** + * @readonly + * @en The minimum bounds of the navigation mesh + * @zh 导航网格的最小边界 + */ + get boundMin(): Vector3; + /** + * @readonly + * @en The maximum bounds of the navigation mesh + * @zh 导航网格的最大边界 + */ + get boundMax(): Vector3; + /** + * @en Set navigation data + * @zh 设置导航数据 + */ + set datas(value: TextResource); + get datas(): TextResource; + /** + * @en The navigation mesh + * @zh 导航网格 + */ + get navMesh(): NavMesh; + /** + * @en Instantiate a pathfinding functionality + * @zh 实例化一个寻路功能 + */ + constructor(); + _cloneTo(dest: NavMeshSurface): void; + /** + * add one modifile navMesh + * @param navModifile + */ + _addModifileNavMesh(navModifile: NavModifleBase): void; + /** + * start build one Mesh + */ + _buildOneTileMesh(): void; + /** + * start build all Mesh + */ + _buildAllTileMesh(): void; + /** + * @en Clean all navigation tiles + * @zh 清除所有导航网格块 + */ + cleanAllTile(): void; + /** + * @en Rebuild a specific tile at the given position + * @param pos The position vector to determine which tile to rebuild + * @zh 重建指定位置的导航网格块 + * @param pos 用于确定要重建哪个网格块的位置向量 + */ + rebuildTile(pos: Vector3): void; + } + /** + * @en NavModifleBase is the base class for dynamic navigation nodes. + * @zh NavModifleBase 是动态导航节点的基类。 + */ + class NavModifleBase extends Component { + get boundMin(): Vector3; + get boundMax(): Vector3; + /** + * @en Agent type for the navigation node + * @zh 导航节点的代理类型 + */ + set agentType(value: string); + get agentType(): string; + /** + * @en Area type for the navigation node + * @zh 导航节点的区域类型 + */ + set areaFlag(value: string); + get areaFlag(): string; + /** + * @en Create a new instance of NavModifleBase. + * @zh 创建 NavModifleBase 类的新实例。 + */ + constructor(); + } + /** + * @en Represents a navigation area flag. + * @zh 表示导航区域标志。 + */ + class NavAreaFlag { + /** + * @en The index of the navigation area flag. + * @zh 导航区域标志的索引。 + */ + index: number; + /** + * @en The cost associated with the navigation area flag. + * @zh 与导航区域标志相关的代价。 + */ + cost: number; + /** + * @en The name of the navigation area flag. + * @zh 导航区域标志的名称。 + */ + name: string; + /** + * @en Get the flag value based on the index. + * @zh 根据索引获取标志值。 + */ + get flag(): number; + } + /** + * @en NavigationManager is a navigation manager responsible for managing navigation meshes. + * @zh NavigationManager 是一个导航管理器,负责管理导航网格。 + */ + class NavigationManager implements IElementComponentManager { + /** + * @en Instantiates a Navigation manager. + * @zh 实例化一个 Navigation 管理器。 + */ + constructor(); + /** + * @en Registers a navigation mesh agent type configuration. + * @param config The RecastConfig object containing the agent configuration. + * @zh 注册导航网格的 agent 类型配置。 + * @param config RecastConfig 对象,包含 agent 的配置。 + */ + regNavConfig(config: RecastConfig): void; + /** + * @en Gets the navigation mesh agent configuration for a specific type. + * @param type The agent type name. + * @returns The RecastConfig for the specified agent type, or undefined if not found. + * @zh 获取指定类型的导航网格 agent 配置。 + * @param type agent 类型名称。 + * @returns 指定 agent 类型的 RecastConfig,如果未找到则返回 undefined。 + */ + getNavConfig(type: string): RecastConfig; + /** + * @en Registers a navigation area type. + * @param area The NavAreaFlag object representing the area type. + * @zh 注册导航区域类型。 + * @param area 表示区域类型的 NavAreaFlag 对象。 + */ + regArea(area: NavAreaFlag): void; + /** + * @en Gets the configuration for a specific navigation area type. + * @param type The area type name. + * @returns The NavAreaFlag for the specified area type, or undefined if not found. + * @zh 获取指定导航区域类型的配置。 + * @param type 区域类型名称。 + * @returns 指定区域类型的 NavAreaFlag,如果未找到则返回 undefined。 + */ + getArea(type: string): NavAreaFlag; + /** + * @en Gets the map of all registered navigation area flags. + * @returns A Map of area names to NavAreaFlag objects. + * @zh 获取所有已注册的导航区域标志的映射。 + * @returns 区域名称到 NavAreaFlag 对象的 Map。 + */ + getAreaFlagMap(): Map; + /** + * @en Registers a NavMeshLink between two different NavMeshSurfaces. + * @param start The starting NavMeshSurface. + * @param end The ending NavMeshSurface. + * @param link The NavMeshLink to register. + * @zh 注册连接两个不同 NavMeshSurface 的 NavMeshLink。 + * @param start 起始 NavMeshSurface。 + * @param end 结束 NavMeshSurface。 + * @param link 要注册的 NavMeshLink。 + */ + regNavMeshLink(start: NavMeshSurface, end: NavMeshSurface, link: NavMeshLink): void; + /** + * @en Get the corresponding NavMeshSurface based on a world position. + * @param pos World coordinate position. + * @param agentType Agent type. + * @returns NavMeshSurface or null if not found. + * @zh 通过空间位置获得对应的 NavMeshSurface。 + * @param pos 世界坐标位置。 + * @param agentType agent 类型。 + * @returns NavMeshSurface,如果未找到则返回 null。 + */ + getNavMeshSurface(pos: Vector3, agentType: string): NavMeshSurface; + /** + * @en Get all NavMeshSurfaces that contain a given world position. + * @param pos World coordinate position. + * @returns Array of NavMeshSurface objects. + * @zh 通过空间坐标获得所有包含该位置的 NavMeshSurface。 + * @param pos 世界坐标位置。 + * @returns NavMeshSurface 对象数组。 + */ + getNavMeshSurfaces(pos: Vector3): NavMeshSurface[]; + } + /** + * @en Represents a navigation path data point. + * @zh 表示导航路径数据点。 + */ + class NavigationPathData { + /** + * @en The position of the path data point. + * @zh 路径数据点的位置。 + */ + get pos(): Vector3; + /** + * @en Get the flag of the path data point. + * @zh 获取路径数据点的标记。 + */ + get flag(): number; + /** + * @ignore + * @en Creates a new instance of NavigationPathData. + * @zh 创建 NavigationPathData 的新实例。 + */ + constructor(); + } + /** + * @en NavigationUtils is a utility class for handling operations related to navigation meshes. + * @zh NavigationUtils 是一个导航工具类,主要用于处理与导航网格相关的操作。 + */ + class NavigationUtils { + /** + * @en Create navMesh tile to Laya Mesh. + * @param navMesh The navigation mesh to create the debug mesh from. + * @param mesh The mesh to update or create. If null, a new mesh will be created. + * @returns The created or updated mesh. + * @zh 创建导航网格为Laya的网格。 + * @param navMesh 用于创建调试网格的导航网格。 + * @param mesh 要更新或创建的网格。如果为 null,将创建一个新的网格。 + * @returns 创建或更新后的网格。 + */ + static creageDebugMesh(navMesh: NavMesh, mesh: Mesh): Mesh; + static transfromBound(mat: Matrix4x4, min: Vector3, max: Vector3, outMin: Vector3, outMax: Vector3): void; + static boundContainPoint(min: Vector3, max: Vector3, point: Vector3): boolean; + /** + * @en Create a new NavMesh. + * @returns A new NavMesh object. + * @zh 创建一个新的 NavMesh。 + * @returns 一个新的 NavMesh 对象。 + */ + static createNavMesh(): any; + /** + * @en Create a new NavMeshQuery. + * @returns A new NavMeshQuery object. + * @zh 创建一个新的 NavMeshQuery。 + * @returns 一个新的 NavMeshQuery 对象。 + */ + static createNavMeshQuery(): any; + /** + * @en Create a new RefPointData. + * @returns A new RefPointData object. + * @zh 创建一个新的 RefPointData。 + * @returns 一个新的 RefPointData 对象。 + */ + static createRefPointData(): any; + /** + * @en Create a new MeshOffLink. + * @returns A new MeshOffLink object. + * @zh 创建一个新的 MeshOffLink。 + * @returns 一个新的 MeshOffLink 对象。 + */ + static createMeshOffLink(): any; + /** + * @en Create a new ConvexVolume. + * @returns A new ConvexVolume object. + * @zh 创建一个新的 ConvexVolume。 + * @returns 一个新的 ConvexVolume 对象。 + */ + static createConvexVolume(): any; + /** + * @en Create a new QueryFilter. + * @returns A new QueryFilter object. + * @zh 创建一个新的 QueryFilter。 + * @returns 一个新的 QueryFilter 对象。 + */ + static createQueryFilter(): any; + /** + * @en Create a new Crowd. + * @returns A new Crowd object. + * @zh 创建一个新的 Crowd。 + * @returns 一个新的 Crowd 对象。 + */ + static createCrowd(): any; + /** + * @en Create a new NavTileData. + * @returns A new NavTileData object. + * @zh 创建一个新的 NavTileData。 + * @returns 一个新的 NavTileData 对象。 + */ + static createdtNavTileData(): any; + /** + * @en Get CrowdAgentParams. + * @returns CrowdAgentParams object. + * @zh 获取 CrowdAgentParams。 + * @returns CrowdAgentParams 对象。 + */ + static getCrowdAgentParams(): any; + /** + * @en Free the NavMeshQuery object. + * @param data The NavMeshQuery object to free. + * @zh 释放 NavMeshQuery 对象。 + * @param data 要释放的 NavMeshQuery 对象。 + */ + static freeNavMeshQuery(data: any): void; + /** + * @en Free the NavMesh object. + * @param data The NavMesh object to free. + * @zh 释放 NavMesh 对象。 + * @param data 要释放的 NavMesh 对象。 + */ + static freeNavMesh(data: any): void; + /** + * @en Free the Crowd object. + * @param data The Crowd object to free. + * @zh 释放 Crowd 对象。 + * @param data 要释放的 Crowd 对象。 + */ + static freeCrowd(data: any): void; + /** + * @en Free any other object. + * @param data The object to free. + * @zh 释放任何其他对象。 + * @param data 要释放的对象。 + */ + static free(data: any): void; + /** + * @en Free any Laya data object. + * @param data The Laya data object to free. + * @zh 释放任何 Laya 数据对象。 + * @param data 要释放的 Laya 数据对象。 + */ + static freeLayaData(data: any): void; + /** + * @en Check if the status is successful. + * @param status The status to check. + * @returns True if the status is successful, false otherwise. + * @zh 检查状态是否成功。 + * @param status 要检查的状态。 + * @returns 如果状态成功则返回 true,否则返回 false。 + */ + static statusSucceed(status: any): boolean; + } + /** + * @en NavMesh class is used to create and manage navigation meshes. + * @zh NavMesh 类用于创建和管理导航网格。 + */ + class NavMesh { + /**寻路代理 */ + private _crowd; + /**过滤信息 */ + private _defatfilter; + /**TODO */ + private _extents; + /**navigation manager */ + private _manager; + private _fiterMap; + get min(): Vector3; + get max(): Vector3; + /** + * @ignore + * @en Instantiate a NavMesh component. + * @param config The Recast configuration for the NavMesh. + * @param bound The bounds of the NavMesh. + * @param manager The NavigationManager instance. + * @zh 实例化一个 NavMesh 组件。 + * @param config NavMesh 的 Recast 配置。 + * @param bound NavMesh 的边界。 + * @param manager NavigationManager 实例。 + */ + constructor(config: RecastConfig, min: Vector3, max: Vector3, manager: NavigationManager); + /** + * create agent + * @param agent + */ + private _createAgents; + /** + * @en Add an agent to the NavMesh. + * @param agent The NavAgent to be added. + * @zh 向 NavMesh 添加一个代理。 + * @param agent 要添加的 NavAgent。 + */ + addAgent(agent: NavAgent): void; + /** + * @en Remove an agent from the NavMesh. + * @param agent The NavAgent to be removed. + * @zh 从 NavMesh 中移除一个代理。 + * @param agent 要移除的 NavAgent。 + */ + removeAgent(agent: NavAgent): void; + /** + * @en Perform a raycast on the NavMesh. + * @param ray The ray to cast. + * @param outPos The output vector to store the hit position. + * @zh 在 NavMesh 上执行射线投射。 + * @param ray 要投射的射线。 + * @param outPos 用于存储命中位置的输出向量。 + */ + raycastNavMesh(ray: Ray, outPos: Vector3): boolean; + /** + * @en Get the flag of the polygon at the specified position. + * @param pos World coordinates. + * @param fiter Optional filter for the query. + * @returns The flag of the polygon. + * @zh 获取指定位置多边形的标志。 + * @param pos 世界坐标。 + * @param fiter 可选的查询过滤器。 + * @returns 多边形的标志。 + */ + getPolyFlags(pos: Vector3, fiter?: any): number; + /** + * @en Get the area flag of the polygon at the specified position. + * @param pos World coordinates. + * @param fiter Optional filter for the query. + * @returns The area flag of the polygon. + * @zh 获取指定位置多边形的区域标志。 + * @param pos 世界坐标。 + * @param fiter 可选的查询过滤器。 + * @returns 多边形的区域标志。 + */ + getPolyArea(pos: Vector3, fiter?: any): number; + /** + * @en Find the nearest polygon to the specified position. + * @param pos World coordinates. + * @param fiter Optional filter for the query. + * @returns Information about the nearest polygon. + * @zh 查找指定位置最近的多边形。 + * @param pos 世界坐标。 + * @param fiter 可选的查询过滤器。 + * @returns 最近多边形的信息。 + */ + findNearestPoly(pos: Vector3, fiter?: any): any; + /** + * @en Find a follow path for the specified agent. + * @param agent The navigation agent. + * @param fllowPaths Array to store the resulting path data. + * @returns Whether the path was successfully found. + * @zh 为指定的代理查找跟随路径。 + * @param agent 导航代理。 + * @param fllowPaths 用于存储结果路径数据的数组。 + * @returns 是否成功找到路径。 + */ + findFllowPath(agent: NavAgent, fllowPaths: NavigationPathData[]): boolean; + /** + * @en Find the distance to the nearest wall for the specified agent. + * @param agent The navigation agent. + * @returns An object containing the distance, position, and normal of the nearest wall, or null if not found. + * @zh 查找指定代理到最近墙壁的距离。 + * @param agent 导航代理。 + * @returns 包含最近墙壁的距离、位置和法线的对象,如果未找到则返回 null。 + */ + findDistanceToWall(agent: NavAgent): { + dist: number; + pos: Array; + normal: Array; + }; + /** + * @en Request a move target for the specified agent. + * @param agent The navigation agent. + * @param destination The target destination. + * @returns Whether the move target request was successful. + * @zh 为指定的代理请求移动目标。 + * @param agent 导航代理。 + * @param destination 目标位置。 + * @returns 移动目标请求是否成功。 + */ + requestMoveTarget(agent: NavAgent, destination: Vector3): boolean; + /** + * @en Build and get the debug mesh for the NavMesh. + * @returns The created debug mesh. + * @zh 构建并获取 NavMesh 的调试网格。 + * @returns 创建的调试网格。 + */ + buildDebugMesh(): Mesh; + } + /** + * @en The NavMeshGrid class manages the grid division of the navigation mesh. + * @zh NavMeshGrid 类用于管理导航网格的网格划分。 + */ + class NavMeshGrid { + /** + * @en The width of a single tile. + * @zh 单个瓦片的宽度。 + */ + get tileWidth(): number; + /** + * @ignore + * @en Instance an NavMeshGrid component. + * @param config The configuration for the navigation mesh. + * @param bound The bounding box of the navigation mesh. + * @zh 实例化一个NavMeshGrid组件。 + * @param config 导航网格的配置。 + * @param bound 导航网格的边界框。 + */ + constructor(config: RecastConfig, min: Vector3, max: Vector3); + /** + * update bound + */ + private _updateBound; + /** + * @en Update the configuration and bounding box based on the given tile data. + * @param tile The navigation tile data. + * @zh 根据给定的瓦片数据更新配置和边界框。 + * @param tile 导航瓦片数据。 + */ + refeachConfig(tile: NavTileData): void; + /** + * @en Get the tile indices that intersect with the given bounding box defined by minimum and maximum coordinates. + * @param min The minimum coordinates of the bounding box. + * @param max The maximum coordinates of the bounding box. + * @param isbord Whether to include a border around the bounding box. + * @returns An array of tile indices. + * @zh 获取与由最小和最大坐标定义的给定边界框相交的瓦片索引。 + * @param min 边界框的最小坐标。 + * @param max 边界框的最大坐标。 + * @param isbord 是否在边界框周围包含边界。 + * @returns 瓦片索引数组。 + */ + getBoundTileIndex(min: Vector3, max: Vector3, isbord?: boolean): number[]; + /** + * @en The bounding box of the navigation mesh. + * @zh 导航网格的边界框。 + */ + get boundMin(): Vector3; + /** + * @en The bounding box of the navigation mesh. + * @zh 导航网格的边界框。 + */ + get boundMax(): Vector3; + /** + * @en The configuration of the navigation mesh. + * @zh 导航网格的配置。 + */ + get config(): RecastConfig; + /** + * @en Get the tile index based on world position. + * @param x The x-coordinate in world space. + * @param z The z-coordinate in world space. + * @returns The tile index. + * @zh 根据世界坐标获取瓦片索引。 + * @param x 世界坐标 x。 + * @param z 世界坐标 z。 + * @returns 瓦片索引。 + */ + getTileIndexByPos(x: number, z: number): number; + /** + * @en Get the tile index based on tile coordinates. + * @param xIndex The x-index of the tile. + * @param zIndex The z-index of the tile. + * @returns The tile index, or -1 if out of bounds. + * @zh 根据瓦片坐标获取瓦片索引。 + * @param xIndex 瓦片的 x 索引。 + * @param zIndex 瓦片的 z 索引。 + * @returns 瓦片索引,如果超出边界则返回 -1。 + */ + getTileIndex(xIndex: number, zIndex: number): number; + /** + * @en Get the maximum number of tiles. + * @zh 获取最大瓦片数量。 + */ + getMaxtiles(): number; + /** + * @en Get the maximum number of tiles along the x-axis. + * @zh 获取 x 轴方向的最大瓦片数量。 + */ + get maxXTileCount(): number; + /** + * @en Get the maximum number of tiles along the z-axis. + * @zh 获取 z 轴方向的最大瓦片数量。 + */ + get maxZTileCount(): number; + /** + * @en Get the maximum number of cells along the x-axis. + * @zh 获取 x 轴方向的最大单元格数量。 + */ + get maxXCellCount(): number; + /** + * @en Get the maximum number of cells along the z-axis. + * @zh 获取 z 轴方向的最大单元格数量。 + */ + get maxZCellCount(): number; + } + /** + * @en The class NavTileCache is used to cache and manage the tile data of the navigation mesh. + * @zh 类 NavTileCache 用于缓存和管理导航网格的瓦片数据。 + */ + class NavTileCache { + /** + * @en The x offset of the tile. + * @zh 瓦片的x偏移。 + */ + x: number; + /** + * @en The y offset of the tile. + * @zh 瓦片的y偏移。 + */ + y: number; + /** + * @en Create a new instance of NavTileCache. + * @zh 创建 NavTileCache 类的新实例。 + */ + constructor(); + /** + * @en Triangle vertices + * @zh 三角形顶点 + */ + set triVertex(data: Float32Array); + get triVertex(): Float32Array; + /** + * @en Triangle indices + * @zh 三角形索引 + */ + set triIndex(data: Uint32Array); + get triIndex(): Uint32Array; + /** + * @en Triangle flags + * @zh 三角形标记 + */ + set triFlag(data: Uint8Array); + get triFlag(): Uint8Array; + /** + * @en Bounding box + * @zh 包围盒大小 + */ + get boundMin(): Vector3; + get boundMax(): Vector3; + /** + * @en Bound data + * @zh 绑定数据 + */ + get bindData(): any; + /** + * @en Destroy the NavTileCache + * @zh 销毁 NavTileCache + */ + destroy(): void; + } + /** + * @en NavTileData class for parsing and storing navigation mesh data + * @zh NavTileData 类用于解析和存储导航网格数据 + */ + class NavTileData { + /** + * @en Create a new instance of NavTileData. + * @param res TextResource containing navigation data + * @zh 创建 NavTileData 类的新实例。 + * @param res 包含导航数据的 TextResource + */ + constructor(res: TextResource); + /** + * @en Get the dirty flag + * @zh 获取脏标记 + */ + get dirtyFlag(): number; + /** + * @en Get NavTileCache data by index + * @param index The index of the NavTileCache + * @zh 通过索引获取 NavTileCache 数据 + * @param index NavTileCache 的索引 + */ + getNavData(index: number): NavTileCache; + /** + * @en Get the number of NavTileCache objects + * @zh 获取 NavTileCache 对象的数量 + */ + get length(): number; + } + /** + * @en Create Recast navMesh Config + * @zh 创建 Recast 导航网格配置 + */ + class RecastConfig implements IClone { + /** + * @en Agent name + * @zh 代理名称 + */ + agentName: string; + /** + * @en Cell height in meters + * @zh 像素格子高度,单位:米 + */ + cellHeight: number; + /** + * @en Maximum slope for the path in degrees + * @zh 路径最大坡度,单位:角度 + */ + agentMaxSlope: number; + /** + * @en Maximum height of the agent in meters + * @zh 代理最大高度跨度,单位:米 + */ + agentHeight: number; + /** + * @en Maximum climb height for the agent in meters + * @zh 代理最大攀爬高度,单位:米 + */ + agentMaxClimb: number; + /** + * @en Agent radius in meters + * @zh 代理半径,单位:米 + */ + agentRadius: number; + /** + * @en Number of cells per tile + * @zh 每个瓦片的格子数量 + */ + tileSize: number; + /** + * @en Cell size in meters + * @zh 像素格子尺寸,单位:米 + */ + set cellSize(value: number); + get cellSize(): number; + /** @ignore */ + constructor(); + /** + * @en Clone the RecastConfig object + * @returns A new RecastConfig object with the same properties + * @zh 克隆 RecastConfig 对象 + * @returns 具有相同属性的新 RecastConfig 对象 + */ + clone(): RecastConfig; + /** + * @en Clone properties to another object + * @param destObject The target object to clone to + * @zh 将属性克隆到另一个对象 + * @param destObject 要克隆到的目标对象 + */ + cloneTo(destObject: RecastConfig): void; + } + /** + * 自动图集管理类 + * @private + */ + class AtlasInfoManager { + static _fileLoadDic: Record; + static enable(infoFile: string, callback?: Handler | null): void; + static addAtlases(data: Record): void; + static addAtlas(atlasUrl: string, prefix: string, frames: Array): void; + static getFileLoadPath(file: string): { + url: string; + baseUrl?: string; + }; + } + type ProgressCallback = (progress: number) => void; + interface IBatchProgress { + readonly itemCount: number; + createCallback(weight?: number): ProgressCallback; + update(index: number, progress: number): void; + } + /** + * @en Represents a batch progress tracker that manages multiple progress items. + * @zh 表示一个批量进度跟踪器,用于管理多个进度项。 + */ + class BatchProgress implements IBatchProgress { + private _callback; + private _items; + private _weights; + private _progress; + /** + * @en Creates a new BatchProgress instance. + * @param callback The callback function to be called when progress updates. + * @zh 创建一个新的 BatchProgress 实例。 + * @param callback 进度更新时要调用的回调函数。 + */ + constructor(callback: ProgressCallback); + /** + * @en The number of progress items. + * @zh 进度项的数量。 + */ + get itemCount(): number; + /** + * @en Resets the progress tracker, clearing all items and weights. + * @zh 重置进度跟踪器,清除所有项目和权重。 + */ + reset(): void; + /** + * @en Creates a callback function for a new progress item. + * @param weight The weight of the progress item. Defaults to null. + * @returns A callback function for updating the progress of this item. + * @zh 为新的进度项创建一个回调函数。 + * @param weight 进度项的权重。默认为null。 + * @returns 用于更新此项目进度的回调函数。 + */ + createCallback(weight?: number): ProgressCallback; + /** + * @en Updates the progress of a specific item and recalculates the overall progress. + * @param index The index of the item to update. Use -1 to update overall progress directly. + * @param value The new progress value (0-1). + * @zh 更新特定项目的进度并重新计算总体进度。 + * @param index 要更新的项目索引。使用-1直接更新总体进度。 + * @param value 新的进度值(0-1)。 + */ + update(index: number, value: number): void; + } + /** + * @en Downloader class responsible for handling various types of resource downloads. + * @zh Downloader类负责处理各种类型的资源下载。 + */ + class Downloader { + /** + * @en Downloads common resources using HTTP request. + * @param owner The owner of the download request. + * @param url The URL of the resource to download. + * @param originalUrl The original URL of the resource. + * @param contentType The content type of the resource. + * @param onProgress Callback function for download progress. + * @param onComplete Callback function when download is complete. + * @zh 使用HTTP请求下载通用资源。 + * @param owner 下载请求的所有者。 + * @param url 要下载的资源的URL。 + * @param originalUrl 资源的原始URL。 + * @param contentType 资源的内容类型。 + * @param onProgress 下载进度的回调函数。 + * @param onComplete 下载完成时的回调函数。 + */ + common(owner: any, url: string, originalUrl: string, contentType: string, onProgress: (progress: number) => void, onComplete: (data: any, error?: string) => void): void; + /** + * @en Downloads an image resource. + * @param owner The owner of the download request. + * @param url The URL of the image to download. + * @param originalUrl The original URL of the image. + * @param onProgress Callback function for download progress. + * @param onComplete Callback function when download is complete. + * @zh 下载图像资源。 + * @param owner 下载请求的所有者。 + * @param url 要下载的图像的URL。 + * @param originalUrl 图像的原始URL。 + * @param onProgress 下载进度的回调函数。 + * @param onComplete 下载完成时的回调函数。 + */ + image(owner: any, url: string, originalUrl: string, onProgress: (progress: number) => void, onComplete: (data: any, error?: string) => void): void; + /** + * @en Downloads an image from a Blob. + * @param owner The owner of the download request. + * @param blob The ArrayBuffer containing the image data. + * @param originalUrl The original URL of the image. + * @param onProgress Callback function for download progress. + * @param onComplete Callback function when download is complete. + * @zh 从Blob下载图像。 + * @param owner 下载请求的所有者。 + * @param blob 包含图像数据的ArrayBuffer。 + * @param originalUrl 图像的原始URL。 + * @param onProgress 下载进度的回调函数。 + * @param onComplete 下载完成时的回调函数。 + */ + imageWithBlob(owner: any, blob: ArrayBuffer, originalUrl: string, onProgress: (progress: number) => void, onComplete: (data: any, error?: string) => void): void; + /** + * @en Downloads an image using a worker. + * @param owner The owner of the download request. + * @param url The URL of the image to download. + * @param originalUrl The original URL of the image. + * @param onProgress Callback function for download progress. + * @param onComplete Callback function when download is complete. + * @zh 使用worker下载图像。 + * @param owner 下载请求的所有者。 + * @param url 要下载的图像的URL。 + * @param originalUrl 图像的原始URL。 + * @param onProgress 下载进度的回调函数。 + * @param onComplete 下载完成时的回调函数。 + */ + imageWithWorker(owner: any, url: string, originalUrl: string, onProgress: (progress: number) => void, onComplete: (data: any, error?: string) => void): void; + /** + * @en Downloads an audio resource. + * @param owner The owner of the download request. + * @param url The URL of the audio to download. + * @param originalUrl The original URL of the audio. + * @param onProgress Callback function for download progress. + * @param onComplete Callback function when download is complete. + * @zh 下载音频资源。 + * @param owner 下载请求的所有者。 + * @param url 要下载的音频的URL。 + * @param originalUrl 音频的原始URL。 + * @param onProgress 下载进度的回调函数。 + * @param onComplete 下载完成时的回调函数。 + */ + audio(owner: any, url: string, originalUrl: string, onProgress: (progress: number) => void, onComplete: (data: any, error?: string) => void): void; + /** + * @en Pool of HttpRequest instances. + * @zh HttpRequest实例池。 + */ + httpRequestPool: Array; + protected getRequestInst(): HttpRequest; + protected returnRequestInst(inst: HttpRequest): void; + } + /** + * @en The `HttpRequest` class encapsulates the HTML `XMLHttpRequest` object to provide full access to the HTTP protocol, including the ability to make POST and HEAD requests as well as regular GET requests. `HttpRequest` only provides asynchronous responses from web servers and can return content in either text or binary form. + * - Note: It is recommended to use a new `HttpRequest` object for each request, as each call to the send method of this object will clear previously set data and reset the HTTP request status. This can cause previously unreturned responses to be reset, resulting in the loss of response results from previous requests. + * - EventType Event.PROGRESS: Dispatch when the request progress changes. + * - EventType Event.COMPLETE: Dispatch after the request ends. + * - EventType Event.ERROR: Dispatch when the request fails. + * @zh `HttpRequest` 类通过封装 HTML `XMLHttpRequest` 对象提供了对 HTTP 协议的完全访问,包括发送 POST 和 HEAD 请求以及普通的 GET 请求的能力。`HttpRequest` 只以异步形式返回 Web 服务器的响应,并且能够以文本或二进制形式返回内容。 + * - 注意:建议每次请求都使用新的 `HttpRequest` 对象,因为每次调用该对象的 send 方法时,都会清空之前设置的数据,并重置 HTTP 请求的状态,这会导致之前还未返回响应的请求被重置,从而得不到之前请求的响应结果。 + * - EventType Event.PROGRESS: 请求进度改变时调度。 + * - EventType Event.COMPLETE: 请求结束后调度。 + * - EventType Event.ERROR: 请求出错时调度。 + */ + class HttpRequest extends EventDispatcher { + protected _http: XMLHttpRequest; + private static _urlEncode; + protected _responseType: string; + protected _data: any; + protected _url: string; + /** + * @en Send an HTTP request. + * @param url The URL to request. Most browsers implement a same-origin security policy and require that the URL has the same hostname and port as the script. + * @param data (default = null) The data to be sent. + * @param method (default = "get") The HTTP method used for the request. Values include "get", "post", "head". + * @param responseType (default = "text") The response type from the web server, can be set to "text", "json", "xml", "arraybuffer". + * @param headers (default = null) The header information for the HTTP request. Parameters are in the form of a key-value array: key is the name of the header, should not include whitespace, colon, or newline; value is the value of the header, should not include newline. For example ["Content-Type", "application/json"]. + * @zh 发送 HTTP 请求。 + * @param url 请求的地址。大多数浏览器实施了同源安全策略,要求此 URL 与包含脚本的文本具有相同的主机名和端口。 + * @param data (默认值 = null) 发送的数据。 + * @param method (默认值 = "get") 用于请求的 HTTP 方法。值包括 "get"、"post"、"head"。 + * @param responseType (默认值 = "text") Web 服务器的响应类型,可设置为 "text"、"json"、"xml"、"arraybuffer"。 + * @param headers (默认值 = null) HTTP 请求的头部信息。参数形如 key-value 数组:key 是头部的名称,不应包括空白、冒号或换行;value 是头部的值,不应包括换行。例如 ["Content-Type", "application/json"]。 + */ + send(url: string, data?: any, method?: "get" | "post" | "head", responseType?: "text" | "json" | "xml" | "arraybuffer", headers?: string[]): void; + /** + * @en The listening and processing function for requesting progress. + * @param e The event object. + * @zh 请求进度的侦听处理函数。 + * @param e 事件对象。 + */ + protected _onProgress(e: any): void; + /** + * @en The listening and processing function for request interruption. + * @param e The event object. + * @zh 请求中断的侦听处理函数。 + * @param e 事件对象。 + */ + protected _onAbort(e: any): void; + /** + * @en The listening and processing function for request errors. + * @param e The event object. + * @zh 请求出错侦的听处理函数。 + * @param e 事件对象。 + */ + protected _onError(e: any): void; + /** + * @en The listening and processing function for request completion. + * @param e The event object. + * @zh 请求消息返回的侦听处理函数。 + * @param e 事件对象。 + */ + protected _onLoad(e: any): void; + /** + * @en Request error handling function. + * @param message The error message. + * @zh 请求错误的处理函数。 + * @param message 错误信息。 + */ + protected error(message: string): void; + /** + * @en The processing function for successfully completing the request. + * @zh 请求成功完成的处理函数。 + */ + protected complete(): void; + /** + * @en Clear the current request. + * @zh 清除当前请求。 + */ + protected clear(): void; + /** + * @en The requested URL. + * @zh 请求的地址。 + */ + get url(): string; + /** + * @en The data. + * @zh 数据。 + */ + get data(): any; + /** + * @en The reference to the native XMLHttpRequest object encapsulated by this object. + * @zh 本对象所封装的原生 XMLHttpRequest 引用。 + */ + get http(): any; + /** + * @en Reset the HttpRequest object, clearing all event listeners and data. + * @zh 重置 HttpRequest 对象,清除所有事件监听器和数据。 + */ + reset(): void; + } + interface ILoadTask { + readonly type: string; + readonly url: string; + readonly uuid: string; + readonly ext: string; + readonly loader: Loader; + readonly obsoluteInst: Resource; + readonly options: Readonly; + readonly progress: IBatchProgress; + } + interface IResourceLoader { + load(task: ILoadTask): Promise; + postLoad?(task: ILoadTask, content: any): Promise; + } + interface ILoadOptions { + type?: string; + priority?: number; + group?: string; + cache?: boolean; + ignoreCache?: boolean; + noRetry?: boolean; + silent?: boolean; + useWorkerLoader?: boolean; + constructParams?: TextureConstructParams; + propertyParams?: TexturePropertyParams; + blob?: ArrayBuffer; + initiator?: ILoadTask; + [key: string]: any; + } + interface ILoadURL extends ILoadOptions { + url: string; + } + interface ContentTypeMap { + "text": string; + "json": any; + "xml": XML; + "arraybuffer": ArrayBuffer; + "image": HTMLImageElement | ImageBitmap; + "sound": HTMLAudioElement; + } + type TypeMapEntry = { + typeId: number; + loaderType: new () => IResourceLoader; + hotReloadable?: boolean; + }; + interface URLInfo { + ext: string; + typeId: number; + main: boolean; + loaderType: new () => IResourceLoader; + } + /** + * @en The `Loader` class can be used to load resources such as text, JSON, XML, binary, images, etc. + * @zh `Loader` 类可用来加载文本、JSON、XML、二进制、图像等资源。 + */ + class Loader extends EventDispatcher { + /** + * @en Text type, returns a TextResource object containing a string after loading is complete. + * @zh 文本类型,加载完成后返回包含 string 的 TextResource 对象。 + */ + static TEXT: string; + /** + * @en JSON type, returns a TextResource object containing JSON data after loading is complete. + * @zh JSON 类型,加载完成后返回包含 json 数据的 TextResource 对象。 + */ + static JSON: string; + /** + * @en XML type, returns a TextResource object containing domXML after loading is complete. + * @zh XML 类型,加载完成后返回包含 domXML 的 TextResource 对象。 + */ + static XML: string; + /** + * @en Binary type, returns a TextResource object containing arraybuffer after loading is complete. + * @zh 二进制类型,加载完成后返回包含 arraybuffer 的 TextResource 对象。 + */ + static BUFFER: string; + /** + * @en Texture type, returns a Texture after loading is complete. + * @zh 纹理类型,加载完成后返回 Texture。 + */ + static IMAGE: string; + /** + * @en Sound type, returns a Sound after loading is complete. + * @zh 声音类型,加载完成后返回 Sound。 + */ + static SOUND: string; + /** + * @en Video type, returns a VideoTexture after loading is complete. + * @zh 视频类型,加载完成后返回 VideoTexture。 + */ + static VIDEO: string; + /** + * @en Atlas type, returns atlas JSON information (and creates small Textures within the atlas) after loading is complete. + * @zh 图集类型,加载完成后返回图集 json 信息(并创建图集内小图 Texture)。 + */ + static ATLAS: string; + /** + * @en Bitmap font type, returns a BitmapFont after loading is complete. It will be automatically registered as a bitmap font based on the file name. + * @zh 位图字体类型,加载完成后返回 BitmapFont,加载后,会根据文件名自动注册为位图字体。 + */ + static FONT: string; + /** + * @en TTF font type, returns an object after loading is complete. + * @zh TTF 字体类型,加载完成后返回一个对象。 + */ + static TTF: string; + /** + * @en Hierarchy resource. + * @zh Hierarchy 资源。 + */ + static HIERARCHY: string; + /** + * @en Mesh resource. + * @zh Mesh 资源。 + */ + static MESH: string; + /** + * @en Material resource. + * @zh Material 资源。 + */ + static MATERIAL: string; + /** + * @en Texture2D resource. This is for compatibility, it should actually be BaseTexture. + * @zh Texture2D 资源。这里是为了兼容,实际应该是 BaseTexture。 + */ + static TEXTURE2D: string; + /** + * @en TextureCube resource. For compatibility, now TEXTURE2D type can load Texture or TextureCube. + * @zh TextureCube 资源。兼容处理,现在 TEXTURE2D 类型可以载入 Texture 或者 TextureCube。 + */ + static TEXTURECUBE: string; + /** + * @en TEXTURE2DARRAY resource. + * @zh TEXTURE2DARRAY 资源。 + */ + static TEXTURE2DARRAY: string; + /** + * @en AnimationClip resource. + * @zh AnimationClip 资源。 + */ + static ANIMATIONCLIP: string; + /** + * @en Terrain height data resource. + * @zh Terrain 高度数据资源。 + */ + static TERRAINHEIGHTDATA: string; + /** + * @en Terrain resource. + * @zh Terrain 资源。 + */ + static TERRAINRES: string; + /** + * @en Spine resource. + * @zh Spine 资源。 + */ + static SPINE: string; + /** + * @en Resource download + parse time. + * @zh 资源下载 + 解析时间。 + */ + static LoaderStat_LoadResourceTime: number; + /** + * @en Number of resource downloads. + * @zh 资源下载次数。 + */ + static LoaderStat_LoaderResourceCount: number; + /** + * @en Number of network file requests. + * @zh 网络文件请求次数。 + */ + static LoaderStat_LoadRequestCount: number; + /** + * @en Network download time. + * @zh 网络下载时间。 + */ + static LoaderStat_LoadRequestTime: number; + /** + * @en Number of retry attempts after loading fails, default is 1. + * @zh 加载出错后的重试次数,默认重试一次。 + */ + retryNum: number; + /** + * @en Delay time before retrying after an error, default is to retry immediately. + * @zh 延迟时间多久再进行错误重试,默认立即重试。 + */ + retryDelay: number; + /** + * @en Maximum number of download threads, default is 5. + * @zh 最大下载线程,默认为 5 个。 + */ + maxLoader: number; + /** + * @en List of resource loaders. + * @zh 资源加载器列表。 + */ + static readonly extMap: { + [ext: string]: Array; + }; + /** + * @en Resource type mapping table. + * @zh 资源类型对应表。 + */ + static readonly typeMap: { + [type: string]: TypeMapEntry; + }; + /** + * @en Hot overload identification. + * @zh 热重载标识。 + */ + static readonly hotReloadableFlags: Record; + /** + * @en If an extension corresponds to multiple loading types, you can define a mapping here, which can be used to obtain the correct loading type through the resource type recorded in the file during deserialization. + * @zh 如果一个扩展名对应多种加载类型时,那么在可以在这里定义一个映射,用于在反序列化时,通过文件中记录的资源类型获得正确的加载类型。 + */ + static readonly assetTypeToLoadType: Record; + /** + * @en The downloader used to download resources. + * @zh 下载器,用来下载资源。 + */ + static downloader: Downloader; + /** + * @en Register a resource loader. + * @param exts Extensions + * @param cls Loader class + * @param type Type identifier. If this kind of resource needs to support identification without extension, or if one extension corresponds to multiple resource types, specifying the type parameter is the best practice. + * @param hotReloadable Whether to support hot reload + * @zh 注册一种资源装载器。 + * @param exts 扩展名 + * @param cls 加载器类 + * @param type 类型标识。如果这种资源需要支持识别没有扩展名的情况,或者一个扩展名对应了多种资源类型的情况,那么指定 type 参数是个最优实践。 + * @param hotReloadable 是否支持热重载 + */ + static registerLoader(exts: string[], cls: new () => IResourceLoader, type?: string, hotReloadable?: boolean): void; + /** + * @en Resource group mapping table. + * @zh 资源分组对应表。 + */ + static groupMap: { + [name: string]: Set; + }; + /** + * @en Pool of loaded resources. + * @zh 已加载的资源池。 + */ + static loadedMap: { + [url: string]: Array; + }; + /** + * @en Preloaded data files. If a url has a record here, the data here will be used directly when requested, abandoning network loading. + * @zh 预加载的数据文件。如果一个 url 在这里有记录,则请求时直接使用这里的数据,放弃网络加载。 + */ + static preLoadedMap: { + [url: string]: any; + }; + private _loadings; + private _queue; + private _downloadings; + private _tempTime; + /** @ignore */ + constructor(); + /** + * @en Indicates whether there are any loading tasks in progress. + * @zh 是否有任何的加载任务在进行。 + */ + get loading(): boolean; + /** + * @en Loads resources. + * @param url The URL or array of URLs of the resource(s) to load. + * @param type The type of resource. For example: Loader.IMAGE. + * @param onProgress The progress callback function. + * @returns A Promise that resolves with the loaded resource(s). If url is a single resource, it returns the loaded resource or null if failed. If url is an array, it returns an array of loaded resources or null for each failed load. + * @zh 加载资源。 + * @param url 要加载的资源地址或资源地址数组。 + * @param type 资源类型。比如:Loader.IMAGE。 + * @param onProgress 进度回调函数。 + * @returns 返回一个 Promise。根据 url 类型不同分为两种情况:1. url 为字符串或 ILoadURL 类型时,如果加载成功,则返回加载完成的资源,否则为 null;2. url 为数组类型时,返回一个数组,数组每个元素为加载完成的资源或 null。 + */ + load(url: string | ILoadURL | (string | Readonly)[], type?: string, onProgress?: ProgressCallback): Promise; + /** + * @en Loads resources with options. + * @param url The URL or array of URLs of the resource(s) to load. + * @param options The loading options. + * @param onProgress The progress callback function. + * @returns A Promise that resolves with the loaded resource(s). If url is a single resource, it returns the loaded resource or null if failed. If url is an array, it returns an array of loaded resources or null for each failed load. + * @zh 使用选项加载资源。 + * @param url 要加载的资源地址或资源地址数组。 + * @param options 加载选项。 + * @param onProgress 进度回调函数。 + * @returns 返回一个 Promise。根据 url 类型不同分为两种情况:1. url 为字符串或 ILoadURL 类型时,如果加载成功,则返回加载完成的资源,否则为 null;2. url 为数组类型时,返回一个数组,数组每个元素为加载完成的资源或 null。 + */ + load(url: string | ILoadURL | (string | Readonly)[], options?: Readonly, onProgress?: ProgressCallback): Promise; + /** + * @en Loads resources (compatible with engine 2.0 loading interface). + * @param url The URL or array of URLs of the resource(s) to load. Can be a simple array ["a.png", "b.png"] or a complex array [{url:"a.png",type:Loader.IMAGE,size:100,priority:1},{url:"b.json",type:Loader.JSON,size:50,priority:1}]. + * @param complete The completion callback. Returns the loaded resource if url is a string, or an array of loaded resources (or null for failed loads) if url is an array. + * @param progress The progress callback. The callback parameter is the current resource loading progress (0-1). + * @param type The resource type. For example: Loader.IMAGE. + * @param priority The loading priority. Higher numbers indicate higher priority. Default is 0. + * @param cache Whether to cache the resource. Default is true. + * @param group The group name for resource management. + * @param ignoreCache Whether to ignore the cache. Default is false. + * @param useWorkerLoader Whether to use worker loading (only for IMAGE and ATLAS types, and when browser supports it). Default is false. + * @returns A Promise object. + * @zh 加载资源(兼容 2.0 引擎的加载接口)。 + * @param url 要加载的单个资源地址或资源信息数组。可以是简单数组 ["a.png", "b.png"] 或复杂数组 [{url:"a.png",type:Loader.IMAGE,size:100,priority:1},{url:"b.json",type:Loader.JSON,size:50,priority:1}]。 + * @param complete 加载完成回调。如果 url 是字符串,返回加载完成的资源;如果 url 是数组,返回加载完成的资源数组(加载失败的项为 null)。 + * @param progress 加载进度回调。回调参数为当前资源的加载进度(0-1)。 + * @param type 资源类型。比如:Loader.IMAGE。 + * @param priority 加载优先级,数字越大优先级越高。默认为 0。 + * @param cache 是否缓存资源。默认为 true。 + * @param group 分组名称,用于资源管理。 + * @param ignoreCache 是否忽略缓存。默认为 false。 + * @param useWorkerLoader 是否使用 worker 加载(仅针对 IMAGE 和 ATLAS 类型,且浏览器支持时生效)。默认为 false。 + * @returns Promise 对象。 + */ + load(url: string | ILoadURL | (string | Readonly)[], complete?: Handler, progress?: Handler, type?: string, priority?: number, cache?: boolean, group?: string, ignoreCache?: boolean, useWorkerLoader?: boolean): Promise; + /** + * @en Download from the specified URL. This is a low-level method for downloading resources. Unlike the load method, it doesn't parse the returned data or cache the downloaded content. Returns the downloaded data on success, null on failure. + * @param url The URL to download from. + * @param contentType The expected content type of the resource. + * @param onProgress Optional callback for progress updates. + * @param options Optional loading options. + * @returns A promise that resolves with the downloaded content. If the download fails, the promise resolves with null. + * @zh 从指定URL下载。这是较为底层的下载资源的方法,它和load方法不同,不对返回的数据进行解析,也不会缓存下载的内容。成功则返回下载的数据,失败返回null。 + * @param url 要下载的URL。 + * @param contentType 预期的资源内容类型。 + * @param onProgress 可选的进度更新回调。 + * @param options 可选的加载选项。 + * @returns 解析为下载内容的Promise,加载失败则返回null + */ + fetch(url: string, contentType: K, onProgress?: ProgressCallback, options?: Readonly): Promise; + private queueToDownload; + private download; + private completeItem; + /** + * @en Get URL information based on the provided URL and optional type. + * @param url The URL to analyze. + * @param type Optional type specification. + * @returns URLInfo object containing extension, main flag, typeId, and loaderType. + * @zh 根据提供的URL和可选类型获取URL信息。 + * @param url 要分析的URL。 + * @param type 可选的类型规范。 + * @returns 包含扩展名、主要标志、类型ID和加载器类型的URLInfo对象。 + */ + static getURLInfo(url: string, type?: string): URLInfo; + /** + * @en Log a warning about a failed resource load, optionally including the initiator URL. + * @param url The URL of the resource that failed to load. + * @param err Optional error object or message. + * @param initiatorUrl Optional URL of the resource that initiated the load. + * @zh 记录资源加载失败的警告,可选择包含启动器URL。 + * @param url 加载失败的资源URL。 + * @param err 可选的错误对象或消息。 + * @param initiatorUrl 可选的启动加载的资源URL。 + */ + static warnFailed(url: string, err?: any, initiatorUrl?: string): void; + /** + * @en Log a warning message, optionally including an error object. + * @param msg The warning message to log. + * @param err Optional error object to include in the warning. + * @zh 记录警告消息,可选择包含错误对象。 + * @param msg 要记录的警告消息。 + * @param err 可选的要包含在警告中的错误对象。 + */ + static warn(msg: string, err?: any): void; + /** + * @en Retrieve resources from the specified resource address. + * @param url The resource address. + * @return Returns the resource. + * @zh 获取指定资源地址的资源。 + * @param url 资源地址。 + * @return 返回资源。 + */ + static getRes(url: string, type?: string): any; + /** + * @en Get a Texture2D resource by URL. + * @param url The URL of the Texture2D resource. + * @returns The Texture2D resource. + * @zh 通过 URL 获取 Texture2D 资源。 + * @param url Texture2D 资源的 URL。 + * @returns Texture2D 资源。 + */ + static getTexture2D(url: string): Texture2D; + /** + * @en Get a BaseTexture resource by URL. + * @param url The URL of the BaseTexture resource. + * @returns The BaseTexture resource. + * @zh 通过 URL 获取 BaseTexture 资源。 + * @param url BaseTexture 资源的 URL。 + * @returns BaseTexture 资源。 + */ + static getBaseTexture(url: string): T; + /** + * @en Get the atlas resource by URL. + * @param url The URL of the atlas. + * @returns Return the set of addresses. + * @zh 获取指定资源地址的图集资源。 + * @param url 图集地址。 + * @returns 返回地址集合。 + */ + static getAtlas(url: string): AtlasResource; + /** + * @en Get a resource by URL and type. + * @param url The URL of the resource. + * @param type The type of the resource. + * @returns The resource. + * @zh 通过 URL 和类型获取资源。 + * @param url 资源的 URL。 + * @param type 资源的类型。 + * @returns 资源。 + */ + getRes(url: string, type?: string): any; + /** + * @en Create nodes from a prefab resource. + * @param url The URL of the prefab resource. + * @returns The created node. + * @zh 从预制资源创建节点。 + * @param url 预制资源的 URL。 + * @returns 创建的节点。 + */ + static createNodes(url: string): T; + /** + * @en Cache a resource. + * @param url The URL of the resource. + * @param data The content to be cached. + * @param type The type of the resource. + * @zh 缓存资源。 + * @param url 资源地址。 + * @param data 要缓存的内容。 + * @param type 资源类型。 + */ + static cacheRes(url: string, data: any, type?: string): void; + /** + * @en Cache a resource. + * @param url The URL of the resource. + * @param data The content to be cached. + * @param type The type of the resource. + * @zh 缓存资源。 + * @param url 资源地址。 + * @param data 要缓存的内容。 + * @param type 资源类型。 + */ + cacheRes(url: string, data: any, type?: string): void; + /** + * @en Clear the cached resource at the specified URL. + * @param url The URL of the resource. + * @param checkObj If provided, only clear the resource if it matches this object. + * @zh 清理指定资源地址的缓存。 + * @param url 资源地址。 + * @param checkObj 如果提供,只有缓存中的对象匹配这个才清除,否则不清除。 + */ + static clearRes(url: string, checkObj?: any): void; + /** + * @en Clear the cached resource at the specified URL. + * @param url The URL of the resource. + * @param checkObj If provided, only clear the resource if it matches this object. + * @zh 清理指定资源地址的缓存。 + * @param url 资源地址。 + * @param checkObj 如果提供,只有缓存中的对象匹配这个才清除,否则不清除。 + */ + clearRes(url: string, checkObj?: any): void; + /** + * @en Destroy the image resource used by a Texture, keeping the texture shell. If the texture's image resource is found to be missing during the next render, it will be automatically restored. Compared to clearRes, clearTextureRes only clears the image resource used in the texture without destroying the texture itself. The image resource will be automatically restored when used again. While clearRes completely destroys the texture, making it unusable, clearTextureRes ensures immediate destruction of the image resource without worrying about incorrect destruction. + * @param url The URL of the atlas or texture, e.g., "res/atlas/comp.atlas" or "hall/bg.jpg". + * @zh 销毁 Texture 使用的图片资源,保留 texture 壳。如果下次渲染时发现 texture 使用的图片资源不存在,则会自动恢复。相比 clearRes,clearTextureRes 只是清理 texture 里面使用的图片资源,并不销毁 texture,再次使用到的时候会自动恢复图片资源。而 clearRes 会彻底销毁 texture,导致不能再使用;clearTextureRes 能确保立即销毁图片资源,并且不用担心销毁错误。 + * @param url 图集地址或者 texture 地址,比如 "res/atlas/comp.atlas" 或 "hall/bg.jpg"。 + */ + clearTextureRes(url: string): void; + /** + * @en Set the resource group. + * @param url The URL of the resource. + * @param group The name of the group. + * @zh 设置资源分组。 + * @param url 资源地址。 + * @param group 分组名。 + */ + static setGroup(url: string, group: string): void; + /** + * @en Clean up resources based on grouping. + * @param group The name of the group. + * @zh 根据分组清理资源。 + * @param group 分组名 + */ + static clearResByGroup(group: string): void; + /** + * @en Clears all unfinished loading tasks. All unloaded content will stop loading. + * @zh 清理当前未完成的加载,所有未加载的内容全部停止加载。 + */ + clearUnLoaded(): void; + /** + * @en Clears unloaded content based on a collection of URLs. + * @param urls An array of resource URLs. + * @zh 根据地址集合清理掉未加载的内容。 + * @param urls 资源地址集合。 + */ + cancelLoadByUrls(urls: any[]): void; + /** + * @en Clears unloaded content based on a specific URL. + * @param url The resource URL. + * @zh 根据地址清理掉未加载的内容。 + * @param url 资源地址。 + */ + cancelLoadByUrl(url: string): void; + /** + * @en Loads a sub-package. + * @param path The path of the sub-package in mini-game. + * @param onProgress The callback for loading progress. + * @returns A Promise that resolves when the package is loaded. + * @zh 载入一个分包。 + * @param path 小游戏的分包路径。 + * @param onProgress 加载进度回调。 + * @returns 当包加载完成时解析的 Promise。 + */ + loadPackage(path: string, onProgress?: ProgressCallback): Promise; + /** + * @en Loads a sub-package. + * @param path The path of the sub-package. + * @param remoteUrl If the package is a remote package, provide the remote resource server address, e.g., "http://cdn.com/" + * @param onProgress The callback for loading progress. + * @returns A Promise that resolves when the package is loaded. + * @zh 载入一个分包。 + * @param path 分包路径。 + * @param remoteUrl 如果分包是一个远程包,那需要提供远程资源服务器的地址,例如"http://cdn.com/" + * @param onProgress 加载进度回调。 + * @returns 当包加载完成时解析的 Promise。 + */ + loadPackage(path: string, remoteUrl?: string, onProgress?: ProgressCallback): Promise; + private _loadMiniPackage; + private _loadSubFileConfig; + } + /** + * @en The `LocalStorage` class is used for data storage without time limit. + * @zh `LocalStorage` 类用于没有时间限制的数据存储。 + */ + class LocalStorage { + /** + * @en Data list. + * @zh 数据列表。 + */ + static items: any; + /** + * @en Indicates whether `LocalStorage` is supported. + * @zh 表示是否支持 `LocalStorage`。 + */ + static support: boolean; + /** + * @en Stores a key-value pair as strings. + * @param key The key name. + * @param value The value to store. + * @zh 存储指定键名和键值,字符串类型。 + * @param key 键名。 + * @param value 键值。 + */ + static setItem(key: string, value: string): void; + /** + * @en Retrieves the value for the specified key. + * @param key The key name. + * @returns The string value associated with the key. + * @zh 获取指定键名的值。 + * @param key 键名。 + * @returns 与键关联的字符串值。 + */ + static getItem(key: string): string; + /** + * @en Stores a key-value pair where the value is an Object. + * @param key The key name. + * @param value The value to store. It's an Object type and will be converted to a JSON string for storage. + * @zh 存储指定键名及其对应的 Object 类型值。 + * @param key 键名。 + * @param value 键值。是 Object 类型,会被转化为 JSON 字符串存储。 + */ + static setJSON(key: string, value: any): void; + /** + * @en Retrieves the Object value for the specified key. + * @param key The key name. + * @returns The Object value associated with the key. + * @zh 获取指定键名对应的 Object 类型值。 + * @param key 键名。 + * @returns 与键关联的 Object 类型值。 + */ + static getJSON(key: string): any; + /** + * @en Removes the item associated with the specified key. + * @param key The key name. + * @zh 删除指定键名的信息。 + * @param key 键名。 + */ + static removeItem(key: string): void; + /** + * @en Clears all locally stored information. + * @zh 清除所有本地存储的信息。 + */ + static clear(): void; + } + /** + * @en Socket encapsulates HTML5 WebSocket, allowing full-duplex real-time communication between server and client, and cross-domain communication. After establishing a connection, both server and Browser/Client Agent can actively send or receive text and binary data to each other. + * - To use Socket class methods, first create a Socket object using the constructor new Socket. Socket transmits and receives data asynchronously. + * - Event.OPEN event: dispatched after successful connection establishment. + * - Event.MESSAGE event: dispatched after receiving data. + * - Event.CLOSE event: dispatched after connection closed. + * - Event.ERROR event: dispatched after an error occurred. + * @zh Socket 封装了 HTML5 WebSocket,允许服务器端与客户端进行全双工(full-duplex)的实时通信,并且允许跨域通信。在建立连接后,服务器和 Browser/Client Agent 都能主动的向对方发送或接收文本和二进制数据。 + * - 要使用Socket 类的方法,请先使用构造函数 new Socket 创建一个 Socket 对象。 Socket 以异步方式传输和接收数据。 + * - Event.OPEN 事件:连接建立成功后调度。 + * - Event.MESSAGE 事件:接收到数据后调度。 + * - Event.CLOSE 事件:连接被关闭后调度。 + * - Event.ERROR 事件:出现异常后调度。 + */ + class Socket extends EventDispatcher { + /** + * @en Little-endian byte order, where the low-order byte is stored in the low address. + * @zh 小端字节序,地址低位存储值的低位,地址高位存储值的高位。 + */ + static LITTLE_ENDIAN: string; + /** + * @en Big-endian byte order, where the high-order byte is stored in the low address. Also known as network byte order. + * @zh 大端字节序,地址低位存储值的高位,地址高位存储值的低位。有时也称之为网络字节序。 + */ + static BIG_ENDIAN: string; + protected _socket: any; + private _connected; + private _addInputPosition; + private _input; + private _output; + /** + * @en Whether to disable caching of data received from the server. If the transmitted data is in string format, it is recommended to set this to true to reduce binary conversion overhead. + * @zh 是否禁用服务端发来的数据缓存。如果传输的数据为字符串格式,建议设置为true,减少二进制转换消耗。 + */ + disableInput: boolean; + private _byteClass; + /** + * @en Subprotocol names. A string or an array of strings of subprotocol names. Must be set before calling connect or connectByUrl, otherwise it will be invalid. If specified, the connection will only be established successfully if the server chooses one of these subprotocols, otherwise it will fail and dispatch an Event.ERROR event. + * @zh 子协议名称。子协议名称字符串,或由多个子协议名称字符串构成的数组。必须在调用 connect 或者 connectByUrl 之前进行赋值,否则无效。指定后,只有当服务器选择了其中的某个子协议,连接才能建立成功,否则建立失败,派发 Event.ERROR 事件。 + */ + protocols: any; + /** + * @en The data received from the server. + * @zh 服务端发来的缓存数据。 + */ + get input(): any; + /** + * @en The data in the buffer that needs to be sent to the server. + * @zh 需要发送至服务端的缓冲区中的数据。 + */ + get output(): any; + /** + * @en Indicates whether this Socket object is currently connected. + * @zh 表示此 Socket 对象目前是否已连接。 + */ + get connected(): boolean; + /** + * @en The byte order used by this Socket object. + * @zh 此 Socket 对象使用的字节序。 + */ + get endian(): string; + set endian(value: string); + /** + * @en Create a new Socket object. The default byte order is Socket.BIG_ENDIAN. If no parameters are specified, a socket initially in a disconnected state will be created. If valid parameters are specified, it attempts to connect to the specified host and port. + * @param host The server address. + * @param port The server port. + * @param byteClass The Byte class used for receiving and sending data. If null, the Byte class will be used. You can also pass in a subclass of the Byte class. + * @param protocols Subprotocol names. A string or an array of strings of subprotocol names. + * @param isSecure Whether to use the WebSocket secure protocol wss, default (false) uses the ordinary protocol ws. + * @zh 创建新的 Socket 对象。默认字节序为 Socket.BIG_ENDIAN 。若未指定参数,将创建一个最初处于断开状态的套接字。若指定了有效参数,则尝试连接到指定的主机和端口。 + * @param host 服务器地址。 + * @param port 服务器端口。 + * @param byteClass 用于接收和发送数据的 Byte 类。如果为 null ,则使用 Byte 类,也可传入 Byte 类的子类。 + * @param protocols 子协议名称。子协议名称字符串,或由多个子协议名称字符串构成的数组。 + * @param isSecure 是否使用WebSocket安全协议wss,默认(false)使用普通协议ws。 + */ + constructor(host?: string | null, port?: number, byteClass?: new () => any, protocols?: any[] | null, isSecure?: boolean); + /** + * @en Connect to the specified host and port. + * - Dispatches Event.OPEN on successful connection; Event.ERROR on connection failure; Event.CLOSE when the connection is closed; Event.MESSAGE when data is received. Except for Event.MESSAGE where the event parameter is the data content, other event parameters are native HTML DOM Event objects. + * @param host The server address. + * @param port The server port. + * @param isSecure Whether to use the WebSocket secure protocol wss, default (false) uses the ordinary protocol ws. + * @zh 连接到指定的主机和端口。 + * - 连接成功派发 Event.OPEN 事件;连接失败派发 Event.ERROR 事件;连接被关闭派发 Event.CLOSE 事件;接收到数据派发 Event.MESSAGE 事件; 除了 Event.MESSAGE 事件参数为数据内容,其他事件参数都是原生的 HTML DOM Event 对象。 + * @param host 服务器地址。 + * @param port 服务器端口。 + * @param isSecure 是否使用WebSocket安全协议wss,默认(false)使用普通协议ws。 + */ + connect(host: string, port: number, isSecure?: boolean): void; + /** + * @en Connect to the specified server WebSocket URL. The URL is similar to ws://yourdomain:port. + * - Dispatches Event.OPEN on successful connection; Event.ERROR on connection failure; Event.CLOSE when the connection is closed; Event.MESSAGE when data is received. Except for Event.MESSAGE where the event parameter is the data content, other event parameters are native HTML DOM Event objects. + * @param url The server WebSocket URL to connect to. The URL is similar to ws://yourdomain:port. + * @zh 连接到指定的服务端 WebSocket URL。 URL 类似 ws://yourdomain:port。 + * - 连接成功派发 Event.OPEN 事件;连接失败派发 Event.ERROR 事件;连接被关闭派发 Event.CLOSE 事件;接收到数据派发 Event.MESSAGE 事件; 除了 Event.MESSAGE 事件参数为数据内容,其他事件参数都是原生的 HTML DOM Event 对象。 + * @param url 要连接的服务端 WebSocket URL。 URL 类似 ws://yourdomain:port。 + */ + connectByUrl(url: string): void; + /** + * @en Clean up the Socket: close the Socket connection, remove event listeners, and reset the Socket. + * @zh 清理Socket:关闭Socket连接,移除事件监听,重置Socket。 + */ + cleanSocket(): void; + /** + * @en Close the connection. + * @zh 关闭连接。 + */ + close(): void; + /** + * @en Connection established successfully + * @zh 连接建立成功 。 + */ + protected _onOpen(e: any): void; + /** + * @en Received data processing method. + * @param msg Data. + * @zh 接收到数据处理方法。 + * @param msg 数据。 + */ + protected _onMessage(msg: any): void; + /** + * @en Connection closed processing method. + * @zh 连接被关闭处理方法。 + */ + protected _onClose(e: any): void; + /** + * @en An error occurred processing method. + * @zh 出现异常处理方法。 + */ + protected _onError(e: any): void; + /** + * @en Send data to the server. + * @param data The data to be sent, which can be either a String or an ArrayBuffer. + * @zh 发送数据到服务器。 + * @param data 需要发送的数据,可以是String或者ArrayBuffer。 + */ + send(data: any): void; + /** + * @en Send the data in the buffer to the server. + * @zh 发送缓冲区中的数据到服务器。 + */ + flush(): void; + } + /** + * @en The `URL` class provides URL formatting and version management. + * - The engine automatically calls the formatURL function to format URL paths when loading resources. + * - You can set the network base path through the basePath property. + * - By setting the customFormat function, you can customize the way URLs are formatted. + * @zh `URL` 类提供URL格式化和版本管理功能。 + * - 引擎加载资源时,会自动调用formatURL函数格式化URL路径。 + * - 通过basePath属性可以设置网络基础路径。 + * - 通过设置customFormat函数,可以自定义URL格式化的方式。 + */ + class URL { + /** + * @en URL address version mapping table. For example, {"aaa/bb.png":"edcba","aaa/bb.png":"1342a"}. By default, after formatting through formatURL, it will automatically generate an address like "aaa/bb-1342a.png". + * @zh URL地址版本映射表。例如,{"aaa/bb.png":"edcba","aaa/bb.png":"1342a"}。默认情况下,通过formatURL格式化后,会自动生成为"aaa/bb-1342a.png"的地址。 + */ + static version: Record; + /** + * @en Base path. If not set, it defaults to the path of the current web page. The final address will be formatted as basePath + relative URL address. + * @zh 基础路径。如果不设置,默认为当前网页的路径。最终地址将被格式化为 basePath + 相对URL地址。 + */ + static basePath: string; + /** + * @en Extended base path mapping table. For example, {"aa/":"http://abc.com/"}, then resources with paths starting with aa/ will be mapped to http://abc.com/. + * @zh 扩展的基础路径映射表。例如,{"aa/":"http://abc.com/"},则把路径以aa/开头的资源映射到http://abc.com/下。 + */ + static basePaths: Record; + private _url; + private _path; + private static overrideFileExts; + private static hasExtOverrides; + private static usingSafeFileExts; + private static readonly safeFileExtConversionMap; + static __init__(): void; + /** + * @en Initialize file extension overrides for mini-game. + * @zh 初始化小游戏的文件扩展名覆盖。 + */ + static initMiniGameExtensionOverrides(): void; + /** + * @en Create a new `URL` instance. + * @param url The URL to be formatted. + * @zh 创建一个新的 `URL` 实例。 + * @param url 要格式化的URL地址。 + */ + constructor(url: string); + /** + * @en The formatted address. + * @zh 格式化后的地址。 + */ + get url(): string; + /** + * @en The folder path of the address (excluding the file name). + * @zh 地址的文件夹路径(不包括文件名)。 + */ + get path(): string; + /** + * @en Custom URL formatting function. For example: customFormat = function(url:String):String{} + * @zh 自定义URL格式化的方式。例如:customFormat = function(url:String):String{} + */ + static customFormat: Function; + /** + * 指以'~/'开头的的url路径的映射。 + * 不推荐使用,应该使用basePaths。 + */ + static get rootPath(): string; + static set rootPath(value: string); + /** + * 包含normalizedURL功能,并且合并base,如果base没有提供,则使用URL.basePath或者URL.rootPath。 + * @param url 地址。 + * @param base 基础路径,如果没有,则使用URL.basePath或者URL.rootPath。 + * @return 格式化处理后的地址。 + */ + static formatURL(url: string, base?: string): string; + /** + * @en Process automatic conversion of file extensions. + * @param url The address to be processed. + * @returns The processed address. + * @zh 处理扩展名的自动转换。 + * @param url 要处理的地址。 + * @return 处理后的地址。 + */ + static postFormatURL(url: string): string; + /** + * @en Normalize a relative path. Mainly handles cases with '.' and '..'. + * @param url The URL to normalize. + * @returns The normalized URL. + * @zh 格式化相对路径。主要是处理 '.' 和 '..' 这些情况。 + * @param url 要格式化的路径。 + * @return 格式化后的路径。 + */ + static normalize(url: string): string; + /** + * @en Get the resource URL by UUID. + * @param url The input URL or UUID. + * @returns The resource URL. + * @zh 通过 UUID 获取资源 URL。 + * @param url 输入的 URL 或 UUID。 + * @return 资源 URL。 + */ + static getResURLByUUID(url: string): string; + /** + * @en Combine and normalize relative paths. + * @param base The base path. + * @param path The path to join. + * @returns The combined and normalized path. + * @zh 组合相对路径并格式化。 + * @param base 基础路径。 + * @param path 要合并的路径。 + * @return 合并并格式化后的路径。 + */ + static join(base: string, path: string): string; + /** + * @en Get the folder path of the specified URL (excluding the file name). Note: the returned path has a trailing slash (/). + * @param url The URL address. + * @returns The folder path with a trailing slash (/). + * @zh 获取指定 URL 的文件夹路径(不包括文件名)。注意:末尾有斜杠(/)。 + * @param url 地址。 + * @return 文件夹路径。 + */ + static getPath(url: string): string; + /** + * @en Get the file name of the specified URL. + * @param url The URL address. + * @returns The file name. + * @zh 获取指定 URL 的文件名。 + * @param url 地址。 + * @return 文件名。 + */ + static getFileName(url: string): string; + /** + * @en Get the version string of the URL. + * @param url The URL to check. + * @returns The version string or null if not found. + * @zh 获取 URL 版本字符。 + * @param url 要检查的 URL。 + * @return 版本字符串或 null(如果未找到)。 + */ + static getURLVerion(url: string): string; + /** + * @en Override the file extension for downloading. + * @param originalExts The original extensions. For example, ["scene"]. + * @param targetExt The target extension to convert to. For example, "json". + * @zh 下载时,转换 URL 的扩展名。 + * @param originalExts 原始扩展名。例如["scene"]。 + * @param targetExt 要转换为的扩展名。例如"json"。 + */ + static overrideExtension(originalExts: Array, targetExt: string, miniGameOnly?: boolean): void; + } + /** + * @en Utility class for basic binary hash calculation and binary equality comparison. + * @zh 用于基本的二进制哈希计算和二进制相等性判断的工具类。 + */ + class BinHashUtils { + /** + * @en Calculates the hash value of a binary buffer. + * @param buffer The binary data to hash. + * @param start The starting position within the buffer. + * @param len The length of data to consider for the hash calculation. + * @param magic A large prime number used as the modulus in the hash calculation, defaults to 9191891. + * @return The calculated hash value as a number. + * @zh 计算二进制缓冲区的哈希值。 + * @param buffer 要进行哈希的数据。 + * @param start 缓冲区中的起始位置。 + * @param len 要用于哈希计算的数据长度。 + * @param magic 哈希计算中使用的模数,大质数,默认为9191891。 + * @return 返回计算得到的哈希值。 + */ + static getHash(buffer: Uint8Array, start: number, len: number, magic?: number): number; + /** + * @en Compares two binary data segments for equality. + * @param buffer1 The first binary data buffer. + * @param start1 The starting position within the first buffer. + * @param len1 The length of data to compare in the first buffer. + * @param buffer2 The second binary data buffer. + * @param start2 The starting position within the second buffer. + * @param len2 The length of data to compare in the second buffer. + * @return True if the data segments are equal, false otherwise. + * @zh 比较两段二进制数据是否相等。 + * @param buffer1 第一个二进制数据缓冲区。 + * @param start1 第一个缓冲区中的起始位置。 + * @param len1 要比较的第一个缓冲区的数据长度。 + * @param buffer2 第二个二进制数据缓冲区。 + * @param start2 第二个缓冲区中的起始位置。 + * @param len2 要比较的第二个缓冲区的数据长度。 + * @return 如果数据段相等则返回true,否则返回false。 + */ + static isSame(buffer1: Uint8Array, start1: number, len1: number, buffer2: Uint8Array, start2: number, len2: number): boolean; + } + /** + * @en JsonBinRead class provides methods for parsing and reading binary JSON-like data. + * It uses custom type codes and supports compression and various data structures. + * @zh JsonBinRead 类提供了用于解析和读取二进制 JSON 数据的方法。 + * 它使用自定义的类型码,支持压缩和多种数据结构。 + */ + class JsonBinRead { + static ISJSONBIN: number; + static ISJSONBIN2: number; + static ISJSONBIN3: number; + /** + * @en The character used to split strings in the serialized data. + * @zh 用于在序列化数据中分割字符串的字符。 + */ + static SPLITCHAR: string; + /** + * @en A constant representing a new compression type or mode. + * @zh 代表一种新的压缩类型或模式的常量。 + */ + static COMPRESS_NEW: number; + /** + * @en A constant representing a reference-based compression type or mode. + * @zh 代表一种基于引用的压缩类型或模式的常量。 + */ + static COMPRESS_REF: number; + /** + * @en A constant representing a modified reference-based compression type or mode. + * @zh 代表一种修改后的基于引用的压缩类型或模式的常量。 + */ + static COMPRESS_REFMODIFY: number; + /** + * @en A type code representing an 8-bit integer value. + * @zh 代表一个8位整数值的类型码。 + */ + static NUM8: number; + /** + * @en A type code representing a 16-bit integer value. + * @zh 代表一个16位整数值的类型码。 + */ + static NUM16: number; + /** + * @en A type code representing a 32-bit integer value. + * @zh 代表一个32位整数值的类型码。 + */ + static NUM32: number; + /** + * @en A type code representing a boolean value. + * @zh 代表一个布尔值的类型码。 + */ + static BOOLEAN: number; + /** + * @en A type code representing a double-precision floating-point value. + * @zh 代表一个双精度浮点值的类型码。 + */ + static DOUBLE: number; + /** + * @en A type code representing a string value. + * @zh 代表一个字符串值的类型码。 + */ + static STRING: number; + /** + * @en A type code representing an 8-element array. + * @zh 代表一个具有8个元素的数组的类型码。 + */ + static ARRAY8: number; + /** + * @en A type code representing a 16-element array. + * @zh 代表一个具有16个元素的数组的类型码。 + */ + static ARRAY16: number; + /** + * @en A type code representing an empty array. + * @zh 代表一个空数组的类型码。 + */ + static ARRAYEMPTY: number; + /** + * @en A type code representing an array of 8-bit integer values. + * @zh 代表一个由8位整数值组成的数组的类型码。 + */ + static ARRAYNUM8: number; + /** + * @en A type code representing an array of 16-bit integer values. + * @zh 代表一个由16位整数值组成的数组的类型码。 + */ + static ARRAYNUM16: number; + /** + * @en A type code representing an array of 32-bit integer values. + * @zh 代表一个由32位整数值组成的数组的类型码。 + */ + static ARRAYNUM32: number; + /** + * @en A type code representing an array of double-precision floating-point values. + * @zh 代表一个由双精度浮点值组成的数组的类型码。 + */ + static ARRAYDOUBLE: number; + /** + * @en A type code representing an array of strings. + * @zh 代表一个由字符串组成的数组的类型码。 + */ + static ARRAYSTRING: number; + /** + * @en A type code representing a null value. + * @zh 代表一个空值的类型码。 + */ + static NULL: number; + /** + * @en A type code representing an object. + * @zh 代表一个对象的类型码。 + */ + static OBJECT: number; + /** + * @en A type code representing a 16-bit integer value multiplied by 1000. + * @zh 代表一个乘以1000的16位整数值的类型码。 + */ + static NUM16_1000: number; + /** + * @en A type code representing a 32-bit integer value multiplied by 1000. + * @zh 代表一个乘以1000的32位整数值的类型码。 + */ + static NUM32_1000: number; + /** + * @en A type code representing a word text value. + * @zh 代表一个单词文本值的类型码。 + */ + static WORDTEXT: number; + /** + * @en A type code representing an array buffer. + * @zh 代表一个数组缓冲区的类型码。 + */ + static ARRAYBUFFER: number; + /** + * @en A type code representing an array reference. + * @zh 代表一个数组引用的类型码。 + */ + static ARRAYREF: number; + /** + * @en A type code representing a source array of 8-bit integers for reference. + * @zh 代表一个用于引用的8位整数源数组的类型码。 + */ + static ARRAYREFSOURCE8: number; + /** + * @en A type code representing a source array of 16-bit integers for reference. + * @zh 代表一个用于引用的16位整数源数组的类型码。 + */ + static ARRAYREFSOURCE16: number; + /** + * @en A type code representing an array buffer with 32-bit size. + * @zh 代表一个具有32位大小的数组缓冲区的类型码。 + */ + static ARRAYBUFFER32: number; + /** + * @en A type code representing an array reference with 32-bit size. + * @zh 代表一个具有32位大小的数组引用的类型码。 + */ + static ARRAYREF32: number; + /** + * @en A type code representing a 32-element array. + * @zh 代表一个具有32个元素的数组的类型码。 + */ + static ARRAY32: number; + /** + * @en A type code representing an object with a specific class. + * @zh 代表一个具有特定类的对象的类型码。 + */ + static OBJECTTHISCLASS: number; + /** + * @en A type code representing a 64-bit integer value. + * @zh 代表一个64位整数值的类型码。 + */ + static NUM64: number; + /** + * @en A type code representing an Int8Array. + * @zh 代表一个Int8Array的类型码。 + */ + static INT8ARRAY: number; + /** + * @en A type code representing a Uint8Array. + * @zh 代表一个Uint8Array的类型码。 + */ + static UINT8ARRAY: number; + /** + * @en A type code representing an Int16Array. + * @zh 代表一个Int16Array的类型码。 + */ + static INT16ARRAY: number; + /** + * @en A type code representing a Float32Array. + * @zh 代表一个Float32Array的类型码。 + */ + static FLOAT32ARRAY: number; + /** + * @en A constant value used to mark the end of an object in the serialized data. + * @zh 用于在序列化数据中标记对象结束的常量值。 + */ + static OBJECTEND: number; + /** + * @en The singleton instance of the JsonBinRead class. + * @zh JsonBinRead类的单例实例。 + */ + private static _instance; + /** + * @en Gets the singleton instance of the JsonBinRead class. If it doesn't exist, creates a new one. + * @returns The singleton instance of the JsonBinRead class. + * @zh 获取JsonBinRead类的单例实例。如果不存在,则创建一个新的实例。 + * @returns JsonBinRead类的单例实例。 + */ + static get instance(): JsonBinRead; + /** + * @en Checks if the given ArrayBuffer contains JSONBin data. + * @param data The ArrayBuffer to be checked. + * @returns True if the data is identified as JSONBin data, false otherwise. + * @zh 检查给定的ArrayBuffer是否包含JsonBin数据。 + * @param data 要检查的ArrayBuffer。 + * @returns 如果数据被识别为JsonBin数据则返回true,否则返回false。 + */ + static IsJsonbin(data: ArrayBuffer): boolean; + /** + * @en Parses the given ArrayBuffer as JSONBin data. If it's not in the expected JSONBin format, + * tries to parse it as a regular JSON string. + * @param value The ArrayBuffer to be parsed. + * @returns The parsed data as an object. If parsing fails, returns null. + * @zh 将给定的ArrayBuffer解析为JsonBin数据。如果不是预期的JsonBin格式, + * 则尝试将其作为常规JSON字符串进行解析。 + * @param value 要解析的ArrayBuffer。 + * @returns 解析后的数据作为一个对象。如果解析失败,则返回null。 + */ + static parse(value: ArrayBuffer): any; + /** + * @en Parses the given value (assumed to be JSONBin data) and caches the result using the Loader. + * @param value The value to be parsed. + * @returns The parsed data as an object. + * @zh 解析给定的值(假定为JsonBin数据)并使用Loader缓存结果。 + * @param value 要解析的价值。 + * @returns 解析后的数据作为一个对象。 + */ + static parsePack(value: any): any; + /** + * @en An object used to store references to other objects during the reading process. + * @zh 在读取过程中用于存储对其他对象引用的对象。 + */ + private _objectRef; + /** + * @en The starting offset of the data within the buffer during the reading process. + * @zh 在读取过程中缓冲区中数据的起始偏移量。 + */ + private _dataStartOfs; + /** + * @en A function used to create an object with a specific class during the reading process. + * @zh 在读取过程中用于创建具有特定类的对象的函数。 + */ + private _createObjWithClass; + /** @ignore */ + constructor(); + /** + * @en Reads an array from the given Byte data buffer based on the specified type and keyMap. + * @param data The Byte data buffer from which to read the array. + * @param pos The starting position in the buffer to read the array. If -1, uses the current position. + * @param n The number of elements in the array. + * @param type The type code representing the array type. + * @param keyMap A mapping object that keeps track of keys and their corresponding values and indices. + * @returns The read array as an object. + * @zh 根据指定的类型和键映射从给定的Byte数据缓冲区读取数组。 + * @param data 从中读取数组的Byte数据缓冲区。 + * @param pos 在缓冲区中读取数组的起始位置。如果为-1,则使用当前位置。 + * @param n 数组中的元素数量。 + * @param type 代表数组类型的类型码。 + * @param keyMap 一个映射对象,用于跟踪键及其对应的值和索引。 + * @returns 读取的数组作为一个对象。 + */ + private _readArray; + /** + * @en Retrieves the length value from the given Byte object. + * It interprets the length based on the encoding rules where a single byte might represent the length directly or two bytes need to be combined if the length is larger. + * @param data The Byte object from which to extract the length. + * @returns The length value obtained from the Byte object. + * @zh 从给定的Byte对象中获取长度值。 + * 它根据编码规则解析长度,即单个字节可能直接表示长度,如果长度较大,则需要组合两个字节来获取长度值。 + * @param data 从中提取长度的Byte对象。 + * @returns 从Byte对象获取的长度值。 + */ + private _getLen; + /** + * @en Combines two numbers into a single large number representation. + * It first converts the second number to a hexadecimal string, pads it to a specific length if needed, + * and then concatenates it with the hexadecimal string of the first number to form the large number. + * @param n1 The first number. + * @param n2 The second number. + * @returns The combined large number. + * @zh 将两个数字组合成一个大数字表示形式。 + * 它首先将第二个数字转换为十六进制字符串,如有需要将其填充到特定长度, + * 然后将其与第一个数字的十六进制字符串连接起来以形成大数字。 + * @param n1 第一个数字。 + * @param n2 第二个数字。 + * @returns 组合后的大数字。 + */ + static _toLargeNumber(n1: number, n2: number): number; + /** + * @en Reads an Int8Array from the given Byte object starting from a specific position and with a given length. + * It adjusts the end position to fit within the buffer bounds and creates the Int8Array from the buffer slice. Also updates the internal position of the Byte object after reading. + * @param byte The Byte object from which to read the Int8Array. + * @param start The starting position within the Byte object's buffer. + * @param len The length of the Int8Array to read. + * @returns The read Int8Array. + * @zh 从给定的Byte对象中从特定位置开始按给定长度读取一个Int8Array。 + * 它会调整结束位置以适应缓冲区边界,并从缓冲区切片创建Int8Array。读取后还会更新Byte对象的内部位置。 + * @param byte 从中读取Int8Array的Byte对象。 + * @param start Byte对象缓冲区中的起始位置。 + * @param len 要读取的Int8Array的长度。 + * @returns 读取的Int8Array。 + */ + private static readInt8Array; + /** + * @en Reads a single value from the given Byte data buffer based on the specified type and keyMap. + * It handles different types of values such as null, integers, booleans, strings, arrays, etc., by using specific read operations for each type. + * If the type is not recognized among the common ones, it delegates to the _readOne_other method. + * @param parent The parent object to which the read value may be assigned (used for object property assignment). + * @param data The Byte data buffer from which to read the value. + * @param key The key associated with the value (if applicable, for object property setting). + * @param type The type code representing the value type. + * @param keyMap A mapping object that keeps track of keys and their corresponding values and indices. + * @returns The read value. + * @zh 根据指定的类型和键映射从给定的Byte数据缓冲区读取单个值。 + * 它通过针对每种类型使用特定的读取操作来处理不同类型的值,如空值、整数、布尔值、字符串、数组等。 + * 如果在常见类型中无法识别该类型,则委托给_readOne_other方法处理。 + * @param parent 读取的值可能分配到的父对象(用于对象属性赋值)。 + * @param data 从中读取值的Byte数据缓冲区。 + * @param key 与值关联的键(如果适用,用于设置对象属性)。 + * @param type 代表值类型的类型码。 + * @param keyMap 一个映射对象,用于跟踪键及其对应的值和索引。 + * @returns 读取的值。 + */ + private _readOne; + /** + * @en Reads a value from the given Byte data buffer for types that are not handled in the _readOne method directly. + * It deals with more complex types like arrays with specific compression or reference handling and objects with class creation. + * @param parent The parent object related to the value being read (used for property assignment and object hierarchy). + * @param data The Byte data buffer from which to read the value. + * @param key The key associated with the value (if applicable for property setting). + * @param type The type code representing the value type. + * @param keyMap A mapping object that keeps track of keys and their corresponding values and indices. + * @returns The read value. + * @zh 从给定的Byte数据缓冲区读取那些在_readOne方法中未直接处理的类型的值。 + * 它处理更复杂的类型,例如具有特定压缩或引用处理的数组以及需要创建类的对象。 + * @param parent 与正在读取的值相关的父对象(用于属性赋值和对象层次结构)。 + * @param data 从中读取值的Byte数据缓冲区。 + * @param key 与值关联的键(如果适用于属性设置)。 + * @param type 代表值类型的类型码。 + * @param keyMap 一个映射对象,用于跟踪键及其对应的值和索引。 + * @returns 读取的值。 + */ + private _readOne_other; + /** + * @en Reads binary JSON data from the given ArrayBuffer and parses it into an object. + * It first initializes some internal state, determines the format based on a marker in the buffer, creates a keyMap for decoding, and then uses the _readOne method to start parsing the data. It also measures and may log the parsing time if it exceeds a certain threshold. + * @param data The ArrayBuffer containing the binary JSON data to be read. + * @param createObjWithClass A function used to create objects with specific classes during the parsing process (optional). + * @returns The parsed object. If the data format is not recognized, it returns null. + * @zh 从给定的ArrayBuffer中读取二进制JSON数据并将其解析为对象。 + * 它首先初始化一些内部状态,根据缓冲区中的标记确定格式,创建用于解码的键映射,然后使用_readOne方法开始解析数据。如果解析时间超过一定阈值,它还会测量并可能记录解析时间。 + * @param data 包含要读取的二进制JSON数据的ArrayBuffer。 + * @param createObjWithClass 在解析过程中用于创建具有特定类的对象的函数(可选)。 + * @returns 解析后的对象。如果数据格式无法识别,则返回null。 + */ + read(data: ArrayBuffer, createObjWithClass?: Function): any; + } + /** + * @en The JsonBinWrite class is responsible for serializing various data types into a binary format that can be saved or transmitted. + * @zh JsonBinWrite类负责将各种数据类型序列化为可保存或传输的二进制格式。 + */ + class JsonBinWrite { + /** + * @en A special string used for compression identification within the serialized data. + * @zh 用于在序列化数据中标识压缩的特殊字符串。 + */ + static COMPRESS: string; + /** + * @en A special string used to mark keys that should not be saved. + * @zh 用于标记不应保存的键的特殊字符串。 + */ + static NOSAVEKEY: string; + /** + * @en A special string used to mark an object that should not be saved in a specific way. + * @zh 用于以特定方式标记不应保存的对象的特殊字符串。 + */ + static NOSAVETHISOBJ: string; + /** + * @en The length of the special NOSAVEKEY string. + * @zh 特殊的NOSAVEKEY字符串的长度。 + */ + static NOSAVE_KEY_LEN: number; + /** + * @en A constant value used to indicate a specific action related to not saving an object (delete). + * @zh 用于指示与不保存对象相关的特定操作(删除)的常量值。 + */ + static NOSAVETHISOBJ_DELETE: number; + /** + * @en A constant value used to indicate a specific action related to not saving an object (true). + * @zh 用于指示与不保存对象相关的特定操作(真)的常量值。 + */ + static NOSAVETHISOBJ_TRUE: number; + /** + * @en The singleton instance of the JsonBinWrite class. + * @zh JsonBinWrite类的单例实例。 + */ + private static _instance; + /** + * @en Gets the singleton instance of the JsonBinWrite class. If it doesn't exist, creates a new one. + * @returns The singleton instance of the JsonBinWrite class. + * @zh 获取JsonBinWrite类的单例实例。如果不存在,则创建一个新的实例。 + * @returns JsonBinWrite类的单例实例。 + */ + static get instance(): JsonBinWrite; + /** + * @en An object used to store references to other objects during the serialization process. + * @zh 在序列化过程中用于存储对其他对象引用的对象。 + */ + objectRef: any; + /** + * @en A flag used to enable or disable certain class-related functionality during serialization. + * @zh 在序列化期间用于启用或禁用某些与类相关功能的标志。 + */ + private _classEnable_; + constructor(); + /** + * @en Saves a key-value pair with a specific value type to the output buffer. + * @param key The key to be saved. + * @param valueType The type of the value associated with the key. + * @param keyMap A mapping object that keeps track of keys and their corresponding values and indices. + * @param out The output buffer where the data is written. + * @zh 将具有特定值类型的键值对保存到输出缓冲区。 + * @param key 要保存的键。 + * @param valueType 与键关联的值的类型。 + * @param keyMap 用于跟踪键及其对应的值和索引的映射对象。 + * @param out 写入数据的输出缓冲区。 + */ + private _saveKey; + /** + * @en Determines the appropriate array value type based on the typeof the given value. + * @param value The value for which the array value type is to be determined. + * @returns The determined array value type as a number. + * @zh 根据给定值的类型确定合适的数组值类型。 + * @param value 要确定数组值类型的那个值。 + * @returns 确定的数组值类型(以数字表示)。 + */ + private _getValueArrayType; + /** + * @en Writes a string or a word text value to the output buffer along with its associated key. + * @param keyMap A mapping object that keeps track of keys and their corresponding values and indices. + * @param key The key associated with the value. Can be null. + * @param value The value to be written. + * @param out The output buffer where the data is written. + * @param isWordText A flag indicating whether the value is a word text. + * @zh 将字符串或单词文本值及其关联的键写入输出缓冲区。 + * @param keyMap 用于跟踪键及其对应的值和索引的映射对象。 + * @param key 与值关联的键。可以为null。 + * @param value 要写入的值。 + * @param out 写入数据的输出缓冲区。 + * @param isWordText 指示值是否为单词文本的标志。 + */ + private _writeStrOrWordText; + /** + * @en Writes a string value to the output buffer. + * @param keyMap A mapping object that keeps track of keys and their corresponding values and indices. + * @param value The value to be written. + * @param out The output buffer where the data is written. + * @zh 将字符串值写入输出缓冲区。 + * @param keyMap 用于跟踪键及其对应的值和索引的映射对象。 + * @param value 要写入的值。 + * @param out 写入数据的输出缓冲区。 + */ + private _writeString; + /** + * @en Gets the type of the given object as a string. + * @param value The object for which the type is to be determined. + * @returns The type of the object as a string. + * @zh 获取给定对象的类型(以字符串表示)。 + * @param value 要确定类型的那个对象。 + * @returns 给定对象的类型(以字符串表示)。 + */ + private _getObjectTypeof; + /** + * @en Checks if the given object is a word text. + * @param o The object to be checked. + * @returns True if the object is a word text, false otherwise. + * @zh 检查给定对象是否为单词文本。 + * @param o 要检查的对象。 + * @returns 如果对象是单词文本则返回true,否则返回false。 + */ + static isWordText(o: any): boolean; + /** + * @en Writes the length value to the output buffer in a specific format depending on its magnitude. + * @param out The output buffer where the data is written. + * @param len The length value to be written. + * @zh 根据长度值的大小以特定格式将其写入输出缓冲区。 + * @param out 写入数据的输出缓冲区。 + * @param len 要写入的长度值。 + */ + private _writeLen; + /** + * @en Writes a large number value to the output buffer in a specific format. + * @param out The output buffer where the data is written. + * @param value The large number value to be written. + * @zh 以特定格式将大数值写入输出缓冲区。 + * @param out 写入数据的输出缓冲区。 + * @param value 要写入的大数值。 + */ + private _writeBigNumber; + /** + * @en A counter used to keep track of the depth during the serialization process. + * @zh 在序列化过程中用于跟踪深度的计数器。 + */ + private deep; + /** + * @en Writes a single key-value pair or object to the output buffer. + * @param out The output buffer where the data is written. + * @param keyMap A mapping object that keeps track of keys and their corresponding values and indices. + * @param key The key associated with the value. Can be null. + * @param value The value to be written. + * @param parent The parent object of the value (if applicable). + * @returns True if the write operation was successful, false otherwise. + * @zh 将单个键值对或对象写入输出缓冲区。 + * @param out 写入数据的输出缓冲区。 + * @param keyMap 用于跟踪键及其对应的值和索引的映射对象。 + * @param key 与值关联的键。可以为null。 + * @param value 要写入的值。 + * @param parent 值的父对象(如果适用)。 + * @returns 如果写入操作成功则返回true,否则返回false。 + */ + private _writeOne; + /** + * @en Saves an array of values to the output buffer. + * @param parent The parent object of the array (if applicable). + * @param out The output buffer where the data is written. + * @param keyMap A mapping object that keeps track of keys and their corresponding values and indices. + * @param key The key associated with the array (if applicable). + * @param value The array of values to be written. + * @returns True if the save operation was successful, false otherwise. + * @zh 将数组的值保存到输出缓冲区。 + * @param parent 数组的父对象(如果适用)。 + * @param out 写入数据的输出缓冲区。 + * @param keyMap 用于跟踪键及其对应的值和索引的映射对象。 + * @param key 与数组关联的键(如果适用)。 + * @param value 要保存的数组值。 + * @returns 如果保存操作成功则返回true,否则返回false。 + */ + private _saveArray; + /** + * @en Handles the compression of data if applicable. + * @param out The output buffer where the data is written. + * @param keyMap A mapping object that keeps track of keys and their corresponding values and indices. + * @param key The key associated with the data (if applicable). + * @param value The data to be compressed (if applicable). + * @param posHead The position of the head of the data in the buffer. + * @param dataPos The position of the data in the buffer. + * @param compress The compression factor or related information. + * @param typeArray The type of the array or data structure. + * @zh 如果适用,处理数据的压缩操作。 + * @param out 写入数据的输出缓冲区。 + * @param keyMap 用于跟踪键及其对应的值和 indices的映射对象。 + * @param key 与数据关联的键(如果适用)。 + * @param value 要压缩的数据(如果适用)。 + * @param posHead 缓冲区中数据头部的位置。 + * @param dataPos 缓冲区中数据的位置。 + * @param compress 压缩因子或相关信息。 + * @param typeArray 数组或数据结构的类型。 + */ + private _useCompress; + /** + * @en Writes an object to the output buffer. + * @param out The output buffer where the data is written. + * @param keyMap A mapping object that keeps track of keys and their corresponding values and indices. + * @param o The object to be written. + * @zh 将对象写入输出缓冲区。 + * @param out 写入数据的输出缓冲区。 + * @param keyMap 用于跟踪键及其对应的值和 indices的映射对象。 + * @param o 要写入的对象。 + */ + private _writeObject; + /** + * @en Serializes the given object into a binary format and returns the resulting buffer. + * @param o The object to be serialized. + * @param __CLASS__ A flag indicating whether to include class information (default is false). + * @returns The serialized object as an ArrayBuffer. + * @zh 将给定对象序列化为二进制格式并返回生成的缓冲区。 + * @param o 要序列化的对象。 + * @param __CLASS__ 一个标志,指示是否包含类信息(默认值为false)。 + * @returns 作为ArrayBuffer的序列化对象。 + */ + write(o: any, __CLASS__?: boolean): ArrayBuffer; + } + /** + * @en Image loader that uses a Web Worker for asynchronous loading. + * @zh 使用Web Worker进行异步加载的图像加载器。 + */ + class WorkerLoader { + /** + * @en Path to the worker.js file + * @zh worker.js的路径 + */ + static workerPath: string; + private static _worker; + private static _dispatcher; + private static _enable; + /** + * @en Check if worker is supported + * @returns Whether worker is supported + * @zh 检查是否支持worker + * @returns 是否支持worker + */ + static workerSupported(): boolean; + /** + * @en Whether to enable the worker loader. + * @zh 是否启用worker加载器。 + */ + static get enable(): boolean; + static set enable(value: boolean); + /** + * @en Loads an image asynchronously using the worker. + * @param url The URL of the image to load. + * @param options Additional options for loading. + * @return A promise that resolves with the loaded image. + * @zh 使用worker异步加载图像。 + * @param url 要加载的图像URL。 + * @param options 加载的附加选项。 + * @return 返回解析后的加载图像。 + */ + static load(url: string, options: any): Promise; + /** + * @en Handles messages received from the worker. + * @param evt Event data from the worker. + * @zh 处理从worker接收到的消息。 + * @param evt worker传递的事件数据。 + */ + private static workerMessage; + } + enum BaseRender2DType { + baseRenderNode = 0, + spine = 1, + particle = 2, + spineSimple = 3 + } + enum Render2DOrderMode { + elementIndex = 0, + ysort = 1 + } + class BaseRenderNode2D extends Component { + /** + * 材质集 + */ + _materials: Material[]; + /** + * 渲染类型 + */ + _renderType: BaseRender2DType; + /** + * 帧循环标记 + */ + _renderUpdateMask: number; + /** + * sprite ShaderData,可以为null + */ + _spriteShaderData: ShaderData; + /** + * 唯一ID + */ + private _renderid; + /** + * 节点内的渲染排序模式 + */ + private _ordingMode; + protected _transformChange(): void; + /** + * 返回第一个材质。 + */ + get sharedMaterial(): Material; + set sharedMaterial(value: Material); + private _setRenderElement2DMaterial; + constructor(); + /** + * cmd run时调用,可以用来计算matrix等获得即时context属性 + * @param context + * @param px + * @param py + */ + addCMDCall?(context: Context, px: number, py: number): void; + /** + * 帧更新,可以放一些顶点更新,数据计算等 + * @protected + * @param context + */ + renderUpdate?(context: IRenderContext2D): void; + /** + * 渲染前更新,准备所需的渲染数据 + * @param context + */ + preRenderUpdate?(context: IRenderContext2D): void; + clear(): void; + } + interface IBatch2DRender { + /**合批范围,合批的RenderElement2D直接add进list中 */ + batchRenderElement(list: FastSinglelist, start: number, length: number): void; + recover(): void; + } + class Batch2DInfo { + batchFun: IBatch2DRender; + batch: boolean; + indexStart: number; + elementLenth: number; + constructor(); + static _pool: Batch2DInfo[]; + static create(): Batch2DInfo; + static recover(info: Batch2DInfo): void; + } + class RenderManager2D { + /** + * 根据不同的RenderNode注册合批方式,来优化性能 + */ + private static _batchMapManager; + /** + * 注册渲染节点之间的合批 + */ + static regisBatch(renderElementType: number, batch: IBatch2DRender): void; + private _lastRenderNodeType; + private _lastbatch2DInfo; + _batchInfoList: FastSinglelist; + /** + * 渲染结束标签 + */ + _renderEnd: boolean; + /** + * RenderList + */ + get list(): FastSinglelist; + set list(value: FastSinglelist); + constructor(); + /** + * add Render Node + * @param object + */ + addRenderObject(object: BaseRenderNode2D): void; + /** + * remove Render Node + * @param object + */ + removeRenderObject(object: BaseRenderNode2D): void; + /** + * clear list + */ + clearList(): void; + /** + * 帧更新 + */ + renderUpdate(): void; + /** + * 渲染 + * @param context + */ + render(context: IRenderContext2D): void; + private _cull; + /** + * 合批总循环 + */ + private _batch; + /** + * 开启一个Batch + */ + private _batchStart; + endRender(): void; + } + /** + * @en 2D rectangular collision body + * @zh 2D矩形碰撞体 + */ + class BoxCollider extends ColliderBase { + /** + * @en Rectangle width of collision body + * @zh 碰撞体矩形宽度 + */ + get width(): number; + set width(value: number); + /** + * @en Rectangle height of collision body + * @zh 碰撞体矩形高度 + */ + get height(): number; + set height(value: number); + /** + * @en Constructor method + * @zh 构造方法 + */ + constructor(); + } + /** + * @en 2D chain collider + * @zh 2D 链形碰撞体 + */ + class ChainCollider extends ColliderBase { + /** + * @deprecated + * @en A collection of points separated by commas, format: x, y, x, y, ... + * @zh 用逗号隔开的点的集合,格式:x,y,x,y ... + */ + get points(): string; + set points(value: string); + /** + * @en Vertex data x,y,x,y ... + * @zh 顶点数据 x,y,x,y ... + */ + get datas(): number[]; + set datas(value: number[]); + /** + * @en Whether it is a closed loop. Ensure there are no self-intersecting link shapes, as they may not function properly. + * @zh 是否是闭环,注意不要有自相交的链接形状,否则它可能不能正常工作 + */ + get loop(): boolean; + set loop(value: boolean); + constructor(); + /** + * @en Called after being added to the node, different from Awake, onAdded will be called even if the node is not active. + * @zh 被添加到节点后调用,和 Awake 不同的是即使节点未激活 onAdded 也会调用。 + */ + onAdded(): void; + } + /** + * @en 2D CircleCollider + * @zh 2D圆形碰撞体 + */ + class CircleCollider extends ColliderBase { + /** + * @en Circular radius, must be a positive number + * @zh 圆形半径,必须为正数 + */ + get radius(): number; + set radius(value: number); + constructor(); + } + /** + * @en Collider base class + * @zh 碰撞体基类 + */ + class ColliderBase extends Component { + /**@private box2D fixture Def */ + protected _fixtureDef: any; + /** + * @en label + * @zh 标签 + */ + label: string; + /** + * @en The reference to the rigidbody. + * @zh 刚体引用。 + */ + rigidBody: RigidBody; + /** + * @en The x-axis offset relative to the node. + * @zh 相对于节点的 x 轴偏移。 + */ + get x(): number; + set x(value: number); + /** + * @en The y-axis offset relative to the node. + * @zh 相对于节点的 y 轴偏移。 + */ + get y(): number; + set y(value: number); + /** + * @en Whether the object is a sensor. A sensor can trigger collision events but does not produce collision responses. + * @zh 是否是传感器,传感器能够触发碰撞事件,但不会产生碰撞反应 + */ + get isSensor(): boolean; + set isSensor(value: boolean); + /** + * @en The density value. The value can be zero or a positive number. It is recommended to use similar densities to improve stacking stability. The default value is 10. + * @zh 密度值。值可以为零或者是正数,建议使用相似的密度以改善堆叠稳定性。默认值为 10。 + */ + get density(): number; + set density(value: number); + /** + * @en The friction coefficient. The value ranges from 0 to 1, the larger the value, the greater the friction. The default value is 0.2. + * @zh 摩擦力。取值范围0-1,值越大,摩擦越大。默认值为0.2。 + */ + get friction(): number; + set friction(value: number); + /** + * @en The restitution coefficient. The value ranges from 0 to 1, the larger the value, the greater the elasticity. The default value is 0. + * @zh 弹性系数。取值范围0-1,值越大,弹性越大。默认值为0。 + */ + get restitution(): number; + set restitution(value: number); + /** + * @en constructor method + * @zh 构造方法 + */ + constructor(); + /**@protected 创建Shape*/ + protected _createfixture(): any; + /**@protected 设置shape属性*/ + protected resetFixtureData(): void; + } + enum PhysicsShape { + BoxShape = 0, + CircleShape = 1, + PolygonShape = 2, + ChainShape = 3, + EdgeShape = 4 + } + class FixtureBox2DDef { + density: number; + friction: number; + isSensor: boolean; + restitution: number; + shape: PhysicsShape; + groupIndex: number; + } + /** + * @en 2D edge collider. + * @zh 2D边缘碰撞体。 + */ + class EdgeCollider extends ColliderBase { + /** + * @deprecated + * 用逗号隔开的点的集合,注意只有两个点,格式:x,y,x,y*/ + get points(): string; + set points(value: string); + /** + * @en Vertex data in the format of x,y,x,y ... + * @zh 顶点数据,格式为 x,y,x,y ... + */ + get datas(): number[]; + set datas(value: number[]); + constructor(); + } + /** + * @en 2D polygon collider. Concave polygons are currently not supported. If it is a concave polygon, manually split it into multiple convex polygons first. + * The maximum number of vertices is `b2_maxPolygonVertices`, which defaults to 8. So it is not recommended to exceed 8 points, and it cannot be less than 3. + * @zh 2D多边形碰撞体,暂时不支持凹多边形,如果是凹多边形,先手动拆分为多个凸多边形。 + * 节点个数最多是 `b2_maxPolygonVertices`,这数值默认是8,所以点的数量不建议超过8个,也不能小于3个。 + */ + class PolygonCollider extends ColliderBase { + /** + * @deprecated + * 用逗号隔开的点的集合,格式:x,y,x,y ... + */ + get points(): string; + set points(value: string); + /** + * @en Vertex data in the format: x,y,x,y ... + * @zh 顶点数据,格式:x,y,x,y ... + */ + get datas(): number[]; + set datas(value: number[]); + constructor(); + /** + * @override + */ + protected _setShapeData(shape: any): void; + } + /** + * @en Implements Box2D c++ version 2.4.1 + * @zh 实现Box2D c++ 2.4.1 版本 + */ + class physics2DwasmFactory implements IPhysiscs2DFactory { + private _tempVe21; + private _tempVe22; + private _massData; + set gravity(value: Vector2); + set allowSleeping(value: boolean); + /** + * @en Initialize the Box2D physics engine. + * @returns A promise that resolves when the initialization is complete. + * @zh 初始化Box2D物理引擎。 + * @returns 初始化完成时解析的promise。 + */ + initialize(): Promise; + /** + * @en Create the Box2D world. + * @zh 创建Box2D世界。 + */ + start(): void; + /** + * @en Update the physics world. + * @param delta The time step. + * @zh 更新物理世界。 + * @param delta 时间步长。 + */ + update(delta: number): void; + /** + * @en Send physics event. + * @param type The event type. + * @param contact The contact object. + * @zh 发送物理事件。 + * @param type 事件类型。 + * @param contact 碰撞对象。 + */ + sendEvent(type: string, contact: any): void; + /** + * @en Create a Box2D body. + * @param def The body definition. + * @returns The created Box2D body. + * @zh 创建一个Box2D刚体。 + * @param def 刚体定义。 + * @returns 创建的Box2D刚体。 + */ + createBody(def: any): any; + /** + * @en Remove a Box2D body. + * @param body The Box2D body to remove. + * @zh 移除一个Box2D刚体。 + * @param body 要移除的Box2D刚体。 + */ + removeBody(body: any): void; + /** + * @en Create a Box2D joint. + * @param def The joint definition. + * @param cls The joint class (optional). + * @returns The created Box2D joint. + * @zh 创建一个Box2D关节。 + * @param def 关节定义。 + * @param cls 关节类(可选)。 + * @returns 创建的Box2D关节。 + */ + createJoint(def: any, cls?: any): any; + /** + * @en Remove a Box2D joint. + * @param joint The Box2D joint to remove. + * @zh 移除一个Box2D关节。 + * @param joint 要移除的Box2D关节。 + */ + removeJoint(joint: any): void; + /** + * @en Get the user data of a joint. + * @param joint The joint. + * @returns The user data of the joint. + * @zh 获取关节的用户数据。 + * @param joint 关节。 + * @returns 关节的用户数据。 + */ + getJoint_userData(joint: any): any; + /** + * @en Check if the user data of a joint is marked as destroyed. + * @param joint The joint. + * @returns True if the user data is marked as destroyed, false otherwise. + * @zh 检查关节的用户数据是否被标记为已销毁。 + * @param joint 关节。 + * @returns 用户数据是否已被标记为已销毁。 + */ + getJoint_userData_destroy(joint: any): boolean; + /** + * @en Enable or disable the motor of a joint. + * @param joint The joint. + * @param enableMotor True to enable the motor, false to disable it. + * @zh 启用或禁用关节的马达。 + * @param joint 关节。 + * @param enableMotor 是否启用马达。 + */ + set_Joint_EnableMotor(joint: any, enableMotor: boolean): void; + /** + * @en Set the motor speed of a joint. + * @param joint The joint. + * @param motorSpeed The motor speed. + * @zh 设置关节的马达速度。 + * @param joint 关节。 + * @param motorSpeed 马达速度。 + */ + set_Joint_SetMotorSpeed(joint: any, motorSpeed: number): void; + /** + * @en Set the maximum motor torque of a joint. + * @param joint The joint. + * @param maxTorque The maximum motor torque. + * @zh 设置关节的最大马达扭矩。 + * @param joint 关节。 + * @param maxTorque 最大马达扭矩。 + */ + set_Joint_SetMaxMotorTorque(joint: any, maxTorque: number): void; + /** + * @en Enable or disable the limit of a joint. + * @param joint The joint. + * @param enableLimit True to enable the limit, false to disable it. + * @zh 启用或禁用关节的限制。 + * @param joint 关节。 + * @param enableLimit 是否启用限制。 + */ + set_Joint_EnableLimit(joint: any, enableLimit: boolean): void; + /** + * @en Set the limits of a joint. + * @param joint The joint. + * @param lowerAngle The lower angle limit. + * @param upperAngle The upper angle limit. + * @zh 设置关节的限制。 + * @param joint 关节。 + * @param lowerAngle 底角限制。 + * @param upperAngle 顶角限制。 + */ + set_Joint_SetLimits(joint: any, lowerAngle: number, upperAngle: number): void; + /** + * @en Set the frequency and damping ratio of a joint. + * @param Joint The joint. + * @param frequency The frequency. + * @param dampingRatio The damping ratio. + * @param isdamping True to apply damping, false otherwise. + * @zh 设置关节的频率和阻尼比。 + * @param Joint 关节。 + * @param frequency 频率。 + * @param dampingRatio 阻尼比。 + * @param isdamping 是否应用阻尼。 + */ + set_Joint_frequencyAndDampingRatio(Joint: any, frequency: number, dampingRatio: number, isdamping: boolean): void; + /** + * @en Create a distance joint. + * @param defStruct The distance joint definition. + * @returns The created distance joint. + * @zh 创建一个距离关节。 + * @param defStruct 距离关节定义。 + * @returns 创建的距离关节。 + */ + createDistanceJoint(defStruct: physics2D_DistancJointDef): any; + /** + * @en Set the length of a distance joint. + * @param joint The distance joint. + * @param length The length. + * @zh 设置距离关节的长度。 + * @param joint 距离关节。 + * @param length 长度。 + */ + set_DistanceJoint_length(joint: any, length: number): void; + /** + * @en Set the maximum length of a distance joint. + * @param joint The distance joint. + * @param length The maximum length. + * @zh 设置距离关节的最大长度。 + * @param joint 距离关节。 + * @param length 最大长度。 + */ + set_DistanceJoint_MaxLength(joint: any, length: number): void; + /** + * @en Set the minimum length of a distance joint. + * @param joint The distance joint. + * @param length The minimum length. + * @zh 设置距离关节的最小长度。 + * @param joint 距离关节。 + * @param length 最小长度。 + */ + set_DistanceJoint_MinLength(joint: any, length: number): void; + /** + * @en Set the stiffness and damping of a distance joint. + * @param joint The distance joint. + * @param stiffness The stiffness. + * @param damping The damping. + * @zh 设置距离关节的刚度和阻尼。 + * @param joint 距离关节。 + * @param stiffness 刚度。 + * @param damping 阻尼。 + */ + set_DistanceJointStiffnessDamping(joint: any, stiffness: number, damping: number): void; + /** + * @en Create a gear joint. + * @param defStruct The definition of the gear joint. + * @returns The created gear joint. + * @zh 创建齿轮关节。 + * @param defStruct 齿轮关节定义。 + * @returns 创建的齿轮关节。 + */ + create_GearJoint(defStruct: physics2D_GearJointDef): void; + /** + * @en Set the ratio of a gear joint. + * @param joint The gear joint. + * @param radio The ratio to set. + * @zh 设置齿轮关节的比率。 + * @param joint 齿轮关节。 + * @param radio 要设置的比率。 + */ + set_GearJoint_SetRatio(joint: any, radio: number): void; + /** + * @en Create a pulley joint. + * @param defStruct The definition of the pulley joint. + * @returns The created pulley joint. + * @zh 创建滑轮关节。 + * @param defStruct 滑轮关节定义。 + * @returns 创建的滑轮关节。 + */ + create_PulleyJoint(defStruct: physics2D_PulleyJointDef): void; + /** + * @en Create a wheel joint. + * @param defStruct The definition of the wheel joint. + * @returns The created wheel joint. + * @zh 创建轮子关节。 + * @param defStruct 轮子关节定义。 + * @returns 创建的轮子关节。 + */ + create_WheelJoint(defStruct: physics2D_WheelJointDef): any; + /** + * @en Create a weld joint. + * @param defStruct The definition of the weld joint. + * @returns The created weld joint. + * @zh 创建焊接关节。 + * @param defStruct 焊接关节定义。 + * @returns 创建的焊接关节。 + */ + create_WeldJoint(defStruct: physics2D_WeldJointDef): any; + /** + * @en Create a mouse joint. + * @param defStruct The definition of the mouse joint. + * @returns The created mouse joint. + * @zh 创建鼠标关节。 + * @param defStruct 鼠标关节定义。 + * @returns 创建的鼠标关节。 + */ + create_MouseJoint(defStruct: physics2D_MouseJointJointDef): any; + /** + * @en Set the target position of a mouse joint. + * @param joint The mouse joint. + * @param x The x-coordinate of the target position. + * @param y The y-coordinate of the target position. + * @zh 设置鼠标关节的目标位置。 + * @param joint 鼠标关节。 + * @param x 目标位置的x坐标。 + * @param y 目标位置的y坐标。 + */ + set_MouseJoint_target(joint: any, x: number, y: number): void; + /** + * @en Set the frequency and damping ratio of a mouse joint. + * @param Joint The mouse joint. + * @param frequency The frequency. + * @param dampingRatio The damping ratio. + * @zh 设置鼠标关节的频率和阻尼比。 + * @param Joint 鼠标关节。 + * @param frequency 频率。 + * @param dampingRatio 阻尼比。 + */ + set_MouseJoint_frequencyAndDampingRatio(Joint: any, frequency: number, dampingRatio: number): void; + /** + * @en Create a revolute joint. + * @param defStruct The definition of the revolute joint. + * @returns The created revolute joint. + * @zh 创建旋转关节。 + * @param defStruct 旋转关节定义。 + * @returns 创建的旋转关节。 + */ + create_RevoluteJoint(defStruct: physics2D_RevoluteJointDef): any; + /** + * @en Create a motor joint. + * @param defStruct The definition of the motor joint. + * @returns The created motor joint. + * @zh 创建马达关节。 + * @param defStruct 马达关节定义。 + * @returns 创建的马达关节。 + */ + create_MotorJoint(defStruct: physics2D_MotorJointDef): any; + /** + * @en Set the linear offset of a motor joint. + * @param joint The motor joint. + * @param x The x-coordinate of the linear offset. + * @param y The y-coordinate of the linear offset. + * @zh 设置马达关节的线性偏移量。 + * @param joint 马达关节。 + * @param x 线性偏移量的x坐标。 + * @param y 线性偏移量的y坐标。 + */ + set_MotorJoint_linearOffset(joint: any, x: number, y: number): void; + /** + * @en Set the angular offset of a motor joint. + * @param joint The motor joint. + * @param angular The angular offset. + * @zh 设置马达关节的角度偏移量。 + * @param joint 马达关节。 + * @param angular 角度偏移量。 + */ + set_MotorJoint_SetAngularOffset(joint: any, angular: number): void; + /** + * @en Set the maximum force of a motor joint. + * @param joint The motor joint. + * @param maxForce The maximum force. + * @zh 设置马达关节的最大力。 + * @param joint 马达关节。 + * @param maxForce 最大力。 + */ + set_MotorJoint_SetMaxForce(joint: any, maxForce: number): void; + /** + * @en Set the maximum torque of a motor joint. + * @param joint The motor joint. + * @param maxTorque The maximum torque. + * @zh 设置马达关节的最大扭矩。 + * @param joint 马达关节。 + * @param maxTorque 最大扭矩。 + */ + set_MotorJoint_SetMaxTorque(joint: any, maxTorque: number): void; + /** + * @en Set the correction factor of a motor joint. + * @param joint The motor joint. + * @param correctionFactor The correction factor. + * @zh 设置马达关节的校正因子。 + * @param joint 马达关节。 + * @param correctionFactor 校正因子。 + */ + set_MotorJoint_SetCorrectionFactor(joint: any, correctionFactor: number): void; + /** + * @en Create a prismatic joint. + * @param def The definition of the prismatic joint. + * @returns The created prismatic joint. + * @zh 创建平移关节。 + * @param def 平移关节定义。 + * @returns 创建的平移关节。 + */ + create_PrismaticJoint(def: physics2D_PrismaticJointDef): any; + /** + * @en Create a box collider shape. + * @returns The created box collider shape. + * @zh 创建盒子碰撞器形状。 + * @returns 创建的盒子碰撞器形状。 + */ + create_boxColliderShape(): any; + /** + * @en Set the shape of a box collider as a box. + * @param shape The box collider shape. + * @param width The width of the box. + * @param height The height of the box. + * @param pos The position of the box. + * @param scaleX The horizontal scale of the box. + * @param scaleY The vertical scale of the box. + * @zh 将盒子碰撞器的形状设置为盒子。 + * @param shape 盒子碰撞器形状。 + * @param width 盒子的宽度。 + * @param height 盒子的高度。 + * @param pos 盒子的位置。 + * @param scaleX 盒子的水平缩放。 + * @param scaleY 盒子的垂直缩放。 + */ + set_collider_SetAsBox(shape: any, width: number, height: number, pos: IV2, scaleX: number, scaleY: number): void; + /** + * @en Create a chain shape. + * @returns The created chain shape. + * @zh 创建链条形状。 + * @returns 创建的链条形状。 + */ + create_ChainShape(): any; + /** + * @en Set the data of a chain shape. + * @param shape The chain shape. + * @param x The x-coordinate of the chain shape's position. + * @param y The y-coordinate of the chain shape's position. + * @param arr The vertex array of the chain shape. + * @param loop Whether the chain shape is a loop. + * @param scaleX The horizontal scale of the chain shape. + * @param scaleY The vertical scale of the chain shape. + * @zh 设置链条形状的数据。 + * @param shape 链条形状。 + * @param x 链条形状的位置的x坐标。 + * @param y 链条形状的位置的y坐标。 + * @param arr 链条形状的顶点数组。 + * @param loop 链条形状是否为循环。 + * @param scaleX 链条形状的水平缩放。 + * @param scaleY 链条形状的垂直缩放。 + */ + set_ChainShape_data(shape: any, x: number, y: number, arr: number[], loop: boolean, scaleX: number, scaleY: number): void; + /** + * @en Create a circle shape. + * @returns The created circle shape. + * @zh 创建圆形形状。 + * @returns 创建的圆形形状。 + */ + create_CircleShape(): any; + /** + * @en Set the radius of a circle shape. + * @param shape The circle shape. + * @param radius The radius of the circle shape. + * @param scale The scale of the circle shape. + * @zh 设置圆形形状的半径。 + * @param shape 圆形形状。 + * @param radius 圆形形状的半径。 + * @param scale 圆形形状的缩放。 + */ + set_CircleShape_radius(shape: any, radius: number, scale: number): void; + /** + * @en Set the position of a circle shape. + * @param shape The circle shape. + * @param x The x-coordinate of the circle shape's position. + * @param y The y-coordinate of the circle shape's position. + * @param scale The scale of the circle shape. + * @zh 设置圆形形状的位置。 + * @param shape 圆形形状。 + * @param x 圆形形状的位置的x坐标。 + * @param y 圆形形状的位置的y坐标。 + * @param scale 圆形形状的缩放。 + */ + set_CircleShape_pos(shape: any, x: number, y: number, scale: number): void; + /** + * @en Create an edge shape. + * @returns The created edge shape. + * @zh 创建边缘形状。 + * @returns 创建的边缘形状。 + */ + create_EdgeShape(): any; + /** + * @en Set the data of an edge shape. + * @param shape The edge shape. + * @param x The x-coordinate of the edge shape's position. + * @param y The y-coordinate of the edge shape's position. + * @param arr The vertex array of the edge shape. + * @param scaleX The horizontal scale of the edge shape. + * @param scaleY The vertical scale of the edge shape. + * @zh 设置边缘形状的数据。 + * @param shape 边缘形状。 + * @param x 边缘形状的位置的x坐标。 + * @param y 边缘形状的位置的y坐标。 + * @param arr 边缘形状的顶点数组。 + * @param scaleX 边缘形状的水平缩放。 + * @param scaleY 边缘形状的垂直缩放。 + */ + set_EdgeShape_data(shape: any, x: number, y: number, arr: number[], scaleX: number, scaleY: number): void; + /** + * @en Create a polygon shape. + * @returns The created polygon shape. + * @zh 创建多边形形状。 + * @returns 创建的多边形形状。 + */ + create_PolygonShape(): any; + /** + * @en Set the data of a polygon shape. + * @param shape The polygon shape. + * @param x The x-coordinate of the polygon shape's position. + * @param y The y-coordinate of the polygon shape's position. + * @param arr The vertex array of the polygon shape. + * @param scaleX The horizontal scale of the polygon shape. + * @param scaleY The vertical scale of the polygon shape. + * @zh 设置多边形形状的数据。 + * @param shape 多边形形状。 + * @param x 多边形形状的位置的x坐标。 + * @param y 多边形形状的位置的y坐标。 + * @param arr 多边形形状的顶点数组。 + * @param scaleX 多边形形状的水平缩放。 + * @param scaleY 多边形形状的垂直缩放。 + */ + set_PolygonShape_data(shape: any, x: number, y: number, arr: number[], scaleX: number, scaleY: number): void; + /** + * @en Create a fixture definition. + * @param fixtureDef The fixture definition. + * @returns The created fixture definition. + * @zh 创建夹具定义。 + * @param fixtureDef 夹具定义。 + * @returns 创建的夹具定义。 + */ + createFixtureDef(fixtureDef: FixtureBox2DDef): any; + /** + * @en Set the group index of a fixture definition. + * @param def The fixture definition. + * @param groupIndex The group index. + * @zh 设置夹具定义的组索引。 + * @param def 夹具定义。 + * @param groupIndex 组索引。 + */ + set_fixtureDef_GroupIndex(def: any, groupIndex: number): void; + /** + * @en Set the category bits of a fixture definition. + * @param def The fixture definition. + * @param categoryBits The category bits. + * @zh 设置夹具定义的类别位。 + * @param def 夹具定义。 + * @param categoryBits 类别位。 + */ + set_fixtureDef_CategoryBits(def: any, categoryBits: number): void; + /** + * @en Set the mask bits of a fixture definition. + * @param def The fixture definition. + * @param maskbits The mask bits. + * @zh 设置夹具定义的掩码位。 + * @param def 夹具定义。 + * @param maskbits 掩码位。 + */ + set_fixtureDef_maskBits(def: any, maskbits: number): void; + /** + * @en Create a fixture by body and definition. + * @param body The body. + * @param fixtureDef The fixture definition. + * @zh 通过物体和定义创建夹具。 + * @param body 物体。 + * @param fixtureDef 夹具定义。 + */ + createfixture(body: any, fixtureDef: any): any; + /** + * @en Set the collider of a fixture. + * @param fixture The fixture. + * @param instance The collider instance. + * @zh 设置夹具的碰撞器。 + * @param fixture 夹具。 + * @param instance 碰撞器实例。 + */ + set_fixture_collider(fixture: any, instance: ColliderBase): void; + /** + * @en Get the body of a fixture. + * @param fixture The fixture. + * @returns The body of the fixture. + * @zh 获取夹具的物体。 + * @param fixture 夹具。 + * @returns 夹具的物体。 + */ + get_fixture_body(fixture: any): any; + /** + * @en Destroy a fixture of a rigid body. + * @param body The rigid body. + * @param fixture The fixture to destroy. + * @zh 销毁刚体的一个夹具。 + * @param body 刚体。 + * @param fixture 要销毁的夹具。 + */ + rigidBody_DestroyFixture(body: any, fixture: any): void; + /** + * @en Create a rigid body definition. + * @param rigidbodyDef The rigid body definition. + * @returns The created rigid body. + * @zh 创建刚体定义。 + * @param rigidbodyDef 刚体定义。 + * @returns 创建的刚体。 + */ + rigidBodyDef_Create(rigidbodyDef: RigidBody2DInfo): any; + /** + * @en Get the position of a rigid body. + * @param body The rigid body. + * @param v2 The vector to store the position. + * @zh 获取刚体的位置。 + * @param body 刚体。 + * @param v2 用于存储位置的向量。 + */ + get_RigidBody_Position(body: any, v2: Vector2): void; + /** + * @en Get the angle of a rigid body. + * @param body The rigid body. + * @returns The angle of the rigid body. + * @zh 获取刚体的角度。 + * @param body 刚体。 + * @returns 刚体的角度。 + */ + get_RigidBody_Angle(body: any): number; + /** + * @en Set the enable of a rigid body. + * @param body The rigid body. + * @zh 设置刚体是否激活。 + * @param body 刚体。 + */ + set_RigibBody_Enable(body: any, enable: boolean): void; + /** + * @en Set the transform of a rigid body. + * @param body The rigid body. + * @param x The x-coordinate of the position. + * @param y The y-coordinate of the position. + * @param angle The angle of the rigid body. + * @zh 设置刚体的变换。 + * @param body 刚体。 + * @param x 位置的x坐标。 + * @param y 位置的y坐标。 + * @param angle 刚体的角度。 + */ + set_RigibBody_Transform(body: any, x: number, y: number, angle: any): void; + /** + * @en Get the world point of a rigid body. + * @param body The rigid body. + * @param x The x-coordinate of the local point. + * @param y The y-coordinate of the local point. + * @returns The world point. + * @zh 获取刚体的世界坐标点。 + * @param body 刚体。 + * @param x 局部坐标的x坐标。 + * @param y 局部坐标的y坐标。 + * @returns 世界坐标点。 + */ + get_rigidBody_WorldPoint(body: any, x: number, y: number): IV2; + /** + * @en Get the local point of a rigid body. + * @param body The rigid body. + * @param x The x-coordinate of the world point. + * @param y The y-coordinate of the world point. + * @returns The local point. + * @zh 获取刚体的本地坐标点。 + * @param body 刚体。 + * @param x 世界坐标的x坐标。 + * @param y 世界坐标的y坐标。 + * @returns 本地坐标点。 + */ + get_rigidBody_LocalPoint(body: any, x: number, y: number): IV2; + /** + * @en Apply a force to a rigid body. + * @param body The rigid body. + * @param force The force to apply. + * @param position The position to apply the force. + * @zh 对刚体施加力。 + * @param body 刚体。 + * @param force 施加的力。 + * @param position 施加力的位置。 + */ + rigidBody_applyForce(body: any, force: IV2, position: IV2): void; + /** + * @en Apply a force to the center of a rigid body. + * @param body The rigid body. + * @param force The force to apply. + * @zh 对刚体的中心施加力。 + * @param body 刚体。 + * @param force 施加的力。 + */ + rigidBody_applyForceToCenter(body: any, force: IV2): void; + /** + * @en Apply a linear impulse to a rigid body. + * @param body The rigid body. + * @param impulse The linear impulse to apply. + * @param position The position to apply the impulse. + * @zh 对刚体施加线性冲量。 + * @param body 刚体。 + * @param impulse 施加的线性冲量。 + * @param position 施加线性冲量的位置。 + */ + rigidbody_ApplyLinearImpulse(body: any, impulse: IV2, position: IV2): void; + /** + * @en Apply a linear impulse to the center of a rigid body. + * @param body The rigid body. + * @param impulse The linear impulse to apply. + * @zh 对刚体的中心施加线性冲量。 + * @param body 刚体。 + * @param impulse 施加的线性冲量。 + */ + rigidbody_ApplyLinearImpulseToCenter(body: any, impulse: IV2): void; + /** + * @en Apply torque to a rigid body to make it rotate. + * @param body The rigid body. + * @param torque The torque to apply. + * @zh 对刚体施加扭矩,使其旋转。 + * @param body 刚体。 + * @param torque 施加的扭矩。 + */ + rigidbody_applyTorque(body: any, torque: number): void; + /** + * @en The velocity to set, e.g., {x: 10, y: 10}. + * @param body The rigid body. + * @param velocity The velocity to set. + * @zh 设置速度,比如{x:10,y:10} + * @param body 刚体。 + * @param velocity 速度。 + */ + set_rigidbody_Velocity(body: any, velocity: IV2): void; + /** + * @en Set the awake state of a rigid body. + * @param body The rigid body. + * @param awake The awake state. + * @zh 设置刚体的唤醒状态。 + * @param body 刚体。 + * @param awake 唤醒状态。 + */ + set_rigidbody_Awake(body: any, awake: boolean): void; + /** + * @en Get the mass of a rigid body. + * @param body The rigid body. + * @returns The mass of the rigid body. + * @zh 获取刚体的质量。 + * @param body 刚体。 + * @returns 刚体的质量。 + */ + get_rigidbody_Mass(body: any): number; + /** + * @en Set the mass of a rigid body. + * @param body The rigid body. + * @param mass The mass to set. + * @param centerofMass The center of mass to set. + * @param inertia The inertia to set. + * @zh 设置刚体的质量。 + * @param body 刚体。 + * @param mass 要设置的质量。 + * @param centerofMass 要设置的质心。 + * @param inertia 要设置的惯性张量。 + */ + set_rigidbody_Mass(body: any, massValue: number, centerofMass: IV2, inertiaValue: number): void; + /** + * @en Get the offset of the center of mass relative to the node (0, 0) point. + * @param body The rigid body. + * @returns The offset of the center of mass. + * @zh 获取质心相对于节点 (0, 0) 点的位置偏移。 + * @param body 刚体。 + * @returns 质心相对于节点 (0, 0) 点的位置偏移。 + */ + get_rigidBody_Center(body: any): IV2; + /** + * @en Get the inertia tensor of the rigid body. + * @param body The rigid body. + * @returns The inertia tensor of the rigid body. + * @zh 获取刚体的转动张量 + * @param body 刚体。 + * @returns 刚体的转动张量。 + */ + get_rigidbody_Inertia(body: any): number; + /** + * @en Check if a rigid body is awake. + * @param body The rigid body. + * @returns True if the rigid body is awake, false otherwise. + * @zh 检查刚体是否处于唤醒状态。 + * @param body 刚体。 + * @returns 若刚体处于唤醒状态,则返回true,否则返回false。 + */ + get_rigidBody_IsAwake(body: any): any; + /** + * @en Get the world coordinates of the center of mass relative to the Physics.I.worldRoot node. + * @param body The rigid body. + * @returns The world coordinates of the center of mass. + * @zh 获取质心相对于 Physics.I.worldRoot 节点的世界坐标。 + * @param body 刚体。 + * @returns 质心相对于 Physics.I.worldRoot 节点的世界坐标。 + */ + get_rigidBody_WorldCenter(body: any): IV2; + /** + * @en Set the type of a rigid body. + * @param body The rigid body. + * @param value The type of the rigid body. + * @zh 设置刚体的类型。 + * @param body 刚体。 + * @param value 刚体的类型。 + */ + set_rigidBody_type(body: any, value: string): void; + /** + * @en Set the gravity scale of a rigid body. + * @param body The rigid body. + * @param value The gravity scale. + * @zh 设置刚体的重力缩放因子。 + * @param body 刚体。 + * @param value 重力缩放因子。 + */ + set_rigidBody_gravityScale(body: any, value: number): void; + /** + * @en Set whether a rigid body allows rotation. + * @param body The rigid body. + * @param value True if the rigid body allows rotation, false otherwise. + * @zh 设置刚体是否允许旋转。 + * @param body 刚体。 + * @param value 若为true,则刚体允许旋转;若为false,则刚体不允许旋转。 + */ + set_rigidBody_allowRotation(body: any, value: boolean): void; + /** + * @en Set whether a rigid body allows sleeping. + * @param body The rigid body. + * @param value True if the rigid body allows sleeping, false otherwise. + * @zh 设置刚体是否允许休眠。 + * @param body 刚体。 + * @param value 若为true,则刚体允许休眠;若为false,则刚体不允许休眠。 + */ + set_rigidBody_allowSleep(body: any, value: boolean): void; + /** + * @en Set the angular damping of a rigid body. + * @param body The rigid body. + * @param value The angular damping. + * @zh 设置刚体的角阻尼。 + * @param body 刚体。 + * @param value 角阻尼。 + */ + set_rigidBody_angularDamping(body: any, value: number): void; + /** + * @en Get the angular velocity of a rigid body. + * @param body The rigid body. + * @returns The angular velocity. + * @zh 获取刚体的角速度。 + * @param body 刚体。 + * @returns 角速度。 + */ + get_rigidBody_angularVelocity(body: any): number; + /** + * @en Set the angular velocity of a rigid body. + * @param body The rigid body. + * @param value The angular velocity. + * @zh 设置刚体的角速度。 + * @param body 刚体。 + * @param value 角速度。 + */ + set_rigidBody_angularVelocity(body: any, value: number): void; + /** + * @en Set the linear damping of a rigid body. + * @param body The rigid body. + * @param value The linear damping. + * @zh 设置刚体的线性阻尼。 + * @param body 刚体。 + * @param value 线性阻尼。 + */ + set_rigidBody_linearDamping(body: any, value: number): void; + /** + * @en Get the linear velocity of a rigid body. + * @param body The rigid body. + * @returns The linear velocity. + * @zh 获取刚体的线性速度。 + * @param body 刚体。 + * @returns 线性速度。 + */ + get_rigidBody_linearVelocity(body: any): IV2; + /** + * @en Set the linear velocity of a rigid body. + * @param body The rigid body. + * @param value The linear velocity. + * @zh 设置刚体的线性速度。 + * @param body 刚体。 + * @param value 线性速度。 + */ + set_rigidBody_linearVelocity(body: any, value: IV2): void; + /** + * @en Set whether a rigid body is a bullet. + * @param body The rigid body. + * @param value True if the rigid body is a bullet, false otherwise. + * @zh 设置刚体是否为子弹。 + * @param body 刚体。 + * @param value 若为true,则刚体为子弹;若为false,则刚体不是子弹。 + */ + set_rigidBody_bullet(body: any, value: boolean): void; + /** + * @en Reset the mass data of a rigid body. + * @param body The rigid body. + * @zh 重置刚体的质量数据。 + * @param body 刚体。 + */ + retSet_rigidBody_MassData(body: any): void; + } + interface IPhysiscs2DFactory { + } + /** + * @en Distance Joint: A joint that maintains a fixed distance between two points on two bodies. + * @zh 距离关节描述了两个刚体锚点之间的距离,并且最终会保持着这个约束的距离。 + */ + class DistanceJoint extends JointBase { + /** + * @en The joint's own rigid body, effective only on the first setting. + * @zh [首次设置有效]关节的自身刚体。 + */ + selfBody: RigidBody; + /** + * @en The joint's connected rigid body, which can be unspecified and defaults to an empty rigid body at the top left corner, effective only on the first setting. + * @zh [首次设置有效]关节的连接刚体,可不设置,默认为左上角空刚体。 + */ + otherBody: RigidBody; + /** + * @en The self body's anchor point, which is the offset relative to the top left corner of the own rigid body, effective only on the first setting. + * @zh [首次设置有效]自身刚体链接点,是相对于自身刚体的左上角位置偏移。 + */ + selfAnchor: any[]; + /** + * @en The connected body's anchor point, which is the offset relative to the top left corner of the other body, effective only on the first setting. + * @zh [首次设置有效]链接刚体链接点,是相对于otherBody的左上角位置偏移。 + */ + otherAnchor: any[]; + /** + * @en Whether the two rigid bodies can collide with each other, default is false, effective only on the first setting. + * @zh [首次设置有效]两个刚体是否可以发生碰撞,默认为false。 + */ + collideConnected: boolean; + /** + * @en The target rest length of the constraint. + * @zh 约束的目标静止长度。 + */ + get length(): number; + set length(value: number); + /** + * @en The minimum length of the constraint. + * @zh 约束的最小长度。 + */ + get minLength(): number; + set minLength(value: number); + /** + * @en The maximum length of the constraint. + * @zh 约束的最大长度。 + */ + get maxLength(): number; + set maxLength(value: number); + /** + * @en The vibration frequency of a spring system indicates how quickly it completes one oscillation cycle. A higher value signifies a higher frequency, meaning it completes one oscillation cycle in a shorter time. Consequently, the oscillation amplitude is relatively smaller, and the oscillation speed is faster. Conversely, a lower frequency results in a larger oscillation amplitude and slower oscillation speed. + * @zh 弹簧系统的振动频率,值越大表示振动频率越高,意味着在更短的时间内完成一个振动周期,所以,振动幅度相对较小,振动速度更快。反之,振动幅度相对较大,振动速度更慢。 + */ + get frequency(): number; + set frequency(value: number); + /** + * @en The damping ratio of the body when returning to the node, which is recommended to be between 0 and 1. + * @zh 刚体在回归到节点过程中受到的阻尼比,建议取值在 0 到 1 之间。 + */ + get damping(): number; + set damping(value: number); + /** + * @en The current length of the joint. + * @zh 关节的当前长度。 + */ + get jointLength(): number; + /** + * @en Called when the object is being destroyed. This method removes event listeners to prevent memory leaks. + * @zh 在对象被销毁时调用。此方法移除事件监听器以防止内存泄漏。 + */ + onDestroy(): void; + } + /** + * @en Gear joint: used to simulate the constraint relationship between two gears. When a gear rotates, the momentum generated has two output modes: one is the angular velocity of the gear itself, and the other is the linear velocity on the gear surface + * @zh 齿轮关节:用来模拟两个齿轮间的约束关系,齿轮旋转时,产生的动量有两种输出方式,一种是齿轮本身的角速度,另一种是齿轮表面的线速度 + */ + class GearJoint extends JointBase { + /** + * @en The first joint to be connected, which can be a RevoluteJoint or a PrismaticJoint, effective only on the first setting. + * @zh [首次设置有效]要绑定的第一个关节,类型可以是旋转关节(RevoluteJoint)或者棱形关节(PrismaticJoint)。 + */ + joint1: RevoluteJoint | PrismaticJoint; + /** + * @en The second joint to be connected, which can be a RevoluteJoint or a PrismaticJoint, effective only on the first setting. + * @zh [首次设置有效]要绑定的第二个关节,类型可以是旋转关节(RevoluteJoint)或者棱形关节(PrismaticJoint)。 + */ + joint2: RevoluteJoint | PrismaticJoint; + /** + * @en Specifies whether the two connected bodies should collide with each other. Default is false, effective only on the first setting. + * @zh [首次设置有效]两个刚体是否可以发生碰撞,默认为 false。 + */ + collideConnected: boolean; + /** + * @en The ratio of the angular velocities of the two gears. + * @zh 两个齿轮的角速度比例。 + */ + get ratio(): number; + set ratio(value: number); + } + /** + * @en Joint base class + * @zh 关节基类 + */ + class JointBase extends Component { + /** + * @readonly + * @en [read-only] Native joint object. + * @zh [只读]原生关节对象。 + */ + get joint(): any; + constructor(); + } + /** + * Box2D distance Joint def Struct + */ + class physics2D_DistancJointDef { + bodyA: any; + bodyB: any; + localAnchorA: Vector2; + localAnchorB: Vector2; + frequency: number; + dampingRatio: number; + collideConnected: boolean; + length: number; + maxLength: number; + minLength: number; + isLocalAnchor: boolean; + } + class physics2D_GearJointDef { + bodyA: any; + bodyB: any; + joint1: any; + joint2: any; + ratio: number; + collideConnected: boolean; + } + class physics2D_MotorJointDef { + bodyA: any; + bodyB: any; + linearOffset: Vector2; + angularOffset: number; + maxForce: number; + maxTorque: number; + correctionFactor: number; + collideConnected: boolean; + } + class physics2D_MouseJointJointDef { + bodyA: any; + bodyB: any; + maxForce: number; + frequency: number; + dampingRatio: number; + target: Vector2; + } + class physics2D_PrismaticJointDef { + bodyA: any; + bodyB: any; + anchor: Vector2; + axis: Vector2; + enableMotor: boolean; + motorSpeed: number; + maxMotorForce: number; + enableLimit: boolean; + lowerTranslation: number; + upperTranslation: number; + collideConnected: boolean; + } + class physics2D_PulleyJointDef { + bodyA: any; + bodyB: any; + groundAnchorA: Vector2; + groundAnchorB: Vector2; + localAnchorA: Vector2; + localAnchorB: Vector2; + ratio: number; + collideConnected: boolean; + } + class physics2D_RevoluteJointDef { + bodyA: any; + bodyB: any; + anchor: Vector2; + enableMotor: boolean; + motorSpeed: number; + maxMotorTorque: number; + enableLimit: boolean; + lowerAngle: number; + upperAngle: number; + collideConnected: boolean; + } + class physics2D_WeldJointDef { + bodyA: any; + bodyB: any; + anchor: Vector2; + frequency: number; + dampingRatio: number; + collideConnected: boolean; + } + class physics2D_WheelJointDef { + bodyA: any; + bodyB: any; + anchor: Vector2; + axis: Vector2; + enableMotor: boolean; + motorSpeed: number; + maxMotorTorque: number; + enableLimit: boolean; + lowerTranslation: number; + upperTranslation: number; + frequency: number; + dampingRatio: number; + collideConnected: boolean; + } + /** + * @en Motor Joint: Allows specifying the relative position and angle between two rigid bodies, and then attempts to achieve these targets by applying forces and torques, striving to maintain this configuration. + * @zh 马达关节:允许指定两个刚体间的相对位置和角度,然后尝试通过施加力和扭矩来达到这些目标,并会尽力维持这样的配置。 + */ + class MotorJoint extends JointBase { + /** + * @en The self body of the joint, effective only on the first setting. + * @zh [首次设置有效]关节的自身刚体。 + */ + selfBody: RigidBody; + /** + * @en The other body connected by the joint, effective only on the first setting. + * @zh [首次设置有效]关节的连接刚体。 + */ + otherBody: RigidBody; + /** + * @en Specifies whether the two connected bodies should collide with each other. Default is false, effective only on the first setting. + * @zh [首次设置有效]两个刚体是否可以发生碰撞,默认为 false。 + */ + collideConnected: boolean; + /** + * @en The offset from the other body's coordinates, which is also the target position for the self body. + * @zh 基于 otherBody 坐标位置的偏移量,也是 selfBody 的目标位置。 + */ + get linearOffset(): any[]; + set linearOffset(value: any[]); + /** + * @en The angular offset based on the other body, which is also the target angle for the self body. + * @zh 基于 otherBody 的角度偏移量,也是 selfBody 的目标角度。 + */ + get angularOffset(): number; + set angularOffset(value: number); + /** + * @en The maximum force applied by the motor joint when the selfBody deviates from the target position. When the force applied by the motor joint exceeds the maximum force, the engine automatically limits the force to ensure it does not exceed the specified maximum value. + * @zh 当 selfBody 偏离目标位置时,马达关节所施加的最大作用力。当马达关节施加的力超过最大力时,引擎会自动截断力的大小,使其不超过设定的最大值。 + */ + get maxForce(): number; + set maxForce(value: number); + /** + * @en The maximum torque is used to ensure that when the torque applied by the motor joint exceeds the maximum torque value, the engine automatically limits the torque to not exceed the specified maximum value. + * @zh 最大扭矩用于当马达关节施加的扭矩超过最大扭矩值时,引擎会自动截断扭矩的大小,以确保不超过设定的最大值。 + */ + get maxTorque(): number; + set maxTorque(value: number); + /** + * @en The factor of easing when the self body moves towards the target position, with a value from 0 to 1, the larger the value, the faster the speed. + * @zh selfBody 向目标位置移动时的缓动因子,取值 0~1,值越大速度越快。 + */ + get correctionFactor(): number; + set correctionFactor(value: number); + } + /** + * @en Mouse joint: A physics constraint used to simulate the user dragging an object with the mouse. It typically allows a rigid body to follow the mouse cursor's movement while also being influenced by other physics effects such as collisions and gravity. + * @zh 鼠标关节:一种用来模拟用户用鼠标拖拽物体的物理约束。它通常会使得一个刚体可以跟随鼠标移动,但同时也能受到其他物理效果如碰撞、重力等的影响。 + */ + class MouseJoint extends JointBase { + /** + * @en The self rigid body of a joint, effective only on the first setting. + * @zh [首次设置有效]关节的自身刚体。 + */ + selfBody: RigidBody; + /** + * @en The connection point of a joint is offset from the position of the upper left corner of its own rigid body. If not set, it is used as the connection point based on the mouse click point. Effective only on the first setting. + * @zh [首次设置有效]关节的链接点,是相对于自身刚体的左上角位置偏移,如果不设置,则根据鼠标点击点作为连接点。 + */ + anchor: any[]; + /** + * @en Used to limit the maximum force that the mouse joint can apply when attempting to move an object towards the mouse position, preventing excessive force that could lead to abnormal behavior or unnatural effects. + * @zh 用于限制鼠标关节试图将物体移向鼠标位置时所能施加的最大力量,避免力过大导致的异常行为或不自然的效果。 + */ + get maxForce(): number; + set maxForce(value: number); + /** + * @en The vibration frequency of the spring system, which can be considered as the spring's elasticity coefficient. The frequency should typically be less than half the time step frequency. + * @zh 弹簧系统的振动频率,可以视为弹簧的弹性系数,通常频率应该小于时间步长频率的一半。 + */ + get frequency(): number; + set frequency(value: number); + /** + * @en The damping ratio of the body when returning to the anchor, with a recommended value between 0 and 1. + * @zh 刚体在回归到节点过程中受到的阻尼比,建议取值在 0 到 1 之间。 + */ + get damping(): number; + set damping(value: number); + } + /** + * @en Translation joint: A movement joint allows two objects to move relative to each other along a specified axis, but it prevents relative rotation + * @zh 平移关节:移动关节允许两个物体沿指定轴相对移动,它会阻止相对旋转 + */ + class PrismaticJoint extends JointBase { + /** + * @en The rigid body to which the joint is attached. This setting is effective only on the first assignment. + * @zh [首次设置有效]关节的自身刚体。 + */ + selfBody: RigidBody; + /** + * @en The connected rigid body of the joint. It can be left unspecified, in which case it defaults to an empty rigid body at the top left corner. This setting is effective only on the first assignment. + * @zh [首次设置有效]关节的连接刚体,可不设置,默认为左上角空刚体。 + */ + otherBody: RigidBody; + /** + * @en The anchor point of the joint, which is the offset relative to the top-left corner of the own rigid body. This setting is effective only on the first assignment. + * @zh [首次设置有效]关节的控制点,是相对于自身刚体左上角位置的偏移。 + */ + anchor: any[]; + /** + * @en The angle describing the axis of motion, e.g., 0 degrees represents movement to the right along the X-axis. This setting is effective only on the first assignment. + * @zh [首次设置有效]描述运动方向的角度,例如 0 度表示沿 X 轴向右移动。 + */ + angle: number; + /** + * @en Specifies whether the two connected rigid bodies should collide with each other. Default is false. This setting is effective only on the first assignment. + * @zh [首次设置有效]两个刚体是否可以发生碰撞,默认为 false。 + */ + collideConnected: boolean; + /** + * @en Whether the motor is enabled to drive the connected body. + * @zh 是否开启马达,开启马达可使目标刚体运动。 + */ + get enableMotor(): boolean; + set enableMotor(value: boolean); + /** + * @en The maximum speed that the motor can achieve along the axis when the motor is enabled. + * @zh 启用马达后,在axis坐标轴上移动可以达到的最大速度。 + */ + get motorSpeed(): number; + set motorSpeed(value: number); + /** + * @en The maximum force that can be applied by the motor when it is enabled. + * @zh 启用马达后,可以施加的最大作用力。 + */ + get maxMotorForce(): number; + set maxMotorForce(value: number); + /** + * @en Whether to constrain the movement range of the rigid body. + * @zh 是否对刚体的移动范围加以约束。 + */ + get enableLimit(): boolean; + set enableLimit(value: boolean); + /** + * @en The lower limit of the body's movement range when the limit is enabled, as an offset from the anchor. + * @zh 启用限制后,刚体移动范围的下限,是距离anchor的偏移量。 + */ + get lowerTranslation(): number; + set lowerTranslation(value: number); + /** + * @en The upper limit of the body's movement range when the limit is enabled, as an offset from the anchor. + * @zh 启用限制后,刚体移动范围的上限,是距离anchor的偏移量。 + */ + get upperTranslation(): number; + set upperTranslation(value: number); + /** + * @deprecated + * @en The axis of motion, which is a vector describing the direction of movement. + * @zh 启用约束后,刚体移动范围的上限,是距离anchor的偏移量 + */ + get axis(): any; + set axis(value: any); + } + /** + * @en PulleyJoint class, which connects two bodies to the ground and to each other, when one body rises, the other descends, simulating the behavior of a pulley system. + * @zh 滑轮关节:它将两个物体接地(ground)并彼此连接,当一个物体上升,另一个物体就会下降 + */ + class PulleyJoint extends JointBase { + /** + * @en The rigid body that is attached to the joint. This setting is effective only on the first assignment. + * @zh [首次设置有效]与关节相连的自身刚体。 + */ + selfBody: RigidBody; + /** + * @en The connected rigid body. This setting is effective only on the first assignment. + * @zh [首次设置有效]连接到关节的另一个刚体。 + */ + otherBody: RigidBody; + /** + * @en The anchor point of the rigid body relative to its top-left corner. This setting is effective only on the first assignment. + * @zh [首次设置有效]自身刚体的链接点,是相对于自身刚体左上角位置的偏移。 + */ + selfAnchor: any[]; + /** + * @en The anchor point of the connected body relative to its top-left corner. This setting is effective only on the first assignment. + * @zh [首次设置有效]连接刚体的链接点,是相对于otherBody左上角位置的偏移。 + */ + otherAnchor: any[]; + /** + * @en The point on the pulley connected to the self anchor, relative to the top-left corner of the rigid body. This setting is effective only on the first assignment. + * @zh [首次设置有效]滑轮上与自身刚体的 selfAnchor 相连的点,是相对于自身刚体左上角位置的偏移。 + */ + selfGroundPoint: any[]; + /** + * @en The point on the pulley connected to the other anchor, relative to the top-left corner of the connected body. This setting is effective only on the first assignment. + * @zh [首次设置有效]滑轮上与连接刚体的 otherAnchor 相连的点,是相对于对方刚体左上角位置的偏移。 + */ + otherGroundPoint: any[]; + /** + * @en The ratio of movement distances between the two connected rigid bodies. This setting is effective only on the first assignment. + * @zh [首次设置有效]两个刚体的移动距离比率。 + */ + ratio: number; + /** + * @en Specifies whether the two connected rigid bodies can collide with each other. Default is false. This setting is effective only on the first assignment. + * @zh [首次设置有效]两个连接的刚体是否可以相互碰撞,默认为 false。 + */ + collideConnected: boolean; + } + /** + * @en Rotating joint forces two objects to share an anchor point, and the two objects rotate relative to each other + * @zh 旋转关节强制两个物体共享一个锚点,两个物体相对旋转 + */ + class RevoluteJoint extends JointBase { + /** + * @en The rigid body that is locally attached to the joint. This setting is effective only on the first assignment. + * @zh [首次设置有效]与关节直接相连的自身刚体。 + */ + selfBody: RigidBody; + /** + * @en The connected rigid body. It can be optionally not set. This setting is effective only on the first assignment. + * @zh [首次设置有效]与关节连接的另一个刚体,可以不设置。 + */ + otherBody: RigidBody; + /** + * @en Link points of joints, it is offset from the position of the upper left corner of its own rigid body. This setting is effective only on the first assignment. + * @zh [首次设置有效]关节的链接点,是相对于自身刚体的左上角位置偏移。 + */ + anchor: any[]; + /** + * @en Specifies whether the two connected rigid bodies can collide with each other. Default is false. This setting is effective only on the first assignment. + * @zh [首次设置有效]两个连接的刚体是否可以相互碰撞,默认为 false。 + */ + collideConnected: boolean; + /** + * @en Enables or disables the motor, which when enabled, drives the rotation of the target body. + * @zh 启用或禁用马达,启用后可以驱动目标刚体的旋转。 + */ + get enableMotor(): boolean; + set enableMotor(value: boolean); + /** + * @en The maximum rotational speed that can be achieved when the motor is enabled. + * @zh 启用马达后可以达到的最大旋转速度。 + */ + get motorSpeed(): number; + set motorSpeed(value: number); + /** + * @en The maximum torque that can be applied when the motor is enabled. Insufficient torque may result in no rotation. + * @zh 启用马达后可以施加的最大扭距。如果最大扭矩太小,可能导致不旋转。 + */ + get maxMotorTorque(): number; + set maxMotorTorque(value: number); + /** + * @en Whether to constrain the rotation range of the rigid body + * @zh 是否对刚体的旋转范围加以约束 + */ + get enableLimit(): boolean; + set enableLimit(value: boolean); + /** + * @en The lower limit angle of the rotation range when the limit is enabled. + * @zh 启用限制后,刚体旋转范围的下限角度。 + */ + get lowerAngle(): number; + set lowerAngle(value: number); + /** + * @en The upper limit angle of the rotation range when the limit is enabled. + * @zh 启用限制后,刚体旋转范围的上限角度。 + */ + get upperAngle(): number; + set upperAngle(value: number); + } + /** + * @en WeldJoint class, used to constrain two bodies together so they cannot move relative to each other. The relative position and angle between the two bodies are fixed, making them appear as a single rigid body. + * @zh 焊接关节:焊接关节的用途是使两个物体不能相对运动,受到关节的限制,两个刚体的相对位置和角度都保持不变,看上去像一个整体 + */ + class WeldJoint extends JointBase { + /** + * @en The rigid body that is locally attached to the joint. This setting is effective only on the first assignment. + * @zh [首次设置有效]与关节直接相连的自身刚体。 + */ + selfBody: RigidBody; + /** + * @en The connected rigid body. This setting is effective only on the first assignment. + * @zh [首次设置有效]与关节连接的另一个刚体。 + */ + otherBody: RigidBody; + /** + * @en Link points of joints, it is offset from the position of the upper left corner of its own rigid body. This setting is effective only on the first assignment. + * @zh [首次设置有效]关节的链接点,是相对于自身刚体的左上角位置偏移。 + */ + anchor: any[]; + /** + * @en Specifies whether the two connected rigid bodies can collide with each other. Default is false. This setting is effective only on the first assignment. + * @zh [首次设置有效]两个连接的刚体是否可以相互碰撞,默认为 false。 + */ + collideConnected: boolean; + /** + * @en The vibration frequency of the spring system, which can be considered as the spring's elasticity coefficient.The frequency should typically be less than half the time step frequency. + * @zh 弹簧系统的振动频率,可以视为弹簧的弹性系数。通常频率应该小于时间步长频率的一半。 + */ + get frequency(): number; + set frequency(value: number); + /** + * @en The damping ratio of the body when returning to the anchor point, with a recommended value range of 0 to 1. + * @zh 刚体在回归到节点过程中受到的阻尼比,建议取值0~1。 + */ + get damping(): number; + set damping(value: number); + } + /** + * @en WheelJoint: Allows an object to rotate around a fixed axis relative to another object, while also providing spring-like resistance along the axis for bouncing back. + * @zh 轮子关节:允许一个物体在另一个物体上以固定的轴向转动,同时还能沿着轴向弹簧回弹。 + */ + class WheelJoint extends JointBase { + /** + * @en The rigid body that is locally attached to the joint. This setting is effective only on the first assignment. + * @zh [首次设置有效]与关节直接相连的自身刚体。 + */ + selfBody: RigidBody; + /** + * @en The connected rigid body. This setting is effective only on the first assignment. + * @zh [首次设置有效]与关节连接的另一个刚体。 + */ + otherBody: RigidBody; + /** + * @en Link points of joints, it is offset from the position of the upper left corner of its own rigid body. This setting is effective only on the first assignment. + * @zh [首次设置有效]关节的链接点,是相对于自身刚体的左上角位置偏移。。 + */ + anchor: any[]; + /** + * @en Specifies whether the two connected rigid bodies can collide with each other. Default is false. This setting is effective only on the first assignment. + * @zh [首次设置有效]两个连接的刚体是否可以相互碰撞,默认为 false。 + */ + collideConnected: boolean; + /** + * @deprecated + * [首次设置有效]一个向量值,用于定义弹性运动方向,即轮子在哪个方向可以如弹簧一样压缩和伸展,比如1,0是沿X轴向右,0,1是沿Y轴向下*/ + _axis: any[]; + /** + * @en An angle value that defines the direction of elastic motion, i.e., the direction in which the wheel can compress and extend like a spring. For example, 0 degrees is along the X-axis to the right, and 90 degrees is along the Y-axis downward. This setting is effective only on the first assignment. + * @zh [首次设置有效]一个角度值,用于定义弹性运动方向,即轮子在哪个方向可以如弹簧一样压缩和伸展,例如 0 度表示沿 X 轴正方向,90 度表示沿 Y 轴负方向。 + */ + angle: number; + /** + * @en The vibration frequency of the spring system, which can be considered as the spring's elasticity coefficient.The frequency should typically be less than half the time step frequency. + * @zh 弹簧系统的振动频率,可以视为弹簧的弹性系数。通常频率应小于时间步长频率的一半。 + */ + get frequency(): number; + set frequency(value: number); + /** + * @en The damping ratio that the body experiences when returning to the anchor point, with a recommended value range of 0 to 1. + * @zh 刚体在回归到锚点过程中受到的阻尼比,建议取值范围为 0 到 1。 + */ + get damping(): number; + set damping(value: number); + /** + * @en Whether the motor is enabled to drive the rotation of the connected body. + * @zh 是否启用马达以驱动连接刚体的旋转。 + */ + get enableMotor(): boolean; + set enableMotor(value: boolean); + /** + * @en The maximum rotational speed that can be achieved when the motor is enabled. + * @zh 启用马达后可以达到的最大旋转速度。 + */ + get motorSpeed(): number; + set motorSpeed(value: number); + /** + * @en The maximum torque that can be applied when the motor is enabled. Insufficient torque may result in no rotation. + * @zh 启用马达后可以施加的最大扭距。如果最大扭矩太小,可能导致不旋转。 + */ + get maxMotorTorque(): number; + set maxMotorTorque(value: number); + /** + * @en Whether the movement range of the connected body is limited. + * @zh 是否对连接刚体的移动范围加以约束。 + */ + get enableLimit(): boolean; + set enableLimit(value: boolean); + /** + * @en The lower limit of the movement range when the limit is enabled, as an offset from the anchor. + * @zh 启用约束后,刚体移动范围的下限,是距离锚点的偏移量。 + */ + get lowerTranslation(): number; + set lowerTranslation(value: number); + /** + * @en The upper limit of the movement range when the limit is enabled, as an offset from the anchor. + * @zh 启用约束后,刚体移动范围的上限,是距离锚点的偏移量。 + */ + get upperTranslation(): number; + set upperTranslation(value: number); + /** + * @deprecated + * 启用约束后,刚体移动范围的上限,是距离anchor的偏移量*/ + get axis(): any; + set axis(value: any); + } + /** + * @en 2D Physics Engine + * @zh 2D物理引擎 + */ + class Physics2D extends EventDispatcher { + /** + * @en Gets the global singleton instance of the Physics2D. + * @zh 获取全局的 Physics2D 单例。 + */ + static get I(): Physics2D; + _factory: IPhysiscs2DFactory; + /** + * @en whether to enable 2D phyiscs debug draw. + * @zh 是否启用2D物理绘制 + */ + set enableDebugDraw(enable: boolean); + /** + * @en Whether to draw the shape. + * @zh 是否绘制物理对象的形状。 + */ + set drawShape(enable: boolean); + /** + * @en Whether to draw the joints of physics objects. + * @zh 是否绘制物理对象的关节。 + */ + set drawJoint(enable: boolean); + /** + * @en Whether to draw the AABB of physics objects. + * @zh 是否绘制物理对象的包围盒。 + */ + set drawAABB(enable: boolean); + /** + * @en Whether to draw the collision pairs of the physics object. + * @zh 是否绘制物理对象碰撞对。 + */ + set drawPair(enable: boolean); + /** + * @en Whether to draw the center of mass of physics objects. + * @zh 是否绘制物理对象的质心。 + */ + set drawCenterOfMass(enable: boolean); + /** + * @en Whether the engine is allowed to sleep. Allowing the engine to sleep can improve stability and performance, but it usually comes at the cost of accuracy. + * @zh 引擎是否允许休眠。允许引擎休眠可以提高稳定性和性能,但通常会牺牲准确性。 + */ + get allowSleeping(): boolean; + set allowSleeping(value: boolean); + /** + * @en The gravity of the physics world. The default value is {x: 0, y: 9.8}. + * Modifying the y direction to make the gravity upward can be done by setting `gravity.y` to -9.8 directly. + * @zh 物理世界的重力环境。默认值为 {x: 0, y: 9.8}。 + * 如果要修改y方向使重力方向向上,可以直接设置 `gravity.y` 为 -9.8。 + */ + get gravity(): any; + set gravity(value: Vector2); + /** + * @en The root container of the physics world. It serves as the coordinate system for the physics world and is used for coordinate transformations. The default value is the stage. + * Setting a specific container allows for the collective movement of physical objects while keeping the physics world unchanged. + * Note that translation will only occur once when setting `worldRoot`. For other situations, use it in conjunction with the `updatePhysicsByWorldRoot` function. + * @zh 物理世界的根容器,它作为物理世界的坐标系,用于坐标变换,默认值是舞台(stage)。 + * 设置特定的容器后,可以整体移动物理对象,同时保持物理世界的坐标不变。 + * 注意,只有在设置 `worldRoot` 时才会平移一次,在其他情况下,请配合使用 `updatePhysicsByWorldRoot` 函数。 + */ + get worldRoot(): Sprite; + set worldRoot(value: Sprite); + /** + * @en The total number of rigid bodies. + * @zh 刚体的总数量。 + */ + get bodyCount(): number; + /** + * @en The total number of contacts. + * @zh 碰撞的总数量。 + */ + get contactCount(): number; + /** + * @en The total number of joints. + * @zh 关节的总数量。 + */ + get jointCount(): number; + /** + * @en Enables the physics world. This method initializes the physics engine and starts the simulation. + * @zh 开启物理世界。此方法初始化物理引擎并启动模拟。 + */ + enable(): Promise; + /** + * @en Starts the physics world. This method is called after the physics engine is initialized. + * @zh 开启物理世界。此方法在物理引擎初始化后被调用。 + */ + start(): void; + /** + * @en Destroys the current physics world. + * @zh 销毁当前物理世界。 + */ + destroyWorld(): void; + /** + * @en Stops the physics world. + * @zh 停止物理世界。 + */ + stop(): void; + /** + * @deprecated + * 获得刚体总数量 + * use bodyCount instead + */ + getBodyCount(): number; + /** + * @deprecated + * 获得碰撞总数量 + * use contactCount instead + */ + getContactCount(): number; + /** + * @deprecated + * 获得关节总数量 + * use jointCount instead + */ + getJointCount(): number; + /** + * @en Manually triggers an update of the physics world after setting the `worldRoot`. + * @zh 在设定 `worldRoot` 后,手动触发物理世界的更新。 + */ + updatePhysicsByWorldRoot(): void; + } + /** + * @en Physical auxiliary line + * @zh 物理辅助线 + */ + class Physics2DDebugDraw extends Sprite { + /**@protected */ + protected _lineWidth: number; + /** + * @en The color string used for drawing text. + * @zh 用于绘制文本的颜色字符串。 + */ + DrawString_color: string; + /** + * @en The color string representing red. + * @zh 表示红色的颜色字符串。 + */ + Red: string; + /** + * @en The color string representing green. + * @zh 表示绿色的颜色字符串。 + */ + Green: string; + /** + * @en The Graphics object used for drawing shapes. + * @zh 用于绘制形状的 Graphics 对象。 + */ + get mG(): Graphics; + /** + * @en The Graphics object used for drawing text. + * @zh 用于绘制文本的 Graphics 对象。 + */ + get textG(): Graphics; + /** + * @en The current line width used for drawing. + * @zh 用于绘制的当前线宽。 + */ + get lineWidth(): number; + /** + * @en The camera object associated with the scene or view. + * @zh 与场景或视图关联的摄像机对象。 + */ + get camera(): any; + constructor(factory: IPhysiscs2DFactory); + /** + * @override + * @en Renders the object using the given context and position. + * @zh 使用给定的上下文和位置渲染对象。 + */ + render(ctx: Context, x: number, y: number): void; + /** + * @en Saves the current state of the environment and remaps the position and rotation on the canvas. + * @zh 保存当前环境的状态,重新映射画布上的位置和旋转。 + */ + PushTransform(tx: number, ty: number, angle: number): void; + /** + * @en Restores the previously saved path state and properties. + * @zh 返回之前保存过的路径状态和属性。 + */ + PopTransform(): void; + } + /** + * @en Physics2DOption is used to configure default parameters for 2D physics + * @zh Physics2DOption 用于配置2D物理的默认参数 + */ + class Physics2DOption { + /** + * @en Sets whether sleeping is allowed. Allowing sleep can improve stability and performance, but it usually comes at the cost of accuracy.The default is false. + * @zh 设置是否允许休眠。允许休眠可以提高稳定性和性能,但通常会牺牲准确性。默认为否。 + */ + static allowSleeping: boolean; + /** + * @en Gravity acceleration, with a default value of 9.8, corresponding to 9.8 meters per second squared (m/s²) in the real world. + * @zh 重力加速度,默认的重力加速度值为 9.8,对应于现实世界中的 9.8米/秒²(m/s²) 。 + */ + static gravity: { + x: number; + y: number; + }; + /** + * @en Indicates whether the update is performed externally.The default is false. + * @zh 表示更新是否由外部执行。默认为否。 + */ + static customUpdate: boolean; + /** + * @en The number of velocity iterations. Increasing this number will improve accuracy but reduce performance.The default is 8. + * @zh 旋转迭代次数。增大此数字会提高精度,但会降低性能。默认为8。 + */ + static velocityIterations: number; + /** + * @en The number of position iterations. Increasing this number will improve accuracy but reduce performance.The default is 3. + * @zh 位置迭代次数。增大此数字会提高精度,但会降低性能。默认为3。 + */ + static positionIterations: number; + /** + * @en The conversion ratio between rendering pixels and physical units. By default, 1 length unit in the physics engine corresponds to 50 pixels. Modifying this value changes the number of pixels that correspond to 1 length unit in the physics engine. + * @zh 渲染像素和物理单位的转换比率,物理引擎中的1长度单位默认转换为50个像素,修改此处可改变物理引擎1长度单位对应的渲染像素值。 + */ + static pixelRatio: number; + /** + * @en Whether to enable physics drawing.The default is true. + * @zh 是否开启物理绘制。默认为是。 + */ + static debugDraw: boolean; + /** + * @en Whether to draw shapes.The default is true. + * @zh 是否绘制形状。默认为是。 + */ + static drawShape: boolean; + /** + * @en Whether to draw joints.The default is true. + * @zh 是否绘制关节。默认为是。 + */ + static drawJoint: boolean; + /** + * @en Whether to draw the Bounding Box.The default is false. + * @zh 是否绘制包围盒。默认为否。 + */ + static drawAABB: boolean; + /** + * @en Whether to draw the center of mass.The default is false. + * @zh 是否绘制质心。默认为否。 + */ + static drawCenterOfMass: boolean; + } + /** + * @en 2D rigidbody, display objects are bound to the physics world through RigidBody to keep the positions of physics and display objects synchronized. + * Changes in the position of the physics world will be automatically synchronized to the display object, and the displacement and rotation of the display object itself (displacement of the parent object is invalid) will also be automatically synchronized to the physics world. + * If you want to move the physics world as a whole, you can set Physics2D.I.worldRoot = scene, and then move the scene. + * You can enable the display of physics auxiliary lines by enabling "Project Settings" - "2D Physics" - "Enable 2D Physics Drawing" in the IDE, or through the code Physics2D.I.enableDebugDraw = true. + * @zh 2D刚体,显示对象通过RigidBody和物理世界进行绑定,保持物理和显示对象之间的位置同步。 + * 物理世界的位置变化会自动同步到显示对象,显示对象本身的位移,旋转(父对象位移无效)也会自动同步到物理世界。 + * 如果想整体位移物理世界,可以设置 Physics2D.I.worldRoot = 场景,然后移动场景即可。 + * 可以通过IDE-"项目设置"-"2D物理"-"是否开启2D物理绘制" 开启物理辅助线显示,或者通过代码 Physics2D.I.enableDebugDraw = true。 + */ + class RigidBody extends Component { + /** + * @en [Read-only] Specifies the collision group to which the body belongs, default is 0, the collision rules are as follows: + * 1. If the group values of two objects are equal: + * - If the group value is greater than zero, they will always collide. + * - If the group value is less than zero, they will never collide. + * - If the group value is equal to 0, then rule 3 is used. + * 2. If the group values are not equal, then rule 3 is used. + * 3. Each rigidbody has a category, this property receives a bit field, the range is the power of 2 in the range of [1,2^31]. + * Each rigidbody also has a mask category, which specifies the sum of the category values it collides with (the value is the result of bitwise AND of all categories). + * @zh [只读] 指定了该主体所属的碰撞组,默认为0,碰撞规则如下: + * 1. 如果两个对象 group 相等: + * - group 值大于零,它们将始终发生碰撞。 + * - group 值小于零,它们将永远不会发生碰撞。 + * - group 值等于0,则使用规则3。 + * 2. 如果 group 值不相等,则使用规则3。 + * 3. 每个刚体都有一个 category 类别,此属性接收位字段,范围为 [1,2^31] 范围内的2的幂。 + * 每个刚体也都有一个 mask 类别,指定与其碰撞的类别值之和(值是所有 category 按位 AND 的值)。 + */ + group: number; + /** + * @en [Read-only] Collision category, specified using powers of 2, with 32 different collision categories available. + * @zh [只读] 碰撞类别,使用2的幂次方值指定,有32种不同的碰撞类别可用。 + */ + category: number; + /** + * @en [Read-only] Specifies the category of collision bit mask, the result of category bitwise operation. + * Each rigidbody also has a mask category, which specifies the sum of the category values it collides with (the value is the result of bitwise AND of all categories). + * @zh [只读] 指定冲突位掩码碰撞的类别,category 位操作的结果。 + * 每个刚体也都有一个 mask 类别,指定与其碰撞的类别值之和(值是所有 category 按位 AND 的值)。 + */ + mask: number; + /** + * @en [Read-only] Custom label. + * @zh [只读] 自定义标签。 + */ + label: string; + /** + * @en The center of mass of the rigid body. (Only valid when not using automatic mass calculation) + * @zh 刚体质心位置(只在未开启自动质量计算时才有效) + */ + private _centerofMass; + /** + * @en The rigid body inertia tensor. (Only valid when not using automatic mass calculation) + * @zh 刚体惯性张量(只在未开启自动质量计算时才有效) + */ + private _inertia; + /** + * @en Is the rigid body mass calculated based on the collider + * @zh 是否根据碰撞体计算刚体质量 + */ + get useAutoMass(): boolean; + set useAutoMass(value: boolean); + /** + * @en The rigid body mass. (Only valid when not using automatic mass calculation) + * @zh 刚体质量(只在未开启自动质量计算时才有效) + */ + get mass(): number; + set mass(value: number); + /** + * @en The center of mass of the rigid body. (Only valid when not using automatic mass calculation) + * @zh 刚体质心(只在未开启自动质量计算时才有效) + */ + get centerOfMass(): IV2; + set centerOfMass(value: IV2); + /** + * @en The Rigidbody's resistance to changes in angular velocity (rotation).(Only valid when not using automatic mass calculation) + * @zh 刚体惯性张量(只在未开启自动质量计算时才有效) + */ + get inertia(): number; + set inertia(value: number); + /** + * @en The original body object. + * @zh 原始body对象。 + */ + get body(): any; + /** + * @en The type of the rigid body. Supports three types: static, dynamic, and kinematic. + * - static: Static type, stays still, not affected by gravity, has infinite mass, can be controlled by moving, rotating, and scaling the node. + * - dynamic: Dynamic type, affected by gravity. + * - kinematic: Kinematic type, not affected by gravity, can be moved by applying velocity or force. + * @zh 刚体类型,支持三种类型:static、dynamic 和 kinematic。 + * - static:静态类型,静止不动,不受重力影响,质量无限大,可以通过节点移动、旋转、缩放进行控制。 + * - dynamic:动态类型,受重力影响。 + * - kinematic:运动类型,不受重力影响,可以通过施加速度或者力的方式使其运动。 + */ + get type(): string; + set type(value: string); + /** + * @en The gravity scale factor. Set it to 0 for no gravity. + * @zh 重力缩放系数,设置为 0 表示没有重力。 + */ + get gravityScale(): number; + set gravityScale(value: number); + /** + * @en Allowing rotation means that when a force or impact is applied to the rigid body, it will naturally rotate according to physical rules. If you do not want the rigid body to rotate, set this to false. + * @zh 允许旋转是指当力或者冲击作用于该刚体时,它会按照物理规则进行自然旋转,如果不希望刚体旋转,请设置为 false。 + */ + get allowRotation(): boolean; + set allowRotation(value: boolean); + /** + * @en Whether to allow sleeping. Allowing sleeping can improve performance but may result in the inability to respond immediately. + * @zh 是否允许休眠,允许休眠能提高性能,但会导致无法即时响应。 + */ + get allowSleep(): boolean; + set allowSleep(value: boolean); + /** + * @en The angular damping coefficient. It can range from 0 to infinity, where 0 means no damping and infinity means full damping. Normally, the damping value should be between 0 and 0.1. + * @zh 旋转速度阻尼系数,范围可以在 0 到无穷大之间,0 表示没有阻尼,无穷大表示满阻尼,通常阻尼的值应该在 0 到 0.1 之间。 + */ + get angularDamping(): number; + set angularDamping(value: number); + /** + * @en The angular velocity. Setting it will cause rotation. + * @zh 角速度,设置会导致旋转。 + */ + get angularVelocity(): number; + set angularVelocity(value: number); + /** + * @en The linear damping coefficient. It can range from 0 to infinity, where 0 means no damping and infinity means full damping. Normally, the damping value should be between 0 and 0.1. + * @zh 线性速度阻尼系数,范围可以在 0 到无穷大之间,0 表示没有阻尼,无穷大表示满阻尼,通常阻尼的值应该在 0 到 0.1 之间。 + */ + get linearDamping(): number; + set linearDamping(value: number); + /** + * @en The linear velocity, such as {x: 5, y: 5}. + * @zh 线性运动速度,例如 {x: 5, y: 5}。 + */ + get linearVelocity(): IV2; + set linearVelocity(value: any); + /** + * @en Whether it is a high-speed moving object. Setting it to true can prevent high-speed penetration. + * @zh 是否为高速移动的物体,设置为 true 可以防止高速穿透。 + */ + get bullet(): boolean; + set bullet(value: boolean); + /** + * @en Get the original body object. + * @zh 获得原始 body 对象。 + */ + getBody(): any; + /** + * @en Apply force to the rigid body. + * @param position The point where the force is applied, such as {x: 100, y: 100}, in global coordinates. + * @param force The force to be applied, such as {x: 0.1, y: 0.1}. + * @zh 对刚体施加力。 + * @param position 施加力的点,如 {x: 100, y: 100},全局坐标。 + * @param force 施加的力,如 {x: 0.1, y: 0.1}。 + */ + applyForce(position: IV2, force: IV2): void; + /** + * @en Apply force to the center of the rigid body to prevent object rotation. + * @param force The force to be applied, such as {x: 0.1, y: 0.1}. + * @zh 从中心点对刚体施加力,防止对象旋转。 + * @param force 施加的力,如 {x: 0.1, y: 0.1}。 + */ + applyForceToCenter(force: IV2): void; + /** + * @en Apply linear impulse. The added velocity impulse will be combined with the rigid body's original velocity to produce a new velocity. + * @param position The point where the impulse is applied, such as {x: 100, y: 100}, in global coordinates. + * @param impulse The velocity impulse to be applied, such as {x: 0.1, y: 0.1}. + * @zh 施加速度冲量,添加的速度冲量会与刚体原有的速度叠加,产生新的速度。 + * @param position 施加力的点,如 {x: 100, y: 100},全局坐标。 + * @param impulse 施加的速度冲量,如 {x: 0.1, y: 0.1}。 + */ + applyLinearImpulse(position: IV2, impulse: IV2): void; + /** + * @en Apply linear impulse to the center. The added velocity impulse will be combined with the rigid body's original velocity to produce a new velocity. + * @param impulse The velocity impulse to be applied, such as {x: 0.1, y: 0.1}. + * @zh 施加速度冲量,添加的速度冲量会与刚体原有的速度叠加,产生新的速度。 + * @param impulse 施加的速度冲量,如 {x: 0.1, y: 0.1}。 + */ + applyLinearImpulseToCenter(impulse: IV2): void; + /** + * @en Apply torque to the rigid body to make it rotate. + * @param torque The torque to be applied. + * @zh 对刚体施加扭矩,使其旋转。 + * @param torque 施加的扭矩。 + */ + applyTorque(torque: number): void; + /** + * @en Set the velocity, such as {x: 10, y: 10}. + * @param velocity The velocity to be set. + * @zh 设置速度,例如 {x: 10, y: 10}。 + * @param velocity 要设置的速度。 + */ + setVelocity(velocity: IV2): void; + /** + * @en Set the angle. + * @param value The angle value in degrees. + * @zh 设置角度。 + * @param value 角度值,单位为度。 + */ + setAngle(value: any): void; + /** + * @en Get the mass of the rigid body. + * @zh 获得刚体质量。 + */ + getMass(): number; + /** + * @en Get the offset of the center of mass relative to the node's (0, 0) point. + * @zh 获得质心相对于节点 (0, 0) 点的位置偏移。 + */ + getCenter(): IV2; + /** + * @en Get the inertia of the rigid body. + * @zh 获得刚体的惯性张量。 + * @returns + */ + getInertia(): number; + /** + * @en Get the world coordinates of the center of mass, relative to the Physics2D.I.worldRoot node. + * @zh 获得质心的世界坐标,相对于 Physics2D.I.worldRoot 节点。 + */ + getWorldCenter(): IV2; + /** + * @en Get the world coordinates relative to the body. + * @param x The x-coordinate in pixels. + * @param y The y-coordinate in pixels. + * @zh 获得相对于 body 的世界坐标。 + * @param x 像素坐标的 x 值。 + * @param y 像素坐标的 y 值。 + */ + getWorldPoint(x: number, y: number): Point; + /** + * @en Get the local coordinates relative to the body. + * @param x The x-coordinate in pixels. + * @param y The y-coordinate in pixels. + * @zh 获得相对于 body 的本地坐标。 + * @param x 像素坐标的 x 值。 + * @param y 像素坐标的 y 值。 + */ + getLocalPoint(x: number, y: number): Point; + } + class RigidBody2DInfo { + position: Vector2; + angle: number; + allowSleep: boolean; + angularDamping: number; + angularVelocity: number; + bullet: boolean; + fixedRotation: boolean; + gravityScale: number; + linearDamping: number; + linearVelocity: Vector2; + type: string; + group: number; + } + interface IPhyDebugDrawer { + /** + * @en Set the color. + * @param c The color value. + * @zh 设置颜色。 + * @param c 颜色值。 + */ + color(c: number): void; + /** + * @en Draw a line. + * @param sx Start point x coordinate. + * @param sy Start point y coordinate. + * @param sz Start point z coordinate. + * @param ex End point x coordinate. + * @param ey End point y coordinate. + * @param ez End point z coordinate. + * @zh 绘制线段。 + * @param sx 起点 x 坐标。 + * @param sy 起点 y 坐标。 + * @param sz 起点 z 坐标。 + * @param ex 终点 x 坐标。 + * @param ey 终点 y 坐标。 + * @param ez 终点 z 坐标。 + */ + line(sx: number, sy: number, sz: number, ex: number, ey: number, ez: number): void; + /** + * @en Clear drawn lines. + * @zh 清除画线结果。 + */ + clear(): void; + } + /** + * @en The `btPhysicsCreateUtil` class is responsible for creating and managing various physics objects and capabilities within the Bullet physics engine. + * @zh `btPhysicsCreateUtil` 类负责在 Bullet 物理引擎中创建和管理各种物理对象和功能。 + */ + class btPhysicsCreateUtil implements IPhysicsCreateUtil { + /** + * @en A map that stores the capabilities of the physics engine. + * @zh 存储物理引擎功能的映射。 + */ + protected _physicsEngineCapableMap: Map; + /** + * @en Initializes the physics engine's capabilities, setting up which features are supported. + * @zh 初始化物理引擎的功能,设置支持的功能项。 + */ + initPhysicsCapable(): void; + /** + * @en Get the status of a specific physics capability. + * @param value The physics capability to query. + * @returns Whether the capability is available. + * @zh 获取特定物理能力的状态。 + * @param value 要查询的物理能力。 + * @returns 该能力是否可用。 + */ + getPhysicsCapable(value: EPhysicsCapable): boolean; + /** + * @en Initializes the Bullet physics engine. This includes setting up the physics memory, creating an instance of the Bullet physics engine, and initializing various physics components. + * @returns A promise that resolves when initialization is complete. + * @zh 初始化 Bullet 物理引擎。这包括设置物理内存、创建 Bullet 物理引擎实例以及初始化各种物理组件。 + * @returns 当初始化完成时解析的 Promise。 + */ + initialize(): Promise; + /** + * @en Creates a new instance of the physics manager with the specified settings. + * @param physicsSettings The physics settings. + * @returns A btPhysicsManager instance. + * @zh 使用指定的设置创建一个新的物理管理器实例。 + * @param physicsSettings 物理设置。 + * @returns btPhysicsManager 实例。 + */ + createPhysicsManger(physicsSettings: PhysicsSettings): btPhysicsManager; + /** + * @en Create a dynamic collider. + * @param manager The physics manager. + * @returns A btRigidBodyCollider instance. + * @zh 创建动态碰撞器。 + * @param manager 物理管理器。 + * @returns btRigidBodyCollider 实例。 + */ + createDynamicCollider(manager: btPhysicsManager): btRigidBodyCollider; + /** + * @en Create a static collider. + * @param manager The physics manager. + * @returns A btStaticCollider instance. + * @zh 创建静态碰撞器。 + * @param manager 物理管理器。 + * @returns btStaticCollider 实例。 + */ + createStaticCollider(manager: btPhysicsManager): btStaticCollider; + /** + * @en Create a character controller. + * @param manager The physics manager. + * @returns A btCharacterCollider instance. + * @zh 创建角色控制器。 + * @param manager 物理管理器。 + * @returns btCharacterCollider 实例。 + */ + createCharacterController(manager: btPhysicsManager): btCharacterCollider; + /** + * @en Create a fixed joint. + * @param manager The physics manager. + * @returns A btFixedJoint instance. + * @zh 创建固定关节。 + * @param manager 物理管理器。 + * @returns btFixedJoint 实例。 + */ + createFixedJoint(manager: btPhysicsManager): btFixedJoint; + /** + * @en Create a hinge joint. + * @param manager The physics manager. + * @returns A btHingeJoint instance. + * @zh 创建铰链关节。 + * @param manager 物理管理器。 + * @returns btHingeJoint 实例。 + */ + createHingeJoint(manager: btPhysicsManager): IHingeJoint; + /** + * @en Create a spring joint. + * @param manager The physics manager. + * @returns A btSpringJoint instance. + * @zh 创建弹簧关节。 + * @param manager 物理管理器。 + * @returns btSpringJoint 实例。 + */ + createSpringJoint(manager: btPhysicsManager): btSpringJoint; + /** + * @en Create a D6 (6 degrees of freedom) joint. + * @param manager The physics manager. + * @returns A btCustomJoint instance. + * @zh 创建 D6(6 自由度) 关节。 + * @param manager 物理管理器。 + * @returns btCustomJoint 实例。 + */ + createD6Joint(manager: btPhysicsManager): ID6Joint; + /** + * @en Create a box collider shape. + * @returns A btBoxColliderShape instance. + * @zh 创建盒型碰撞器形状。 + * @returns btBoxColliderShape 实例。 + */ + createBoxColliderShape(): btBoxColliderShape; + /** + * @en Create a sphere collider shape. + * @returns A btSphereColliderShape instance. + * @zh 创建球形碰撞器形状。 + * @returns btSphereColliderShape 实例。 + */ + createSphereColliderShape(): btSphereColliderShape; + /** + * @en Create a capsule collider shape. + * @returns A btCapsuleColliderShape instance. + * @zh 创建胶囊碰撞器形状。 + * @returns btCapsuleColliderShape 实例。 + */ + createCapsuleColliderShape(): btCapsuleColliderShape; + /** + * @en Create a mesh collider shape. + * @returns A btMeshColliderShape instance. + * @zh 创建网格碰撞器形状。 + * @returns btMeshColliderShape 实例。 + */ + createMeshColliderShape(): btMeshColliderShape; + /** + * @en Create a plane collider shape. + * @zh 创建平面碰撞器形状。 + */ + createPlaneColliderShape(): IPlaneColliderShape; + /** + * @en Create a cylinder collider shape. + * @returns A btCylinderColliderShape instance. + * @zh 创建圆柱碰撞器形状。 + * @returns btCylinderColliderShape 实例。 + */ + createCylinderColliderShape(): btCylinderColliderShape; + /** + * @en Create a cone collider shape. + * @returns A btConeColliderShape instance. + * @zh 创建圆锥碰撞器形状。 + * @returns btConeColliderShape 实例。 + */ + createConeColliderShape(): btConeColliderShape; + /** + * @en Create a compound collider shape. + * @returns A btCompoundColliderShape instance. + * @zh 创建组合碰撞器形状。 + * @returns btCompoundColliderShape 实例。 + */ + createCompoundShape(): ICompoundColliderShape; + /** + * @en Create a convex mesh from a given mesh. + * @param mesh The source mesh. + * @returns The created convex mesh, or null if creation fails. + * @zh 从给定的网格创建凸包网格。 + * @param mesh 源网格。 + * @returns 创建的凸包网格,如果创建失败则返回 null。 + */ + createCorveMesh(mesh: Mesh): Mesh; + } + /** + * @en The `btPhysicsManager` class is the core class for managing the Bullet physics engine. + * @zh `btPhysicsManager` 类是用于管理 Bullet 物理引擎的核心类。 + */ + class btPhysicsManager implements IPhysicsManager { + /** + * @en Default collision group + * @zh 默认碰撞组 + */ + static COLLISIONFILTERGROUP_DEFAULTFILTER: number; + /** + * @en Static collision group + * @zh 静态碰撞组 + */ + static COLLISIONFILTERGROUP_STATICFILTER: number; + /** + * @en Kinematic rigid body collision group + * @zh 运动学刚体碰撞组 + */ + static COLLISIONFILTERGROUP_KINEMATICFILTER: number; + /** + * @en Debris collision group + * @zh 碎片碰撞组 + */ + static COLLISIONFILTERGROUP_DEBRISFILTER: number; + /** + * @en Sensor trigger group + * @zh 传感器触发器组 + */ + static COLLISIONFILTERGROUP_SENSORTRIGGER: number; + /** + * @en Character filter group + * @zh 角色过滤器组 + */ + static COLLISIONFILTERGROUP_CHARACTERFILTER: number; + /** + * @en Custom filter group 1 + * @zh 自定义过滤组 1 + */ + static COLLISIONFILTERGROUP_CUSTOMFILTER1: number; + /** + * @en Custom filter group 2 + * @zh 自定义过滤组 2 + */ + static COLLISIONFILTERGROUP_CUSTOMFILTER2: number; + /** + * @en Custom filter group 3 + * @zh 自定义过滤组 3 + */ + static COLLISIONFILTERGROUP_CUSTOMFILTER3: number; + /** + * @en Custom filter group 4 + * @zh 自定义过滤组 4 + */ + static COLLISIONFILTERGROUP_CUSTOMFILTER4: number; + /** + * @en Custom filter group 5 + * @zh 自定义过滤组 5 + */ + static COLLISIONFILTERGROUP_CUSTOMFILTER5: number; + /** + * @en Custom filter group 6 + * @zh 自定义过滤组 6 + */ + static COLLISIONFILTERGROUP_CUSTOMFILTER6: number; + /** + * @en Custom filter group 7 + * @zh 自定义过滤组 7 + */ + static COLLISIONFILTERGROUP_CUSTOMFILTER7: number; + /** + * @en Custom filter group 8 + * @zh 自定义过滤组 8 + */ + static COLLISIONFILTERGROUP_CUSTOMFILTER8: number; + /** + * @en Custom filter group 9 + * @zh 自定义过滤组 9 + */ + static COLLISIONFILTERGROUP_CUSTOMFILTER9: number; + /** + * @en Custom filter group 10 + * @zh 自定义过滤组 10 + */ + static COLLISIONFILTERGROUP_CUSTOMFILTER10: number; + /** + * @en All filter groups + * @zh 所有过滤组 + */ + static COLLISIONFILTERGROUP_ALLFILTER: number; + /** + * @en Initializes the btPhysicsManager. + * @zh 初始化 btPhysicsManager。 + */ + static init(): void; + /** + * @en The maximum number of sub-steps used by the physics engine in one frame to compensate for deceleration. This is the maximum number of simulations allowed per frame. If the engine runs slowly, this number may need to be increased,otherwise the simulator will lose "time". It's crucial that the engine interval time is less than maxSubSteps * fixedTimeStep. + * @zh 物理引擎在一帧中用于补偿减速的最大次数:模拟器每帧允许的最大模拟次数,如果引擎运行缓慢,可能需要增加该次数,否则模拟器会丢失“时间",引擎间隔时间小于maxSubSteps*fixedTimeStep非常重要。 + */ + maxSubSteps: number; + /***/ + /** + * @en The interval time of the physics simulator frame. Reducing fixedTimeStep can increase simulation precision. The default value is 1.0 / 60.0. + * @zh 物理模拟器帧的间隔时间:通过减少fixedTimeStep可增加模拟精度,默认是1.0 / 60.0。 + */ + fixedTimeStep: number; + /** + * @en Whether to enable continuous collision detection. + * @zh 是否开启连续碰撞检测。 + */ + enableCCD: boolean; + /** + * @en The threshold for continuous collision detection. + * @zh 连续碰撞检测的阈值。 + */ + ccdThreshold: number; + /** + * @en The sphere radius for continuous collision detection. + * @zh 连续碰撞检测的球体半径。 + */ + ccdSphereRadius: number; + /** + * @en The delta time used in physics calculations, default is 1/60 second. + * @zh 物理计算中使用的时间间隔,默认为 1/60 秒。 + */ + dt: number; + protected _updateCount: number; + _characters: btCharacterCollider[]; + protected _physicsEngineCapableMap: Map; + /** + * @ignore + * @en Creates an instance of a btPhysicsManager. + * @param physicsSettings The settings for the physics simulation. + * @zh 创建一个 btPhysicsManager 的实例。 + * @param physicsSettings 物理模拟的设置。 + */ + constructor(physicsSettings: PhysicsSettings); + /** + * @en Sets the active state of a btCollider. + * @param collider The btCollider to set the active state for. + * @param value The active state to set (true for active, false for inactive). + * @zh 设置 btCollider 的激活状态。 + * @param collider 要设置激活状态的 btCollider。 + * @param value 要设置的激活状态(true 表示激活,false 表示不激活)。 + */ + setActiveCollider(collider: btCollider, value: boolean): void; + /** + * @en Performs a sphere query to find colliders within a specified radius from a given position. + * @param pos The center position of the sphere query. + * @param radius The radius of the sphere query. + * @param result An array to store the found colliders. + * @param collisionmask The collision mask to filter the query results. + * @zh 执行球体查询,查找给定位置指定半径内的碰撞体。 + * @param pos 球体查询的中心位置。 + * @param radius 球体查询的半径。 + * @param result 用于存储找到的碰撞体的数组。 + * @param collisionmask 用于过滤查询结果的碰撞掩码。 + */ + sphereQuery?(pos: Vector3, radius: number, result: ICollider[], collisionmask: number): void; + /** + * @perfTag PerformanceDefine.T_PhysicsColliderEnter + * @en Dispatch Collider Enter Event + * @param colliderA 碰撞组件A + * @param ownerA 组件A的所属节点 + * @param colliderB 碰撞组件B + * @param ownerB 组件B的所属节点 + * @param curFrameCol 当前帧碰撞信息 + * @zh 派发碰撞器进入事件 + * @param colliderA Collision Component A + * @param ownerA The Node to Which Component A Belongs + * @param colliderB Collision Component B + * @param ownerB The Node to Which Component B Belongs + * @param curFrameCol Current Frame Collision Information + */ + private _collision_EnterEvent; + /** + * @perfTag PerformanceDefine.T_PhysicsColliderStay + * @en Dispatch Collider Stay Event + * @param colliderA 碰撞组件A + * @param ownerA 组件A的所属节点 + * @param colliderB 碰撞组件B + * @param ownerB 组件B的所属节点 + * @param curFrameCol 当前帧碰撞信息 + * @zh 派发碰撞器持续事件 + * @param colliderA Collision Component A + * @param ownerA The Node to Which Component A Belongs + * @param colliderB Collision Component B + * @param ownerB The Node to Which Component B Belongs + * @param curFrameCol Current Frame Collision Information + */ + private _collision_StayEvent; + /** + * @perfTag PerformanceDefine.T_PhysicsColliderExit + * @en Dispatch Collider Exit Event + * @param preColliderA 碰撞组件A + * @param ownerA 组件A的所属节点 + * @param preColliderB 碰撞组件B + * @param ownerB 组件B的所属节点 + * @param preFrameCol 当前帧碰撞信息 + * @zh 派发碰撞器离开事件 + * @param preColliderA Collision Component A + * @param ownerA The Node to Which Component A Belongs + * @param preColliderB Collision Component B + * @param ownerB The Node to Which Component B Belongs + * @param preFrameCol Current Frame Collision Information + */ + private _collision_ExitEvent; + /** + * @perfTag PerformanceDefine.T_PhysicsTriggerEnter + * @en Dispatch Trigger Enter Event + * @param colliderA 碰撞组件A + * @param ownerA 组件A的所属节点 + * @param colliderB 碰撞组件B + * @param ownerB 组件B的所属节点 + * @zh 派发触发器进入事件 + * @param colliderA Collision Component A + * @param ownerA The Node to Which Component A Belongs + * @param colliderB Collision Component B + * @param ownerB The Node to Which Component B Belongs + */ + private _trigger_EnterEvent; + /** + * @perfTag PerformanceDefine.T_PhysicsTriggerStay + * @en Dispatch Trigger Enter Event + * @param colliderA 碰撞组件A + * @param ownerA 组件A的所属节点 + * @param colliderB 碰撞组件B + * @param ownerB 组件B的所属节点 + * @zh 派发触发器持续事件 + * @param colliderA Collision Component A + * @param ownerA The Node to Which Component A Belongs + * @param colliderB Collision Component B + * @param ownerB The Node to Which Component B Belongs + */ + private _trigger_StayEvent; + /** + * @perfTag PerformanceDefine.T_PhysicsTriggerExit + * @en Dispatch Trigger Exit Event + * @param preColliderA 碰撞组件A + * @param ownerA 组件A的所属节点 + * @param preColliderB 碰撞组件B + * @param ownerB 组件B的所属节点 + * @zh 派发触发器离开事件 + * @param preColliderA Collision Component A + * @param ownerA The Node to Which Component A Belongs + * @param preColliderB Collision Component B + * @param ownerB The Node to Which Component B Belongs + */ + private _trigger_ExitEvent; + /** + * @perfTag PerformanceDefine.T_PhysicsEvent + * @en This method only sends events to objects, it doesn't call collision functions for each component individually.Components need to listen to events if they want to respond to collisions. + * @zh 这个只是给对象发送事件,不会挨个组件调用碰撞函数。组件要响应碰撞的话,要通过监听事件。 + */ + dispatchCollideEvent(): void; + /** + * @en Debugger function to enable or disable the debug drawer. + * @param value A boolean value to enable (true) or disable (false) the debug drawer. + * @zh 调试器函数,用于启用或禁用调试绘制器。 + * @param value 布尔值,用于启用(true)或禁用(false)调试绘制器。 + */ + enableDebugDrawer(value: boolean): void; + /** + * @en Gets the capability status of a specific physics feature. + * @param value The physics capability to check. + * @returns Whether the specified physics capability is supported. + * @zh 获取特定物理特性的能力状态。 + * @param value 要检查的物理能力。 + * @returns 指定的物理能力是否被支持。 + */ + getPhysicsCapable(value: EPhysicsCapable): boolean; + /** + * @en Initializes the physics capabilities map. + * @zh 初始化物理能力映射。 + */ + initPhysicsCapable(): void; + /** + * @en Sets the gravity. + * @param gravity The gravity to be set. + * @zh 设置重力。 + * @param gravity 要设置的重力。 + */ + setGravity(gravity: Vector3): void; + /** + * @en Adds a collider. + * @param collider The collider to be added. + * @zh 添加碰撞体。 + * @param collider 要添加的碰撞体。 + */ + addCollider(collider: ICollider): void; + /** + * @en Removes a collider. + * @param collider The collider to be removed. + * @zh 移除碰撞体。 + * @param collider 要移除的碰撞体。 + */ + removeCollider(collider: ICollider): void; + /** + * @en Adds a joint. + * @param joint The joint to be added. + * @zh 添加关节。 + * @param joint 要添加的关节。 + */ + addJoint(joint: btJoint): void; + /** + * @en Removes a joint. + * @param joint The joint to be removed. + * @zh 移除关节。 + * @param joint 要移除的关节。 + */ + removeJoint(joint: btJoint): void; + /** + * @perfTag PerformanceDefine.T_Physics_Simulation + * @en Updates the physics simulation. + * @param elapsedTime The time elapsed since the last update. + * @zh 更新物理模拟。 + * @param elapsedTime 自上次更新以来经过的时间。 + */ + update(elapsedTime: number): void; + /** + * @en Performs a ray cast in the physics world.Returns the first hit object. + * @param ray The ray to cast. + * @param outHitResult The hit result object to store the result. + * @param distance The maximum distance of the ray cast. + * @param collisonGroup The collision group of the ray. + * @param collisionMask The collision mask of the ray. + * @returns Whether the ray hit anything. + * @zh 执行一次射线检测,返回第一个与射线相交的碰撞体信息。 + * @param ray 要投射的射线。 + * @param outHitResult 用于存储结果的命中结果对象。 + * @param distance 射线投射的最大距离。 + * @param collisonGroup 射线的碰撞组。 + * @param collisionMask 射线的碰撞掩码。 + * @returns 射线是否击中了任何物体。 + */ + rayCast(ray: Ray, outHitResult: HitResult, distance?: number, collisonGroup?: number, collisionMask?: number): boolean; + /** + * @en Performs a ray cast in the physics world.Returns all hit objects. + * @param ray The ray to cast. + * @param out An array to store all hit results. + * @param distance The maximum distance of the ray cast. + * @param collisonGroup The collision group of the ray. + * @param collisionMask The collision mask of the ray. + * @returns Whether the ray hit anything. + * @zh 执行一次射线检测,返回所有与射线相交的碰撞体信息。 + * @param ray 要投射的射线。 + * @param out 用于存储所有命中结果的数组。 + * @param distance 射线投射的最大距离。 + * @param collisonGroup 射线的碰撞组。 + * @param collisionMask 射线的碰撞掩码。 + * @returns 射线是否击中了任何物体。 + */ + rayCastAll(ray: Ray, out: HitResult[], distance?: number, collisonGroup?: number, collisionMask?: number): boolean; + /** + * @en Performs a shape cast. Returns the first hit object. + * @param shape The shape to cast. + * @param fromPosition The starting position of the shape. + * @param toPosition The ending position of the shape. + * @param out The hit result object to store the result. + * @param fromRotation The starting rotation of the shape. + * @param toRotation The ending rotation of the shape. + * @param collisonGroup The collision group of the shape. + * @param collisionMask The collision mask of the shape. + * @param allowedCcdPenetration The allowed continuous collision detection penetration. + * @returns Whether hit anything. + * @zh 执行形状射线检测,返回第一个与射线相交的碰撞体信息。 + * @param shape 要投射的形状。 + * @param fromPosition 形状的起始位置。 + * @param toPosition 形状的结束位置。 + * @param out 用于存储结果的命中结果对象。 + * @param fromRotation 形状的起始旋转。 + * @param toRotation 形状的结束旋转。 + * @param collisonGroup 形状的碰撞组。 + * @param collisionMask 形状的碰撞掩码。 + * @param allowedCcdPenetration 允许的连续碰撞检测穿透。 + * @returns 是否击中了任何物体。 + */ + shapeCast(shape: btColliderShape, fromPosition: Vector3, toPosition: Vector3, out: HitResult, fromRotation?: Quaternion, toRotation?: Quaternion, collisonGroup?: number, collisionMask?: number, allowedCcdPenetration?: number): boolean; + /** + * @en Performs a shape cast. Returns all hit objects. + * @param shape The shape to cast. + * @param fromPosition The starting position of the shape. + * @param toPosition The ending position of the shape. + * @param out An array to store all hit results. + * @param fromRotation The starting rotation of the shape. + * @param toRotation The ending rotation of the shape. + * @param collisonGroup The collision group of the shape. + * @param collisionMask The collision mask of the shape. + * @param allowedCcdPenetration The allowed continuous collision detection penetration. + * @returns Whether hit anything. + * @zh 执行形状投射,返回所有与射线相交的碰撞体信息。 + * @param shape 要投射的形状。 + * @param fromPosition 形状的起始位置。 + * @param toPosition 形状的结束位置。 + * @param out 用于存储所有命中结果的数组。 + * @param fromRotation 形状的起始旋转。 + * @param toRotation 形状的结束旋转。 + * @param collisonGroup 形状的碰撞组。 + * @param collisionMask 形状的碰撞掩码。 + * @param allowedCcdPenetration 允许的连续碰撞检测穿透。 + * @returns 是否击中了任何物体。 + */ + shapeCastAll(shape: btColliderShape, fromPosition: Vector3, toPosition: Vector3, out: HitResult[], fromRotation?: Quaternion, toRotation?: Quaternion, collisonGroup?: number, collisionMask?: number, allowedCcdPenetration?: number): boolean; + /** + * @en Destroys the physics manager and releases all associated resources. + * @zh 销毁物理管理器并释放所有相关资源。 + */ + destroy(): void; + } + /** + * @en The btCharacterCollider class is used to handle 3D physics character colliders. + * @zh btCharacterCollider 类用于处理3D物理角色碰撞器。 + */ + class btCharacterCollider extends btCollider implements ICharacterController { + static __init__(): void; + /** + * @en Check if the character is capable of a specific action. + * @param value The capability to check. + * @returns True if the character is capable, false otherwise. + * @zh 检查角色是否能够执行特定动作。 + * @param value 要检查的能力。 + * @returns 如果角色具备该能力则返回 true,否则返回 false。 + */ + getCapable(value: number): boolean; + /** + * @en Creates an instance of the btCharacterCollider class. + * @param physicsManager The physics manager instance. + * @zh 创建一个 btCharacterCollider 类的实例。 + * @param physicsManager 物理管理器实例。 + */ + constructor(physicsManager: btPhysicsManager); + /** + * @en Set the local offset of the collider shape. + * @param value The local offset vector. + * @zh 设置碰撞器形状的偏移。 + * @param value 偏移向量。 + */ + setShapelocalOffset(value: Vector3): void; + /** + * @en Set the skin width of the character collider. + * @param width The skin width value. + * @zh 设置角色碰撞器的皮肤宽度。 + * @param width 皮肤宽度值。 + */ + setSkinWidth?(width: number): void; + /** + * @en Set the position. + * @param value The position vector. + * @zh 设置位置。 + * @param value 位置向量。 + */ + setPosition(value: Vector3): void; + /** + * @en Get the current position. + * @returns The position vector. + * @zh 获取当前位置。 + * @returns 位置向量。 + */ + getPosition(): Vector3; + /** + * @en Set the radius of the character collider. + * @param value The radius value. + * @zh 设置角色碰撞器的半径。 + * @param value 半径值。 + */ + setRadius?(value: number): void; + /** + * @en Set the height of the character collider. + * @param value The height value. + * @zh 设置角色碰撞器的高度。 + * @param value 高度值。 + */ + setHeight?(value: number): void; + /** + * @en Set the minimum distance for the character collider. + * @param value The minimum distance value. + * @zh 设置角色碰撞器的最小距离。 + * @param value 最小距离值。 + */ + setminDistance(value: number): void; + /** + * @en Get the character capability status. + * @param value The character capability to check. + * @zh 获取角色能力状态。 + * @param value 要检查的角色能力。 + */ + static getCharacterCapable(value: ECharacterCapable): boolean; + /** + * @en Initialize the capabilities of the character collider. + * @zh 初始化角色碰撞器的能力。 + */ + static initCapable(): void; + protected getColliderType(): btColliderType; + protected _initCollider(): void; + protected _onShapeChange(): void; + /** + * @en Set the world position of the character. + * @param value The new world position vector. + * @zh 设置角色的世界位置。 + * @param value 新的世界位置向量。 + */ + setWorldPosition(value: Vector3): void; + /** + * @en Move the character by a displacement vector. + * @param disp The displacement vector. + * @zh 通过位移向量移动角色。 + * @param disp 位移向量。 + */ + move(disp: Vector3): void; + /** + * @en Make the character jump with a given velocity. + * @param velocity The jump velocity vector. + * @zh 使角色以给定的速度跳跃。 + * @param velocity 跳跃速度向量。 + */ + jump(velocity: Vector3): void; + /** + * @en Set the jump speed of the character. + * @param value The jump speed value. + * @zh 设置角色的跳跃速度。 + * @param value 跳跃速度值。 + */ + setJumpSpeed(value: number): void; + /** + * @en Set the step offset (height) for the character. + * @param offset The step offset value. + * @zh 设置角色的步高。 + * @param offset 步高值。 + */ + setStepOffset(offset: number): void; + /** + * @en Set the up direction for the character. + * @param up The up direction vector. + * @zh 设置角色的向上方向。 + * @param up 向上方向向量。 + */ + setUpDirection(up: Vector3): void; + /** + * @en Get the vertical velocity of the character. + * The vertical velocity of the character is particularly useful for determining whether a character is falling or rising. Here are some key points about its value: + * - **0** means the character is on the ground. + * - **Positive values** indicate the character is rising (e.g., jumping). + * - **Negative values** indicate the character is falling. + * @zh 获取角色的垂直速度。主要用于获取角色在垂直方向(通常是 Y 轴)的当前速度。这个值反映了角色受重力、跳跃或其他垂直运动影响时的状态。 + * - **值为 0**,表示角色位于地面; + * - **为正值**,表示角色正在上升(如跳跃); + * - **为负值**,表示角色在下落。 + */ + getVerticalVel(): number; + /** + * @en Set the slope limit for the character. + * @param slopeLimit The slope limit in degrees. + * @zh 设置角色的坡度限制。 + * @param slopeLimit 坡度限制(以度为单位)。 + */ + setSlopeLimit(slopeLimit: number): void; + /** + * @en Set the fall speed for the character. + * @param value The fall speed value. + * @zh 设置角色的下落速度。 + * @param value 下落速度值。 + */ + setfallSpeed(value: number): void; + /** + * @en Set the push force for the character. + * @param value The push force value. + * @zh 设置角色的推力。 + * @param value 推力值。 + */ + setPushForce(value: number): void; + /** + * @en Set the gravity for the character. + * @param value The gravity vector. + * @zh 设置角色的重力。 + * @param value 重力向量。 + */ + setGravity(value: Vector3): void; + /** + * @en Get the overlapping objects of the character. + * @param cb Callback function to handle each overlapping object. + * @zh 获得角色碰撞的对象。 + * @param cb 处理每个重叠对象的回调函数。 + */ + getOverlappingObj(cb: (body: btCollider) => void): void; + /** + * @en Set the collider shape for the character. + * @param shape The collider shape to set. + * @zh 设置角色的碰撞器形状。 + * @param shape 要设置的碰撞器形状。 + */ + setColliderShape(shape: btColliderShape): void; + /** + * @en Destroy CharacterController + * @zh 销毁角色控制器 + */ + destroy(): void; + } + enum btColliderType { + RigidbodyCollider = 0, + CharactorCollider = 1, + StaticCollider = 2 + } + /** + * @en btCollider class is used to handle 3D physics collisions. + * @zh btCollider 类用于处理3D物理碰撞。 + */ + class btCollider implements ICollider { + component: PhysicsColliderComponent; + static _colliderID: number; + static _addUpdateList: boolean; + /** + * @en Static rigid body type. + * Set to a rigid body that will never move, and the engine will not automatically update it. + * If you intend to move physics objects, it is recommended to use TYPE_KINEMATIC. + * @zh 刚体类型_静态。 + * 设定为永远不会移动刚体,引擎也不会自动更新。 + * 如果你打算移动物理,建议使用TYPE_KINEMATIC。 + */ + static TYPE_STATIC: number; + /** + * @en Dynamic rigid body type. + * The rigid body can be moved through forces and impulses, and there's no need to modify the movement transformation. + * @zh 刚体类型_动态。 + * 可以通过力和冲量移动刚体,并且不需要修改移动变换。 + */ + static TYPE_DYNAMIC: number; + /** + * @en Kinematic rigid body type. + * The rigid body can be moved, and the physics engine will automatically handle dynamic interactions. + * Note: It will not produce dynamic interactions with static or other types of rigid bodies. + * @zh 刚体类型_运动。 + * 可以移动刚体,物理引擎会自动处理动态交互。 + * 注意:和静态或其他类型刚体不会产生动态交互。 + */ + static TYPE_KINEMATIC: number; + protected static _btVector30: number; + /** + * @en The underlying Bullet physics collider object. + * @zh 物理碰撞器对象。 + */ + _btCollider: any; + /** + * @en The shape of the Bullet physics collider. + * @zh 物理碰撞器的形状。 + */ + _btColliderShape: btColliderShape; + /** + * @en The collision group that this collider belongs to. + * @zh 此碰撞器所属的碰撞组。 + */ + _collisionGroup: number; + /** + * @en The collision mask determining which groups this collider can collide with. + * @zh 决定此碰撞器可以与哪些组碰撞的碰撞掩码。 + */ + _canCollideWith: number; + /** + * @en The physics manager handling this collider. + * @zh 处理此碰撞器的物理管理器。 + */ + _physicsManager: btPhysicsManager; + /** + * @en Indicates whether the collider is currently simulated in the physics world. + * @zh 表示碰撞器是否已在物理世界中生效。 + */ + _isSimulate: boolean; + /** + * @en The type of the collider (static, dynamic, or kinematic). + * @zh 碰撞器的类型(静态、动态或运动学)。 + */ + _type: btColliderType; + /** + * @en update list index. + * @zh 更新列表中的索引。 + */ + inPhysicUpdateListIndex: number; + /** + * @en Unique identifier for the collider. + * @zh 碰撞器的唯一标识符。 + */ + _id: number; + /** + * @en Whether the collider is a trigger. + * @zh 是否为触发器。 + */ + _isTrigger: boolean; + /** + * @en Determines if collision processing is enabled for this collider. + * @zh 决定是否为此碰撞器启用碰撞处理。 + */ + _enableProcessCollisions: boolean; + /** + * @en Indicates whether the collider has been destroyed. + * @zh 表示碰撞器是否已被销毁。 + */ + _destroyed: boolean; + /** + * @en The Sprite3D object that owns this collider. + * @zh 拥有此碰撞器的Sprite3D对象。 + */ + owner: Sprite3D; + /** + * @en The Transform3D component associated with this collider. + * @zh 与此碰撞器关联的Transform3D组件。 + */ + _transform: Transform3D; + /** + * @ignore + * @en Creates an instance of btCollider. + * @param physicsManager The physics manager. + * @zh 创建一个 btCollider 的实例。 + * @param physicsManager 物理管理器。 + */ + constructor(physicsManager: btPhysicsManager); + active: boolean; + /** + * @en Sets the dynamic friction of the collider. + * @param value The dynamic friction value. + * @zh 设置碰撞器的动态摩擦力。 + * @param value 动态摩擦力值。 + */ + setDynamicFriction?(value: number): void; + /** + * @en Sets the static friction of the collider. + * @param value The static friction value. + * @zh 设置碰撞器的静态摩擦力。 + * @param value 静态摩擦力值。 + */ + setStaticFriction?(value: number): void; + /** + * @en Sets the friction combine mode. + * @param value The friction combine mode. + * @zh 设置摩擦力组合模式。 + * @param value 摩擦力组合模式。 + */ + setFrictionCombine?(value: PhysicsCombineMode): void; + /** + * @en Sets the bounce combine mode. + * @param value The bounce combine mode. + * @zh 设置弹力组合模式。 + * @param value 弹力组合模式。 + */ + setBounceCombine?(value: PhysicsCombineMode): void; + /** + * @en Sets the event filter for the collider. + * @param events Array of event names to filter. + * @zh 设置碰撞器的事件过滤器。 + * @param events 要过滤的事件名称。 + */ + setEventFilter?(events: string[]): void; + allowSleep(value: boolean): void; + /** + * @en Checks if the collider is capable of a certain feature. + * @param value The capability to check. + * @returns Whether the collider has the capability. + * @zh 检查碰撞器是否具有某种能力。 + * @param value 要检查的能力。 + * @returns 碰撞器是否具有该能力。 + */ + getCapable(value: number): boolean; + /** + * @en Sets the owner of the collider. + * @param node The Sprite3D node to set as owner. + * @zh 设置碰撞器的所有者。 + * @param node 所有者节点。 + */ + setOwner(node: Sprite3D): void; + /** + * @en Sets the collision group of the collider. + * @param value The collision group value. + * @zh 设置碰撞器的碰撞组。 + * @param value 碰撞组的值。 + */ + setCollisionGroup(value: number): void; + /** + * @en Sets which groups this collider can collide with. + * @param value The collision mask value. + * @zh 设置此碰撞器可以与哪些组碰撞。 + * @param value 碰撞掩码的值。 + */ + setCanCollideWith(value: number): void; + protected _initCollider(): void; + protected getColliderType(): btColliderType; + protected _onShapeChange(): void; + /** + * @en Sets the collider shape. + * @param shape The new collider shape. + * @zh 设置碰撞器形状。 + * @param shape 新的碰撞器形状。 + */ + setColliderShape(shape: btColliderShape): void; + /** + * @en Destroys the collider. + * @zh 销毁碰撞器。 + */ + destroy(): void; + /** + * @en Handles transform changes. + * @param flag The transform flag. + * @zh 处理变换改变。 + * @param flag 变换标志。 + */ + transformChanged(flag: number): void; + /** + * @en Sets the bounciness (restitution) of the collider. + * @param value The bounciness value. + * @zh 设置碰撞器的弹性(恢复系数)。 + * @param value 弹性值。 + */ + setBounciness(value: number): void; + /** + * @en Sets the friction of the collider. + * @param value The friction value. + * @zh 设置碰撞器的摩擦力。 + * @param value 摩擦力值。 + */ + setfriction(value: number): void; + /** + * @en Sets the rolling friction of the collider. + * @param value The rolling friction value. + * @zh 设置碰撞器的滚动摩擦力。 + * @param value 滚动摩擦力值。 + */ + setRollingFriction(value: number): void; + /** + * @en Sets the CCD (Continuous Collision Detection) motion threshold. + * @param value The CCD motion threshold value. + * @zh 设置 CCD(连续碰撞检测)运动阈值。 + * @param value CCD 运动阈值。 + */ + setCcdMotionThreshold(value: number): void; + /** + * @en Sets the CCD (Continuous Collision Detection) swept sphere radius. + * @param value The CCD swept sphere radius value. + * @zh 设置 CCD(连续碰撞检测)扫描球半径。 + * @param value CCD 扫描球半径。 + */ + setCcdSweptSphereRadius(value: number): void; + } + /** + * @en The `btRigidBodyCollider` class is used to implement 3D physics rigid body colliders. + * @zh `btRigidBodyCollider` 类用于实现3D物理刚体碰撞器。 + */ + class btRigidBodyCollider extends btCollider implements IDynamicCollider { + constructor(manager: btPhysicsManager); + /** + * @en Get the capability of the rigid body collider. + * @param value The capability value to check. + * @returns Whether the rigid body collider has the specified capability. + * @zh 获取刚体碰撞器的能力。 + * @param value 要检查的能力值。 + * @returns 刚体碰撞器是否具有指定的能力。 + */ + getCapable(value: number): boolean; + /** + * @en Get the capability of the rigid body. + * @param value The capability to check. + * @returns Whether the rigid body has the specified capability. + * @zh 获取刚体的能力。 + * @param value 要检查的能力。 + * @returns 刚体是否具有指定的能力。 + */ + static getRigidBodyCapable(value: EColliderCapable): boolean; + /** + * @en Initialize the capabilities of the rigid body collider. + * @zh 初始化刚体碰撞器的能力。 + */ + static initCapable(): void; + /** + * @en Set the world position of the rigid body. + * @param value The new world position. + * @zh 设置刚体的世界坐标位置。 + * @param value 坐标位置。 + */ + setWorldPosition(value: Vector3): void; + /** + * @en Set the world rotation of the rigid body. + * @param value The new world rotation. + * @zh 设置刚体在世界坐标系下的旋转。 + * @param value 旋转四元数。 + */ + setWorldRotation(value: Quaternion): void; + /** + * @en Set the rigid body to sleep state. + * @zh 设置刚体进入睡眠状态。 + */ + sleep(): void; + protected getColliderType(): btColliderType; + /** + * @en Whether to override gravity. + * @zh 是否重载重力。 + */ + private _setoverrideGravity; + /** + * @en Whether it is sleeping. + * @zh 是否处于睡眠状态。 + */ + isSleeping(): boolean; + protected _initCollider(): void; + protected _onShapeChange(): void; + /** + * @en Set the linear damping of the rigid body. + * @param value The linear damping value. + * @zh 设置刚体的线性阻尼。 + * @param value 线性阻尼值。 + */ + setLinearDamping(value: number): void; + /** + * @en Set the angular damping of the rigid body. + * @param value The angular damping value. + * @zh 设置刚体的角速度阻尼。 + * @param value 角速度阻尼值。 + */ + setAngularDamping(value: number): void; + /** + * @en Set the linear velocity of the rigid body. + * @param value The linear velocity vector. + * @zh 设置刚体的线速度。 + * @param value 线速度向量。 + */ + setLinearVelocity(value: Vector3): void; + /** + * @en Get the linear velocity of the rigid body. + * @returns The current linear velocity vector. + * @zh 获取刚体的线速度。 + * @returns 当前的线速度。 + */ + getLinearVelocity(): Vector3; + /** + * @en Set the linear velocity threshold for the rigid body. + * @param value The linear velocity threshold vector. + * @zh 设置刚体线速度阈值。 + * @param value 线速度阈值。 + */ + setSleepLinearVelocity(value: Vector3): void; + /** + * @en Set the angular velocity of the rigid body. + * @param value The angular velocity vector. + * @zh 设置刚体的角速度。 + * @param value 角速度。 + */ + setAngularVelocity(value: Vector3): void; + /** + * @en Get the angular velocity of the rigid body. + * @returns The current angular velocity vector. + * @zh 获取刚体的角速度。 + * @returns 当前的角速度。 + */ + getAngularVelocity(): Vector3; + /** + * @en Set the mass of the rigid body. + * @param value The mass value. + * @zh 设置刚体的质量。 + * @param value 质量值。 + */ + setMass(value: number): void; + /** + * @en Set the inertia tensor of the rigid body. + * @param value The inertia tensor vector. + * @zh 设置刚体的惯性张量。 + * @param value 惯性张量。 + */ + setInertiaTensor(value: Vector3): void; + /** + * @en Set the center of mass of the rigid body. + * @param value The center of mass vector. + * @zh 设置刚体的质心。 + * @param value 质心。 + */ + setCenterOfMass(value: Vector3): void; + /** + * @en Set the maximum angular velocity of the rigid body. + * @param value The maximum angular velocity. + * @zh 设置刚体的最大角速度。 + * @param value 角速度。 + */ + setMaxAngularVelocity(value: number): void; + /** + * @en Set the maximum depenetration velocity of the rigid body. + * @param value The maximum depenetration velocity. + * @zh 设置刚体的最大去穿透速度。 + * @param value 速度。 + */ + setMaxDepenetrationVelocity(value: number): void; + /** + * @en Set the linear velocity threshold for the rigid body to sleep. + * @param value The linear velocity threshold. + * @zh 设置刚体进入睡眠状态的线速度阈值。 + * @param value 线速度阈值。 + */ + setSleepThreshold(value: number): void; + /** + * @en Set the angular velocity threshold for the rigid body to sleep. + * @param value The angular velocity threshold. + * @zh 设置刚体进入睡眠状态的角速度阈值。 + * @param value 角速度阈值。 + */ + setSleepAngularVelocity(value: number): void; + /** + * @en Set the solver iterations for the rigid body. + * @param value The number of solver iterations. + * @zh 设置刚体的求解器迭代次数。 + * @param value 求解器迭代次数。 + */ + setSolverIterations(value: number): void; + /** + * @en Set the collision detection mode for the rigid body. + * @param value The collision detection mode. + * @zh 设置刚体的碰撞检测模式。 + * @param value 碰撞检测模式。 + */ + setCollisionDetectionMode(value: number): void; + /** + * @en Set whether the rigid body is kinematic. + * @param value True if the body should be kinematic, false otherwise. + * @zh 设置刚体是否为运动学刚体。 + * @param value 如果为true,则设置为运动学刚体;否则为false。 + */ + setIsKinematic(value: boolean): void; + /** + * @en Set the linear and angular factor constraints for the rigid body. + * @param linearFactor The linear factor constraint. + * @param angularFactor The angular factor constraint. + * @zh 设置刚体的线性和角度因子约束。 + * @param linearFactor 线性因子约束。 + * @param angularFactor 角度因子约束。 + */ + setConstraints(linearFactor: Vector3, angularFactor: Vector3): void; + /** + * @en Set whether the rigid body is a trigger. + * @param value True if the body should be a trigger, false otherwise. + * @zh 设置刚体是否为触发器。 + * @param value 如果为true,则设置为触发器;否则为false。 + */ + setTrigger(value: boolean): void; + /** + * @en Apply a force to the rigid body. + * @param force The force to be applied. + * @param localOffset The offset. If null, force is applied at the center. + * @zh 应用作用力。 + * @param force 要施加的作用力。 + * @param localOffset 偏移量,如果为null则为中心点。 + */ + private _applyForce; + /** + * @en Apply a torque to the rigid body. + * @param torque The torque to be applied. + * @zh 应用扭转力。 + * @param torque 要施加的扭转力。 + */ + private _applyTorque; + /** + * @en Apply an impulse to the rigid body. + * @param impulse The impulse to be applied. + * @param localOffset The offset. If null, force is applied at the center. + * @zh 应用冲量。 + * @param impulse 要施加的冲量。 + * @param localOffset 偏移量,如果为null则为中心点。 + */ + private _applyImpulse; + /** + * @en Apply a torque impulse to the rigid body. + * @param torqueImpulse The torque impulse to be applied. + * @zh 应用扭转冲量。 + * @param torqueImpulse 要施加的扭转冲量。 + */ + private _applyTorqueImpulse; + /** + * @en Add a force to the rigid body. + * @param force The force to be added. + * @param mode The force mode. + * @param localOffset The offset from the center of mass. + * @zh 向刚体添加力。 + * @param force 要添加的力。 + * @param mode 力的模式。 + * @param localOffset 相对于质心的偏移量。 + */ + addForce(force: Vector3, mode: PhysicsForceMode, localOffset: Vector3): void; + /** + * @en Add a torque to the rigid body. + * @param torque The torque to be added. + * @param mode The force mode. + * @zh 向刚体添加扭矩。 + * @param torque 要添加的扭矩。 + * @param mode 力的模式。 + */ + addTorque(torque: Vector3, mode: PhysicsForceMode): void; + /** + * @en Clear all forces applied to the rigid body. + * @zh 清除应用到刚体上的所有力。 + */ + private clearForces; + /** + * @en Wake up the rigid body. + * @zh 唤醒刚体。 + */ + wakeUp(): void; + protected _onScaleChange(scale: Vector3): void; + /** + * @en Set the collider shape for the rigid body. + * @param shape The collider shape to be set. + * @zh 设置刚体的碰撞器形状。 + * @param shape 要设置的碰撞器形状。 + */ + setColliderShape(shape: btColliderShape): void; + /** + * @en Destroy the rigid body. + * @zh 销毁刚体。 + */ + destroy(): void; + } + /** + * @en The `btStaticCollider` class is used to create and manage static colliders. + * @zh `btStaticCollider` 类用于创建和管理静态碰撞体。 + */ + class btStaticCollider extends btCollider implements IStaticCollider { + protected _initCollider(): void; + /** + * @en Set whether the collider is a trigger. + * @param value True if the collider should be a trigger, false otherwise. + * @zh 设置碰撞体是否为触发器。 + * @param value 如果为true,则设置为触发器;否则为false。 + */ + setTrigger(value: boolean): void; + allowSleep(value: boolean): void; + protected getColliderType(): btColliderType; + /** + * @en Check if the collider has a specific capability. + * @param value The capability to check. + * @returns Whether the collider has the specified capability. + * @zh 检查碰撞体是否具有特定能力。 + * @param value 要检查的能力。 + * @returns 碰撞体是否具有指定的能力。 + */ + getCapable(value: number): boolean; + /** + * @ignore + * @en Creates an instance of `btStaticCollider`. + * @param physicsManager The physics manager. + * @zh 创建一个 `btStaticCollider` 的实例。 + * @param physicsManager 物理管理器。 + */ + constructor(physicsManager: btPhysicsManager); + /** + * @en Check if the static collider has a specific capability. + * @param value The capability to check. + * @returns Whether the static collider has the specified capability. + * @zh 检查静态碰撞体是否具有特定能力。 + * @param value 要检查的能力。 + * @returns 静态碰撞体是否具有指定的能力。 + */ + static getStaticColliderCapable(value: EColliderCapable): boolean; + /** + * @en Initialize the capabilities of the static collider. + * @zh 初始化静态碰撞体的能力。 + */ + static initCapable(): void; + /** + * @en Set the world position of the static collider. + * @param value The world position. + * @zh 设置静态碰撞体的世界坐标位置。 + * @param value 坐标位置。 + */ + setWorldPosition(value: Vector3): void; + /** + * @en Destroy Static Collider + * @zh 销毁静态碰撞器 + */ + destroy(): void; + } + /** + * @en The `btCustomJoint` class is used for detailed control of joints. + * @zh 类`btCustomJoint`用于实现关节的详细控制。 + */ + class btCustomJoint extends btJoint implements ID6Joint { + /** + * @en Initializes the joint. + * @zh 初始化关节。 + */ + initJoint(): void; + protected _createJoint(): void; + /** + * @en Initializes all constraint information for the joint. + * @zh 初始化关节的所有约束信息。 + */ + _initAllConstraintInfo(): void; + /** + * @ignore + * @en Creates an instance of btCustomJoint. + * @param manager The Bullet physics manager instance used to handle physics simulations. + * @zh 创建一个btCustomJoint的实例。 + * @param manager 用于处理物理模拟的Bullet物理管理器实例。 + */ + constructor(manager: btPhysicsManager); + /** + * @en Sets the local position of the joint. + * @param pos The new local position vector. + * @zh 设置关节的局部位置。 + * @param pos 新的局部位置向量。 + */ + setLocalPos(pos: Vector3): void; + /** + * @en Sets the connected local position of the joint. + * @param pos The new connected local position vector. + * @zh 设置关节的连接局部位置。 + * @param pos 新的连接局部位置向量。 + */ + setConnectLocalPos(pos: Vector3): void; + /** + * @en Sets the primary and secondary axes for the joint. + * @param axis The primary axis vector. + * @param secendary The secondary axis vector. + * @zh 设置关节的主轴和次轴。 + * @param axis 主轴向量。 + * @param secendary 次轴向量。 + */ + setAxis(axis: Vector3, secendary: Vector3): void; + /** + * @en Sets the motion type for a specific axis of the constraint. + * @param axis The constraint type to set. + * @param motionType The motion type to apply. + * @zh 设置约束特定轴的运动类型。 + * @param axis 要设置的约束类型。 + * @param motionType 要应用的运动类型。 + */ + setMotion(axis: D6Axis, motionType: D6MotionType): void; + /** + * @en Sets the distance limit for the constraint. + * @param limit The distance limit. + * @param bounceness The bounciness of the constraint. + * @param bounceThreshold The bounce threshold. + * @param spring The spring stiffness. + * @param damp The damping value. + * @zh 设置约束的距离限制。 + * @param limit 距离限制。 + * @param bounceness 约束的弹性。 + * @param bounceThreshold 弹跳阈值。 + * @param spring 弹簧刚度。 + * @param damp 阻尼值。 + */ + setDistanceLimit(limit: number, bounceness: number, bounceThreshold: number, spring: number, damp: number): void; + /** + * @en Sets the linear limit for a specific axis of the constraint. + * @param linearAxis The linear axis to set the limit for. + * @param upper The upper limit. + * @param lower The lower limit. + * @param bounceness The bounciness of the constraint. + * @param bounceThreshold The bounce threshold. + * @param spring The spring stiffness. + * @param damping The damping value. + * @zh 设置约束特定轴的线性限制。 + * @param linearAxis 要设置限制的线性轴。 + * @param upper 上限。 + * @param lower 下限。 + * @param bounceness 约束的弹性。 + * @param bounceThreshold 弹跳阈值。 + * @param spring 弹簧刚度。 + * @param damping 阻尼值。 + */ + setLinearLimit(linearAxis: D6MotionType, upper: number, lower: number, bounceness: number, bounceThreshold: number, spring: number, damping: number): void; + /** + * @en Sets the twist limit for the constraint. + * @param upper The upper twist limit (in radians). + * @param lower The lower twist limit (in radians). + * @param bounceness The bounciness of the constraint. + * @param bounceThreshold The bounce threshold. + * @param spring The spring stiffness. + * @param damping The damping value. + * @zh 设置约束的扭转限制。 + * @param upper 上扭转限制(弧度)。 + * @param lower 下扭转限制(弧度)。 + * @param bounceness 约束的弹性。 + * @param bounceThreshold 弹跳阈值。 + * @param spring 弹簧刚度。 + * @param damping 阻尼值。 + */ + setTwistLimit(upper: number, lower: number, bounceness: number, bounceThreshold: number, spring: number, damping: number): void; + /** + * @en Sets the swing limit for the constraint. + * @param yAngle The Y-axis swing limit (in radians). + * @param zAngle The Z-axis swing limit (in radians). + * @param bounceness The bounciness of the constraint. + * @param bounceThreshold The bounce threshold. + * @param spring The spring stiffness. + * @param damping The damping value. + * @zh 设置约束的摆动限制。 + * @param yAngle Y轴摆动限制(弧度)。 + * @param zAngle Z轴摆动限制(弧度)。 + * @param bounceness 约束的弹性。 + * @param bounceThreshold 弹跳阈值。 + * @param spring 弹簧刚度。 + * @param damping 阻尼值。 + */ + setSwingLimit(yAngle: number, zAngle: number, bounceness: number, bounceThreshold: number, spring: number, damping: number): void; + /** + * @en Sets the drive parameters for a specific axis of the constraint. + * @param index The drive axis index. + * @param stiffness The drive stiffness. + * @param damping The drive damping. + * @param forceLimit The force limit for the drive. + * @zh 设置约束特定轴的驱动参数。 + * @param index 驱动轴索引。 + * @param stiffness 驱动刚度。 + * @param damping 驱动阻尼。 + * @param forceLimit 驱动力限制。 + */ + setDrive(index: D6Drive, stiffness: number, damping: number, forceLimit: number): void; + /** + * @en Sets the drive transform for the constraint. + * @param position The target position. + * @param rotate The target rotation. + * @zh 设置约束的驱动变换。 + * @param position 目标位置。 + * @param rotate 目标旋转。 + */ + setDriveTransform(position: Vector3, rotate: Quaternion): void; + /** + * @en Sets the drive velocity for the constraint. + * @param position The target linear velocity. + * @param angular The target angular velocity. + * @zh 设置约束的驱动速度。 + * @param position 目标线性速度。 + * @param angular 目标角速度。 + */ + setDriveVelocity(position: Vector3, angular: Vector3): void; + /** + * @en Gets the current twist angle of the constraint. + * @zh 获取约束当前的扭转角度。 + */ + getTwistAngle(): number; + /** + * @en Gets the current swing Y angle of the constraint. + * @returns The current swing Y angle. + * @zh 获取约束当前的Y轴摆动角度。 + * @returns 当前Y轴摆动角度。 + */ + getSwingYAngle(): number; + /** + * @en Gets the current swing Z angle of the constraint. + * @returns The current swing Z angle. + * @zh 获取约束当前的Z轴摆动角度。 + * @returns 当前Z轴摆动角度。 + */ + getSwingZAngle(): number; + /** + * @en Destroy joint + * @zh 销毁关节 + */ + destroy(): void; + } + /** + * @en Class `btFixedJoint` is used to create a fixed joint in the physical engine. + * @zh 类`btFixedJoint`用于在物理引擎中创建固定关节。 + */ + class btFixedJoint extends btJoint implements IFixedJoint { + /** + * @en Creates an instance of `btFixedJoint`. + * @param manager The physics manager that will handle this joint. + * @zh 创建一个实例`btFixedJoint`。 + * @param manager 将处理这个关节的物理管理器。 + */ + constructor(manager: btPhysicsManager); + protected _createJoint(): void; + /** + * @en Destroy joint + * @zh 销毁关节 + */ + destroy(): void; + } + /** + * @en The class `btHingeJoint` represents a hinge joint between two rigid bodies. + * @zh 类 `btHingeJoint` 表示两个刚体之间的摆动关节。 + */ + class btHingeJoint extends btJoint implements IHingeJoint { + protected _createJoint(): void; + /** + * @ignore + * @en Creates an instance of btHingeJoint. + * @param manager The physics manager. + * @zh 创建 `btHingeJoint` 的实例。 + * @param manager 物理管理器。 + */ + constructor(manager: btPhysicsManager); + /** + * @en Sets the local position of the joint. + * @param pos The new local position vector. + * @zh 设置关节的局部位置。 + * @param pos 新的局部位置。 + */ + setLocalPos(pos: Vector3): void; + /** + * @en Sets the connected local position of the joint. + * @param pos The new connected local position vector. + * @zh 设置关节的连接局部位置。 + * @param pos 新的连接局部位置。 + */ + setConnectLocalPos(pos: Vector3): void; + /** + * @en Sets the lower limit of the joint's rotation. + * @param lowerLimit The new lower limit in radians. + * @zh 设置关节旋转的下限。 + * @param lowerLimit 新的下限值,单位为弧度。 + */ + setLowerLimit(lowerLimit: number): void; + /** + * @en Sets the upper limit of the joint's rotation. + * @param value The new upper limit in radians. + * @zh 设置关节旋转的上限。 + * @param value 新的上限值,单位为弧度。 + */ + setUpLimit(value: number): void; + /** + * @en Sets the bounciness of the joint. + * @param value The bounce factor. If less than or equal to 0, it will be set to 0. + * @zh 设置关节的弹性。 + * @param value 弹跳因子。如果小于或等于0,将被设置为0。 + */ + setBounceness(value: number): void; + /** + * @en Sets the minimum velocity for bounce. + * @param value The minimum velocity value. + * @zh 设置弹跳的最小速度。 + * @param value 最小速度值。 + */ + setBouncenMinVelocity(value: number): void; + /** + * @en Sets the contact distance for the joint. + * @param value The contact distance value. + * @zh 设置关节的接触距离。 + * @param value 接触距离值。 + */ + setContactDistance(value: number): void; + /** + * @en Enables or disables the joint limit. + * @param value True to enable the limit, false to disable. + * @zh 启用或禁用关节限制。 + * @param value 为true时启用限制,为false时禁用。 + */ + enableLimit(value: boolean): void; + /** + * @en Enables or disables the joint drive. + * @param value True to enable the drive, false to disable. + * @zh 启用或禁用关节驱动。 + * @param value 为true时启用驱动,为false时禁用。 + */ + enableDrive(value: boolean): void; + /** + * @en Enables or disables free spin for the joint. + * @param value True to enable free spin, false to disable. + * @zh 启用或禁用关节的自由旋转。 + * @param value 为true时启用自由旋转,为false时禁用。 + */ + enableFreeSpin(value: boolean): void; + /** + * @en Sets the axis of rotation for the hinge joint. + * @param value A vector representing the axis of rotation. + * @zh 设置铰链关节的旋转轴。 + * @param value 表示旋转轴的向量。 + */ + setAxis(value: Vector3): void; + /** + * @en Sets the swing offset for the joint. + * @param value The swing offset vector. + * @zh 设置关节的摆动偏移。 + * @param value 摆动偏移向量。 + */ + setSwingOffset(value: Vector3): void; + /** + * @en Gets the current angle of the joint. + * @zh 获取关节的当前角度。 + */ + getAngle(): number; + /** + * @en Gets the current velocity of the joint. + * @zh 获取关节的当前速度。 + */ + getVelocity(): Readonly; + /** + * @en Sets the hard limit for the joint. + * @param lowerLimit The lower limit of the joint's movement. + * @param upperLimit The upper limit of the joint's movement. + * @param contactDist The contact distance. + * @zh 设置关节的硬限制。 + * @param lowerLimit 关节运动的下限。 + * @param upperLimit 关节运动的上限。 + * @param contactDist 接触距离。 + */ + setHardLimit(lowerLimit: number, upperLimit: number, contactDist: number): void; + /** + * @en Sets the soft limit for the joint. + * @param lowerLimit The lower limit of the joint's movement. + * @param upperLimit The upper limit of the joint's movement. + * @param stiffness The stiffness of the soft limit. + * @param damping The damping of the soft limit. + * @zh 设置关节的软限制。 + * @param lowerLimit 关节运动的下限。 + * @param upperLimit 关节运动的上限。 + * @param stiffness 软限制的刚度。 + * @param damping 软限制的阻尼。 + */ + setSoftLimit(lowerLimit: number, upperLimit: number, stiffness: number, damping: number): void; + /** + * @en Sets the drive velocity for the joint. + * @param velocity The target velocity for the joint's motor. + * @zh 设置关节的驱动速度。 + * @param velocity 关节电机的目标速度。 + */ + setDriveVelocity(velocity: number): void; + /** + * @en Sets the drive force limit for the joint. + * @param limit The maximum force that can be applied by the joint's motor. + * @zh 设置关节的驱动力限制。 + * @param limit 关节电机可以施加的最大力。 + */ + setDriveForceLimit(limit: number): void; + /** + * @en Sets the drive gear ratio for the joint. + * @param ratio The gear ratio for the joint's motor. + * @zh 设置关节的驱动齿轮比。 + * @param ratio 关节电机的齿轮比。 + */ + setDriveGearRatio(ratio: number): void; + /** + * @en Sets a specific flag for the hinge joint. + * @param flag The flag to be set. + * @param value The boolean value to set the flag to. + * @zh 为铰链关节设置特定标志。 + * @param flag 要设置的标志。 + * @param value 设置标志的布尔值。 + */ + setHingeJointFlag(flag: number, value: boolean): void; + /** + * @en Destroy joint + * @zh 销毁关节 + */ + destroy(): void; + } + /** + * @en Class `btJoint` is the base class for all joints in LayaAir physics engine. + * @zh 类`btJoint`用于实现物理关节的基类。 + */ + class btJoint implements IJoint { + _manager: btPhysicsManager; + /** + * @en Whether to perform collision detection between the two connected objects. + * @zh 连接的两个物体是否进行碰撞检测。 + */ + _disableCollisionsBetweenLinkedBodies: boolean; + static __init__(): void; + /** + * @en Initialize the joint capability map. + * @zh 初始化关节能力映射。 + */ + static initJointCapable(): void; + /** + * @en Get the joint capability. + * @param value The joint capability to check. + * @returns Whether the joint has the specified capability. + * @zh 获取关节能力。 + * @param value 要检查的关节能力。 + * @returns 关节是否具有指定的能力。 + */ + static getJointCapable(value: EJointCapable): boolean; + /** + * @en Creates an instance of btJoint. + * @param manager The physics manager. + * @zh 创建一个 btJoint 的实例。 + * @param manager 物理管理器。 + */ + constructor(manager: btPhysicsManager); + protected _createJoint(): void; + destroy(): void; + /** + * @en Set the collider for the joint. + * @param collider The collider to set. + * @zh 设置关节的碰撞器。 + * @param collider 要设置的碰撞器。 + */ + setCollider(collider: btCollider): void; + /** + * @en Set the connected collider for the joint. + * @param collider The connected collider to set. + * @zh 设置关节的连接碰撞器。 + * @param collider 要设置的连接碰撞器。 + */ + setConnectedCollider(collider: btCollider): void; + /** + * @en Set the local position of the joint. + * @param pos The local position to set. + * @zh 设置关节的局部位置。 + * @param pos 要设置的局部位置。 + */ + setLocalPos(pos: Vector3): void; + /** + * @en Set the connected local position of the joint. + * @param pos The connected local position to set. + * @zh 设置关节的连接局部位置。 + * @param pos 要设置的连接局部位置。 + */ + setConnectLocalPos(pos: Vector3): void; + /** + * @en Get the linear force of the joint. + * @zh 获取关节的线性力。 + */ + getlinearForce(): Vector3; + /** + * @en Get the angular force of the joint. + * @zh 获取关节的角力。 + */ + getAngularForce(): Vector3; + /** + * @en Check if the joint is valid. + * @zh 检查关节是否有效。 + */ + isValid(): boolean; + /** + * @en Enable or disable the joint. + * @param value Whether to enable the joint. + * @zh 启用或禁用关节。 + * @param value 是否启用关节。 + */ + isEnable(value: boolean): void; + /** + * @en Set whether collision is enabled between connected bodies. + * @param value Whether to enable collision. + * @zh 设置连接的物体之间是否启用碰撞。 + * @param value 是否启用碰撞。 + */ + isCollision(value: boolean): void; + protected initJoint(): void; + /** + * @en Set the owner of the joint. + * @param owner The owner to set. + * @zh 设置关节的所有者。 + * @param owner 要设置的所有者。 + */ + setOwner(owner: Sprite3D): void; + /** + * @en Check if the joint is constrained by break force or torque. + * @zh 检查关节是否受到断裂力或扭矩的约束。 + */ + _isBreakConstrained(): boolean; + /** + * @en Set the mass scale of the connected body. + * @param value The mass scale to set. + * @zh 设置连接物体的质量比例。 + * @param value 要设置的质量比例。 + */ + setConnectedMassScale(value: number): void; + /** + * @en Set the inertia scale of the connected body. + * @param value The inertia scale to set. + * @zh 设置连接物体的惯性比例。 + * @param value 要设置的惯性比例。 + */ + setConnectedInertiaScale(value: number): void; + /** + * @en Set the mass scale of the joint. + * @param value The mass scale to set. + * @zh 设置关节的质量比例。 + * @param value 要设置的质量比例。 + */ + setMassScale(value: number): void; + /** + * @en Set the inertia scale of the joint. + * @param value The inertia scale to set. + * @zh 设置关节的惯性比例。 + * @param value 要设置的惯性比例。 + */ + setInertiaScale(value: number): void; + /** + * @en Set the break force of the joint. + * @param value The break force to set. + * @zh 设置关节的断裂力。 + * @param value 要设置的断裂力。 + */ + setBreakForce(value: number): void; + /** + * @en Set the break torque of the joint. + * @param value The break torque to set. + * @zh 设置关节的断裂扭矩。 + * @param value 要设置的断裂扭矩。 + */ + setBreakTorque(value: number): void; + } + /** + * @en The `btSpringJoint` class is used to create and manage spring joints in the physics engine. + * @zh 类`btSpringJoint`用于在物理引擎中创建和管理弹簧关节。 + */ + class btSpringJoint extends btJoint implements ISpringJoint { + protected _createJoint(): void; + /** + * @ignore + * @en Creates an instance of the `btSpringJoint` class. + * @param manager The physics manager. + * @zh 创建一个btSpringJoint类的实例。 + * @param manager 物理管理器。 + */ + constructor(manager: btPhysicsManager); + /** + * @en Sets the local position of the joint. + * @param pos The local position. + * @zh 设置关节的局部位置。 + * @param pos 局部位置。 + */ + setLocalPos(pos: Vector3): void; + /** + * @en Sets the connected local position of the joint. + * @param pos The connected local position. + * @zh 设置关节连接的局部位置。 + * @param pos 连接局部位置。 + */ + setConnectLocalPos(pos: Vector3): void; + /** + * @en Sets the swing offset of the joint. + * @param value The swing offset. + * @zh 设置关节的摆动偏移量。 + * @param value 摆动偏移量。 + */ + setSwingOffset(value: Vector3): void; + /** + * @en Sets the minimum distance of the spring joint. + * @param distance The minimum distance value. + * @zh 设置弹簧关节的最小距离。 + * @param distance 最小距离值。 + */ + setMinDistance(distance: number): void; + /** + * @en Sets the maximum distance of the spring joint. + * @param distance The maximum distance value. + * @zh 设置弹簧关节的最大距离。 + * @param distance 最大距离值。 + */ + setMaxDistance(distance: number): void; + /** + * @ignore + */ + setTolerance(tolerance: number): void; + /** + * @en Sets the stiffness of the spring joint. + * @param stiffness The stiffness value. + * @zh 设置弹簧关节的刚度。 + * @param stiffness 刚度值。 + */ + setStiffness(stiffness: number): void; + /** + * @en Sets the damping of the spring joint. + * @param damping The damping value. + * @zh 设置弹簧关节的阻尼。 + * @param damping 阻尼值。 + */ + setDamping(damping: number): void; + /** + * @en Destroy joint + * @zh 销毁关节 + */ + destroy(): void; + } + /** + * @en The `btBoxColliderShape` class is used to create and manage box collision shapes for the physics engine. + * @zh 类`btBoxColliderShape` 用于创建和管理物理引擎的盒子碰撞形状。 + */ + class btBoxColliderShape extends btColliderShape implements IBoxColliderShape { + constructor(); + private changeBoxShape; + protected _createShape(): void; + protected _getType(): number; + /** + * @en Sets the size of the box collider shape. + * @param size The new size of the box. + * @zh 设置盒子碰撞器形状的大小。 + * @param size 盒子的新大小。 + */ + setSize(size: Vector3): void; + /** + * @en Destroys the box collider shape and releases resources. + * @zh 销毁盒子碰撞器形状并释放资源。 + */ + destroy(): void; + } + /** + * @en The `btCapsuleColliderShape` class is used to create and manage capsule-shaped colliders. + * @zh 类 `btCapsuleColliderShape` 用于创建和管理胶囊形状的碰撞体。 + */ + class btCapsuleColliderShape extends btColliderShape implements ICapsuleColliderShape { + private static _tempVector30; + constructor(); + protected _createShape(): void; + protected _getType(): number; + /** + * @en Sets the radius of the capsule. + * @param radius The radius of the capsule. + * @zh 设置胶囊体的半径。 + * @param radius 胶囊体的半径。 + */ + setRadius(radius: number): void; + /** + * @en Sets the height of the capsule. + * @param height The height of the capsule. + * @zh 设置胶囊体的高度。 + * @param height 胶囊体的高度。 + */ + setHeight(height: number): void; + /** + * @en Sets the up axis of the capsule. + * @param upAxis The up axis of the capsule. + * @zh 设置胶囊体的朝向轴。 + * @param upAxis 胶囊体的朝向轴。 + */ + setUpAxis(upAxis: number): void; + /** + * @en Sets the world scale of the capsule collider shape. + * @param scale The scale of the capsule collider shape. + * @zh 设置胶囊碰撞器形状的世界缩放。 + * @param scale 缩放比例。 + */ + setWorldScale(scale: Vector3): void; + /** + * @en Destroys the capsule collider shape and releases resources. + * @zh 销毁胶囊碰撞器形状并释放资源。 + */ + destroy(): void; + } + /** + * @en The `btColliderShape` class is the base class for defining and managing physics collision shapes. + * @zh 类`btColliderShape` 用于定义和管理物理碰撞形状的基类。 + */ + class btColliderShape implements IColliderShape { + /** + * @en Shape orientation along positive X-axis + * @zh 形状方向沿 X 轴正向 + */ + static SHAPEORIENTATION_UPX: number; + /** + * @en Shape orientation along positive Y-axis + * @zh 形状方向沿 Y 轴正向 + */ + static SHAPEORIENTATION_UPY: number; + /** + * @en Shape orientation along positive Z-axis + * @zh 形状方向沿 Z 轴正向 + */ + static SHAPEORIENTATION_UPZ: number; + _type: number; + _btShape: any; + _btScale: any; + _localOffset: Vector3; + _worldScale: Vector3; + _btCollider: btCollider; + _destroyed: boolean; + constructor(); + /** + * @en Gets the physics shape. + * @returns The physics shape. + * @zh 获取物理形状。 + * @returns 物理形状。 + */ + getPhysicsShape(): any; + /** + * @override + */ + protected _createShape(): void; + /** + * @override + */ + protected _getType(): number; + /** + * @en Sets the local offset of the shape. + * @param value The offset value. + * @zh 设置形状的局部偏移。 + * @param value 偏移量。 + */ + setOffset(value: Vector3): void; + /** + * @en Gets the local offset of the shape. + * @returns The local offset of the shape. + * @zh 获取形状的局部偏移。 + * @returns 局部偏移量。 + */ + getOffset(): Vector3; + /** + * @en Sets the world scale of the shape. + * @param scale The scale value. + * @zh 设置形状的世界缩放。 + * @param scale 缩放比例。 + */ + setWorldScale(scale: Vector3): void; + /** + * @en Destroys the collider shape and releases resources. + * @zh 销毁碰撞器形状并释放资源。 + */ + destroy(): void; + } + /** + * @en use to create compound collider. + * @zh 用于创建组合碰撞器。 + */ + class btCompoundColliderShape extends btColliderShape implements ICompoundColliderShape { + /** + * @en create a new instance of btCompoundColliderShape. + * @zh 创建一个新的组合碰撞形状实例。 + */ + constructor(); + clearChildShape(): void; + protected _getType(): number; + addChildShape(shape: btColliderShape): void; + removeChildShape(shape: btColliderShape, index: number): void; + setShapeData(component: PhysicsColliderComponent): void; + getChildShapeCount(): number; + /** + * @inheritDoc + * @override + */ + destroy(): void; + } + /** + * @en The `btConeColliderShape` class creates a cone shape, which is a cylinder with a conical top. + * @zh 类 `btConeColliderShape` 用于创建和管理物理引擎中圆锥碰撞器形状。 + */ + class btConeColliderShape extends btColliderShape implements IConeColliderShape { + private static _tempVector30; + constructor(); + protected _createShape(): void; + protected _getType(): number; + /** + * @en Sets the radius of the cone. + * @param radius The radius to set. + * @zh 设置圆锥的半径。 + * @param radius 圆锥的半径。 + */ + setRadius(radius: number): void; + /** + * @en Sets the height of the cone. + * @param height The height to set. + * @zh 设置圆锥的高度。 + * @param height 圆锥的高度。 + */ + setHeight(height: number): void; + /** + * @en Sets the up axis of the cone. + * @param upAxis The up axis to set. + * @zh 设置圆锥的朝向轴。 + * @param upAxis 圆锥的朝向轴。 + */ + setUpAxis(upAxis: number): void; + /** + * @en Destroys the cone collider shape and releases resources. + * @zh 销毁圆锥碰撞器形状并释放资源。 + */ + destroy(): void; + } + /** + * @en The `btCylinderColliderShape` class is used to create and manage cylinder collision shapes. + * @zh `btCylinderColliderShape` 类用于创建和管理圆柱体碰撞形状。 + */ + class btCylinderColliderShape extends btColliderShape implements ICylinderColliderShape { + private static _tempVector30; + private _btSize; + constructor(); + protected _createShape(): void; + protected _getType(): number; + /** + * @en Sets the radius of the cylinder. + * @param radius The radius of the cylinder. + * @zh 设置圆柱体的半径。 + * @param radius 圆柱体的半径。 + */ + setRadius(radius: number): void; + /** + * @en Sets the height of the cylinder. + * @param height The height of the cylinder. + * @zh 设置圆柱体的高度。 + * @param height 圆柱体的高度。 + */ + setHeight(height: number): void; + /** + * @en Sets the up axis of the cylinder. + * @param upAxis The up axis of the cylinder. + * @zh 设置圆柱体的朝上轴。 + * @param upAxis 圆柱体的朝上轴。 + */ + setUpAxis(upAxis: number): void; + /** + * @en Destroys the cylinder collider shape and releases resources. + * @zh 销毁圆柱体碰撞器形状并释放资源。 + */ + destroy(): void; + } + /** + * @en The `btMeshColliderShape` class is used to create and manage mesh-based collision shapes. + * @zh `btMeshColliderShape` 类用于创建和管理基于网格的碰撞形状。 + */ + class btMeshColliderShape extends btColliderShape implements IMeshColliderShape { + private _limitvertex; + private _convex; + /** + * @en The mesh of the collider shape. + * @zh 碰撞器形状的网格。 + */ + get mesh(): Mesh; + set mesh(value: Mesh); + static __init__(): void; + /** @ignore */ + constructor(); + /** + * @en Set the physics mesh from a given mesh. + * @param value The mesh to set. + * @zh 从给定的网格设置物理网格。 + * @param value 网格。 + */ + setPhysicsMeshFromMesh(value: Mesh): void; + /** + * @en Set the convex mesh. + * @param value The mesh to set. + * @zh 设置凸包网格。 + * @param value 网格。 + */ + setConvexMesh(value: Mesh): void; + /** + * @en Set the limit of vertices. + * @param limit The limit value. + * @zh 设置顶点限制。 + * @param limit 限制值。 + */ + setLimitVertex(limit: number): void; + private _createPhysicsMeshFromMesh; + private _createConvexMeshFromMesh; + protected _createTrianggleMeshGeometry(): void; + protected _createConvexMeshGeometry(): void; + /** + * @en Set the world scale of the collider shape. + * @param value The scale vector to set. + * @zh 设置碰撞器形状的世界缩放。 + * @param value 缩放向量。 + */ + setWorldScale(value: Vector3): void; + } + /** + * @en The `btSphereColliderShape` class is used to create and manage spherical collision shapes. + * @zh `btSphereColliderShape` 类用于创建和管理球形碰撞体形状。 + */ + class btSphereColliderShape extends btColliderShape implements ISphereColliderShape { + /** @ignore */ + constructor(); + protected _getType(): number; + protected _createShape(): void; + /** + * @en Sets the radius of the sphere. + * @param radius The radius to set. + * @zh 设置球体的半径。 + * @param radius 要设置的半径。 + */ + setRadius(radius: number): void; + /** + * @en Destroys the sphere collider shape and cleans up resources. + * @zh 销毁球形碰撞体形状并清理资源。 + */ + destroy(): void; + } + /** + * @en Interface for character controllers. + * @zh 角色控制器的接口。 + */ + interface ICharacterController extends ICollider { + /** + * @en Moves the character using a "collide-and-slide" algorithm. + * @param disp Displacement vector + * @zh 使用"碰撞并滑动"算法移动角色。 + * @param disp 位移向量 + */ + move(disp: Vector3): void; + /** + * @en Make the character jump. + * @param velocity Jump velocity + * @zh 使角色跳跃。 + * @param velocity 跳跃速度 + */ + jump?(velocity: Vector3): void; + /** + * @en Set position of CharacterController. + * @param value New position + * @zh 设置角色控制器的位置。 + * @param value 位置 + */ + setPosition(value: Vector3): void; + /** + * @en Get current position of characterController. + * @returns Current position + * @zh 获取角色控制器的当前位置。 + * @returns 当前位置 + */ + getPosition?(): Vector3; + /** + * @en Set the step height for the characterController. + * @param offset The new step offset + * @zh 设置角色控制器的步高。 + * @param offset 步高偏移量 + */ + setStepOffset?(offset: number): void; + /** + * @en Set skin width for the characterController. + * @param width The new skin width + * @zh 设置角色控制器的皮肤宽度。 + * @param width 皮肤宽度 + */ + setSkinWidth?(width: number): void; + /** + * @en Set the 'up' direction for the characterController. + * @param up The up direction + * @zh 设置角色控制器的"向上"方向。 + * @param up 向上方向 + */ + setUpDirection?(up: Vector3): void; + /** + * @en Get the vertical velocity of the characterController. + * @returns Vertical velocity + * @zh 获取角色控制器的垂直速度。 + * @returns 垂直速度 + */ + getVerticalVel?(): number; + /** + * @en Set the slope limit for the characterController. + * @param slopeLimit The new slope limit + * @zh 设置角色控制器的斜坡限制。 + * @param slopeLimit 斜坡限制 + */ + setSlopeLimit?(slopeLimit: number): void; + /** + * @en Set the gravity for the characterController. + * @param value Gravity vector + * @zh 设置角色控制器的重力。 + * @param value 重力 + */ + setGravity?(value: Vector3): void; + /** + * @en Set the radius of the characterController. + * @param value The new radius + * @zh 设置角色的半径。 + * @param value 半径 + */ + setRadius?(value: number): void; + /** + * @en Set the height of the characterController. + * @param value The height + * @zh 设置角色的高度。 + * @param value 高度 + */ + setHeight?(value: number): void; + /** + * @en Set the minimum distance for the characterController. + * @param value The minimum distance + * @zh 设置角色控制器的最小距离。 + * @param value 最小距离 + */ + setminDistance(value: number): void; + /** + * @en Set the local offset of the characterController's shape. + * @param value The local offset + * @zh 设置角色控制器形状的局部偏移。 + * @param value 局部偏移 + */ + setShapelocalOffset(value: Vector3): void; + /** + * @en Set the push force for the characterController. + * @param value The push force + * @zh 设置角色控制器的推力。 + * @param value 推力 + */ + setPushForce?(value: number): void; + /** + * @en Set the jump speed for the characterController. + * @param value The jump speed + * @zh 设置角色控制器的跳跃速度。 + * @param value 跳跃速度 + */ + setJumpSpeed?(value: number): void; + } + /** + * @en Interface for collider. + * @zh 碰撞器的接口。 + */ + interface ICollider { + /** + * @en The owner node of the collider. + * @zh 碰撞器所属的节点。 + */ + owner: Node; + /** + * @en Indicates whether the collider can be enabled. It's true only when placed in the scene and the physics component is effective. + * @zh 是否可以启用,只有放入scene中且物理组件生效才会为true。 + */ + active: boolean; + /** + * @en Index in the physics update list. + * @zh 在物理更新列表中的索引。 + */ + inPhysicUpdateListIndex: number; + /** + * @en The physics collider component associated with this collider. + * @zh 与此碰撞器关联的物理碰撞器组件。 + */ + component: PhysicsColliderComponent; + /** + * @en Get the capability of the collider. + * @param value The capability value to check. + * @zh 获取碰撞器的能力。 + * @param value 要检查的能力值。 + */ + getCapable(value: number): boolean; + /** + * @en Set the collider shape. + * @param shape The collider shape to set. + * @zh 设置碰撞器形状。 + * @param shape 要设置的碰撞器形状。 + */ + setColliderShape(shape: IColliderShape): void; + /** + * @en Destroy the collider. + * @zh 销毁碰撞器。 + */ + destroy(): void; + /** + * @en Set the collision group of the collider. + * @param value The collision group value. + * @zh 设置碰撞器的碰撞组。 + * @param value 碰撞组的值。 + */ + setCollisionGroup(value: number): void; + /** + * @en Set the groups that this collider can collide with. + * @param value The collision mask value. + * @zh 设置此碰撞器可以与之碰撞的组。 + * @param value 碰撞掩码的值。 + */ + setCanCollideWith(value: number): void; + /** + * @en Set the owner node of the collider. + * @param node The owner node to set. + * @zh 设置碰撞器的所有者节点。 + * @param node 要设置的所有者节点。 + */ + setOwner(node: Node): void; + /** + * @en Handle transform changes of the collider. + * @param flag The transform change flag. + * @zh 处理碰撞器的变换改变。 + * @param flag 变换改变标志。 + */ + transformChanged(flag: number): void; + /** + * @en Set the bounciness of the collider. + * @param value The bounciness value. + * @zh 设置碰撞器的弹性。 + * @param value 弹性值。 + */ + setBounciness?(value: number): void; + /** + * @en Set the friction of the collider. + * @param value The friction value. + * @zh 设置碰撞器的摩擦力。 + * @param value 摩擦力值。 + */ + setfriction?(value: number): void; + /** + * @en Set the rolling friction of the collider. + * @param value The rolling friction value. + * @zh 设置碰撞器的滚动摩擦力。 + * @param value 滚动摩擦力值。 + */ + setRollingFriction?(value: number): void; + /** + * @en Set the dynamic friction of the collider. + * @param value The dynamic friction value. + * @zh 设置碰撞器的动态摩擦力。 + * @param value 动态摩擦力值。 + */ + setDynamicFriction?(value: number): void; + /** + * @en Set the static friction of the collider. + * @param value The static friction value. + * @zh 设置碰撞器的静态摩擦力。 + * @param value 静态摩擦力值。 + */ + setStaticFriction?(value: number): void; + /** + * @en Set the friction combine mode of the collider. + * @param value The friction combine mode. + * @zh 设置碰撞器的摩擦力合并模式。 + * @param value 摩擦力合并模式。 + */ + setFrictionCombine?(value: PhysicsCombineMode): void; + /** + * @en Set the bounce combine mode of the collider. + * @param value The bounce combine mode. + * @zh 设置碰撞器的弹性合并模式。 + * @param value 弹性合并模式。 + */ + setBounceCombine?(value: PhysicsCombineMode): void; + /** + * @en Set the event filter for the collider. + * @param events An array of event names to filter. + * @zh 设置碰撞器的事件过滤器。 + * @param events 要过滤的事件数组。 + */ + setEventFilter?(events: string[]): void; + /** + * @en Set whether the collider allows sleep. + * @param value Whether the collider allows sleep. + * @zh 设置碰撞器是否允许睡眠。 + * @param value 是否允许睡眠。 + */ + allowSleep(value: boolean): void; + } + /** + * @en Interface of physics dynamic collider. + * @zh 物理动态碰撞器的接口。 + */ + interface IDynamicCollider extends ICollider { + /** + * @en Sets the linear damping coefficient. + * @param value Linear damping coefficient. + * @zh 设置线性阻尼系数。 + * @param value 线性阻尼系数。 + */ + setLinearDamping(value: number): void; + /** + * @en Sets the angular damping coefficient. + * @param value Angular damping coefficient. + * @zh 设置角度阻尼系数。 + * @param value 角度阻尼系数。 + */ + setAngularDamping(value: number): void; + /** + * @en Sets the linear velocity of the actor. + * @param value New linear velocity of actor. + * @zh 设置物体的线性速度。 + * @param value 物体的新线性速度。 + */ + setLinearVelocity(value: Vector3): void; + /** + * @en Get the linear velocity of the actor. + * @zh 获取物体的线性速度。 + */ + getLinearVelocity(): Vector3; + /** + * @en Sets the angular velocity of the actor. + * @param value New angular velocity of actor. + * @zh 设置物体的角速度。 + * @param value 物体的新角速度。 + */ + setAngularVelocity(value: Vector3): void; + /** + * @en Gets the angular velocity of the actor. + * @zh 获取物体的角速度。 + */ + getAngularVelocity(): Vector3; + /** + * @en Sets the mass of a dynamic actor. + * @param value New mass value for the actor. + * @zh 设置动态物体的质量。 + * @param value 物体的新质量值。 + */ + setMass(value: number): void; + /** + * @en Sets the pose of the center of mass relative to the actor. + * @param value Mass frame offset transform relative to the actor frame. + * @zh 设置质心相对于物体的位置。 + * @param value 质心相对于物体框架的偏移变换。 + */ + setCenterOfMass(value: Vector3): void; + /** + * @en Sets the inertia tensor, using a parameter specified in mass space coordinates. + * @param value New mass space inertia tensor for the actor. + * @zh 设置惯性张量,使用质量空间坐标中指定的参数。 + * @param value 物体的新质量空间惯性张量。 + */ + setInertiaTensor(value: Vector3): void; + /** + * @en Set the linear velocity threshold for the rigid body to sleep. + * @param value The linear velocity threshold. + * @zh 设置刚体进入睡眠状态的线速度阈值。 + * @param value 线速度睡眠阈值。 + */ + setSleepThreshold(value: number): void; + /** + * @en Whether it is sleeping. + * @zh 是否处于睡眠状态。 + */ + isSleeping(): boolean; + /** + * @en Sets the colliders' collision detection mode. + * @param value Rigid body flag. + * @zh 设置碰撞器的碰撞检测模式。 + * @param value 刚体标志。 + */ + setCollisionDetectionMode(value: number): void; + /** + * @en Controls whether physics affects the dynamic collider. + * @param value Whether physics affects the dynamic collider. + * @zh 控制物理是否影响动态碰撞器。 + * @param value 物理是否影响动态碰撞器。 + */ + setIsKinematic(value: boolean): void; + /** + * @en Raises or clears a particular rigid dynamic lock flag. + * @param linearFactor Linear constraint factor. + * @param angularFactor Angular constraint factor. + * @zh 设置或清除特定的刚体动态锁定标志。 + * @param linearFactor 线性约束因子。 + * @param angularFactor 角度约束因子。 + */ + setConstraints(linearFactor: Vector3, angularFactor: Vector3): void; + /** + * @en Apply a force to the dynamic collider. + * @param force The force to make the collider move. + * @param mode The mode of applying the force. + * @param localOffset The local offset where the force is applied. + * @zh 对动态碰撞器施加力。 + * @param force 使碰撞器移动的力。 + * @param mode 施加力的模式。 + * @param localOffset 力施加的局部偏移。 + */ + addForce(force: Vector3, mode: PhysicsForceMode, localOffset: Vector3): void; + /** + * @en Apply a torque to the dynamic collider. + * @param torque The torque to make the collider rotate. + * @param mode The mode of applying the torque. + * @zh 对动态碰撞器施加扭矩。 + * @param torque 使碰撞器旋转的扭矩。 + * @param mode 施加扭矩的模式。 + */ + addTorque(torque: Vector3, mode: PhysicsForceMode): void; + /** + * @en Forces a collider to sleep at least one frame. + * @zh 强制碰撞器至少休眠一帧。 + */ + sleep?(): void; + /** + * @en Forces a collider to wake up. + * @zh 强制唤醒碰撞器。 + */ + wakeUp(): void; + /** + * @en Sets the world position of the collider. + * @param value The new world position. + * @zh 设置碰撞器的世界位置。 + * @param value 位置。 + */ + setWorldPosition(value: Vector3): void; + /** + * @en Sets the world rotation of the collider. + * @param value The new world rotation. + * @zh 设置碰撞器的世界旋转。 + * @param value 旋转四元数。 + */ + setWorldRotation(value: Quaternion): void; + /** + * @en Sets whether the collider is a trigger. + * @param value Whether the collider is a trigger. + * @zh 设置碰撞器是否为触发器。 + * @param value 碰撞器是否为触发器。 + */ + setTrigger(value: boolean): void; + } + /** + * @en Interface for physics creation utility. + * @zh 物理创建工具接口。 + */ + interface IPhysicsCreateUtil { + /** + * @en Initialize the physics system. + * @zh 初始化物理。 + */ + initialize(): Promise; + /** + * @en Set the physics engine capabilities. + * @zh 设置物理引擎能力。 + */ + initPhysicsCapable(): void; + /** + * @en Get the physics engine capability. + * @param value The capability to check. + * @zh 获取物理引擎能力。 + * @param value 要检查的能力。 + */ + getPhysicsCapable(value: EPhysicsCapable): boolean; + /** + * @en Create a physics manager. + * @param physicsSettings The physics settings. + * @zh 创建物理管理器。 + * @param physicsSettings 物理设置。 + */ + createPhysicsManger(physicsSettings: PhysicsSettings): IPhysicsManager; + /** + * @en Create a dynamic collider. + * @param manager The physics manager. + * @zh 创建动态碰撞体。 + * @param manager 物理管理器。 + */ + createDynamicCollider(manager: IPhysicsManager): IDynamicCollider; + /** + * @en Create a static collider. + * @param manager The physics manager. + * @zh 创建静态碰撞体。 + * @param manager 物理管理器。 + */ + createStaticCollider(manager: IPhysicsManager): IStaticCollider; + /** + * @en Create a character controller. + * @param manager The physics manager. + * @zh 创建角色碰撞器。 + * @param manager 物理管理器。 + */ + createCharacterController(manager: IPhysicsManager): ICharacterController; + /** + * @en Create fixed joint. + * @param manager The physics manager. + * @zh 创建固定关节。 + * @param manager 物理管理器。 + */ + createFixedJoint(manager: IPhysicsManager): IFixedJoint; + /** + * @en Create hinge joint. + * @param manager The physics manager. + * @zh 创建铰链关节。 + * @param manager 物理管理器。 + */ + createHingeJoint(manager: IPhysicsManager): IHingeJoint; + /** + * @en Create spring joint. + * @param manager The physics manager. + * @zh 创建弹簧关节。 + * @param manager 物理管理器。 + */ + createSpringJoint(manager: IPhysicsManager): ISpringJoint; + /** + * @en Create Custom Joint. + * @param manager The physics manager. + * @zh 创建自定义关节。 + * @param manager 物理管理器。 + */ + createD6Joint(manager: IPhysicsManager): ID6Joint; + /** + * @en Create box collider shape. + * @zh 创建盒形碰撞器形状。 + */ + createBoxColliderShape(): IBoxColliderShape; + /** + * @en Create sphere collider shape. + * @zh 创建球形碰撞器形状。 + */ + createSphereColliderShape(): ISphereColliderShape; + /** + * @en Create plane collider shape. + * @zh 创建平面碰撞器形状。 + */ + createPlaneColliderShape(): IPlaneColliderShape; + /** + * @en Create capsule collider shape. + * @zh 创建胶囊碰撞器形状。 + */ + createCapsuleColliderShape?(): ICapsuleColliderShape; + /** + * @en Create mesh collider shape. + * @zh 创建网格碰撞器形状。 + */ + createMeshColliderShape?(): IMeshColliderShape; + /** + * @en Create cylinder collider shape. + * @zh 创建圆柱碰撞器形状。 + */ + createCylinderColliderShape?(): ICylinderColliderShape; + /** + * @en Create cone collider shape. + * @zh 创建圆锥碰撞器形状。 + */ + createConeColliderShape?(): IConeColliderShape; + /** + * @en Create height field shape. + * @zh 创建高度场形状。 + */ + createHeightFieldShape?(): IHeightFieldShape; + /** + * @en Create compound collider shape. + * @zh 创建组合碰撞形状。 + */ + createCompoundShape(): ICompoundColliderShape; + /** + * @en Create curve mesh. + * @param mesh The input mesh. + * @zh 创建曲线网格。 + * @param mesh 输入的网格。 + */ + createCorveMesh?(mesh: Mesh): Mesh; + } + /** + * @en Interface for physics manager. + * @zh 物理管理器的接口。 + */ + interface IPhysicsManager { + /** + * @en Set gravity for the physics world. + * @param gravity Physics gravity vector. + * @zh 设置物理世界的重力。 + * @param gravity 物理重力向量。 + */ + setGravity(gravity: Vector3): void; + /** + * @en Add ICollider into the manager. + * @param collider StaticCollider or DynamicCollider to be added. + * @zh 向物理管理器添加碰撞器。 + * @param collider 要添加的静态碰撞器或动态碰撞器。 + */ + addCollider(collider: ICollider): void; + /** + * @en Set whether the collider is active. + * @param collider The collider to set active state. + * @param value Whether the collider is active. + * @zh 是否启用碰撞器。 + * @param collider 要设置启用状态的碰撞器。 + * @param value 碰撞器是否处于启用状态。 + */ + setActiveCollider(collider: ICollider, value: boolean): void; + /** + * @en Remove ICollider from the physics manager. + * @param collider StaticCollider or DynamicCollider to be removed. + * @zh 从物理管理器中移除碰撞器。 + * @param collider 要移除的静态碰撞器或动态碰撞器。 + */ + removeCollider(collider: ICollider): void; + /** + * @en Update the physics world, called on every frame to update object poses. + * @param elapsedTime Step time for the update. + * @zh 更新物理世界,每帧调用以更新对象姿态。 + * @param elapsedTime 更新的步进时间。 + */ + update(elapsedTime: number): void; + /** + * @en Perform a raycast to find the first collision. + * @param ray The ray to cast. + * @param outHitResult The result of the raycast. + * @param distance Maximum distance of the raycast. + * @param collisonGroup Collision group for filtering. + * @param collisionMask Collision mask for filtering. + * @zh 执行射线检测以找到第一个碰撞。 + * @param ray 要投射的射线。 + * @param outHitResult 射线检测的结果。 + * @param distance 射线检测的最大距离。 + * @param collisonGroup 用于过滤的碰撞组。 + * @param collisionMask 用于过滤的碰撞掩码。 + */ + rayCast?(ray: Ray, outHitResult: HitResult, distance?: number, collisonGroup?: number, collisionMask?: number): boolean; + /** + * @en Perform a raycast to find all collisions. + * @param ray The ray to cast. + * @param out Array to store all hit results. + * @param distance Maximum distance of the raycast. + * @param collisonGroup Collision group for filtering. + * @param collisionMask Collision mask for filtering. + * @zh 执行射线检测以找到所有碰撞。 + * @param ray 要投射的射线。 + * @param out 用于存储所有命中结果的数组。 + * @param distance 射线检测的最大距离。 + * @param collisonGroup 用于过滤的碰撞组。 + * @param collisionMask 用于过滤的碰撞掩码。 + */ + rayCastAll?(ray: Ray, out: HitResult[], distance?: number, collisonGroup?: number, collisionMask?: number): boolean; + /** + * @en Enable or disable the debug drawer. + * @param value Whether to enable the debug drawer. + * @zh 启用或禁用调试器。 + * @param value 是否启用调试器。 + */ + enableDebugDrawer?(value: boolean): void; + /** + * @en Destroy the physics manager. + * @zh 销毁物理管理器。 + */ + destroy(): void; + /** + * @en Perform a shape cast to find the first collision. + * @param shape The shape to cast. + * @param fromPosition Start position of the cast. + * @param toPosition End position of the cast. + * @param out The result of the shape cast. + * @param fromRotation Start rotation of the cast. + * @param toRotation End rotation of the cast. + * @param collisonGroup Collision group for filtering. + * @param collisionMask Collision mask for filtering. + * @param allowedCcdPenetration Allowed continuous collision detection penetration. + * @zh 执行形状投射以找到第一个碰撞。 + * @param shape 要投射的形状。 + * @param fromPosition 投射的起始位置。 + * @param toPosition 投射的结束位置。 + * @param out 形状投射的结果。 + * @param fromRotation 投射的起始旋转。 + * @param toRotation 投射的结束旋转。 + * @param collisonGroup 用于过滤的碰撞组。 + * @param collisionMask 用于过滤的碰撞掩码。 + * @param allowedCcdPenetration 允许的连续碰撞检测穿透。 + */ + shapeCast(shape: IColliderShape, fromPosition: Vector3, toPosition: Vector3, out: HitResult, fromRotation?: Quaternion, toRotation?: Quaternion, collisonGroup?: number, collisionMask?: number, allowedCcdPenetration?: number): boolean; + /** + * @en Perform a shape cast to find all collisions. + * @param shape The shape to cast. + * @param fromPosition Start position of the cast. + * @param toPosition End position of the cast. + * @param out Array to store all hit results. + * @param fromRotation Start rotation of the cast. + * @param toRotation End rotation of the cast. + * @param collisonGroup Collision group for filtering. + * @param collisionMask Collision mask for filtering. + * @param allowedCcdPenetration Allowed continuous collision detection penetration. + * @zh 执行形状投射以找到所有碰撞。 + * @param shape 要投射的形状。 + * @param fromPosition 投射的起始位置。 + * @param toPosition 投射的结束位置。 + * @param out 用于存储所有命中结果的数组。 + * @param fromRotation 投射的起始旋转。 + * @param toRotation 投射的结束旋转。 + * @param collisonGroup 用于过滤的碰撞组。 + * @param collisionMask 用于过滤的碰撞掩码。 + * @param allowedCcdPenetration 允许的连续碰撞检测穿透。 + */ + shapeCastAll(shape: IColliderShape, fromPosition: Vector3, toPosition: Vector3, out: HitResult[], fromRotation?: Quaternion, toRotation?: Quaternion, collisonGroup?: number, collisionMask?: number, allowedCcdPenetration?: number): boolean; + } + /** + * @en Interface for physics material. + * @zh 物理材质的接口。 + */ + interface IPhysicsMaterial { + /** + * @en Sets the bounciness. + * @param value The bounciness value. + * @zh 设置弹力。 + * @param value 弹力值。 + */ + setBounciness(value: number): void; + /** + * @en Sets the dynamic friction. + * @param value The dynamic friction. + * @zh 设置动态摩擦力。 + * @param value 动态摩擦力值。 + */ + setDynamicFriction(value: number): void; + /** + * @en Sets the static friction. + * @param value The static friction. + * @zh 设置静态摩擦力。 + * @param value 静态摩擦力值。 + */ + setStaticFriction(value: number): void; + /** + * @en Sets the bounce combine mode. + * @param value The bounce combine mode. + * @zh 设置弹性组合模式。 + * @param value 弹力组合模式。 + */ + setBounceCombine(value: number): void; + /** + * @en Sets the friction combine mode. + * @param value The friction combine mode. + * @zh 设置摩擦组合模式。 + * @param value 摩擦力组合模式。 + */ + setFrictionCombine(value: number): void; + /** + * @en Decrements the reference count of a material and releases it if the new reference count is zero. + * @zh 减少材质的引用计数,如果新的引用计数为零则释放它。 + */ + destroy(): void; + } + /** + * @en Interface for static physics collider. + * @zh 静态物理碰撞器的接口。 + */ + interface IStaticCollider extends ICollider { + /** + * @en Sets whether the collider is a trigger. + * @param value Whether the collider is a trigger. + * @zh 设置碰撞器是否为触发器。 + * @param value 碰撞器是否为触发器。 + */ + setTrigger(value: boolean): void; + } + /** + * @en Interface for custom joints in the physics system. + * @zh 用于物理系统中自定义关节的接口。 + */ + interface ICustomJoint extends IJoint { + } + /** + * @en Enumeration of motion types for a 6-degree-of-freedom joint. + * @zh 6自由度关节的运动类型枚举。 + */ + enum D6MotionType { + /** + * @en Motion along the X axis + * @zh X轴方向的运动 + */ + eX = 0, + /** + * @en Motion along the Y axis + * @zh Y轴方向的运动 + */ + eY = 1, + /** + * @en Motion along the Z axis + * @zh Z轴方向的运动 + */ + eZ = 2, + /** + * @en Motion around the X axis + * @zh 绕X轴的运动 + */ + eTWIST = 3, + /** + * @en Motion around the Y axis + * @zh 绕Y轴的运动 + */ + eSWING1 = 4, + /** + * @en Motion around the Z axis + * @zh 绕Z轴的运动 + */ + eSWING2 = 5 + } + /** + * @en Enumeration of axis states for a 6-degree-of-freedom joint. + * @zh 6自由度关节的轴状态枚举。 + */ + enum D6Axis { + /** + * @en The degree of freedom is locked, not allowing relative motion. + * @zh 自由度被锁定,不允许相对运动。 + */ + eLOCKED = 0, + /** + * @en The degree of freedom is limited, only allowing motion within a specific range. + * @zh 自由度受限,只允许在特定范围内运动。 + */ + eLIMITED = 1, + /** + * @en The degree of freedom is free, allowing its full range of motion. + * @zh 自由度是自由的,允许其全范围运动。 + */ + eFREE = 2 + } + /** + * @en Enumeration of drive types for a 6-degree-of-freedom joint. + * @zh 6自由度关节的驱动类型枚举。 + */ + enum D6Drive { + /** + * @en Drive along the X-axis + * @zh 沿X轴驱动 + */ + eX = 0, + /** + * @en Drive along the Y-axis + * @zh 沿Y轴驱动 + */ + eY = 1, + /** + * @en Drive along the Z-axis + * @zh 沿Z轴驱动 + */ + eZ = 2, + /** + * @en Drive of displacement from the X-axis + * @zh 相对于X轴的位移驱动 + */ + eSWING = 3, + /** + * @en Drive of the displacement around the X-axis + * @zh 绕X轴的位移驱动 + */ + eTWIST = 4, + /** + * @en Drive of all three angular degrees along a SLERP-path + * @zh 沿SLERP路径的三个角度自由度的驱动 + */ + eSLERP = 5 + } + /** + * @en Interface for a 6-degree-of-freedom joint in the physics system. + * @zh 物理系统中6自由度关节的接口。 + */ + interface ID6Joint extends IJoint { + /** + * @en Set the primary and secondary axes for the joint. + * @param axis The primary axis. + * @param secendary The secondary axis. + * @zh 设置关节的主轴和次轴。 + * @param axis 主轴。 + * @param secendary 次轴。 + */ + setAxis(axis: Vector3, secendary: Vector3): void; + /** + * @en Set the motion type around the specified axis. + * @param axis The axis to set. + * @param motionType The type of motion to set. + * @zh 设置指定轴的运动类型。 + * @param axis 轴。 + * @param motionType 运动类型。 + */ + setMotion(axis: D6Axis, motionType: D6MotionType): void; + /** + * @en Set Distance limit Params + * @param limit The distance limit. + * @param bounciness The bounciness of the limit. + * @param bounceThreshold The bounce threshold. + * @param spring The spring coefficient. + * @param damp The damping coefficient. + * @zh 设置关节的距离限制参数。 + * @param limit 距离限制。 + * @param bounciness 限制的弹性。 + * @param bounceThreshold 弹跳阈值。 + * @param spring 弹簧系数。 + * @param damp 阻尼系数。 + */ + setDistanceLimit(limit: number, bounciness: number, bounceThreshold: number, spring: number, damp: number): void; + /** + * @en x,y,z linear Limit. + * @param linearAxis The axis to set the limit for. + * @param upper The upper limit. + * @param lower The lower limit. + * @param bounciness The bounciness of the limit. + * @param bounceThreshold The bounce threshold. + * @param spring The spring coefficient. + * @param damping The damping coefficient. + * @zh 设置x,y,z轴的线性限制。 + * @param linearAxis 轴。 + * @param upper 上限。 + * @param lower 下限。 + * @param bounciness 弹性。 + * @param bounceThreshold 弹跳阈值。 + * @param spring 弹簧系数。 + * @param damping 阻尼系数。 + */ + setLinearLimit(linearAxis: D6MotionType, upper: number, lower: number, bounciness: number, bounceThreshold: number, spring: number, damping: number): void; + /** + * @en The twist limit controls the range of motion around the twist axis. + * @param upper The upper limit of the twist. + * @param lower The lower limit of the twist. + * @param bounciness The bounciness of the limit. + * @param bounceThreshold The bounce threshold. + * @param spring The spring coefficient. + * @param damping The damping coefficient. + * @zh 扭转限制控制绕扭转轴的运动范围。 + * @param upper 扭转轴的上限。 + * @param lower 扭转轴的下限。 + * @param bounciness 弹性。 + * @param bounceThreshold 弹跳阈值。 + * @param spring 弹簧系数。 + * @param damping 阻尼系数。 + */ + setTwistLimit(upper: number, lower: number, bounciness: number, bounceThreshold: number, spring: number, damping: number): void; + /** + * @en Set the cone-like swing limit for the joint. + * @param yAngle The angle limit around the Y axis. + * @param zAngle The angle limit around the Z axis. + * @param bounciness The bounciness of the limit. + * @param bounceThreshold The bounce threshold. + * @param spring The spring coefficient. + * @param damping The damping coefficient. + * @zh 设置关节的锥形摆动限制。 + * @param yAngle Y轴的角度限制。 + * @param zAngle Z轴的角度限制。 + * @param bounciness 弹性。 + * @param bounceThreshold 弹跳阈值。 + * @param spring 弹簧系数。 + * @param damping 阻尼系数。 + */ + setSwingLimit(yAngle: number, zAngle: number, bounciness: number, bounceThreshold: number, spring: number, damping: number): void; + /** + * @en Set the drive parameters for a specific drive type. + * @param index The drive type to set. + * @param stiffness The stiffness of the drive. + * @param damping The damping of the drive. + * @param forceLimit The force limit of the drive. + * @zh 设置特定驱动类型的驱动参数。 + * @param index 驱动类型。 + * @param stiffness 刚度。 + * @param damping 阻尼。 + * @param forceLimit 力限。 + */ + setDrive(index: D6Drive, stiffness: number, damping: number, forceLimit: number): void; + /** + * @en Set the drive transform for the joint. + * @param position The target position. + * @param rotate The target rotation. + * @zh 设置关节的驱动变换。 + * @param position 目标位置。 + * @param rotate 目标旋转。 + */ + setDriveTransform(position: Vector3, rotate: Quaternion): void; + /** + * @en Set the drive velocity for the joint. + * @param position The linear velocity. + * @param angular The angular velocity. + * @zh 设置关节的驱动速度。 + * @param position 线速度。 + * @param angular 角速度。 + */ + setDriveVelocity(position: Vector3, angular: Vector3): void; + /** + * @en Get the twist angle of the joint, in the range (-2*Pi, 2*Pi]. + * @zh 获取关节的扭转角度,范围为(-2*Pi, 2*Pi]。 + */ + getTwistAngle(): number; + /** + * @en Get the swing angle of the joint from the Y axis. + * @zh 获取关节相对于Y轴的摆动角度。 + */ + getSwingYAngle(): number; + /** + * @en Get the swing angle of the joint from the Z axis. + * @zh 获取关节相对于Z轴的摆动角度。 + */ + getSwingZAngle(): number; + } + /** + * @en Interface for a fixed joint in the physics system. + * @zh 物理系统中固定关节的接口。 + */ + interface IFixedJoint extends IJoint { + } + /** + * @en Interface for a hinge joint. + * @zh 铰链关节接口。 + */ + interface IHingeJoint extends IJoint { + /** + * @en Sets the axis of rotation for the hinge joint. + * @param value The axis vector to set. + * @zh 设置铰链关节的旋转轴。 + * @param value 要设置的轴向量。 + */ + setAxis(value: Vector3): void; + /** + * @en The current angle in degrees of the joint relative to its rest position. + * @zh 当前关节相对于其静止位置的角度。 + */ + getAngle(): number; + /** + * @en The angular velocity of the joint in degrees per second. + * @zh 关节的角速度(以度/秒为单位)。 + */ + getVelocity(): Readonly; + /** + * @en Sets the lower limit of the joint's rotation. + * @param lowerLimit The lower limit value in degrees. + * @zh 设置关节旋转的下限。 + * @param lowerLimit 下限值(以度为单位)。 + */ + setLowerLimit(lowerLimit: number): void; + /** + * @en Sets the upper limit of the joint's rotation. + * @param value The upper limit value in degrees. + * @zh 设置关节旋转的上限。 + * @param value 上限值(以度为单位)。 + */ + setUpLimit(value: number): void; + /** + * @en Sets the bounciness of the joint. + * @param value The bounciness value. + * @zh 设置关节的反弹性。 + * @param value 反弹性值。 + */ + setBounceness(value: number): void; + /** + * @en Sets the minimum velocity required for the joint to bounce. + * @param value The minimum bounce velocity. + * @zh 设置关节反弹所需的最小速度。 + * @param value 最小反弹速度。 + */ + setBouncenMinVelocity(value: number): void; + /** + * @en Sets the contact distance for the joint. + * @param value The contact distance value. + * @zh 设置关节的接触距离。 + * @param value 接触距离值。 + */ + setContactDistance(value: number): void; + /** + * @en Enables or disables the joint's rotation limit. + * @param value True to enable the limit, false to disable. + * @zh 启用或禁用关节的旋转限制。 + * @param value 为true时启用限制,为false时禁用。 + */ + enableLimit(value: boolean): void; + /** + * @en Enables or disables the joint's drive. + * @param value True to enable the drive, false to disable. + * @zh 启用或禁用关节的驱动。 + * @param value 为true时启用驱动,为false时禁用。 + */ + enableDrive(value: boolean): void; + /** + * @en Enables or disables free spin for the joint. + * @param value True to enable free spin, false to disable. + * @zh 启用或禁用关节的自由旋转。 + * @param value 为true时启用自由旋转,为false时禁用。 + */ + enableFreeSpin(value: boolean): void; + /** + * @en Sets the target velocity for the drive model. + * @param velocity The drive target velocity. + * @zh 设置驱动模型的目标速度。 + * @param velocity 驱动目标速度。 + */ + setDriveVelocity(velocity: number): void; + /** + * @en Sets the maximum torque the drive can exert. + * @param limit The maximum torque value. + * @zh 设置驱动可施加的最大扭矩。 + * @param limit 最大扭矩值。 + */ + setDriveForceLimit(limit: number): void; + } + /** + * @en Interface for a joint in a physics system. + * @zh 物理系统中关节的接口。 + */ + interface IJoint { + /** + * @en Sets the owner node of the joint. + * @param value The node to set as the owner. + * @zh 设置关节的所有者节点。 + * @param value 要设置为所有者的节点。 + */ + setOwner(value: Node): void; + /** + * @en Sets the collider for this joint. + * @param owner The collider to set. + * @zh 设置此关节的碰撞体。 + * @param owner 要设置的碰撞体。 + */ + setCollider(owner: ICollider): void; + /** + * @en Sets the connected collider for this joint. + * @param owner The collider to connect to. + * @zh 设置此关节连接的碰撞体。 + * @param owner 要连接的碰撞体。 + */ + setConnectedCollider(owner: ICollider): void; + /** + * @en The scale to apply to the inverse mass of collider 0 for resolving this constraint. + * @param value The scale value to set. + * @zh 设置应用于连接碰撞体逆质量的缩放比例,用于解析此约束。 + * @param value 要设置的缩放值。 + */ + setConnectedMassScale(value: number): void; + /** + * @en The scale to apply to the inverse inertia of collider0 for resolving this constraint. + * @param value The scale value to set. + * @zh 设置应用于连接碰撞体逆惯性的缩放比例,用于解析此约束。 + * @param value 要设置的缩放值。 + */ + setConnectedInertiaScale(value: number): void; + /** + * @en The scale to apply to the inverse mass of collider 1 for resolving this constraint. + * @param value The scale value to set. + * @zh 设置应用于主碰撞体逆质量的缩放比例,用于解析此约束。 + * @param value 要设置的缩放值。 + */ + setMassScale(value: number): void; + /** + * @en The scale to apply to the inverse inertia of collider1 for resolving this constraint. + * @param value The scale value to set. + * @zh 设置应用于主碰撞体逆惯性的缩放比例,用于解析此约束。 + * @param value 要设置的缩放值。 + */ + setInertiaScale(value: number): void; + /** + * @en The maximum force the joint can apply before breaking. + * @param value The maximum force value. + * @zh 设置关节在断裂前可施加的最大力。 + * @param value 最大力值。 + */ + setBreakForce(value: number): void; + /** + * @en The maximum torque the joint can apply before breaking. + * @param value The maximum torque value. + * @zh 设置关节在断裂前可施加的最大扭矩。 + * @param value 最大扭矩值。 + */ + setBreakTorque(value: number): void; + /** + * @en Sets the local anchor/frame position for the main actor. + * @param pos The local position to set. + * @zh 设置主执行体的本地锚点/框架位置。 + * @param pos 要设置的本地位置。 + */ + setLocalPos(pos: Vector3): void; + /** + * @en Sets the local anchor/frame position for the connected actor. + * @param pos The local position to set. + * @zh 设置连接执行体的本地锚点/框架位置。 + * @param pos 要设置的本地位置。 + */ + setConnectLocalPos(pos: Vector3): void; + /** + * @en Gets the linear force applied by the joint. + * @zh 获取关节施加的线性力。 + */ + getlinearForce(): Vector3; + /** + * @en Gets the angular force applied by the joint. + * @zh 获取关节施加的角力。 + */ + getAngularForce(): Vector3; + /** + * @en Checks if the joint is still valid (not broken). + * @zh 检查关节是否仍然有效(未断裂)。 + */ + isValid(): boolean; + /** + * @en Enables or disables the joint. + * @param value True to enable, false to disable. + * @zh 启用或禁用关节。 + * @param value 为true时启用,为false时禁用。 + */ + isEnable(value: boolean): void; + /** + * @en Sets whether collision is enabled between the connected bodies. + * @param value True to enable collision, false to disable. + * @zh 设置是否启用连接体之间的碰撞。 + * @param value 为true时启用碰撞,为false时禁用。 + */ + isCollision(value: boolean): void; + /** + * @en Destroy the joint. + * @zh 销毁关节。 + */ + destroy(): void; + } + /** + * @en Interface for a spring joint. + * @zh 弹簧关节接口。 + */ + interface ISpringJoint extends IJoint { + /** + * @en Set the allowed minimum distance for the joint. + * @param distance The minimum distance. + * @zh 设置关节允许的最小距离。 + * @param distance 最小距离。 + */ + setMinDistance(distance: number): void; + /** + * @en Set the allowed maximum distance for the joint. + * @param distance The maximum distance. + * @zh 设置关节允许的最大距离。 + * @param distance 最大距离。 + */ + setMaxDistance(distance: number): void; + /** + * @en Set the error tolerance of the joint. + * @param tolerance The distance beyond the allowed range at which the joint becomes active. + * @zh 设置关节的误差容限。 + * @param tolerance 超出允许范围时关节变为活动状态的距离。 + */ + setTolerance(tolerance: number): void; + /** + * @en Set the strength of the joint spring. + * @param stiffness The spring strength of the joint. + * @zh 设置关节弹簧的强度。 + * @param stiffness 关节弹簧的强度。 + */ + setStiffness(stiffness: number): void; + /** + * @en Set the damping of the joint spring. + * @param damping The degree of damping of the joint spring. + * @zh 设置关节弹簧的阻尼。 + * @param damping 关节弹簧的阻尼程度。 + */ + setDamping(damping: number): void; + } + class Physics3DStatInfo { + private static _PhysicsStatisticsInfo; + /** + * @en enable Physics Statistics + * @zh 启动物理统计信息 + */ + static enableStatistics: boolean; + /** + * @en enable Frame ClearData + * @zh 是否每帧自动清理 + */ + static autoFrameClear: boolean; + /** + * @en Initialize Physical Statistics Map + * @zh 初始化物理统计信息表 + */ + static initStatisticsInfo(): void; + /** + * @en Set Physical Statistics Values + * @param info Physical Statistics Enumeration + * @param value value + * @zh 设置物理统计信息值 + * @param info 物理统计信息枚举 + * @param value 值 + */ + static addStatisticsInfo(info: EPhysicsStatisticsInfo, value: number): void; + /** + * @en Get Physical Statistics Values + * @param info Physical Statistics Enumeration + * @returns Physical Statistics value + * @zh 获取物理统计信息值 + * @param info 物理统计信息枚举 + * @returns 物理统计信息值 + */ + static getStatisticsInfo(info: EPhysicsStatisticsInfo): number; + /** + * @en Per Frame Cleanup of Physical Statistics + * @zh 每帧清理物理统计信息 + */ + static clearStatisticsInfo(): void; + /** + * @en Stop Statistics + * @zh 停止统计信息 + */ + static stopAndClearAllStatisticsInfo(): void; + } + /** + * @en Interface for box collider shape. + * @zh 盒形碰撞器的接口。 + */ + interface IBoxColliderShape extends IColliderShape { + /** + * @en Set size of Box Shape. + * @param size The size of the box + * @zh 设置盒子形状的大小。 + * @param size 盒子的大小 + */ + setSize(size: Vector3): void; + } + /** + * @en Interface for capsule collider shape. + * @zh 胶囊体碰撞器的接口。 + */ + interface ICapsuleColliderShape extends IColliderShape { + /** + * @en Set radius of capsule. + * @param radius The radius of the capsule + * @zh 设置胶囊体的半径。 + * @param radius 胶囊体的半径 + */ + setRadius(radius: number): void; + /** + * @en Set height of capsule. + * @param height The height of the capsule + * @zh 设置胶囊体的高度。 + * @param height 胶囊体的高度 + */ + setHeight(height: number): void; + /** + * @en Set up axis of capsule. + * @param upAxis The up axis of the capsule + * @zh 设置胶囊体的朝上轴。 + * @param upAxis 胶囊体的朝上轴 + */ + setUpAxis(upAxis: number): void; + } + /** + * @en Interface for collider shape. + * @zh 碰撞器形状的接口。 + */ + interface IColliderShape { + /** + * @en Set local position of the collider shape. + * @param position The local position to set + * @zh 设置碰撞器形状的局部位置。 + * @param position 要设置的局部位置 + */ + setOffset(position: Vector3): void; + /** + * @en Gets the local offset of the shape. + * @returns The local offset of the shape. + * @zh 获取形状的局部偏移。 + * @returns 局部偏移量。 + */ + getOffset(): Vector3; + /** + * @en Decrements the reference count of a shape and releases it if the new reference count is zero. + * @zh 减少形状的引用计数,如果新的引用计数为零则释放它。 + */ + destroy(): void; + /** + * @en Gets the physics shape. + * @returns The physics shape. + * @zh 获取物理形状。 + * @returns 物理形状。 + */ + getPhysicsShape(): any; + } + /** + * @en The `ICompoundColliderShape` interface defines the methods for managing compound collider shapes. + * @zh `ICompoundColliderShape` 接口定义了用于管理组合碰撞器形状的方法。 + */ + interface ICompoundColliderShape extends IColliderShape { + /** + * @en Adds a child shape to the compound collider shape. + * @param shape The child shape to add. + * @zh 添加一个子形状到组合碰撞器形状。 + * @param shape 要添加的子形状。 + */ + addChildShape(shape: IColliderShape): void; + /** + * @en Removes a child shape from the compound collider shape. + * @param shape The child shape to remove. + * @param index The index of the child shape to remove. + * @zh 从组合碰撞器形状中移除一个子形状。 + * @param shape 要移除的子形状。 + * @param index 要移除的子形状的索引。 + */ + removeChildShape(shape: IColliderShape, index: number): void; + /** + * @en Sets the data of the shape. + * @param component The component to set the data. + * @zh 设置形状的数据。 + * @param component 要设置数据的组件。 + */ + setShapeData?(component: PhysicsColliderComponent): void; + } + /** + * @en Interface for cone collider shape. + * @zh 锥体碰撞器的接口。 + */ + interface IConeColliderShape extends IColliderShape { + /** + * @en Set radius of the cone. + * @param radius The radius of the cone base + * @zh 设置锥体的半径。 + * @param radius 锥体底部的半径 + */ + setRadius(radius: number): void; + /** + * @en Set height of the cone. + * @param height The height of the cone + * @zh 设置锥体的高度。 + * @param height 锥体的高度 + */ + setHeight(height: number): void; + /** + * @en Set up axis of the cone. + * @param upAxis The up axis of the cone + * @zh 设置锥体的朝上轴。 + * @param upAxis 锥体的朝上轴 + */ + setUpAxis(upAxis: number): void; + } + /** + * @en Interface for cylinder collider shape. + * @zh 圆柱体碰撞器的接口。 + */ + interface ICylinderColliderShape extends IColliderShape { + /** + * @en Set radius of the cylinder. + * @param radius The radius of the cylinder base + * @zh 设置圆柱体的半径。 + * @param radius 圆柱体底面的半径 + */ + setRadius(radius: number): void; + /** + * @en Set height of the cylinder. + * @param height The height of the cylinder + * @zh 设置圆柱体的高度。 + * @param height 圆柱体的高度 + */ + setHeight(height: number): void; + /** + * @en Set up axis of the cylinder. + * @param upAxis The up axis of the cylinder + * @zh 设置圆柱体的朝上轴。 + * @param upAxis 圆柱体的朝上轴 + */ + setUpAxis(upAxis: number): void; + } + /** + * @en Interface for height field shape. + * @zh 高度场的接口。 + */ + interface IHeightFieldShape extends IColliderShape { + /** + * @en Set height field data. + * @param numRows Number of rows in the height field + * @param numCols Number of columns in the height field + * @param heightData Array of height values + * @param flag Array of flags for each cell + * @param scale Scale of the height field + * @zh 设置高度数据。 + * @param numRows 高度场的行数 + * @param numCols 高度场的列数 + * @param heightData 高度值数组 + * @param flag 每个单元格的标志数组 + * @param scale 高度场的缩放 + */ + setHeightFieldData(numRows: number, numCols: number, heightData: Float32Array, flag: Uint8Array, scale: Vector3): void; + /** + * @en Get the number of rows in the height field. + * @zh 获取高度场的行数。 + */ + getNbRows(): number; + /** + * @en Get the number of columns in the height field. + * @zh 获取高度场的列数。 + */ + getNbColumns(): number; + /** + * @en Get the height at a specific row and column. + * @param rows Row index + * @param cols Column index + * @returns The height at the specified position + * @zh 获取指定行列位置的高度。 + * @param rows 行索引 + * @param cols 列索引 + * @returns 指定位置的高度 + */ + getHeight(rows: number, cols: number): number; + } + /** + * @en Interface for mesh collider shape. + * @zh 网格碰撞器的接口。 + */ + interface IMeshColliderShape extends IColliderShape { + /** + * @en Create physics mesh from regular Mesh. + * @param value The source Mesh to create physics mesh from + * @zh 从常规网格创建物理网格。 + * @param value 用于创建物理网格的源网格 + */ + setPhysicsMeshFromMesh(value: Mesh): void; + /** + * @en Set convex mesh for the collider shape. + * @param value The convex Mesh to set + * @zh 为碰撞器形状设置凸多边形网格。 + * @param value 要设置的凸多边形网格 + */ + setConvexMesh(value: Mesh): void; + /** + * @en Set the vertex limit for mesh simplification. + * @param limit The maximum number of vertices allowed + * @zh 设置网格简化的顶点限制。 + * @param limit 允许的最大顶点数 + */ + setLimitVertex(limit: number): void; + } + interface IPlaneColliderShape extends IColliderShape { + } + /** + * @en Interface for sphere collider shape. + * @zh 球形碰撞器的接口。 + */ + interface ISphereColliderShape extends IColliderShape { + /** + * @en Set the radius of the sphere. + * @param radius The radius of the sphere + * @zh 设置球体的半径。 + * @param radius 球体的半径 + */ + setRadius(radius: number): void; + } + enum ECharacterCapable { + /** + * @en Gravity applied to the character. + * @zh 应用于角色的重力。 + */ + Charcater_Gravity = 0, + /** + * @en Collision group for the character. + * @zh 角色的碰撞分组。 + */ + Charcater_CollisionGroup = 1, + /** + * @en World position of the character. + * @zh 角色在世界坐标中的位置。 + */ + Charcater_WorldPosition = 2, + /** + * @en Directional movement of the character. + * @zh 角色的方向移动。 + */ + Charcater_Move = 3, + /** + * @en Jump capability of the character. + * @zh 角色的跳跃能力。 + */ + Charcater_Jump = 4, + /** + * @en Step offset for the character. + * @zh 角色的步幅偏移。 + */ + Charcater_StepOffset = 5, + /** + * @en Up direction of the character. + * @zh 角色的向上方向。 + */ + Character_UpDirection = 6, + /** + * @en Fall speed of the character. + * @zh 角色的下落速度。 + */ + Character_FallSpeed = 7, + /** + * @en Slope limit for the character. + * @zh 角色的坡度限制。 + */ + Character_SlopeLimit = 8, + /** + * @en Force when character collides with other objects. + * @zh 角色碰撞其他物体的力。 + */ + Character_PushForce = 9, + /** + * @en Radius of the character. + * @zh 角色的半径。 + */ + Character_Radius = 10, + /** + * @en Height of the character. + * @zh 角色的高度。 + */ + Character_Height = 11, + /** + * @en Offset of the character. + * @zh 角色的偏移。 + */ + Character_offset = 12, + /** + * @en Skin of the character. + * @zh 角色的皮肤。 + */ + Character_Skin = 13, + /** + * @en Minimum distance for the character. + * @zh 角色的最小距离。 + */ + Character_minDistance = 14, + /** + * @en Event filter for the character controller. + * @zh 角色控制器的事件过滤器。 + */ + Character_EventFilter = 15, + /** + * @en Simulate gravity for the character controller. + * @zh 模拟角色控制器的重力。 + */ + Character_SimulateGravity = 16 + } + enum EColliderCapable { + /** + * @en Collision group for the collider. + * @zh 碰撞体的碰撞分组。 + */ + Collider_CollisionGroup = 0, + /** + * @en Friction of the collider. + * @zh 碰撞体的摩擦力。 + */ + Collider_Friction = 1, + /** + * @en Rolling friction of the collider. + * @zh 碰撞体的滚动摩擦力。 + */ + Collider_RollingFriction = 2, + /** + * @en Restitution (bounciness) of the collider. + * @zh 碰撞体的弹力。 + */ + Collider_Restitution = 3, + /** + * @en Whether the collider supports triggers. + * @zh 碰撞体是否支持触发器。 + */ + Collider_AllowTrigger = 4, + /** + * @en Dynamic friction of the collider. + * @zh 碰撞体的动态摩擦力。 + */ + Collider_DynamicFriction = 5, + /** + * @en Static friction of the collider. + * @zh 碰撞体的静态摩擦力。 + */ + Collider_StaticFriction = 6, + /** + * @en Bounce combine mode of the collider. + * @zh 碰撞体的弹力组合模式。 + */ + Collider_BounceCombine = 7, + /** + * @en Friction combine mode of the collider. + * @zh 碰撞体的摩擦力组合模式。 + */ + Collider_FrictionCombine = 8, + /** + * @en Event filter for the collider. + * @zh 碰撞体的事件过滤器。 + */ + Collider_EventFilter = 9, + /** + * @en Collision detection mode for the collider. + * @zh 碰撞体的碰撞检测模式。 + */ + Collider_CollisionDetectionMode = 10, + /** + * @en Whether the rigid body supports kinematic mode. + * @zh 刚体是否支持运动学模式。 + */ + RigidBody_CanKinematic = 11, + /** + * @en Whether the rigid body supports sleeping. + * @zh 刚体是否支持睡眠。 + */ + RigidBody_AllowSleep = 12, + /** + * @en Gravity applied to the rigid body. + * @zh 应用于刚体的重力。 + */ + RigidBody_Gravity = 13, + /** + * @en Linear damping of the rigid body. + * @zh 刚体的线性阻尼。 + */ + RigidBody_LinearDamp = 14, + /** + * @en Angular damping of the rigid body. + * @zh 刚体的角度阻尼。 + */ + RigidBody_AngularDamp = 15, + /** + * @en Linear velocity of the rigid body. + * @zh 刚体的线速度。 + */ + RigidBody_LinearVelocity = 16, + /** + * @en Angular velocity of the rigid body. + * @zh 刚体的角速度。 + */ + RigidBody_AngularVelocity = 17, + /** + * @en Mass of the rigid body. + * @zh 刚体的质量。 + */ + RigidBody_Mass = 18, + /** + * @en World position of the rigid body. + * @zh 刚体在世界坐标中的位置。 + */ + RigidBody_WorldPosition = 19, + /** + * @en World orientation of the rigid body. + * @zh 刚体在世界坐标中的旋转。 + */ + RigidBody_WorldOrientation = 20, + /** + * @en Inertia tensor of the rigid body. + * @zh 刚体的惯性张量。 + */ + RigidBody_InertiaTensor = 21, + /** + * @en Center of mass of the rigid body. + * @zh 刚体的重心。 + */ + RigidBody_MassCenter = 22, + /** + * @en Maximum angular velocity of the rigid body. + * @zh 刚体的最大角速度。 + */ + RigidBody_MaxAngularVelocity = 23, + /** + * @en Maximum depenetration velocity of the rigid body. + * @zh 刚体的最大侵入速度。 + */ + RigidBody_MaxDepenetrationVelocity = 24, + /** + * @en Sleep threshold of the rigid body. + * @zh 刚体的睡眠阈值。 + */ + RigidBody_SleepThreshold = 25, + /** + * @en Sleep angular velocity of the rigid body. + * @zh 刚体的睡眠角速度。 + */ + RigidBody_SleepAngularVelocity = 26, + /** + * @en Number of physics iterations for the rigid body. + * @zh 刚体的物理迭代次数。 + */ + RigidBody_SolverIterations = 27, + /** + * @en Whether the rigid body supports dynamic switching of object types. + * @zh 刚体是否支持动态切换物体类型。 + */ + RigidBody_AllowDetectionMode = 28, + /** + * @en Whether the rigid body supports kinematic mode. + * @zh 刚体是否支持运动学模式。 + */ + RigidBody_AllowKinematic = 29, + /** + * @en Whether the rigid body supports character mode. + * @zh 刚体是否支持角色模式。 + */ + RigidBody_AllowCharacter = 30, + /** + * @en Linear velocity scale factor of the rigid body. + * @zh 刚体的线速度缩放因子。 + */ + RigidBody_LinearFactor = 31, + /** + * @en Angular velocity scale factor of the rigid body. + * @zh 刚体的角速度缩放因子。 + */ + RigidBody_AngularFactor = 32, + /** + * @en Apply force to the rigid body. + * @zh 对刚体施加力。 + */ + RigidBody_ApplyForce = 33, + /** + * @en Clear forces applied to the rigid body. + * @zh 清除施加在刚体上的力。 + */ + RigidBody_ClearForce = 34, + /** + * @en Apply force at an offset position to the rigid body. + * @zh 对刚体施加偏移位置的力。 + */ + RigidBody_ApplyForceWithOffset = 35, + /** + * @en Apply torque to the rigid body. + * @zh 对刚体施加扭力。 + */ + RigidBody_ApplyTorque = 36, + /** + * @en Apply impulse to the rigid body. + * @zh 对刚体施加冲量。 + */ + RigidBody_ApplyImpulse = 37, + /** + * @en Apply torque impulse to the rigid body. + * @zh 对刚体施加扭力冲量。 + */ + RigidBody_ApplyTorqueImpulse = 38 + } + enum EJointCapable { + /** + * @en The anchor point of the joint. + * @zh 关节的锚点。 + */ + Joint_Anchor = 0, + /** + * @en The connected anchor point of the joint. + * @zh 关节的连接锚点。 + */ + Joint_ConnectAnchor = 1 + } + enum EPhysicsCapable { + /** + * @en Gravity in the physics system. + * @zh 物理系统中的重力。 + */ + Physics_Gravity = 0, + /** + * @en Support for static collider mode. + * @zh 是否支持静态碰撞体模式。 + */ + Physics_StaticCollider = 1, + /** + * @en Support for dynamic collider mode. + * @zh 是否支持动态碰撞体模式。 + */ + Physics_DynamicCollider = 2, + /** + * @en Support for character collider mode. + * @zh 是否支持角色碰撞体模式。 + */ + Physics_CharacterCollider = 3, + /** + * @en Box-shaped collider shape. + * @zh 盒状碰撞形状。 + */ + Physics_BoxColliderShape = 4, + /** + * @en Sphere-shaped collider shape. + * @zh 球状碰撞形状。 + */ + Physics_SphereColliderShape = 5, + /** + * @en Capsule-shaped collider shape. + * @zh 胶囊碰撞形状。 + */ + Physics_CapsuleColliderShape = 6, + /** + * @en Cylinder-shaped collider shape. + * @zh 圆柱碰撞形状。 + */ + Physics_CylinderColliderShape = 7, + /** + * @en Cone-shaped collider shape. + * @zh 圆锥碰撞形状。 + */ + Physics_ConeColliderShape = 8, + /** + * @en Mesh collider shape. + * @zh 网格碰撞形状。 + */ + Physics_MeshColliderShape = 9, + /** + * @en Compound collider shape. + * @zh 组合碰撞形状。 + */ + Physics_CompoundColliderShape = 10, + /** + * @en Support for creating curve mesh. + * @zh 支持创建曲线网格。 + */ + Physics_CreateCorveMesh = 11, + /** + * @en Height field collider shape. + * @zh 高度场碰撞形状。 + */ + physics_heightFieldColliderShape = 12, + /** + * @en General joint capability. + * @zh 常规关节能力。 + */ + Physics_Joint = 13, + /** + * @en Fixed joint capability. + * @zh 固定关节能力。 + */ + Physics_FixedJoint = 14, + /** + * @en Spring joint capability. + * @zh 弹簧关节能力。 + */ + Physics_SpringJoint = 15, + /** + * @en Hinge joint capability. + * @zh 铰链关节能力。 + */ + Physics_HingeJoint = 16, + /** + * @en 6 Degrees of Freedom (D6) joint capability. + * @zh 6自由度(D6)关节能力。 + */ + Physics_D6Joint = 17 + } + /** + * @en Physical Statistics Data + * @zh 物理统计数据 + */ + enum EPhysicsStatisticsInfo { + /** + * @en Physical Event Count Enumeration + * @zh 物理事件计数枚举 + */ + C_PhysicsEventCount = 0, + /** + * @en Cleanup Count Per Frame + * @zh 每帧清理个数 + */ + FrameClearCount = 1, + /** + * @en Physical Dynamics Rigid Body Count Enumeration + * @zh 物理动力学刚体计数枚举 + */ + C_PhysicaDynamicRigidBody = 2, + /** + * @en Physical Static Rigid Body Count Enumeration + * @zh 物理静态刚体计数枚举 + */ + C_PhysicaStaticRigidBody = 3, + /** + * @en Physical Kinematic Rigid Body Count Enumeration + * @zh 物理运动学刚体计数枚举 + */ + C_PhysicaKinematicRigidBody = 4, + /** + * @en Physical Character Controller Count Enumeration + * @zh 物理角色控制器计数枚举 + */ + C_PhysicaCharacterController = 5, + /** + * @en Physical Joint Count Enumeration + * @zh 物理关节计数枚举 + */ + C_PhysicsJoint = 6, + /** + * @en Enumeration Count + * @zh 枚举个数 + */ + Count = 7 + } + enum ControllerNonWalkableMode { + /** + * @en Stops character from climbing up non-walkable slopes, but doesn't move it otherwise. + * @zh 阻止角色爬上不可行走的斜坡,但不会对其他情况进行移动。 + */ + ePREVENT_CLIMBING = 0, + /** + * @en Stops character from climbing up non-walkable slopes, and forces it to slide down those slopes. + * @zh 阻止角色爬上不可行走的斜坡,并强制其沿这些斜坡滑下。 + */ + ePREVENT_CLIMBING_AND_FORCE_SLIDING = 1 + } + enum ECharacterCollisionFlag { + /** + * @en Character is colliding to the sides. + * @zh 角色与侧面发生碰撞。 + */ + eCOLLISION_SIDES = 1, + /** + * @en Character has collision above. + * @zh 角色上方发生碰撞。 + */ + eCOLLISION_UP = 2, + /** + * @en Character has collision below. + * @zh 角色下方发生碰撞。 + */ + eCOLLISION_DOWN = 4 + } + /** + * @en The `pxCharactorCollider` class implements character controller functionality in the physics engine. + * @zh `pxCharactorCollider` 类用于在物理引擎中实现角色控制器的功能。 + */ + class pxCharactorCollider extends pxCollider implements ICharacterController { + static tempV3: Vector3; + _shapeID: number; + private _nonWalkableMode; + private _gravity; + private _characterCollisionFlags; + /** + * @en Creates a instance of pxCharactorCollider. + * @param manager The physics manager responsible for this collider. + * @zh 创建一个 pxCharactorCollider 实例。 + * @param manager 负责管理此碰撞器的物理管理器。 + */ + constructor(manager: pxPhysicsManager); + setColliderShape(shape: pxColliderShape): void; + private _getNodeScale; + protected _initCollider(): void; + /** + * @en Gets the capability of the character controller. + * @param value The capability to check. + * @returns Whether the capability is supported. + * @zh 获取角色控制器的能力。 + * @param value 要检查的能力。 + * @returns 是否支持该能力。 + */ + getCapable(value: number): boolean; + /** + * @en Gets the character capability. + * @param value The character capability to check. + * @returns Whether the capability is supported. + * @zh 获取角色能力。 + * @param value 要检查的角色能力。 + * @returns 是否支持该能力。 + */ + static getCharacterCapable(value: ECharacterCapable): boolean; + /** + * @en Initializes the character capabilities. + * @zh 初始化角色能力。 + */ + static initCapable(): void; + /** + * @en Creates the character controller in the physics engine. + * @zh 在物理引擎中创建角色控制器。 + */ + _createController(): void; + /** + * @en Sets the collision flag for the character controller. + * @param value The collision flag to set. + * @zh 设置角色控制器的碰撞标志。 + * @param value 要设置的碰撞标志。 + */ + _setCharacterCollisonFlag(value: ECharacterCollisionFlag): void; + /** + * @en Releases the character controller from the physics engine. + * @zh 从物理引擎中释放角色控制器。 + */ + _releaseController(): void; + /** + * @en Moves the character controller. + * @param disp The displacement vector. + * @zh 移动角色控制器。 + * @param disp 位移向量。 + */ + move(disp: Vector3): void; + /** + * @en Makes the character jump. + * @param velocity The jump velocity. + * @zh 使角色跳跃。 + * @param velocity 跳跃速度。 + */ + jump?(velocity: Vector3): void; + /** + * @en Sets the step offset for the character controller. + * @param offset The step offset value. + * @zh 设置角色控制器的台阶偏移。 + * @param offset 台阶偏移值。 + */ + setStepOffset(offset: number): void; + /** + * @en Sets the up direction for the character controller. + * @param up The up direction vector. + * @zh 设置角色控制器的向上方向。 + * @param up 向上方向向量。 + */ + setUpDirection(up: Vector3): void; + /** + * @en Sets the slope limit for the character controller. + * @param value The slope limit value in radians. + * @zh 设置角色控制器的坡度限制。 + * @param value 坡度限制值(弧度)。 + */ + setSlopeLimit(value: number): void; + /** + * @en Sets the gravity for the character controller. + * @param value The gravity vector. + * @zh 设置角色控制器的重力。 + * @param value 重力向量。 + */ + setGravity(value: Vector3): void; + /** + * @en Sets the push force for the character controller. + * @param value The push force value. + * @zh 设置角色控制器的推力。 + * @param value 推力值。 + */ + setPushForce(value: number): void; + /** + * @en Updates the character's world transform from the physics engine. + * @zh 从物理引擎更新角色的世界变换。 + */ + getWorldTransform(): void; + /** + * @en Sets the skin width for the character controller. + * @param width The skin width value. + * @zh 设置角色控制器的皮肤宽度。 + * @param width 皮肤宽度值。 + */ + setSkinWidth(width: number): void; + /** + * @en Destroys the character controller. + * @zh 销毁角色控制器。 + */ + destroy(): void; + /** + * @en Sets the position of the character controller. + * @param value The position vector. + * @zh 设置角色控制器的位置。 + * @param value 位置向量。 + */ + setPosition(value: Vector3): void; + /** + * @en Gets the position of the character controller. + * @returns The position vector. + * @zh 获取角色控制器的位置。 + * @returns 位置向量。 + */ + getPosition(): Vector3; + /** + * @en Sets the local offset of the character's shape. + * @param value The local offset vector. + * @zh 设置角色形状的局部偏移。 + * @param value 局部偏移向量。 + */ + setShapelocalOffset(value: Vector3): void; + /** + * @en Sets the height of the character controller. + * @param value The height value. + * @zh 设置角色控制器的高度。 + * @param value 高度值。 + */ + setHeight(value: number): void; + /** + * @en Sets the radius of the character controller. + * @param value The radius value. + * @zh 设置角色控制器的半径。 + * @param value 半径值。 + */ + setRadius(value: number): void; + /** + * @en Sets the minimum distance for the character controller. + * @param value The minimum distance value. + * @zh 设置角色控制器的最小距离。 + * @param value 最小距离值。 + */ + setminDistance(value: number): void; + /** + * @en Sets the non-walkable mode for the character controller. + * @param value The non-walkable mode. + * @zh 设置角色控制器的不可行走模式。 + * @param value 不可行走模式。 + */ + setNonWalkableMode(value: ControllerNonWalkableMode): void; + /** + * @en Sets the event filter for the character controller. + * @param events An array of events to filter. + * @zh 设置角色控制器的事件过滤器。 + * @param events 要过滤的事件数组。 + */ + setEventFilter(events: [ + ]): void; + /** + * @en Releases the character controller resources. + * @zh 释放角色控制器资源。 + */ + release(): void; + } + /** + * @en Enumeration of collider types. + * @zh 碰撞器类型枚举。 + */ + enum pxColliderType { + RigidbodyCollider = 0, + CharactorCollider = 1, + StaticCollider = 2 + } + /** + * @en PhysX actor flags. + * @zh PhysX 执行器标志。 + */ + enum pxActorFlag { + /** + * @en Enable debug renderer for this actor. + * @zh 为此执行器启用调试渲染器。 + */ + eVISUALIZATION = 1, + /** + * @en Disables scene gravity for this actor. + * @zh 禁用此执行器的场景重力。 + */ + eDISABLE_GRAVITY = 2, + /** + * @en Enables the sending of PxSimulationEventCallback::onWake() and PxSimulationEventCallback::onSleep() notify events. + * @zh 启用 PxSimulationEventCallback::onWake() 和 PxSimulationEventCallback::onSleep() 通知事件的发送。 + */ + eSEND_SLEEP_NOTIFIES = 4, + /** + * @en Disables simulation for the actor. + * @zh 禁用执行器的模拟。 + */ + eDISABLE_SIMULATION = 8 + } + /** + * @en The `pxCollider` class is used to handle physics colliders. + * @zh `pxCollider` 类用于处理物理碰撞器。 + */ + class pxCollider implements ICollider { + /**temp tranform object */ + private static _tempTransform; + /**actor */ + _pxActor: any; + /**owner transform */ + _transform: Transform3D; + /**type data */ + _type: pxColliderType; + /**触发器 */ + _isTrigger: boolean; + /**can collision Group*/ + _canCollisionWith: number; + /**collision group */ + _collisionGroup: number; + /**pxshape */ + _shape: pxColliderShape; + /**manager */ + _physicsManager: pxPhysicsManager; + /**check destroy */ + _destroyed: boolean; + /** + * @en The index of this collider in the physics update list. + * @zh 此碰撞器在物理更新列表中的索引。 + */ + inPhysicUpdateListIndex: number; + /**id */ + _id: number; + private _bounciness; + /** + * @en Creates a instance of pxCollider. + * @param manager The physics manager responsible for this collider. + * @zh 创建一个 pxCollider 实例。 + * @param manager 负责管理此碰撞器的物理管理器。 + */ + constructor(manager: pxPhysicsManager); + /** + * @en Indicates whether the collider is active. + * @zh 表示碰撞器是否处于激活状态。 + */ + active: boolean; + /** + * @en Sets the friction value for the collider. + * @param value The friction value to set. + * @zh 设置碰撞器的摩擦力值。 + * @param value 要设置的摩擦力值。 + */ + setfriction?(value: number): void; + /** + * @en Sets the rolling friction value for the collider. + * @param value The rolling friction value to set. + * @zh 设置碰撞器的滚动摩擦力值。 + * @param value 要设置的滚动摩擦力值。 + */ + setRollingFriction?(value: number): void; + protected setActorFlag(flag: pxActorFlag, value: boolean): void; + /** + * @en Gets the capability of the collider. + * @param value The capability to check. + * @zh 获取碰撞器的能力。 + * @param value 要检查的能力。 + */ + getCapable(value: number): boolean; + /** + * @en Sets the collider shape for this collider. + * @param shape The collider shape to set. + * @zh 为此碰撞器设置碰撞形状。 + * @param shape 要设置的碰撞形状。 + */ + setColliderShape(shape: pxColliderShape): void; + protected _initColliderShapeByCollider(): void; + /** + * @en Destroys the collider and releases its resources. + * @zh 销毁碰撞器并释放其资源。 + */ + destroy(): void; + /** + * @en Sets the collision group for this collider. + * @param value The collision group value. + * @zh 设置此碰撞器的碰撞组。 + * @param value 碰撞组值。 + */ + setCollisionGroup(value: number): void; + /** + * @en Sets which groups this collider can collide with. + * @param value The collision mask value. + * @zh 设置此碰撞器可以与哪些组碰撞。 + * @param value 碰撞掩码值。 + */ + setCanCollideWith(value: number): void; + /** + * @en Sets the event filter for the collider. + * @param events An array of events to filter. + * @zh 设置碰撞器的事件过滤器。 + * @param events 要过滤的事件数组。 + */ + setEventFilter(events: [ + ]): void; + allowSleep(value: boolean): void; + /** + * @en Sets the owner node for this collider. + * @param node The Sprite3D node that owns this collider. + * @zh 设置此碰撞器的所有者节点。 + * @param node 拥有此碰撞器的 Sprite3D 节点。 + */ + setOwner(node: Sprite3D): void; + protected _initCollider(): void; + /** + * @en Notifies that the transform has changed. + * @param flag The transform change flag. + * @zh 通知变换已更改。 + * @param flag 变换更改标志。 + */ + transformChanged(flag: number): void; + /** + * @en Sets the world transform of the collider. + * @param focus Whether to force update even if no change is detected. + * @zh 设置碰撞器的世界变换。 + * @param focus 是否强制更新,即使未检测到变化。 + */ + setWorldTransform(focus: boolean): void; + /** + * @en Sets the bounciness (restitution) of the collider. + * @param value The bounciness value. + * @zh 设置碰撞器的弹性(恢复)。 + * @param value 弹性值。 + */ + setBounciness(value: number): void; + /** + * @en Sets the dynamic friction of the collider. + * @param value The dynamic friction value. + * @zh 设置碰撞器的动态摩擦力。 + * @param value 动态摩擦力值。 + */ + setDynamicFriction(value: number): void; + /** + * @en Sets the static friction of the collider. + * @param value The static friction value. + * @zh 设置碰撞器的静态摩擦力。 + * @param value 静态摩擦力值。 + */ + setStaticFriction(value: number): void; + /** + * @en Sets the friction combine mode of the collider. + * @param value The friction combine mode. + * @zh 设置碰撞器的摩擦力合并模式。 + * @param value 摩擦力合并模式。 + */ + setFrictionCombine(value: PhysicsCombineMode): void; + /** + * @en Sets the bounce combine mode of the collider. + * @param value The bounce combine mode. + * @zh 设置碰撞器的弹性合并模式。 + * @param value 弹性合并模式。 + */ + setBounceCombine(value: PhysicsCombineMode): void; + } + /** + * @en The collision detection mode constants. + * @zh 碰撞检测模式常量。 + */ + enum CollisionDetectionMode { + /** + * @en Continuous collision detection is off for this dynamic collider. + * @zh 对于这个动态碰撞体,连续碰撞检测是关闭的。 + */ + Discrete = 0, + /** + * @en Continuous collision detection is on for colliding with static mesh geometry. + * @zh 对于与静态网格几何体的碰撞,连续碰撞检测是开启的。 + */ + Continuous = 1, + /** + * @en Continuous collision detection is on for colliding with static and dynamic geometry. + * @zh 对于与静态和动态几何体的碰撞,连续碰撞检测是开启的。 + */ + ContinuousDynamic = 2, + /** + * @en Speculative continuous collision detection is on for static and dynamic geometries. + * @zh 对于静态和动态几何体,推测性连续碰撞检测是开启的。 + */ + ContinuousSpeculative = 3 + } + /** + * @en Use these flags to constrain motion of dynamic collider. + * @zh 使用这些标志来限制动态碰撞体的运动。 + */ + enum DynamicColliderConstraints { + /** + * @en Not Freeze. + * @zh 不冻结任何运动。 + */ + None = 0, + /** + * @en Freeze motion along the X-axis. + * @zh 冻结沿 X 轴的运动。 + */ + FreezePositionX = 1, + /** + * @en Freeze motion along the Y-axis. + * @zh 冻结沿 Y 轴的运动。 + */ + FreezePositionY = 2, + /** + * @en Freeze motion along the Z-axis. + * @zh 冻结沿 Z 轴的运动。 + */ + FreezePositionZ = 4, + /** + * @en Freeze rotation along the X-axis. + * @zh 冻结绕 X 轴的旋转。 + */ + FreezeRotationX = 8, + /** + * @en Freeze rotation along the Y-axis. + * @zh 冻结绕 Y 轴的旋转。 + */ + FreezeRotationY = 16, + /** + * @en Freeze rotation along the Z-axis. + * @zh 冻结绕 Z 轴的旋转。 + */ + FreezeRotationZ = 32 + } + /** + * @en The `pxDynamicCollider` class is used to manage dynamic colliders in the physics engine. + * @zh `pxDynamicCollider` 类用于在物理引擎中管理动态碰撞体。 + */ + class pxDynamicCollider extends pxCollider implements IDynamicCollider { + /** + * @en Get the static collider capability for a given value. + * @param value The collider capability to check. + * @returns Whether the static collider has the specified capability. + * @zh 获取指定值的静态碰撞体能力。 + * @param value 要检查的碰撞体能力。 + * @returns 静态碰撞体是否具有指定的能力。 + */ + static getStaticColliderCapable(value: EColliderCapable): boolean; + /** + * @en Initialize the capabilities map for dynamic colliders. + * @zh 初始化动态碰撞体的能力映射。 + */ + static initCapable(): void; + /** + * @en Indicates whether the collider is kinematic. + * @zh 表示碰撞体是否是运动学的。 + */ + IsKinematic: boolean; + private _mass; + private _linearDamping; + private _angularDamping; + private _linearVelocity; + private _angularVelocity; + private _centerOfMass; + private _inertiaTensor; + private _sleepThreshold; + private _collisionDetectionMode; + private _solverIterations; + /** + * @en Create a pxDynamicCollider instance. + * @param manager The physics manager instance. + * @zh 创建 pxDynamicCollider 类的实例。 + * @param manager 物理管理器实例。 + */ + constructor(manager: pxPhysicsManager); + /** + * @en Get the capability of the collider for a given value. + * @param value The capability value to check. + * @returns Whether the collider has the specified capability. + * @zh 获取碰撞体对于给定值的能力。 + * @param value 要检查的能力值。 + * @returns 碰撞体是否具有指定的能力。 + */ + getCapable(value: number): boolean; + protected _initCollider(): void; + protected _initColliderShapeByCollider(): void; + /** + * @en Set the world rotation of the dynamic collider. + * @param value The new world rotation. + * @zh 设置动态碰撞体的世界旋转。 + * @param value 新的世界旋转。 + */ + setWorldRotation(value: Quaternion): void; + /** + * @en Set the world position of the dynamic collider. + * @param value The new world position. + * @zh 设置动态碰撞体的世界位置。 + * @param value 新的世界位置。 + */ + setWorldPosition(value: Vector3): void; + /** + * @en Get the world transform of the dynamic collider. + * @zh 获取动态碰撞体的世界变换。 + */ + getWorldTransform(): void; + /** + * @en Set the trigger state of the collider. + * @param value True to set as trigger, false otherwise. + * @zh 设置碰撞体的触发器状态。 + * @param value 为 true 时设置为触发器,否则为 false。 + */ + setTrigger(value: boolean): void; + /** + * @en Set the linear damping of the dynamic collider. + * @param value The linear damping value. + * @zh 设置动态碰撞体的线性阻尼。 + * @param value 线性阻尼值。 + */ + setLinearDamping(value: number): void; + /** + * @en Set the angular damping of the dynamic collider. + * @param value The angular damping value. + * @zh 设置动态碰撞体的角度阻尼。 + * @param value 角度阻尼值。 + */ + setAngularDamping(value: number): void; + /** + * @en Set the linear velocity of the dynamic collider. + * @param value The linear velocity vector. + * @zh 设置动态碰撞体的线性速度。 + * @param value 线性速度向量。 + */ + setLinearVelocity(value: Vector3): void; + /** + * @en Get the linear velocity of the dynamic collider. + * @returns The current linear velocity. + * @zh 获取动态碰撞体的线性速度。 + * @returns 当前的线性速度。 + */ + getLinearVelocity(): Vector3; + /** + * @en Set the angular velocity of the dynamic collider. + * @param value The angular velocity vector. + * @zh 设置动态碰撞体的角速度。 + * @param value 角速度向量。 + */ + setAngularVelocity(value: Vector3): void; + /** + * @en Get the angular velocity of the dynamic collider. + * @returns The current angular velocity. + * @zh 获取动态碰撞体的角速度。 + * @returns 当前的角速度。 + */ + getAngularVelocity(): Vector3; + /** + * @en Set the mass of the dynamic collider. + * @param value The mass value. + * @zh 设置动态碰撞体的质量。 + * @param value 质量值。 + */ + setMass(value: number): void; + /** + * @en Set the center of mass of the dynamic collider. + * @param value The center of mass vector. + * @zh 设置动态碰撞体的质心。 + * @param value 质心向量。 + */ + setCenterOfMass(value: Vector3): void; + /** + * @en Set the inertia tensor of the dynamic collider. + * @param value The inertia tensor vector. + * @zh 设置动态碰撞体的惯性张量。 + * @param value 惯性张量向量。 + */ + setInertiaTensor(value: Vector3): void; + /** + * @en Whether it is sleeping. + * @zh 是否处于睡眠状态。 + */ + isSleeping(): boolean; + /** + * @en Set the sleep threshold of the dynamic collider. + * @param value The sleep threshold value. + * @zh 设置动态碰撞体的睡眠阈值。 + * @param value 睡眠阈值。 + */ + setSleepThreshold(value: number): void; + /** + * @en Set the collision detection mode of the dynamic collider. + * @param value The collision detection mode. + * @zh 设置动态碰撞体的碰撞检测模式。 + * @param value 碰撞检测模式。 + */ + setCollisionDetectionMode(value: number): void; + /** + * @en Set the solver iterations of the dynamic collider. + * @param value The number of solver iterations. + * @zh 设置动态碰撞体的求解器迭代次数。 + * @param value 求解器迭代次数。 + */ + setSolverIterations(value: number): void; + /** + * @en Set whether the dynamic collider is kinematic. + * @param value True if kinematic, false otherwise. + * @zh 设置动态碰撞体是否为运动学的。 + * @param value 为 true 时设置为运动学,否则为 false。 + */ + setIsKinematic(value: boolean): void; + allowSleep(value: boolean): void; + /** + * @en Set the constraints of the dynamic collider. + * @param linearFactor The linear factor vector. + * @param angularFactor The angular factor vector. + * @zh 设置动态碰撞体的约束。 + * @param linearFactor 线性因子向量。 + * @param angularFactor 角度因子向量。 + */ + setConstraints(linearFactor: Vector3, angularFactor: Vector3): void; + /** + * @en Add force to the dynamic collider. + * @param force The force vector to add. + * @param mode The physics force mode. + * @param localOffset The local offset vector. + * @zh 为动态碰撞体添加力。 + * @param force 要添加的力向量。 + * @param mode 物理力模式。 + * @param localOffset 局部偏移向量。 + */ + addForce(force: Vector3, mode: PhysicsForceMode, localOffset: Vector3): void; + /** + * @en Add torque to the dynamic collider. + * @param torque The torque vector to add. + * @param mode The physics force mode. + * @zh 为动态碰撞体添加扭矩。 + * @param torque 要添加的扭矩向量。 + * @param mode 物理力模式。 + */ + addTorque(torque: Vector3, mode: PhysicsForceMode): void; + /** + * @en Put the dynamic collider to sleep. + * @zh 使动态碰撞体进入睡眠状态。 + */ + sleep(): void; + /** + * @en Wake up the dynamic collider. + * @zh 唤醒动态碰撞体。 + */ + wakeUp(): void; + /** + * @en Move the kinematic actor to a new pose. + * @param positionOrRotation The new position or rotation. + * @param rotation The new rotation (optional). + * @zh 将运动学角色移动到新的姿态。 + * @param positionOrRotation 新的位置或旋转。 + * @param rotation 新的旋转(可选)。 + */ + move(positionOrRotation: Vector3 | Quaternion, rotation?: Quaternion): void; + /** + * @en Destroy Rigidbody + * @zh 销毁刚体 + */ + destroy(): void; + } + /** + * @en Class representing a static collider in the PhysX physics engine. + * @zh 表示 PhysX 物理引擎中的静态碰撞器的类。 + */ + class pxStaticCollider extends pxCollider implements IStaticCollider { + /** + * @en Get the capability of a static collider for a specific collider capable. + * @param value The collider capable to check. + * @returns Whether the static collider is capable of the specified feature. + * @zh 获取静态碰撞器对特定碰撞器能力的支持状态。 + * @param value 要检查的碰撞器能力。 + * @returns 静态碰撞器是否支持指定的特性。 + */ + static getStaticColliderCapable(value: EColliderCapable): boolean; + /** + * @en Initialize the capabilities map for static colliders. + * @zh 初始化静态碰撞器的能力映射表。 + */ + static initCapable(): void; + /** + * @en Creates an instance of pxStaticCollider. + * @param manager The physics manager. + * @zh 创建一个 pxStaticCollider 实例。 + * @param manager 物理管理器。 + */ + constructor(manager: pxPhysicsManager); + /** + * @en Check if the static collider is capable of a specific feature. + * @param value The capability to check. + * @returns Whether the static collider is capable of the specified feature. + * @zh 检查静态碰撞器是否具有特定能力。 + * @param value 要检查的能力。 + * @returns 静态碰撞器是否具有指定的能力。 + */ + getCapable(value: number): boolean; + protected _initCollider(): void; + /** + * @en Set the trigger state of the collider. + * @param value Whether the collider should act as a trigger. + * @zh 设置碰撞器的触发器状态。 + * @param value 碰撞器是否应该作为触发器。 + */ + setTrigger(value: boolean): void; + protected _initColliderShapeByCollider(): void; + /** + * @en Destroy Static Collider + * @zh 销毁静态碰撞器 + */ + destroy(): void; + } + enum PxD6JointDriveFlag { + /** + * @en drive spring is for the acceleration at the joint (rather than the force). + * @zh 表示驱动弹簧用于关节的加速度,而不是力。 + */ + eACCELERATION = 1 + } + /** + * @en The `pxD6Joint` class is used to create and manage D6 joints (6 degrees of freedom joints) in the PhysX physics engine. + * @zh `pxD6Joint` 类用于创建和管理 PhysX 物理引擎中的 D6 关节(6 自由度关节)。 + */ + class pxD6Joint extends pxJoint implements ID6Joint { + /** + * create Joint + */ + protected _createJoint(): void; + /** + * set local Pose + * @param actor + * @param position + */ + protected _setLocalPose(actor: number, position: Vector3): void; + /** + * @en Sets the joint's primary and secondary axes. + * @param axis The primary axis. + * @param secendary The secondary axis. + * @zh 设置关节的主轴和次轴。 + * @param axis 主轴。 + * @param secendary 次轴。 + */ + setAxis(axis: Vector3, secendary: Vector3): void; + /** + * @en Sets the motion type for a specific axis. + * @param axis The axis to set. + * @param motionType The motion type to apply. + * @zh 设置特定轴的运动类型。 + * @param axis 要设置的轴。 + * @param motionType 要应用的运动类型。 + */ + setMotion(axis: D6Axis, motionType: D6MotionType): void; + /** + * @en Sets the distance limit for the joint. + * @param limit The distance limit. + * @param bounceness The bounciness of the limit. + * @param bounceThreshold The bounce threshold. + * @param spring The spring coefficient. + * @param damp The damping coefficient. + * @zh 设置关节的距离限制。 + * @param limit 距离限制。 + * @param bounceness 限制的弹性。 + * @param bounceThreshold 反弹阈值。 + * @param spring 弹簧系数。 + * @param damp 阻尼系数。 + */ + setDistanceLimit(limit: number, bounceness: number, bounceThreshold: number, spring: number, damp: number): void; + /** + * @en Sets the linear limit for a specific axis. + * @param linearAxis The linear axis to set. + * @param upper The upper limit. + * @param lower The lower limit. + * @param bounceness The bounciness of the limit. + * @param bounceThreshold The bounce threshold. + * @param spring The spring coefficient. + * @param damping The damping coefficient. + * @zh 设置特定轴的线性限制。 + * @param linearAxis 要设置的线性轴。 + * @param upper 上限。 + * @param lower 下限。 + * @param bounceness 限制的弹性。 + * @param bounceThreshold 反弹阈值。 + * @param spring 弹簧系数。 + * @param damping 阻尼系数。 + */ + setLinearLimit(linearAxis: D6MotionType, upper: number, lower: number, bounceness: number, bounceThreshold: number, spring: number, damping: number): void; + /** + * @en Sets the twist limit for the joint. + * @param upper The upper limit. + * @param lower The lower limit. + * @param bounceness The bounciness of the limit. + * @param bounceThreshold The bounce threshold. + * @param spring The spring coefficient. + * @param damping The damping coefficient. + * @zh 设置关节的扭转限制。 + * @param upper 上限。 + * @param lower 下限。 + * @param bounceness 限制的弹性。 + * @param bounceThreshold 反弹阈值。 + * @param spring 弹簧系数。 + * @param damping 阻尼系数。 + */ + setTwistLimit(upper: number, lower: number, bounceness: number, bounceThreshold: number, spring: number, damping: number): void; + /** + * @en Sets the swing limit for the joint. + * @param yAngle The Y angle limit. + * @param zAngle The Z angle limit. + * @param bounceness The bounciness of the limit. + * @param bounceThreshold The bounce threshold. + * @param spring The spring coefficient. + * @param damping The damping coefficient. + * @zh 设置关节的摆动限制。 + * @param yAngle Y 角度限制。 + * @param zAngle Z 角度限制。 + * @param bounceness 限制的弹性。 + * @param bounceThreshold 反弹阈值。 + * @param spring 弹簧系数。 + * @param damping 阻尼系数。 + */ + setSwingLimit(yAngle: number, zAngle: number, bounceness: number, bounceThreshold: number, spring: number, damping: number): void; + /** + * @en Sets the drive parameters for a specific drive index. + * @param index The drive index. + * @param stiffness The stiffness of the drive. + * @param damping The damping of the drive. + * @param forceLimit The force limit of the drive. + * @zh 设置特定驱动索引的驱动参数。 + * @param index 驱动索引。 + * @param stiffness 驱动的刚度。 + * @param damping 驱动的阻尼。 + * @param forceLimit 驱动的力限制。 + */ + setDrive(index: D6Drive, stiffness: number, damping: number, forceLimit: number): void; + /** + * @en Sets the drive transform for the joint. + * @param position The target position. + * @param rotate The target rotation. + * @zh 设置关节的驱动变换。 + * @param position 目标位置。 + * @param rotate 目标旋转。 + */ + setDriveTransform(position: Vector3, rotate: Quaternion): void; + /** + * @en Sets the drive velocity for the joint. + * @param position The linear velocity. + * @param angular The angular velocity. + * @zh 设置关节的驱动速度。 + * @param position 线性速度。 + * @param angular 角速度。 + */ + setDriveVelocity(position: Vector3, angular: Vector3): void; + /** + * @en Gets the current twist angle of the joint. + * @returns The twist angle in radians. + * @zh 获取关节当前的扭转角度。 + * @returns 扭转角度(弧度)。 + */ + getTwistAngle(): number; + /** + * @en Gets the current swing Y angle of the joint. + * @returns The swing Y angle in radians. + * @zh 获取关节当前的 Y 轴摆动角度。 + * @returns Y 轴摆动角度(弧度)。 + */ + getSwingYAngle(): number; + /** + * @en Gets the current swing Z angle of the joint. + * @returns The swing Z angle in radians. + * @zh 获取关节当前的 Z 轴摆动角度。 + * @returns Z 轴摆动角度(弧度)。 + */ + getSwingZAngle(): number; + /** + * @en Destroy joint + * @zh 销毁关节 + */ + destroy(): void; + } + /** + * @en The pxDistanceJoint class represents a distance joint in the PhysX physics engine. + * @zh pxDistanceJoint 类表示 PhysX 物理引擎中的距离关节。 + */ + class pxDistanceJoint extends pxJoint implements ISpringJoint { + /** + * create Joint + */ + protected _createJoint(): void; + /** + * @en Sets the minimum distance for the joint. + * @param distance The minimum distance value. + * @zh 设置关节的最小距离。 + * @param distance 最小距离值。 + */ + setMinDistance(distance: number): void; + /** + * @en Sets the maximum distance for the joint. + * @param distance The maximum distance value. + * @zh 设置关节的最大距离。 + * @param distance 最大距离值。 + */ + setMaxDistance(distance: number): void; + /** + * @en Sets the connect distance for the joint. + * @param distance The connect distance value. + * @zh 设置关节的连接距离。 + * @param distance 连接距离值。 + */ + setConnectDistance(distance: number): void; + /** + * @en Allows the spring to have a different rest length. + * @param tolerance The tolerance value for the spring rest length. + * @zh 允许弹簧具有不同的静止长度。 + * @param tolerance 弹簧静止长度的容差值。 + */ + setTolerance(tolerance: number): void; + /** + * @en Sets the stiffness of the joint spring. + * @param stiffness The stiffness value. + * @zh 设置关节弹簧的刚度。 + * @param stiffness 刚度值。 + */ + setStiffness(stiffness: number): void; + /** + * @en Sets the damping of the joint spring. + * @param damping The damping value. + * @zh 设置关节弹簧的阻尼。 + * @param damping 阻尼值。 + */ + setDamping(damping: number): void; + /** + * @en Destroy joint + * @zh 销毁关节 + */ + destroy(): void; + } + /** + * @en The pxFixedJoint class represents a fixed joint in the PhysX physics engine. + * @zh pxFixedJoint 类表示 PhysX 物理引擎中的固定关节。 + */ + class pxFixedJoint extends pxJoint implements IFixedJoint { + /** + * create Joint + */ + protected _createJoint(): void; + /** + * @en Destroy joint + * @zh 销毁关节 + */ + destroy(): void; + } + /** + * joint flag + */ + enum PxConstraintFlag { + eBROKEN = 1, + ePROJECT_TO_ACTOR0 = 2, + ePROJECT_TO_ACTOR1 = 4, + ePROJECTION = 6, + eCOLLISION_ENABLED = 8, + eVISUALIZATION = 16, + eDRIVE_LIMITS_ARE_FORCES = 32, + eIMPROVED_SLERP = 128, + eDISABLE_PREPROCESSING = 256, + eENABLE_EXTENDED_LIMITS = 512, + eGPU_COMPATIBLE = 1024, + eALWAYS_UPDATE = 2048, + eDISABLE_CONSTRAINT = 4096 + } + /** + * @en The `pxJoint` class is used to implement joint functionality in the physical engine. + * @zh `pxJoint`类用于在物理引擎中实现关节功能。 + */ + class pxJoint implements IJoint { + /** + * @en Create an instance of the pxJoint class. + * @param manager The physics manager. + * @zh 创建pxJoint类的shape实例。 + * @param manager 物理管理器。 + */ + constructor(manager: pxPhysicsManager); + destroy(): void; + } + enum PxRevoluteJointFlag { + eLIMIT_ENABLED = 1, + eDRIVE_ENABLED = 2, + eDRIVE_FREESPIN = 4 + } + /** + * @en `pxRevoluteJoint` is a joint that allows rotation around an axis. + * @zh `pxRevoluteJoint`类用于在物理引擎中创建和管理旋转关节(铰链关节) + */ + class pxRevoluteJoint extends pxJoint implements IHingeJoint { + /** + * create Joint + */ + protected _createJoint(): void; + /** + * @en Destroy joint + * @zh 销毁关节 + */ + destroy(): void; + } + class pxSphereJoint extends pxJoint { + } + /** + * @en Implements PhysX collision data content + * @zh 实现PhysX碰撞数据内容 + */ + class pxCollisionTool { + /**@ignore */ + constructor(); + /** + * @en Convert PhysX LayaQuaryResult to HitResult type + * @param out The HitResult object to store the result + * @param quaryResult The PhysX query result + * @returns The converted HitResult + * @zh 转换PhysX的LayaQuaryResult到HitResult类型 + * @param out 用于存储结果的HitResult对象 + * @param quaryResult PhysX查询结果 + * @returns 转换后的HitResult + */ + static getRayCastResult(out: HitResult, quaryResult: any): HitResult; + /** + * @en Convert all PhysX LayaQuaryResults to HitResult type + * @param out The array to store the converted HitResults + * @param quaryResults The PhysX query results + * @returns The array of converted HitResults + * @zh 转换所有PhysX的LayaQuaryResult到HitResult类型 + * @param out 用于存储转换后HitResult的数组 + * @param quaryResults PhysX查询结果 + * @returns 转换后的HitResult数组 + */ + static getRayCastResults(out: HitResult[], quaryResults: any): HitResult[]; + /** + * @en Recycle Collision object back to the pool + * @param value The Collision object to be recycled + * @zh 回收Collision对象到对象池 + * @param value 要回收的Collision对象 + */ + static reCoverCollision(value: Collision): void; + /** + * @en Recycle HitResult object back to the pool + * @param value The HitResult object to be recycled + * @zh 回收HitResult对象到对象池 + * @param value 要回收的HitResult对象 + */ + static reCoverHitresults(value: HitResult): void; + } + /** + * @en PhysX physics creation utility class + * @zh PhysX物理创建工具类 + */ + class pxPhysicsCreateUtil implements IPhysicsCreateUtil { + static _physXPVD: boolean; + static _PxPvdPort: any; + static _allocator: any; + static _tolerancesScale: any; + protected _physicsEngineCapableMap: Map; + /** + * @en Initialize physics capabilities + * @zh 初始化物理能力 + */ + initPhysicsCapable(): void; + /** + * @en Get the capability status of a specific physics feature. + * @param value The physics capability to query. + * @returns Whether the specified physics capability is available. + * @zh 获取特定物理功能的能力状态。 + * @param value 要查询的物理能力。 + * @returns 指定的物理能力是否可用。 + */ + getPhysicsCapable(value: EPhysicsCapable): boolean; + /** + * @en Initialize the physics engine. + * @returns A promise that resolves when initialization is complete. + * @zh 初始化物理引擎。 + * @returns 当初始化完成时解析的Promise。 + */ + initialize(): Promise; + /** + * @en Enable PhysX PVD (PhysX Visual Debugger) using Socket transport. + * @param physX The PhysX instance. + * @param pxFoundation The PhysX foundation instance. + * @zh 使用Socket传输启用PhysX PVD(PhysX可视化调试器)。 + * @param physX PhysX实例。 + * @param pxFoundation PhysX foundation实例。 + */ + _physxPVDSocketConnect(physX: any, pxFoundation: any): any; + private _init; + /** + * @en Create a physics manager. + * @param physicsSettings The physics settings. + * @returns A new physics manager instance. + * @zh 创建物理管理器。 + * @param physicsSettings 物理设置。 + * @returns 新的物理管理器实例。 + */ + createPhysicsManger(physicsSettings: PhysicsSettings): pxPhysicsManager; + /** + * @en Create a dynamic collider. + * @param manager The physics manager. + * @returns A new dynamic collider instance. + * @zh 创建动态碰撞器。 + * @param manager 物理管理器。 + * @returns 新的动态碰撞器实例。 + */ + createDynamicCollider(manager: pxPhysicsManager): IDynamicCollider; + /** + * @en Create a static collider. + * @param manager The physics manager. + * @returns A new static collider instance. + * @zh 创建静态碰撞器。 + * @param manager 物理管理器。 + * @returns 新的静态碰撞器实例。 + */ + createStaticCollider(manager: pxPhysicsManager): IStaticCollider; + /** + * @en Create a character controller. + * @param manager The physics manager. + * @returns A new character controller instance. + * @zh 创建角色控制器。 + * @param manager 物理管理器。 + * @returns 新的角色控制器实例。 + */ + createCharacterController(manager: pxPhysicsManager): ICharacterController; + /** + * @en Create a fixed joint. + * @param manager The physics manager. + * @returns A new fixed joint instance. + * @zh 创建固定关节。 + * @param manager 物理管理器。 + * @returns 新的固定关节实例。 + */ + createFixedJoint(manager: pxPhysicsManager): IFixedJoint; + /** + * @en Create a hinge joint. + * @param manager The physics manager. + * @returns A new hinge joint instance. + * @zh 创建铰链关节。 + * @param manager 物理管理器。 + * @returns 新的铰链关节实例。 + */ + createHingeJoint(manager: pxPhysicsManager): IHingeJoint; + /** + * @en Create a spring joint. + * @param manager The physics manager. + * @returns A new spring joint instance. + * @zh 创建弹簧关节。 + * @param manager 物理管理器。 + * @returns 新的弹簧关节实例。 + */ + createSpringJoint(manager: pxPhysicsManager): ISpringJoint; + /** + * @en Create a D6 joint. + * @param manager The physics manager. + * @returns A new D6 joint instance. + * @zh 创建D6关节。 + * @param manager 物理管理器。 + * @returns 新的D6关节实例。 + */ + createD6Joint(manager: pxPhysicsManager): ID6Joint; + /** + * @en Create a box collider shape. + * @returns A new box collider shape instance. + * @zh 创建盒子碰撞器形状。 + * @returns 新的盒子碰撞器形状实例。 + */ + createBoxColliderShape(): IBoxColliderShape; + /** + * @en Create a sphere collider shape. + * @returns A new sphere collider shape instance. + * @zh 创建球体碰撞器形状。 + * @returns 新的球体碰撞器形状实例。 + */ + createSphereColliderShape(): ISphereColliderShape; + /** + * @en Create a plane collider shape. + * @zh 创建平面碰撞器形状。 + */ + createPlaneColliderShape(): IPlaneColliderShape; + /** + * @en Create a capsule collider shape. + * @returns A new capsule collider shape instance. + * @zh 创建胶囊碰撞器形状。 + * @returns 新的胶囊碰撞器形状实例。 + */ + createCapsuleColliderShape?(): ICapsuleColliderShape; + /** + * @en Create a mesh collider shape. + * @returns A new mesh collider shape instance. + * @zh 创建网格碰撞器形状。 + * @returns 新的网格碰撞器形状实例。 + */ + createMeshColliderShape?(): IMeshColliderShape; + /** + * @en Create a cylinder collider shape. + * @zh 创建圆柱体碰撞器形状。 + */ + createCylinderColliderShape?(): ICylinderColliderShape; + /** + * @en Create a cone collider shape. + * @zh 创建圆锥体碰撞器形状。 + */ + createConeColliderShape?(): IConeColliderShape; + /** + * @en Create a height field shape. + * @returns A new height field shape instance. + * @zh 创建高度场形状。 + * @returns 新的高度场形状实例。 + */ + createHeightFieldShape(): pxHeightFieldShape; + /** + * @en Create a compound collider shape. + * @returns A new compound collider shape instance. + * @zh 创建组合碰撞器形状。 + * @returns 新的组合碰撞器形状实例。 + */ + createCompoundShape(): ICompoundColliderShape; + /** + * @en Create a convex mesh from a given mesh. + * @param mesh The input mesh. + * @zh 从给定的网格创建凸包网格。 + * @param mesh 输入的网格。 + */ + createCorveMesh(mesh: Mesh): Mesh; + /** + * @en Create a Float32Array with allocated memory. + * @param length The length of the array. + * @zh 创建具有分配内存的Float32Array。 + * @param length 数组的长度。 + */ + static createFloat32Array(length: number): { + ptr: number; + buffer: Float32Array; + }; + /** + * @en Create a Uint32Array with allocated memory. + * @param length The length of the array. + * @zh 创建具有分配内存的Uint32Array。 + * @param length 数组的长度。 + */ + static createUint32Array(length: number): { + ptr: number; + buffer: Uint32Array; + }; + /** + * @en Create a Uint16Array with allocated memory. + * @param length The length of the array. + * @zh 创建具有分配内存的Uint16Array。 + * @param length 数组的长度。 + */ + static createUint16Array(length: number): { + ptr: number; + buffer: Uint16Array; + }; + /** + * @en Create a Uint8Array with allocated memory. + * @param length The length of the array. + * @zh 创建具有分配内存的Uint8Array。 + * @param length 数组的长度。 + */ + static createUint8Array(length: number): { + ptr: number; + buffer: Uint8Array; + }; + /** + * @en Free the allocated memory for a buffer. + * @param data The buffer object to free. + * @zh 释放为缓冲区分配的内存。 + * @param data 要释放的缓冲区对象。 + */ + static freeBuffer(data: any): void; + } + enum partFlag { + eSOLVE_CONTACT = 1, + eMODIFY_CONTACTS = 2, + eNOTIFY_TOUCH_FOUND = 4, + eNOTIFY_TOUCH_PERSISTS = 8, + eNOTIFY_TOUCH_LOST = 16, + eNOTIFY_TOUCH_CCD = 32, + eNOTIFY_THRESHOLD_FORCE_FOUND = 64, + eNOTIFY_THRESHOLD_FORCE_PERSISTS = 128, + eNOTIFY_THRESHOLD_FORCE_LOST = 256, + eNOTIFY_CONTACT_POINTS = 512, + eDETECT_DISCRETE_CONTACT = 1024, + eDETECT_CCD_CONTACT = 2048, + ePRE_SOLVER_VELOCITY = 4096, + ePOST_SOLVER_VELOCITY = 8192, + eCONTACT_EVENT_POSE = 16384, + eNEXT_FREE = 32768, + eCONTACT_DEFAULT = 1025, + eTRIGGER_DEFAULT = 1044 + } + /** + * @en The `pxPhysicsManager` class is used to implement physics management. + * @zh `pxPhysicsManager` 类用于实现物理管理。 + */ + class pxPhysicsManager implements IPhysicsManager { + _dynamicUpdateList: PhysicsUpdateList; + /** + * @en Fixed time step for physics simulation. + * @zh 物理模拟的固定时间步长。 + */ + fixedTime: number; + /** + * @en Whether to enable Continuous Collision Detection (CCD). + * @zh 是否启用连续碰撞检测(CCD)。 + */ + enableCCD: boolean; + _pxcontrollerManager: any; + private _gravity; + /**temp tranform object */ + private static _tempTransform; + /** + * @en Create a new instance of `pxPhysicsManager`. + * @param physicsSettings The physics settings to initialize the manager. + * @zh 创建`pxPhysicsManager`类的新实例。 + * @param physicsSettings 用于初始化管理器的物理设置。 + */ + constructor(physicsSettings: PhysicsSettings); + /** + * @en Set the active state of a collider. + * @param collider The collider to set. + * @param value The active state to set. + * @zh 设置碰撞器的活动状态。 + * @param collider 要设置的碰撞器。 + * @param value 要设置的活动状态。 + */ + setActiveCollider(collider: pxCollider, value: boolean): void; + /** + * @en Enable or disable the debug drawer. + * @param value Whether to enable the debug drawer. + * @zh 启用或禁用调试绘制器。 + * @param value 是否启用调试绘制器。 + */ + enableDebugDrawer?(value: boolean): void; + /** + * @en Set collision data to the appropriate map based on the event type. + * @param dataCallBack The collision data callback. + * @param eventType The type of collision event. + * @param isTrigger Whether the collision is a trigger event. + * @zh 根据事件类型将碰撞数据设置到适当的映射中。 + * @param dataCallBack 碰撞数据回调。 + * @param eventType 碰撞事件的类型。 + * @param isTrigger 碰撞是否为触发器事件。 + */ + setDataToMap(dataCallBack: any, eventType: string, isTrigger?: boolean): void; + /** + * @en Set the gravity of the physics world. + * @param gravity The gravity vector to set. + * @zh 设置物理世界的重力。 + * @param gravity 要设置的重力向量。 + */ + setGravity(gravity: Vector3): void; + private _addCharactorCollider; + private _removeCharactorCollider; + private addDynamicElementByUUID; + private removeDynamicElementByUUID; + /** + * @en Add a collider to the physics world. + * @param collider The collider to be added. + * @zh 将碰撞器添加到物理世界中。 + * @param collider 要添加的碰撞器。 + */ + addCollider(collider: ICollider): void; + /** + * @en Remove a collider from the physics world. + * @param collider The collider to be removed. + * @zh 从物理世界中移除碰撞器。 + * @param collider 要移除的碰撞器。 + */ + removeCollider(collider: ICollider): void; + /** + * @private + * @perfTag PerformanceDefine.T_PhysicsCollider + */ + private _collision_event; + /** + * @private + * @perfTag PerformanceDefine.T_PhysicsColliderEnter + */ + private _collision_EnterEvent; + /** + * @private + * @perfTag PerformanceDefine.T_PhysicsColliderStay + */ + private _collision_StayEvent; + /** + * @private + * @perfTag PerformanceDefine.T_PhysicsColliderExit + */ + private _collision_ExitEvent; + /** + * @private + * @perfTag PerformanceDefine.T_PhysicsTrigger + */ + private _trigger_Event; + /** + * @private + * @perfTag PerformanceDefine.T_PhysicsTriggerEnter + */ + private _trigger_EnterEvent; + /** + * @private + * @perfTag PerformanceDefine.T_PhysicsTriggerStay + */ + private _trigger_StayEvent; + /** + * @private + * @perfTag PerformanceDefine.T_PhysicsTriggerExit + */ + private _trigger_ExitEvent; + /** + * @private + * @perfTag PerformanceDefine.T_PhysicsEvent + */ + private _updatePhysicsEvents; + /** + * @private + * @perfTag PerformanceDefine.T_Physics_UpdateNode + */ + private _updatePhysicsTransformToRender; + /** + * @perfTag PerformanceDefine.T_Physics_Simulation + * @en Update the physics simulation. + * @param elapsedTime The elapsed time since the last update. + * @zh 更新物理模拟。 + * @param elapsedTime 自上次更新以来经过的时间。 + */ + update(elapsedTime: number): void; + /** + * @en Performs a ray cast in the physics world.Returns the first hit object. + * @param ray The ray to cast. + * @param outHitResult The result of the raycast. + * @param distance The maximum distance of the raycast. + * @param collisonGroup The collision group of the ray. + * @param collisionMask The collision mask of the ray. + * @returns Whether the raycast hit anything. + * @zh 执行一次射线检测,返回第一个与射线相交的碰撞体信息。 + * @param ray 要投射的射线。 + * @param outHitResult 射线检测的结果。 + * @param distance 射线检测的最大距离。 + * @param collisonGroup 射线的碰撞组。 + * @param collisionMask 射线的碰撞掩码。 + * @returns 射线是否击中了任何物体。 + */ + rayCast(ray: Ray, outHitResult: HitResult, distance?: number, collisonGroup?: number, collisionMask?: number): boolean; + /** + * @en Performs a ray cast in the physics world.Returns all hit objects. + * @param ray The ray to cast. + * @param out An array to store all hit results. + * @param distance The maximum distance of the raycast. + * @param collisonGroup The collision group of the ray. + * @param collisionMask The collision mask of the ray. + * @returns Whether the raycast hit anything. + * @zh 执行一次射线检测,返回所有与射线相交的碰撞体信息。 + * @param ray 要投射的射线。 + * @param out 用于存储所有击中结果的数组。 + * @param distance 射线检测的最大距离。 + * @param collisonGroup 射线的碰撞组。 + * @param collisionMask 射线的碰撞掩码。 + * @returns 射线是否击中了任何物体。 + */ + rayCastAll?(ray: Ray, out: HitResult[], distance?: number, collisonGroup?: number, collisionMask?: number): boolean; + /** + * @en Performs a shape cast. Returns the first hit object. + * @param shape The shape to cast. + * @param fromPosition The starting position of the shape. + * @param toPosition The ending position of the shape. + * @param out The result of the shape cast. + * @param fromRotation The starting rotation of the shape. + * @param toRotation The ending rotation of the shape. + * @param collisonGroup The collision group of the shape. + * @param collisionMask The collision mask of the shape. + * @param allowedCcdPenetration The allowed continuous collision detection penetration. + * @returns Whether the shape cast hit anything. + * @zh 执行形状射线检测,返回第一个与射线相交的碰撞体信息。 + * @param shape 要投射的形状。 + * @param fromPosition 形状的起始位置。 + * @param toPosition 形状的结束位置。 + * @param out 形状投射的结果。 + * @param fromRotation 形状的起始旋转。 + * @param toRotation 形状的结束旋转。 + * @param collisonGroup 形状的碰撞组。 + * @param collisionMask 形状的碰撞掩码。 + * @param allowedCcdPenetration 允许的连续碰撞检测穿透。 + * @returns 形状投射是否击中了任何物体。 + */ + shapeCast(shape: pxColliderShape, fromPosition: Vector3, toPosition: Vector3, out: HitResult, fromRotation?: Quaternion, toRotation?: Quaternion, collisonGroup?: number, collisionMask?: number, allowedCcdPenetration?: number): boolean; + /** + * @en Performs a shape cast. Returns all hit objects. + * @param shape The shape to cast. + * @param fromPosition The starting position of the shape. + * @param toPosition The ending position of the shape. + * @param out An array to store all hit results. + * @param fromRotation The starting rotation of the shape. + * @param toRotation The ending rotation of the shape. + * @param collisonGroup The collision group of the shape. + * @param collisionMask The collision mask of the shape. + * @param allowedCcdPenetration The allowed continuous collision detection penetration. + * @returns Whether the shape cast hit anything. + * @zh 执行形状投射,返回所有与射线相交的碰撞体信息。 + * @param shape 要投射的形状。 + * @param fromPosition 形状的起始位置。 + * @param toPosition 形状的结束位置。 + * @param out 用于存储所有击中结果的数组。 + * @param fromRotation 形状的起始旋转。 + * @param toRotation 形状的结束旋转。 + * @param collisonGroup 形状的碰撞组。 + * @param collisionMask 形状的碰撞掩码。 + * @param allowedCcdPenetration 允许的连续碰撞检测穿透。 + * @returns 形状投射是否击中了任何物体。 + */ + shapeCastAll(shape: pxColliderShape, fromPosition: Vector3, toPosition: Vector3, out: HitResult[], fromRotation?: Quaternion, toRotation?: Quaternion, collisonGroup?: number, collisionMask?: number, allowedCcdPenetration?: number): boolean; + sphereQuery?(pos: Vector3, radius: number, result: ICollider[], collisionmask: number): void; + destroy(): void; + } + /** + * @en Represents a physics material in the PhysX engine. + * @zh 表示PhysX引擎中的物理材质。 + */ + class pxPhysicsMaterial { + private _bounciness; + private _dynamicFriction; + private _staticFriction; + private _bounceCombine; + private _frictionCombine; + /** + * @en Creates a new pxPhysicsMaterial class. + * @zh 创建一个新的pxPhysicsMaterial类。 + */ + constructor(); + /** + * @en Sets the bounciness (restitution). + * @param value The bounciness value. + * @zh 设置反弹性(恢复系数)。 + * @param value 反弹性值。 + */ + setBounciness(value: number): void; + /** + * @en Sets the dynamic friction. + * @param value The dynamic friction value. + * @zh 设置动态摩擦力。 + * @param value 动态摩擦力值。 + */ + setDynamicFriction(value: number): void; + /** + * @en Sets the static friction. + * @param value The static friction value. + * @zh 设置静态摩擦力。 + * @param value 静态摩擦力值。 + */ + setStaticFriction(value: number): void; + /** + * @en Sets the bounce combine mode. + * @param value The bounce combine mode. + * @zh 设置反弹组合模式。 + * @param value 反弹组合模式。 + */ + setBounceCombine(value: PhysicsCombineMode): void; + /** + * @en Sets the friction combine mode. + * @param value The friction combine mode. + * @zh 设置摩擦力组合模式。 + * @param value 摩擦力组合模式。 + */ + setFrictionCombine(value: PhysicsCombineMode): void; + /** + * @en Destroys the physics material and releases associated resources. + * @zh 销毁物理材质并释放相关资源。 + */ + destroy(): void; + } + /** + * @en Represents a box collider shape in the PhysX physics engine. + * @zh 表示 PhysX 物理引擎中的盒状碰撞器形状。 + */ + class pxBoxColliderShape extends pxColliderShape implements IBoxColliderShape { + private static _tempHalfExtents; + /** + * @en Creates a new instance of pxBoxColliderShape. + * @zh 创建 pxBoxColliderShape 的新实例。 + */ + constructor(); + /** + * @en Sets the size of the box collider. + * @param size The new size of the box collider. + * @zh 设置盒状碰撞器的大小。 + * @param size 盒状碰撞器的新大小。 + */ + setSize(size: Vector3): void; + /** + * @en Sets the offset of the box collider. + * @param position The new offset position. + * @zh 设置盒状碰撞器的偏移。 + * @param position 新的偏移位置。 + */ + setOffset(position: Vector3): void; + /** + * @en Destroys the box collider shape and releases resources. + * @zh 销毁盒状碰撞器形状并释放资源。 + */ + destroy(): void; + } + /** + * @en Represents a capsule collider shape in the PhysX physics engine. + * @zh 表示 PhysX 物理引擎中的胶囊碰撞器形状。 + */ + class pxCapsuleColliderShape extends pxColliderShape implements ICapsuleColliderShape { + private _upAxis; + /** + * @en Creates a new instance of pxCapsuleColliderShape. + * @zh 创建 pxCapsuleColliderShape 的新实例。 + */ + constructor(); + /** + * @en Adds the shape to a collider. + * @param collider The collider to add the shape to. + * @zh 将形状添加到碰撞器。 + * @param collider 要添加形状的碰撞器。 + */ + addToActor(collider: pxCollider): void; + /** + * @en Sets the radius of the capsule. + * @param radius The new radius value. + * @zh 设置胶囊体的半径。 + * @param radius 新的半径值。 + */ + setRadius(radius: number): void; + /** + * @en Sets the height of the capsule. + * @param height The new height value. + * @zh 设置胶囊体的高度。 + * @param height 新的高度值。 + */ + setHeight(height: number): void; + /** + * @en Sets the up axis of the capsule. + * @param upAxis The new up axis value. + * @zh 设置胶囊体的向上轴。 + * @param upAxis 新的向上轴值。 + */ + setUpAxis(upAxis: number): void; + /** + * @en Sets the offset of the capsule collider. + * @param position The new offset position. + * @zh 设置胶囊碰撞器的偏移。 + * @param position 新的偏移位置。 + */ + setOffset(position: Vector3): void; + /** + * @en Destroys the capsule collider shape and releases resources. + * @zh 销毁胶囊碰撞器形状并释放资源。 + */ + destroy(): void; + } + /** + * Flags which affect the behavior of Shapes. + */ + enum ShapeFlag { + /** The shape will partake in collision in the physical simulation. */ + SIMULATION_SHAPE = 1, + /** The shape will partake in scene queries (ray casts, overlap tests, sweeps, ...). */ + SCENE_QUERY_SHAPE = 2, + /** The shape is a trigger which can send reports whenever other shapes enter/leave its volume. */ + TRIGGER_SHAPE = 4 + } + interface pxFilterData { + word0?: number; + word1?: number; + word2?: number; + word3?: number; + } + /** + * @en Represents a collider shape in the PhysX physics engine. + * @zh 表示 PhysX 物理引擎中的碰撞器形状。 + */ + class pxColliderShape implements IColliderShape { + static _shapePool: Map; + static _pxShapeID: number; + static transform: { + translation: Vector3; + rotation: Quaternion; + }; + _offset: Vector3; + _scale: Vector3; + _shapeFlags: ShapeFlag; + _pxShape: any; + _pxGeometry: any; + _destroyed: boolean; + _id: number; + /** + * @en Filter data for collision and query. [0]: group, [1]: mask, [2]: event + * @zh 碰撞和查询的过滤数据。[0]: 组, [1]: 掩码, [2]: 事件 + */ + filterData: pxFilterData; + /** @ignore */ + constructor(); + /** + * @override + */ + protected _createShape(): void; + private _modifyFlag; + getPhysicsShape(): any; + /** + * @en Adds the shape to a collider. + * @param collider The collider to add the shape to. + * @zh 将形状添加到碰撞器。 + * @param collider 要添加形状的碰撞器。 + */ + addToActor(collider: pxCollider): void; + /** + * @en Removes the shape from a collider. + * @param collider The collider to remove the shape from. + * @zh 从碰撞器中移除形状。 + * @param collider 要移除形状的碰撞器。 + */ + removeFromActor(collider: pxCollider): void; + /** + * @en Sets the offset of the shape. + * @param position The new offset position. + * @zh 设置形状的偏移。 + * @param position 新的偏移位置。 + */ + setOffset(position: Vector3): void; + getOffset(): Vector3; + /** + * @en Sets whether the shape is a trigger. + * @param value True if the shape should be a trigger, false otherwise. + * @zh 设置形状是否为触发器。 + * @param value 如果形状应为触发器则为 true,否则为 false。 + */ + setIsTrigger(value: boolean): void; + _setShapeFlags(flags: ShapeFlag): void; + /** + * @en Sets the simulation filter data. + * @param colliderGroup The collider group. + * @param colliderMask The collider mask. + * @zh 设置模拟过滤数据。 + * @param colliderGroup 碰撞器组。 + * @param colliderMask 碰撞器掩码。 + */ + setSimulationFilterData(colliderGroup: number, colliderMask: number): void; + /** + * @en Optimizes event return. + * @param filterWorld2Number The filter data. + * @zh 优化事件返回。 + * @param filterWorld2Number 过滤数据。 + */ + setEventFilterData(filterWorld2Number: number): void; + /** + * @en Destroys the collider shape and releases resources. + * @zh 销毁碰撞器形状并释放资源。 + */ + destroy(): void; + } + class pxCompoundShape extends pxColliderShape implements ICompoundColliderShape { + private _physicsComponent; + pxShapes: pxColliderShape[]; + constructor(); + addChildShape(shape: pxColliderShape): void; + removeChildShape(shape: pxColliderShape, index: number): void; + setShapeData(component: PhysicsColliderComponent): void; + refreshShapes(): void; + } + /** + * @en Represents a height field shape in the PhysX physics engine. + * @zh 表示 PhysX 物理引擎中的高度场形状。 + */ + class pxHeightFieldShape extends pxColliderShape implements IHeightFieldShape { + /**@ignore */ + constructor(); + /** + * get height data tranform + * @returns + */ + private getHeightData; + /** + * get flag Data + * @returns + */ + private getFlagData; + /** + * create HeightField Geometry + */ + private _createHeightField; + /** + * @en Sets the height field data. + * @param numRows Number of rows. + * @param numCols Number of columns. + * @param heightData Height data array. + * @param flag Flag data array. + * @param scale Scale of the height field. + * @zh 设置高度场数据。 + * @param numRows 行数。 + * @param numCols 列数。 + * @param heightData 高度数据数组。 + * @param flag 标志数据数组。 + * @param scale 高度场的缩放。 + */ + setHeightFieldData(numRows: number, numCols: number, heightData: Float32Array, flag: Uint8Array, scale: Vector3): void; + /** + * @en Gets the number of rows in the height field. + * @returns Number of rows. + * @zh 获取高度场的行数。 + * @returns 行数。 + */ + getNbRows(): number; + /** + * @en Gets the number of columns in the height field. + * @returns Number of columns. + * @zh 获取高度场的列数。 + * @returns 列数。 + */ + getNbColumns(): number; + /** + * @en Gets the height at a specific row and column. + * @param rows Row index. + * @param cols Column index. + * @returns Height value. + * @zh 获取特定行列的高度值。 + * @param rows 行索引。 + * @param cols 列索引。 + * @returns 高度值。 + */ + getHeight(rows: number, cols: number): number; + } + enum PxConvexFlag { + e16_BIT_INDICES = 1, + eCOMPUTE_CONVEX = 2, + eCHECK_ZERO_AREA_TRIANGLES = 4, + eQUANTIZE_INPUT = 8, + eDISABLE_MESH_VALIDATION = 16, + ePLANE_SHIFTING = 32, + eFAST_INERTIA_COMPUTATION = 64, + eGPU_COMPATIBLE = 128, + eSHIFT_VERTICES = 256 + } + enum PxConvexMeshGeometryFlag { + eTIGHT_BOUNDS = 1 + } + enum PxMeshGeometryFlag { + eTIGHT_BOUNDS = 1, + eDOUBLE_SIDED = 2 + } + /** + * @en Represents a mesh collider shape in the physics engine. + * @zh 表示物理引擎中的网格碰撞器形状。 + */ + class pxMeshColliderShape extends pxColliderShape implements IMeshColliderShape { + private _limitvertex; + private _mesh; + private _convex; + private _meshScale; + /** + * @en Creates a new instance of pxMeshColliderShape. + * @zh 创建一个新的 pxMeshColliderShape 实例。 + */ + constructor(); + private _getMeshPosition; + private _getIndices; + private _createConvexMeshGeometry; + private _createTrianggleMeshGeometry; + /** + * @override + */ + protected _createShape(): void; + private _reConfigShape; + private _setScale; + /** + * @en Sets the offset of the collider shape. + * @param position The new offset position. + * @zh 设置碰撞器形状的偏移。 + * @param position 新的偏移位置。 + */ + setOffset(position: Vector3): void; + /** + * @en Sets the physics mesh from a given mesh. + * @param value The mesh to use for physics. + * @zh 从给定的网格设置物理网格。 + * @param value 用于物理的网格。 + */ + setPhysicsMeshFromMesh(value: Mesh): void; + /** + * @en Sets the convex mesh for the collider. + * @param value The convex mesh to use. + * @zh 设置碰撞器的凸面网格。 + * @param value 要使用的凸面网格。 + */ + setConvexMesh(value: Mesh): void; + /** + * @en Sets the vertex limit for convex mesh generation. + * @param limit The maximum number of vertices. + * @zh 设置凸面网格生成的顶点限制。 + * @param limit 最大顶点数。 + */ + setLimitVertex(limit: number): void; + } + /** + * @en Represents a sphere collider shape in the physics engine. + * @zh 表示物理引擎中的球体碰撞器形状。 + */ + class pxSphereColliderShape extends pxColliderShape implements ISphereColliderShape { + /** + * @en Creates a new instance of pxSphereColliderShape. + * @zh 创建一个新的 pxSphereColliderShape 实例。 + */ + constructor(); + /** + * @en Sets the radius of the sphere collider. + * @param radius The new radius value. + * @zh 设置球体碰撞器的半径。 + * @param radius 新的半径值。 + */ + setRadius(radius: number): void; + /** + * @en Sets the offset position of the sphere collider. + * @param position The new offset position. + * @zh 设置球体碰撞器的偏移位置。 + * @param position 新的偏移位置。 + */ + setOffset(position: Vector3): void; + /** + * @en Destroys the sphere collider shape and releases resources. + * @zh 销毁球体碰撞器形状并释放资源。 + */ + destroy(): void; + } + /** + * 前向渲染流程通用类 + */ + class ForwardAddClusterRP { + pipelineMode: PipelineMode; + depthPipelineMode: PipelineMode; + depthNormalPipelineMode: PipelineMode; + depthTarget: InternalRenderTarget; + destTarget: InternalRenderTarget; + camera: ICameraNodeData; + cameraCullInfo: CameraCullInfo; + depthTextureMode: DepthTextureMode; + depthNormalTarget: InternalRenderTarget; + beforeForwardCmds: CommandBuffer[]; + beforeSkyboxCmds: CommandBuffer[]; + beforeTransparentCmds: CommandBuffer[]; + skyRenderNode: WebBaseRenderNode; + clearColor: Color; + clearFlag: number; + enableCMD: boolean; + enableOpaque: boolean; + enableTransparent: boolean; + protected _opaqueList: RenderListQueue; + protected _transparent: RenderListQueue; + protected _zBufferParams: Vector4; + protected _defaultNormalDepthColor: Color; + protected _viewPort: Viewport; + setViewPort(value: Viewport): void; + protected _scissor: Vector4; + setScissor(value: Vector4): void; + constructor(); + /** + * 设置相机裁剪信息 + * @param camera + */ + setCameraCullInfo(camera: Camera): void; + /** + * 设置渲染命令(前向渲染之前) + * @param value + */ + setBeforeForwardCmds(value: CommandBuffer[]): void; + /** + * 设置渲染命令(天空渲染之前) + * @param value + */ + setBeforeSkyboxCmds(value: CommandBuffer[]): void; + /** + * 设置渲染命令(透明物体渲染之前) + * @param value + */ + setBeforeTransparentCmds(value: CommandBuffer[]): void; + /** + * 渲染流程(TODO:其他两个pass合并MulTargetRT) + * @param context + * @param list + * @param count + */ + render(context: IRenderContext3D, list: WebBaseRenderNode[], count: number): void; + /** + * 清除渲染队列 + */ + protected _clearRenderList(): void; + /** + * 缓存视口和裁剪 + */ + protected _cacheViewPortAndScissor(): void; + /** + * 渲染深度流程 + * @param context + */ + protected _renderDepthPass(context: IRenderContext3D): void; + /** + * 渲染法线深度流程 + * @param context + */ + protected _renderDepthNormalPass(context: IRenderContext3D): void; + /** + * 主渲染流程 + * @param context + */ + protected _mainPass(context: IRenderContext3D): void; + /** + * 渲染不透明贴图流程 + */ + protected _opaqueTexturePass(): void; + } + /** + * 裁剪通用工具类 + */ + class RenderCullUtil { + /** + * 相机裁剪 + * @param cameraCullInfo 相机裁剪信息 + * @param list 渲染节点列表 + * @param count 渲染节点数量(为什么不是list.length?) + * @param opaqueList 不透明队列 + * @param transparent 透明队列 + * @param context 渲染上下文 + */ + static cullByCameraCullInfo(cameraCullInfo: CameraCullInfo, list: WebBaseRenderNode[], count: number, opaqueList: RenderListQueue, transparent: RenderListQueue, context: IRenderContext3D): void; + /** + * 方向光源裁剪 + * @param shadowCullInfo + * @param list + * @param count + * @param opaqueList + * @param context + */ + static cullDirectLightShadow(shadowCullInfo: ShadowCullInfo, list: WebBaseRenderNode[], count: number, opaqueList: RenderListQueue, context: IRenderContext3D): void; + /** + * 聚光灯裁剪 + * @param cameraCullInfo + * @param list + * @param count + * @param opaqueList + * @param context + */ + static cullSpotShadow(cameraCullInfo: CameraCullInfo, list: WebBaseRenderNode[], count: number, opaqueList: RenderListQueue, context: IRenderContext3D): void; + } + /** + * 渲染节点队列 + */ + class RenderListQueue { + private _elements; + get elements(): FastSinglelist; + private _quickSort; + private _isTransparent; + _batch: IInstanceRenderBatch; + constructor(isTransParent: boolean); + /** + * 添加渲染元素 + * @param renderelement + */ + addRenderElement(renderelement: IRenderElement3D): void; + /** + * 合并渲染队列 + */ + private _batchQueue; + /** + * 渲染队列 + * @param context + */ + renderQueue(context: IRenderContext3D): void; + /** + * 清空队列 + */ + clear(): void; + /** + * 销毁 + */ + destroy(): void; + } + /** + * 渲染流程通用工具类 + */ + class RenderPassUtil { + static contextViewPortCache: Viewport; + static contextScissorCache: Vector4; + /** + * 执行渲染命令 + * @param cmds + * @param context + */ + static renderCmd(cmds: CommandBuffer[], context: IRenderContext3D): void; + /** + * 恢复渲染上下文 + * @param context + * @param renderTarget + */ + static recoverRenderContext3D(context: IRenderContext3D, renderTarget: InternalRenderTarget): void; + } + /** + * 渲染节点快速排序 + */ + class RenderQuickSort { + private elementArray; + private isTransparent; + /** + * 快速排序 + * @param elements + * @param isTransparent + * @param left + * @param right + */ + sort(elements: FastSinglelist, isTransparent: boolean, left: number, right: number): void; + } + interface I2DRenderPassFactory { + createRenderElement2D(): IRenderElement2D; + createRenderContext2D(): IRenderContext2D; + } + interface IRenderContext2D { + invertY: boolean; + pipelineMode: string; + sceneData: ShaderData; + setRenderTarget(value: InternalRenderTarget, clear: boolean, clearColor: Color): void; + setOffscreenView(width: number, height: number): void; + drawRenderElementOne(node: IRenderElement2D): void; + drawRenderElementList(list: SingletonList): number; + } + interface IRenderElement2D { + geometry: IRenderGeometryElement; + materialShaderData: ShaderData; + value2DShaderData: ShaderData; + subShader: SubShader; + renderStateIsBySprite: boolean; + destroy(): void; + } + interface IRender3DProcess { + render3DManager: ISceneRenderManager; + fowardRender(context: IRenderContext3D, camera: Camera): void; + destroy(): void; + } + type PipelineMode = "Forward" | "ShadowCaster" | "DepthNormal" | string; + interface IRenderContext3D { + globalShaderData: ShaderData; + sceneData: ShaderData; + sceneModuleData: ISceneNodeData; + cameraModuleData: ICameraNodeData; + cameraData: ShaderData; + sceneUpdataMask: number; + cameraUpdateMask: number; + pipelineMode: PipelineMode; + invertY: boolean; + setRenderTarget(value: InternalRenderTarget, clearFlag: RenderClearFlag): void; + setViewPort(value: Viewport): void; + setScissor(value: Vector4): void; + setClearData(clearFlag: number, clolor: Color, depth: number, stencil: number): number; + drawRenderElementList(list: FastSinglelist): number; + drawRenderElementOne(node: IRenderElement3D): number; + runOneCMD(cmd: IRenderCMD): void; + runCMDList(cmds: IRenderCMD[]): void; + } + interface IRenderElement3D { + geometry: IRenderGeometryElement; + materialShaderData: ShaderData; + materialRenderQueue: number; + renderShaderData: ShaderData; + transform: Transform3D; + canDynamicBatch: boolean; + isRender: boolean; + owner: IBaseRenderNode; + subShader: SubShader; + materialId: number; + destroy(): void; + } + interface IInstanceRenderBatch { + batch(elements: SingletonList): void; + clearRenderData(): void; + recoverData(): void; + } + interface IInstanceRenderElement3D extends IRenderElement3D { + instanceElementList: SingletonList; + setGeometry(geometry: IRenderGeometryElement): void; + clearRenderData(): void; + recover(): void; + } + interface ISkinRenderElement3D { + skinnedData: Float32Array[]; + } + interface I3DRenderPassFactory { + createRender3DProcess(): IRender3DProcess; + createRenderContext3D(): IRenderContext3D; + createRenderElement3D(): IRenderElement3D; + createInstanceBatch(): IInstanceRenderBatch; + createInstanceRenderElement3D(): IInstanceRenderElement3D; + createSkinRenderElement(): ISkinRenderElement3D; + createSceneRenderManager(): ISceneRenderManager; + createDrawNodeCMDData(): DrawNodeCMDData; + createBlitQuadCMDData(): BlitQuadCMDData; + createDrawElementCMDData(): DrawElementCMDData; + createSetViewportCMD(): SetViewportCMD; + createSetRenderTargetCMD(): SetRenderTargetCMD; + createSetRenderDataCMD(): SetRenderDataCMD; + createSetShaderDefineCMD(): SetShaderDefineCMD; + } + enum RenderCMDType { + DrawNode = 0, + DrawElement = 1, + Blit = 2, + ChangeData = 3, + ChangeShaderDefine = 4, + ChangeViewPort = 5, + ChangeRenderTarget = 6 + } + interface IRenderCMD { + type: RenderCMDType; + apply(context: IRenderContext3D): void; + } + class DrawNodeCMDData implements IRenderCMD { + type: RenderCMDType; + protected _node: IBaseRenderNode; + protected _destShaderData: ShaderData; + protected _destSubShader: SubShader; + protected _subMeshIndex: number; + get node(): IBaseRenderNode; + set node(value: IBaseRenderNode); + get destShaderData(): ShaderData; + set destShaderData(value: ShaderData); + get destSubShader(): SubShader; + set destSubShader(value: SubShader); + get subMeshIndex(): number; + set subMeshIndex(value: number); + apply(context: IRenderContext3D): void; + } + class BlitQuadCMDData implements IRenderCMD { + type: RenderCMDType; + protected _dest: InternalRenderTarget; + protected _viewport: Viewport; + protected _scissor: Vector4; + protected _source: InternalTexture; + protected _offsetScale: Vector4; + protected _element: IRenderElement3D; + get element(): IRenderElement3D; + set element(value: IRenderElement3D); + get dest(): InternalRenderTarget; + set dest(value: InternalRenderTarget); + get viewport(): Viewport; + set viewport(value: Viewport); + get scissor(): Vector4; + set scissor(value: Vector4); + get source(): InternalTexture; + set source(value: InternalTexture); + get offsetScale(): Vector4; + set offsetScale(value: Vector4); + apply(context: IRenderContext3D): void; + } + class DrawElementCMDData implements IRenderCMD { + type: RenderCMDType; + setRenderelements(value: IRenderElement3D[]): void; + apply(context: IRenderContext3D): void; + } + class SetViewportCMD implements IRenderCMD { + type: RenderCMDType; + protected _viewport: Viewport; + protected _scissor: Vector4; + get viewport(): Viewport; + set viewport(value: Viewport); + get scissor(): Vector4; + set scissor(value: Vector4); + apply(context: IRenderContext3D): void; + } + class SetRenderTargetCMD implements IRenderCMD { + type: RenderCMDType; + protected _rt: InternalRenderTarget; + protected _clearFlag: number; + protected _clearDepthValue: number; + protected _clearStencilValue: number; + protected _clearColorValue: Color; + get rt(): InternalRenderTarget; + set rt(value: InternalRenderTarget); + get clearFlag(): number; + set clearFlag(value: number); + get clearDepthValue(): number; + set clearDepthValue(value: number); + get clearStencilValue(): number; + set clearStencilValue(value: number); + get clearColorValue(): Color; + set clearColorValue(value: Color); + apply(context: IRenderContext3D): void; + } + class SetRenderDataCMD implements IRenderCMD { + type: RenderCMDType; + protected _value: ShaderDataItem; + protected _dataType: ShaderDataType; + protected _propertyID: number; + protected _dest: ShaderData; + get value(): ShaderDataItem; + set value(value: ShaderDataItem); + get dataType(): ShaderDataType; + set dataType(value: ShaderDataType); + get propertyID(): number; + set propertyID(value: number); + get dest(): ShaderData; + set dest(value: ShaderData); + apply(context: IRenderContext3D): void; + } + class SetShaderDefineCMD implements IRenderCMD { + type: RenderCMDType; + protected _define: ShaderDefine; + protected _dest: ShaderData; + protected _add: boolean; + get define(): ShaderDefine; + set define(value: ShaderDefine); + get dest(): ShaderData; + set dest(value: ShaderData); + get add(): boolean; + set add(value: boolean); + apply(context: IRenderContext3D): void; + } + /** + * @deprecated + */ + interface IRenderEngine3DOBJFactory { + /** + * @deprecated + */ + createVertexBuffer3D(byteLength: number, bufferUsage: BufferUsage, canRead: boolean): VertexBuffer3D; + /** + * @deprecated + */ + createIndexBuffer3D(indexType: IndexFormat, indexCount: number, bufferUsage: BufferUsage, canRead: boolean): IndexBuffer3D; + } + /** + * 可替换的SceneManager + */ + interface ISceneRenderManager { + list: FastSinglelist; + /** + * add one BaseRender + * @param object + */ + addRenderObject(object: BaseRender): void; + /** + * remove RenderObject + * @param object + */ + removeRenderObject(object: BaseRender): void; + /** + * 移除某个动态的渲染节点 + * @param object + */ + removeMotionObject(object: BaseRender): void; + /** + * 增加运动物体 + * @param object + */ + addMotionObject(object: BaseRender): void; + /** + * 更新运动物体 + */ + updateMotionObjects(): void; + /** + * release Manager Node + */ + destroy(): void; + } + /** + * @deprecated + */ + class LengencyRenderEngine3DFactory implements IRenderEngine3DOBJFactory { + /** + * @deprecated use new VertexBuffer3D + * @param byteLength + * @param bufferUsage + * @param canRead + * @returns + */ + createVertexBuffer3D(byteLength: number, bufferUsage: BufferUsage, canRead?: boolean): VertexBuffer3D; + /** + * @deprecated use new IndexBuffer3D + * @param indexType + * @param indexCount + * @param bufferUsage + * @param canRead + * @returns + */ + createIndexBuffer3D(indexType: IndexFormat, indexCount: number, bufferUsage?: BufferUsage, canRead?: boolean): IndexBuffer3D; + } + type UniformProperty = { + id: number; + propertyName: string; + uniformtype: ShaderDataType; + }; + class CommandUniformMap { + constructor(stateName: string); + /** + * 增加一个Uniform参数 + */ + addShaderUniform(propertyID: number, propertyKey: string, uniformtype: ShaderDataType, block?: string): void; + /** + * 增加一个UniformArray参数 + */ + addShaderUniformArray(propertyID: number, propertyName: string, uniformtype: ShaderDataType, arrayLength: number, block?: string): void; + /** + * 增加一个Uniform + */ + addShaderBlockUniform(propertyID: number, blockname: string, blockProperty: UniformProperty[]): void; + } + interface IBufferState { + _bindedIndexBuffer: IIndexBuffer; + _vertexBuffers: IVertexBuffer[]; + applyState(vertexBuffers: IVertexBuffer[], indexBuffer: IIndexBuffer | null): void; + destroy(): void; + } + interface IIndexBuffer { + destroy(): void; + _setIndexDataLength(data: number): void; + _setIndexData(data: Uint32Array | Uint16Array | Uint8Array, bufferOffset: number): void; + indexType: IndexFormat; + indexCount: number; + } + interface InternalRenderTarget { + _isCube: boolean; + _samples: number; + _generateMipmap: boolean; + _textures: InternalTexture[]; + _texturesResolve?: InternalTexture[]; + _depthTexture: InternalTexture; + colorFormat: RenderTargetFormat; + depthStencilFormat: RenderTargetFormat; + isSRGB: boolean; + gpuMemory: number; + dispose(): void; + } + /** + * 内部纹理对象 + */ + interface InternalTexture { + /** + * gpu texture object + */ + resource: any; + width: number; + height: number; + depth: number; + isPotSize: boolean; + mipmap: boolean; + mipmapCount: number; + filterMode: FilterMode; + wrapU: WrapMode; + wrapV: WrapMode; + wrapW: WrapMode; + anisoLevel: number; + baseMipmapLevel: number; + maxMipmapLevel: number; + compareMode: TextureCompareMode; + /**bytelength */ + gpuMemory: number; + /** + * 是否使用 sRGB格式 加载图片数据 + */ + useSRGBLoad: boolean; + /** + * gamma 矫正值 + */ + gammaCorrection: number; + dispose(): void; + } + interface IRenderDeviceFactory { + createShaderInstance(shaderProcessInfo: ShaderProcessInfo, shaderPass: ShaderCompileDefineBase): IShaderInstance; + createIndexBuffer(bufferUsage: BufferUsage): IIndexBuffer; + createVertexBuffer(bufferUsageType: BufferUsage): IVertexBuffer; + createBufferState(): IBufferState; + createRenderGeometryElement(mode: MeshTopology, drawType: DrawType): IRenderGeometryElement; + createEngine(config: Config, canvas: any): Promise; + createGlobalUniformMap(blockName: string): CommandUniformMap; + createShaderData(ownerResource?: Resource): ShaderData; + } + interface IRenderEngine { + _context: any; + _enableStatistics: boolean; + _remapZ: boolean; + _screenInvertY: boolean; + _lodTextureSample: boolean; + _breakTextureSample: boolean; + initRenderEngine(canvas: any): void; + copySubFrameBuffertoTex(texture: InternalTexture, level: number, xoffset: number, yoffset: number, x: number, y: number, width: number, height: number): void; + resizeOffScreen(width: number, height: number): void; + propertyNameToID(name: string): number; + propertyIDToName(id: number): string; + getDefineByName(name: string): ShaderDefine; + getNamesByDefineData(defineData: IDefineDatas, out: Array): void; + addTexGammaDefine(key: number, value: ShaderDefine): void; + getParams(params: RenderParams): number; + getCapable(capatableType: RenderCapable): boolean; + getTextureContext(): ITextureContext; + getCreateRenderOBJContext(): IRenderEngineFactory; + getUBOPointer?(name: string): number; + createBuffer?(targetType: BufferTargetType, bufferUsageType: BufferUsage): GLBuffer; + endFrame(): void; + } + interface IRenderEngineFactory { + createUniformBufferObject(glPointer: number, name: string, bufferUsage: BufferUsage, byteLength: number, isSingle: boolean): UniformBufferObject; + createEngine(config: Config, canvas: any): Promise; + } + interface IRenderGeometryElement { + } + interface IRenderTarget { + _renderTarget: InternalRenderTarget; + _isCameraTarget: boolean; + isCube: boolean; + samples: number; + generateMipmap: boolean; + depthStencilTexture: BaseTexture | null; + } + interface IShaderInstance { + _create(shaderProcessInfo: ShaderProcessInfo, shaderPass: ShaderPass): void; + _disposeResource(): void; + } + interface ITextureContext { + needBitmap: boolean; + /** + * 为 Texture 创建 InternalTexture + * @param width + * @param height + * @param format + * @param generateMipmap + * @param sRGB + * @returns + */ + createTextureInternal(dimension: TextureDimension, width: number, height: number, format: TextureFormat, generateMipmap: boolean, sRGB: boolean, premultipliedAlpha: boolean): InternalTexture; + setTextureImageData(texture: InternalTexture, source: HTMLImageElement | HTMLCanvasElement | ImageBitmap, premultiplyAlpha: boolean, invertY: boolean): void; + setTextureSubImageData(texture: InternalTexture, source: HTMLImageElement | HTMLCanvasElement | ImageBitmap, x: number, y: number, premultiplyAlpha: boolean, invertY: boolean): void; + setTexturePixelsData(texture: InternalTexture, source: ArrayBufferView, premultiplyAlpha: boolean, invertY: boolean): void; + initVideoTextureData(texture: InternalTexture): void; + setTextureSubPixelsData(texture: InternalTexture, source: ArrayBufferView, mipmapLevel: number, generateMipmap: boolean, xOffset: number, yOffset: number, width: number, height: number, premultiplyAlpha: boolean, invertY: boolean): void; + setTextureDDSData(texture: InternalTexture, ddsInfo: DDSTextureInfo): void; + setTextureKTXData(texture: InternalTexture, ktxInfo: KTXTextureInfo): void; + setTextureHDRData(texture: InternalTexture, hdrInfo: HDRTextureInfo): void; + setCubeImageData(texture: InternalTexture, sources: (HTMLImageElement | HTMLCanvasElement | ImageBitmap)[], premultiplyAlpha: boolean, invertY: boolean): void; + setCubePixelsData(texture: InternalTexture, source: ArrayBufferView[], premultiplyAlpha: boolean, invertY: boolean): void; + setCubeSubPixelData(texture: InternalTexture, source: ArrayBufferView[], mipmapLevel: number, generateMipmap: boolean, xOffset: number, yOffset: number, width: number, height: number, premultiplyAlpha: boolean, invertY: boolean): void; + setCubeDDSData(texture: InternalTexture, ddsInfo: DDSTextureInfo): void; + setCubeKTXData(texture: InternalTexture, ktxInfo: KTXTextureInfo): void; + setTextureCompareMode(texture: InternalTexture, compareMode: TextureCompareMode): TextureCompareMode; + createRenderTargetInternal(width: number, height: number, format: RenderTargetFormat, depthStencilFormat: RenderTargetFormat, generateMipmap: boolean, sRGB: boolean, multiSamples: number): InternalRenderTarget; + createRenderTargetCubeInternal(size: number, colorFormat: RenderTargetFormat, depthStencilFormat: RenderTargetFormat, generateMipmap: boolean, sRGB: boolean, multiSamples: number): InternalRenderTarget; + createRenderTargetDepthTexture(renderTarget: InternalRenderTarget, dimension: TextureDimension, width: number, height: number): InternalTexture; + bindRenderTarget(renderTarget: InternalRenderTarget, faceIndex?: number): void; + bindoutScreenTarget(): void; + unbindRenderTarget(renderTarget: InternalRenderTarget): void; + /** + * @deprecated 请使用readRenderTargetPixelDataAsync函数代替 + * @param renderTarget + * @param xOffset + * @param yOffset + * @param width + * @param height + * @param out + */ + readRenderTargetPixelData(renderTarget: InternalRenderTarget, xOffset: number, yOffset: number, width: number, height: number, out: ArrayBufferView): ArrayBufferView; + readRenderTargetPixelDataAsync(renderTarget: InternalRenderTarget, xOffset: number, yOffset: number, width: number, height: number, out: ArrayBufferView): Promise; + updateVideoTexture(texture: InternalTexture, video: HTMLVideoElement, premultiplyAlpha: boolean, invertY: boolean): void; + createTexture3DInternal(dimension: TextureDimension, width: number, height: number, depth: number, format: TextureFormat, generateMipmap: boolean, sRGB: boolean, premultipliedAlpha: boolean): InternalTexture; + setTexture3DImageData(texture: InternalTexture, source: HTMLImageElement[] | HTMLCanvasElement[] | ImageBitmap[], depth: number, premultiplyAlpha: boolean, invertY: boolean): void; + setTexture3DPixelsData(texture: InternalTexture, source: ArrayBufferView, depth: number, premultiplyAlpha: boolean, invertY: boolean): void; + setTexture3DSubPixelsData(texture: InternalTexture, source: ArrayBufferView, mipmapLevel: number, generateMipmap: boolean, xOffset: number, yOffset: number, zOffset: number, width: number, height: number, depth: number, premultiplyAlpha: boolean, invertY: boolean): void; + } + interface IVertexBuffer { + vertexDeclaration: VertexDeclaration; + instanceBuffer: boolean; + setData(buffer: ArrayBuffer, bufferOffset: number, dataStartIndex: number, dataCount: number): void; + setDataLength(byteLength: number): void; + destroy(): void; + } + type uboParams = { + ubo: UniformBufferObject; + uboBuffer: UnifromBufferData; + }; + enum ShaderDataType { + None = 0, + Int = 1, + Bool = 2, + Float = 3, + Vector2 = 4, + Vector3 = 5, + Vector4 = 6, + Color = 7, + Matrix4x4 = 8, + Texture2D = 9, + Texture3D = 10, + TextureCube = 11, + Buffer = 12, + Matrix3x3 = 13, + Texture2DArray = 14 + } + type ShaderDataItem = number | boolean | Vector2 | Vector3 | Vector4 | Color | Matrix4x4 | BaseTexture | Float32Array | Matrix3x3; + function ShaderDataDefaultValue(type: ShaderDataType): false | Readonly | 0 | Readonly | Readonly | Readonly | Readonly | Color; + /** + * 着色器数据类。 + */ + class ShaderData implements IClone { + _releaseUBOData(): void; + getDefineData(): IDefineDatas; + /** + * 增加Shader宏定义。 + */ + addDefine(define: ShaderDefine): void; + addDefines(define: IDefineDatas): void; + /** + * 移除Shader宏定义。 + */ + removeDefine(define: ShaderDefine): void; + /** + * 是否包含Shader宏定义。 + */ + hasDefine(define: ShaderDefine): boolean; + /** + * 清空宏定义。 + */ + clearDefine(): void; + /** + * 获取布尔。 + * @param index shader索引。 + * @return 布尔。 + */ + getBool(index: number): boolean; + /** + * 设置布尔。 + * @param index shader索引。 + * @param value 布尔。 + */ + setBool(index: number, value: boolean): void; + /** + * 获取整形。 + * @param index shader索引。 + * @return 整形。 + */ + getInt(index: number): number; + /** + * 设置整型。 + * @param index shader索引。 + * @param value 整形。 + */ + setInt(index: number, value: number): void; + /** + * 获取浮点。 + * @param index shader索引。 + * @return 浮点。 + */ + getNumber(index: number): number; + /** + * 设置浮点。 + * @param index shader索引。 + * @param value 浮点。 + */ + setNumber(index: number, value: number): void; + /** + * 获取Vector2向量。 + * @param index shader索引。 + * @return Vector2向量。 + */ + getVector2(index: number): Vector2; + /** + * 设置Vector2向量。 + * @param index shader索引。 + * @param value Vector2向量。 + */ + setVector2(index: number, value: Vector2): void; + /** + * 获取Vector3向量。 + * @param index shader索引。 + * @return Vector3向量。 + */ + getVector3(index: number): Vector3; + /** + * 设置Vector3向量。 + * @param index shader索引。 + * @param value Vector3向量。 + */ + setVector3(index: number, value: Vector3): void; + /** + * 获取颜色。 + * @param index shader索引。 + * @return 向量。 + */ + getVector(index: number): Vector4; + /** + * 设置向量。 + * @param index shader索引。 + * @param value 向量。 + */ + setVector(index: number, value: Vector4): void; + /** + * 获取颜色 + * @param index 索引 + * @returns 颜色 + */ + getColor(index: number): Color; + /** + * 设置颜色 + * @param index 索引 + * @param value 颜色值 + */ + setColor(index: number, value: Color): void; + /** + * 获取矩阵。 + * @param index shader索引。 + * @return 矩阵。 + */ + getMatrix4x4(index: number): Matrix4x4; + /** + * 设置矩阵。 + * @param index shader索引。 + * @param value 矩阵。 + */ + setMatrix4x4(index: number, value: Matrix4x4): void; + /** + * 获取矩阵 + * @param index + * @returns + */ + getMatrix3x3(index: number): Matrix3x3; + /** + * 设置矩阵。 + */ + setMatrix3x3(index: number, value: Matrix3x3): void; + /** + * 获取Buffer。 + * @param index shader索引。 + * @return + */ + getBuffer(index: number): Float32Array; + /** + * 设置Buffer。 + * @param index shader索引。 + * @param value buffer数据。 + */ + setBuffer(index: number, value: Float32Array): void; + /** + * 设置纹理。 + * @param index shader索引。 + * @param value 纹理。 + */ + setTexture(index: number, value: BaseTexture): void; + /** + * 获取纹理。 + * @param index shader索引。 + * @return 纹理。 + */ + getTexture(index: number): BaseTexture; + setUniformBuffer(index: number, value: UniformBufferObject): void; + getUniformBuffer(index: number): UniformBufferObject; + setShaderData(uniformIndex: number, type: ShaderDataType, value: ShaderDataItem | Quaternion): void; + getShaderData(uniformIndex: number, type: ShaderDataType): ShaderDataItem; + /** + * @private + */ + _setInternalTexture(index: number, value: InternalTexture): void; + /** + * 克隆。 + * @param destObject 克隆源。 + */ + cloneTo(destObject: ShaderData): void; + /** + * 克隆。 + * @return 克隆副本。 + */ + clone(): any; + reset(): void; + destroy(): void; + } + interface IUniformBufferUser { + needUpload: boolean; + bufferBlock: UniformBufferBlock; + bufferAlone: UniformBufferAlone; + manager: UniformBufferManager; + data: ShaderData; + offset: number; + clearGPUBufferBind(): void; + notifyGPUBufferChange(): void; + } + /** + * 单独的UniformBuffer + */ + class UniformBufferAlone { + buffer: any; + data: ArrayBuffer; + size: number; + alignedSize: number; + manager: UniformBufferManager; + destroyed: boolean; + constructor(size: number, manager: UniformBufferManager); + /** + * 上传数据 + */ + upload(): void; + /** + * 销毁 + */ + destroy(): boolean; + } + /** + * Uniform内存块(小内存块) + */ + class UniformBufferBlock { + sn: number; + cluster: UniformBufferCluster; + index: number; + offset: number; + size: number; + alignedSize: number; + uploadNum: number; + moved: boolean; + user: IUniformBufferUser; + destroyed: boolean; + constructor(sn: number, cluster: UniformBufferCluster, index: number, size: number, alignedSize: number, user: IUniformBufferUser); + /** + * 标记块需要上传 + */ + needUpload(): void; + /** + * 销毁 + */ + destroy(): boolean; + } + /** + * Uniform内存块(大内存块) + */ + class UniformBufferCluster { + sn: number; + totalSize: number; + blockSize: number; + blockNum: number; + needUpload: boolean[]; + destroyed: boolean; + buffer: any; + blocks: UniformBufferBlock[]; + expand: number; + data: ArrayBuffer; + move: Uint8Array; + manager: UniformBufferManager; + constructor(blockSize: number, blockNum: number, manager: UniformBufferManager); + get usedNum(): number; + /** + * 扩展GPU缓冲区 + */ + private _expandBuffer; + /** + * 移动内存块,后面的块向前移动,填补指定的内存空洞 + * @param index + */ + private _moveBlock; + /** + * 获取内存块 + * @param size 需求尺寸 + * @param user 使用者 + */ + getBlock(size: number, user: IUniformBufferUser): UniformBufferBlock; + /** + * 释放内存块 + */ + freeBlock(bb: UniformBufferBlock): boolean; + /** + * 将数据上传到GPU内存,合并相邻块,尽可能减少上传次数 + */ + upload(): void; + /** + * 优化块顺序,上传频繁的块排前面 + */ + optimize(): void; + /** + * 移除空洞 + */ + removeHole(): void; + /** + * 清理,释放所有内存块,回到内存未占用状态 + * @param blockNum 保留多少小块 + */ + clear(blockNum?: number): void; + /** + * 获取一个空闲块,如果空间不够,扩大内存块 + */ + private _getBlockWithExpand; + /** + * 销毁 + */ + destroy(): boolean; + } + type TypedArray = Int8Array | Uint8Array | Int16Array | Uint16Array | Int32Array | Uint32Array | Float32Array | Float64Array; + type TypedArrayConstructor = Int8ArrayConstructor | Uint8ArrayConstructor | Int16ArrayConstructor | Uint16ArrayConstructor | Int32ArrayConstructor | Uint32ArrayConstructor | Float32ArrayConstructor | Float64ArrayConstructor; + /** + * 向上圆整到align的整数倍 + * @param n + * @param align + */ + function roundUp(n: number, align: number): number; + /** + * 向下圆整到align的整数倍 + * @param n + * @param align + */ + function roundDown(n: number, align: number): number; + /** + * Uniform内存块管理 + */ + class UniformBufferManager { + renderContext: any; + clustersAll: Map; + clustersCur: Map; + useBigBuffer: boolean; + destroyed: boolean; + snCounter: number; + byteAlign: number; + clusterMaxBlock: number; + uploadThreshold: number; + moveNum: number; + uploadNum: number; + uploadByte: number; + removeHoleTimer: number; + timeCostAvg: number; + timeCostSum: number; + timeCostCount: number; + constructor(useBigBuffer: boolean); + /** + * 添加大内存块 + * @param size + * @param blockNum + */ + private _addCluster; + /** + * 移除空洞 + */ + private _removeHole; + /** + * 开始新的一帧 + */ + startFrame(): void; + /** + * 设置渲染上下文 + * @param renderContext + */ + setRenderContext(renderContext: any): void; + /** + * 获取单独的UniformBuffer + * @param size + * @param name + */ + getBufferAlone(size: number, name?: string): void; + /** + * 删除大内存块 + * @param size + * @param sn + */ + removeCluster(size: number, sn: number): void; + /** + * 获取小内存块 + * @param size + * @param user + */ + getBlock(size: number, user: IUniformBufferUser): UniformBufferBlock; + /** + * 释放小内存块 + * @param bb + */ + freeBlock(bb: UniformBufferBlock): boolean; + /** + * 上传数据 + */ + upload(): void; + /** + * 清理所有内存 + */ + clear(): void; + /** + * 销毁 + */ + destroy(): boolean; + /** + * 创建GPU内存对象 + * @param size 字节长度 + * @param name 名称 + */ + createGPUBuffer(size: number, name?: string): void; + /** + * 将数据写入GPU内存 + * @param buffer GPU内存对象 + * @param data CPU数据对象 + * @param offset 数据在大内存中的偏移量(字节) + * @param size 写入的数据长度(字节) + */ + writeBuffer(buffer: any, data: ArrayBuffer, offset: number, size: number): void; + /** + * 统计GPU内存使用量 + * @param bytes 字节 + */ + statisGPUMemory(bytes: number): void; + /** + * 统计上传次数 + * @param count 上传次数 + * @param bytes 上传字节 + */ + statisUpload(count: number, bytes: number): void; + } + type ItemType = { + name: string; + view: TypedArray; + type: string; + align: number; + size: number; + elements: number; + count: number; + }; + /** + * UniformBuffer使用者 + */ + class UniformBufferUser implements IUniformBufferUser { + name: string; + strId: string; + size: number; + items: Map; + itemNum: number; + destroyed: boolean; + needUpload: boolean; + bufferBlock: UniformBufferBlock; + bufferAlone: UniformBufferAlone; + manager: UniformBufferManager; + data: ShaderData; + offset: number; + constructor(name: string, size: number, manager: UniformBufferManager, data: ShaderData); + /** + * 通知GPUBuffer改变 + */ + notifyGPUBufferChange(): void; + /** + * 清除GPUBuffer绑定 + */ + clearGPUBufferBind(): void; + /** + * 添加uniform字段 + * @param id + * @param name + * @param type + * @param offset + * @param align + * @param size + * @param elements + * @param count + */ + addUniform(id: number, name: string, type: string, offset: number, align: number, size: number, elements: number, count: number): void; + /** + * 设置uniform数据 + * @param id + * @param data + */ + setUniformData(id: number, data: any): void; + /** + * 设置uniform数据 + * @param id + * @param data + */ + setBool(id: number, data: boolean): void; + /** + * 设置uniform数据 + * @param id + * @param data + */ + setBoolArray(id: number, data: boolean[]): void; + /** + * 设置uniform数据 + * @param id + * @param data + */ + setInt(id: number, data: number): void; + /** + * 设置uniform数据 + * @param id + * @param data + */ + setIntArray(id: number, data: number[]): void; + /** + * 设置uniform数据 + * @param id + * @param data + */ + setFloat(id: number, data: number): void; + /** + * 设置uniform数据 + * @param id + * @param data + */ + setFloatArray(id: number, data: number[]): void; + /** + * 设置uniform数据 + * @param id + * @param data + */ + setVector2(id: number, data: Vector2): void; + /** + * 设置uniform数据 + * @param id + * @param data + */ + setVector2Array(id: number, data: Vector2[]): void; + /** + * 设置uniform数据 + * @param id + * @param data + */ + setVector3(id: number, data: Vector3): void; + /** + * 设置uniform数据 + * @param id + * @param data + */ + setVector3Array(id: number, data: Vector3[]): void; + /** + * 设置uniform数据 + * @param id + * @param data + */ + setVector4(id: number, data: Vector4): void; + /** + * 设置uniform数据 + * @param id + * @param data + */ + setVector4Array(id: number, data: Vector4[]): void; + /** + * 设置uniform数据 + * @param id + * @param data + */ + setMatrix3x3(id: number, data: Matrix3x3): void; + /** + * 设置uniform数据 + * @param id + * @param data + */ + setMatrix3x3Array(id: number, data: Matrix3x3[]): void; + /** + * 设置uniform数据 + * @param id + * @param data + */ + setMatrix4x4(id: number, data: Matrix4x4): void; + /** + * 设置uniform数据 + * @param id + * @param data + */ + setMatrix4x4Array(id: number, data: Matrix4x4[]): void; + /** + * 设置uniform数据 + * @param id + * @param data + */ + setBuffer(id: number, data: Float32Array): void; + /** + * 获取uniformItem + * @param id + */ + getUniform(id: number): ItemType; + /** + * 是否存在指定的uniform + * @param id + */ + hasUniform(id: number): boolean; + /** + * 根据strId判断是否命中 + * @param strId + */ + isMe(strId: string): boolean; + /** + * 上传数据 + */ + upload(): void; + /** + * 清除所有uniform + */ + clear(): void; + /** + * 销毁 + */ + destroy(): boolean; + /** + * 获取一个unifromItem + * @param name + * @param tac + * @param type + * @param offset + * @param align + * @param size + * @param elements + * @param count + */ + protected _getUniformItem(name: string, tac: TypedArrayConstructor, type: string, offset: number, align: number, size: number, elements: number, count: number): { + name: string; + view: TypedArray; + type: string; + align: number; + size: number; + elements: number; + count: number; + }; + /** + * 根据type获取TypeArray类型 + * @param type + */ + protected static _typeArray(type: string): Float32ArrayConstructor | Int32ArrayConstructor; + } + class NoRender2DProcess implements I2DRenderPassFactory { + createRenderElement2D(): IRenderElement2D; + createRenderContext2D(): IRenderContext2D; + } + class NoRenderElement2D implements IRenderElement2D { + geometry: IRenderGeometryElement; + materialShaderData: ShaderData; + value2DShaderData: ShaderData; + subShader: SubShader; + renderStateIsBySprite: boolean; + destroy(): void; + } + class NoRenderContext2D implements IRenderContext2D { + sceneData: ShaderData; + invertY: boolean; + pipelineMode: string; + setRenderTarget(value: InternalRenderTarget, clear: boolean, clearColor: Color): void; + setOffscreenView(width: number, height: number): void; + drawRenderElementOne(node: IRenderElement2D): void; + drawRenderElementList(list: SingletonList): number; + } + class NoRender3DRenderPassFactory implements I3DRenderPassFactory { + createRender3DProcess(): IRender3DProcess; + createRenderContext3D(): IRenderContext3D; + createRenderElement3D(): IRenderElement3D; + createInstanceBatch(): IInstanceRenderBatch; + createInstanceRenderElement3D(): IInstanceRenderElement3D; + createSkinRenderElement(): ISkinRenderElement3D; + createSceneRenderManager(): ISceneRenderManager; + createDrawNodeCMDData(): DrawNodeCMDData; + createBlitQuadCMDData(): BlitQuadCMDData; + createDrawElementCMDData(): DrawElementCMDData; + createSetViewportCMD(): SetViewportCMD; + createSetRenderTargetCMD(): SetRenderTargetCMD; + createSetRenderDataCMD(): SetRenderDataCMD; + createSetShaderDefineCMD(): SetShaderDefineCMD; + } + class NoRenderRender3DProcess implements IRender3DProcess { + render3DManager: NoRenderSceneRenderManager; + destroy(): void; + fowardRender(context: IRenderContext3D, camera: Camera): void; + } + class NoRenderSceneRenderManager implements ISceneRenderManager { + addRenderObject(object: BaseRender): void; + removeRenderObject(object: BaseRender): void; + removeMotionObject(object: BaseRender): void; + addMotionObject(object: BaseRender): void; + updateMotionObjects(): void; + destroy(): void; + list: FastSinglelist; + baseRenderList: FastSinglelist; + } + class NoRenderRenderContext3D implements IRenderContext3D { + globalShaderData: ShaderData; + sceneData: ShaderData; + sceneModuleData: ISceneNodeData; + cameraModuleData: ICameraNodeData; + cameraData: ShaderData; + sceneUpdataMask: number; + cameraUpdateMask: number; + pipelineMode: string; + invertY: boolean; + setRenderTarget(value: InternalRenderTarget, clearFlag: RenderClearFlag): void; + setViewPort(value: Viewport): void; + setScissor(value: Vector4): void; + setClearData(clearFlag: number, clolor: Color, depth: number, stencil: number): number; + drawRenderElementList(list: FastSinglelist): number; + drawRenderElementOne(node: IRenderElement3D): number; + runOneCMD(cmd: IRenderCMD): void; + runCMDList(cmds: IRenderCMD[]): void; + } + class NoRenderRenderElement3D implements IRenderElement3D { + geometry: IRenderGeometryElement; + materialShaderData: ShaderData; + materialRenderQueue: number; + renderShaderData: ShaderData; + transform: Transform3D; + canDynamicBatch: boolean; + isRender: boolean; + owner: IBaseRenderNode; + subShader: SubShader; + materialId: number; + destroy(): void; + } + class NoRenderInstanceRenderBatch implements IInstanceRenderBatch { + batch(elements: SingletonList): void; + clearRenderData(): void; + recoverData(): void; + } + class NoRenderInstanceRenderElement3D implements IInstanceRenderElement3D { + instanceElementList: SingletonList; + setGeometry(geometry: IRenderGeometryElement): void; + clearRenderData(): void; + recover(): void; + geometry: IRenderGeometryElement; + materialShaderData: ShaderData; + materialRenderQueue: number; + renderShaderData: ShaderData; + transform: Transform3D; + canDynamicBatch: boolean; + isRender: boolean; + owner: IBaseRenderNode; + subShader: SubShader; + materialId: number; + destroy(): void; + } + class NoRenderSkinRenderElement3D implements ISkinRenderElement3D { + skinnedData: Float32Array[]; + } + class NoRenderDrawNodeCMDData extends DrawNodeCMDData { + type: RenderCMDType; + protected _node: WebBaseRenderNode; + protected _destShaderData: NoRenderShaderData; + protected _destSubShader: SubShader; + protected _subMeshIndex: number; + get node(): WebBaseRenderNode; + set node(value: WebBaseRenderNode); + get destShaderData(): NoRenderShaderData; + set destShaderData(value: NoRenderShaderData); + get destSubShader(): SubShader; + set destSubShader(value: SubShader); + get subMeshIndex(): number; + set subMeshIndex(value: number); + constructor(); + apply(context: NoRenderRenderContext3D): void; + } + class NoRenderBlitQuadCMDData extends BlitQuadCMDData { + type: RenderCMDType; + private _sourceTexelSize; + protected _dest: NoInternalRT; + protected _viewport: Viewport; + protected _source: InternalTexture; + protected _scissor: Vector4; + protected _offsetScale: Vector4; + protected _element: NoRenderRenderElement3D; + get dest(): NoInternalRT; + set dest(value: NoInternalRT); + get viewport(): Viewport; + set viewport(value: Viewport); + get scissor(): Vector4; + set scissor(value: Vector4); + get source(): InternalTexture; + set source(value: InternalTexture); + get offsetScale(): Vector4; + set offsetScale(value: Vector4); + get element(): NoRenderRenderElement3D; + set element(value: NoRenderRenderElement3D); + constructor(); + apply(context: NoRenderRenderContext3D): void; + } + class NoRenderDrawElementCMDData extends DrawElementCMDData { + type: RenderCMDType; + private _elemets; + constructor(); + setRenderelements(value: NoRenderRenderElement3D[]): void; + apply(context: NoRenderRenderContext3D): void; + } + class NoRenderSetViewportCMD extends SetViewportCMD { + type: RenderCMDType; + protected _viewport: Viewport; + protected _scissor: Vector4; + get viewport(): Viewport; + set viewport(value: Viewport); + get scissor(): Vector4; + set scissor(value: Vector4); + constructor(); + apply(context: NoRenderRenderContext3D): void; + } + class NoRenderSetRenderTargetCMD extends SetRenderTargetCMD { + type: RenderCMDType; + protected _rt: InternalRenderTarget; + protected _clearFlag: number; + protected _clearColorValue: Color; + protected _clearDepthValue: number; + protected _clearStencilValue: number; + get rt(): InternalRenderTarget; + set rt(value: InternalRenderTarget); + get clearFlag(): number; + set clearFlag(value: number); + get clearColorValue(): Color; + set clearColorValue(value: Color); + get clearDepthValue(): number; + set clearDepthValue(value: number); + get clearStencilValue(): number; + set clearStencilValue(value: number); + constructor(); + apply(context: NoRenderRenderContext3D): void; + } + class NoRenderSetRenderData extends SetRenderDataCMD { + type: RenderCMDType; + protected _dataType: ShaderDataType; + protected _propertyID: number; + protected _dest: NoRenderShaderData; + protected _value: ShaderDataItem; + data_v4: Vector4; + data_v3: Vector3; + data_v2: Vector2; + data_mat: Matrix4x4; + data_number: number; + data_texture: BaseTexture; + data_Color: Color; + data_Buffer: Float32Array; + get dataType(): ShaderDataType; + set dataType(value: ShaderDataType); + get propertyID(): number; + set propertyID(value: number); + get dest(): NoRenderShaderData; + set dest(value: NoRenderShaderData); + get value(): ShaderDataItem; + set value(value: ShaderDataItem); + constructor(); + apply(context: NoRenderRenderContext3D): void; + } + class NoRenderSetShaderDefine extends SetShaderDefineCMD { + type: RenderCMDType; + protected _define: ShaderDefine; + protected _dest: NoRenderShaderData; + protected _add: boolean; + get define(): ShaderDefine; + set define(value: ShaderDefine); + get dest(): NoRenderShaderData; + set dest(value: NoRenderShaderData); + get add(): boolean; + set add(value: boolean); + constructor(); + apply(context: NoRenderRenderContext3D): void; + } + class NoRenderDeviceFactory implements IRenderDeviceFactory { + createShaderInstance(shaderProcessInfo: ShaderProcessInfo, shaderPass: ShaderCompileDefineBase): IShaderInstance; + createIndexBuffer(bufferUsage: BufferUsage): IIndexBuffer; + createVertexBuffer(bufferUsageType: BufferUsage): IVertexBuffer; + createBufferState(): IBufferState; + createRenderGeometryElement(mode: MeshTopology, drawType: DrawType): IRenderGeometryElement; + createEngine(config: Config, canvas: any): Promise; + createGlobalUniformMap(blockName: string): CommandUniformMap; + createShaderData(ownerResource?: Resource): ShaderData; + } + class NoRenderCommandUnifojrmMap extends CommandUniformMap { + constructor(stateName: string); + /** + * 增加一个Uniform参数 + */ + addShaderUniform(propertyID: number, propertyKey: string, uniformtype: ShaderDataType, block?: string): void; + /** + * 增加一个UniformArray参数 + * @param propertyID + * @param propertyName + */ + addShaderUniformArray(propertyID: number, propertyName: string, uniformtype: ShaderDataType, arrayLength: number, block?: string): void; + /** + * 增加一个Uniform + */ + addShaderBlockUniform(propertyID: number, blockname: string, blockProperty: UniformProperty[]): void; + } + class NoRenderShaderInstance implements IShaderInstance { + _create(shaderProcessInfo: ShaderProcessInfo, shaderPass: ShaderPass): void; + _disposeResource(): void; + } + class NoRenderIndexBuffer implements IIndexBuffer { + destroy(): void; + _setIndexDataLength(data: number): void; + _setIndexData(data: Uint32Array | Uint16Array | Uint8Array, bufferOffset: number): void; + indexType: IndexFormat; + indexCount: number; + } + class NoRenderVertexBuffer implements IVertexBuffer { + vertexDeclaration: VertexDeclaration; + instanceBuffer: boolean; + setData(buffer: ArrayBuffer, bufferOffset: number, dataStartIndex: number, dataCount: number): void; + setDataLength(byteLength: number): void; + destroy(): void; + } + class NoRenderBufferState implements IBufferState { + _bindedIndexBuffer: IIndexBuffer; + _vertexBuffers: IVertexBuffer[]; + applyState(vertexBuffers: IVertexBuffer[], indexBuffer: IIndexBuffer): void; + destroy(): void; + } + class NoRenderGeometryElement implements IRenderGeometryElement { + bufferState: IBufferState; + mode: MeshTopology; + drawType: DrawType; + instanceCount: number; + indexFormat: IndexFormat; + setDrawArrayParams(first: number, count: number): void; + setDrawElemenParams(count: number, offset: number): void; + clearRenderParams(): void; + destroy(): void; + } + class NoRenderShaderData extends ShaderData { + _releaseUBOData(): void; + getDefineData(): WebDefineDatas; + /** + * 增加Shader宏定义。 + */ + addDefine(define: ShaderDefine): void; + addDefines(define: IDefineDatas): void; + /** + * 移除Shader宏定义。 + */ + removeDefine(define: ShaderDefine): void; + /** + * 是否包含Shader宏定义。 + */ + hasDefine(define: ShaderDefine): boolean; + /** + * 清空宏定义。 + */ + clearDefine(): void; + /** + * 获取布尔。 + * @param index shader索引。 + * @return 布尔。 + */ + getBool(index: number): boolean; + /** + * 设置布尔。 + * @param index shader索引。 + * @param value 布尔。 + */ + setBool(index: number, value: boolean): void; + /** + * 获取整形。 + * @param index shader索引。 + * @return 整形。 + */ + getInt(index: number): number; + /** + * 设置整型。 + * @param index shader索引。 + * @param value 整形。 + */ + setInt(index: number, value: number): void; + /** + * 获取浮点。 + * @param index shader索引。 + * @return 浮点。 + */ + getNumber(index: number): number; + /** + * 设置浮点。 + * @param index shader索引。 + * @param value 浮点。 + */ + setNumber(index: number, value: number): void; + /** + * 获取Vector2向量。 + * @param index shader索引。 + * @return Vector2向量。 + */ + getVector2(index: number): Vector2; + /** + * 设置Vector2向量。 + * @param index shader索引。 + * @param value Vector2向量。 + */ + setVector2(index: number, value: Vector2): void; + /** + * 获取Vector3向量。 + * @param index shader索引。 + * @return Vector3向量。 + */ + getVector3(index: number): Vector3; + /** + * 设置Vector3向量。 + * @param index shader索引。 + * @param value Vector3向量。 + */ + setVector3(index: number, value: Vector3): void; + /** + * 获取颜色。 + * @param index shader索引。 + * @return 向量。 + */ + getVector(index: number): Vector4; + /** + * 设置向量。 + * @param index shader索引。 + * @param value 向量。 + */ + setVector(index: number, value: Vector4): void; + /** + * 获取颜色 + * @param index 索引 + * @returns 颜色 + */ + getColor(index: number): Color; + /** + * 设置颜色 + * @param index 索引 + * @param value 颜色值 + */ + setColor(index: number, value: Color): void; + /** + * 获取矩阵。 + * @param index shader索引。 + * @return 矩阵。 + */ + getMatrix4x4(index: number): Matrix4x4; + /** + * 设置矩阵。 + * @param index shader索引。 + * @param value 矩阵。 + */ + setMatrix4x4(index: number, value: Matrix4x4): void; + /** + * 获取矩阵 + * @param index + * @returns + */ + getMatrix3x3(index: number): Matrix3x3; + /** + * 设置矩阵。 + */ + setMatrix3x3(index: number, value: Matrix3x3): void; + /** + * 获取Buffer。 + * @param index shader索引。 + * @return + */ + getBuffer(index: number): Float32Array; + /** + * 设置Buffer。 + * @param index shader索引。 + * @param value buffer数据。 + */ + setBuffer(index: number, value: Float32Array): void; + /** + * 设置纹理。 + * @param index shader索引。 + * @param value 纹理。 + */ + setTexture(index: number, value: BaseTexture): void; + /** + * 获取纹理。 + * @param index shader索引。 + * @return 纹理。 + */ + getTexture(index: number): BaseTexture; + /** + * + * @param index + * @param value + */ + setUniformBuffer(index: number, value: UniformBufferObject): void; + getUniformBuffer(index: number): UniformBufferObject; + setShaderData(uniformIndex: number, type: ShaderDataType, value: ShaderDataItem | Quaternion): void; + getShaderData(uniformIndex: number, type: ShaderDataType): ShaderDataItem; + /** + * @private + */ + _setInternalTexture(index: number, value: InternalTexture): void; + /** + * 克隆。 + * @param destObject 克隆源。 + */ + cloneTo(destObject: NoRenderShaderData): void; + /** + * 克隆。 + * @return 克隆副本。 + */ + clone(): any; + reset(): void; + destroy(): void; + } + class NoRenderEngineFactory implements IRenderEngineFactory { + createUniformBufferObject(glPointer: number, name: string, bufferUsage: BufferUsage, byteLength: number, isSingle: boolean): UniformBufferObject; + createEngine(config: Config, canvas: any): Promise; + } + class NoRenderEngine implements IRenderEngine { + endFrame(): void; + _context: any; + _isShaderDebugMode: boolean; + _renderOBJCreateContext: IRenderEngineFactory; + _enableStatistics: boolean; + _remapZ: boolean; + _screenInvertY: boolean; + _lodTextureSample: boolean; + _breakTextureSample: boolean; + initRenderEngine(canvas: any): void; + copySubFrameBuffertoTex(texture: InternalTexture, level: number, xoffset: number, yoffset: number, x: number, y: number, width: number, height: number): void; + resizeOffScreen(width: number, height: number): void; + propertyNameToID(name: string): number; + propertyIDToName(id: number): string; + static _maskMap: Array<{ + [key: number]: string; + }>; + getDefineByName(name: string): ShaderDefine; + getNamesByDefineData(defineData: IDefineDatas, out: string[]): void; + addTexGammaDefine(key: number, value: ShaderDefine): void; + getParams(params: RenderParams): number; + getCapable(capatableType: RenderCapable): boolean; + getTextureContext(): ITextureContext; + getCreateRenderOBJContext(): IRenderEngineFactory; + clearStatisticsInfo(): void; + getStatisticsInfo(info: GPUEngineStatisticsInfo): number; + } + class NoInternalTexture implements InternalTexture { + resource: any; + width: number; + height: number; + depth: number; + isPotSize: boolean; + mipmap: boolean; + mipmapCount: number; + filterMode: FilterMode; + wrapU: WrapMode; + wrapV: WrapMode; + wrapW: WrapMode; + anisoLevel: number; + baseMipmapLevel: number; + maxMipmapLevel: number; + compareMode: TextureCompareMode; + gpuMemory: number; + useSRGBLoad: boolean; + gammaCorrection: number; + dispose(): void; + } + class NoInternalRT implements InternalRenderTarget { + _isCube: boolean; + _samples: number; + _generateMipmap: boolean; + _textures: InternalTexture[]; + _texturesResolve?: InternalTexture[]; + _depthTexture: InternalTexture; + colorFormat: RenderTargetFormat; + depthStencilFormat: RenderTargetFormat; + isSRGB: boolean; + gpuMemory: number; + dispose(): void; + } + class NoTextureContext implements ITextureContext { + needBitmap: boolean; + createTextureInternal(dimension: TextureDimension, width: number, height: number, format: TextureFormat, generateMipmap: boolean, sRGB: boolean, premultipliedAlpha: boolean): InternalTexture; + setTextureImageData(texture: InternalTexture, source: HTMLImageElement | HTMLCanvasElement | ImageBitmap, premultiplyAlpha: boolean, invertY: boolean): void; + setTextureSubImageData(texture: InternalTexture, source: HTMLImageElement | HTMLCanvasElement | ImageBitmap, x: number, y: number, premultiplyAlpha: boolean, invertY: boolean): void; + setTexturePixelsData(texture: InternalTexture, source: ArrayBufferView, premultiplyAlpha: boolean, invertY: boolean): void; + initVideoTextureData(texture: InternalTexture): void; + setTextureSubPixelsData(texture: InternalTexture, source: ArrayBufferView, mipmapLevel: number, generateMipmap: boolean, xOffset: number, yOffset: number, width: number, height: number, premultiplyAlpha: boolean, invertY: boolean): void; + setTextureDDSData(texture: InternalTexture, ddsInfo: DDSTextureInfo): void; + setTextureKTXData(texture: InternalTexture, ktxInfo: KTXTextureInfo): void; + setTextureHDRData(texture: InternalTexture, hdrInfo: HDRTextureInfo): void; + setCubeImageData(texture: InternalTexture, sources: (HTMLImageElement | HTMLCanvasElement | ImageBitmap)[], premultiplyAlpha: boolean, invertY: boolean): void; + setCubePixelsData(texture: InternalTexture, source: ArrayBufferView[], premultiplyAlpha: boolean, invertY: boolean): void; + setCubeSubPixelData(texture: InternalTexture, source: ArrayBufferView[], mipmapLevel: number, generateMipmap: boolean, xOffset: number, yOffset: number, width: number, height: number, premultiplyAlpha: boolean, invertY: boolean): void; + setCubeDDSData(texture: InternalTexture, ddsInfo: DDSTextureInfo): void; + setCubeKTXData(texture: InternalTexture, ktxInfo: KTXTextureInfo): void; + setTextureCompareMode(texture: InternalTexture, compareMode: TextureCompareMode): TextureCompareMode; + createRenderTargetInternal(width: number, height: number, format: RenderTargetFormat, depthStencilFormat: RenderTargetFormat, generateMipmap: boolean, sRGB: boolean, multiSamples: number): InternalRenderTarget; + createRenderTargetCubeInternal(size: number, colorFormat: RenderTargetFormat, depthStencilFormat: RenderTargetFormat, generateMipmap: boolean, sRGB: boolean, multiSamples: number): InternalRenderTarget; + createRenderTargetDepthTexture(renderTarget: InternalRenderTarget, dimension: TextureDimension, width: number, height: number): InternalTexture; + bindRenderTarget(renderTarget: InternalRenderTarget, faceIndex?: number): void; + bindoutScreenTarget(): void; + unbindRenderTarget(renderTarget: InternalRenderTarget): void; + readRenderTargetPixelData(renderTarget: InternalRenderTarget, xOffset: number, yOffset: number, width: number, height: number, out: ArrayBufferView): ArrayBufferView; + readRenderTargetPixelDataAsync(renderTarget: InternalRenderTarget, xOffset: number, yOffset: number, width: number, height: number, out: ArrayBufferView): Promise; + updateVideoTexture(texture: InternalTexture, video: HTMLVideoElement, premultiplyAlpha: boolean, invertY: boolean): void; + createTexture3DInternal(dimension: TextureDimension, width: number, height: number, depth: number, format: TextureFormat, generateMipmap: boolean, sRGB: boolean, premultipliedAlpha: boolean): InternalTexture; + setTexture3DImageData(texture: InternalTexture, source: HTMLImageElement[] | HTMLCanvasElement[] | ImageBitmap[], depth: number, premultiplyAlpha: boolean, invertY: boolean): void; + setTexture3DPixelsData(texture: InternalTexture, source: ArrayBufferView, depth: number, premultiplyAlpha: boolean, invertY: boolean): void; + setTexture3DSubPixelsData(texture: InternalTexture, source: ArrayBufferView, mipmapLevel: number, generateMipmap: boolean, xOffset: number, yOffset: number, zOffset: number, width: number, height: number, depth: number, premultiplyAlpha: boolean, invertY: boolean): void; + } + class GLESRender2DProcess implements I2DRenderPassFactory { + createRenderElement2D(): GLESREnderElement2D; + createRenderContext2D(): GLESREnderContext2D; + } + class GLESREnderContext2D implements IRenderContext2D { + static isCreateBlitScreenELement: boolean; + static blitScreenElement: GLESREnderElement2D; + get invertY(): boolean; + set invertY(value: boolean); + get pipelineMode(): string; + set pipelineMode(value: string); + _nativeObj: any; + constructor(); + private _sceneData; + get sceneData(): ShaderData; + set sceneData(value: ShaderData); + private setBlitScreenElement; + private _tempList; + drawRenderElementList(list: FastSinglelist): number; + setRenderTarget(value: GLESInternalRT, clear: boolean, clearColor: Color): void; + setOffscreenView(width: number, height: number): void; + drawRenderElementOne(node: GLESREnderElement2D): void; + } + class GLESREnderElement2D implements IRenderElement2D { + private _geometry; + private _materialShaderData; + private _value2DShaderData; + private _subShader; + set geometry(data: GLESRenderGeometryElement); + get geometry(): GLESRenderGeometryElement; + set materialShaderData(data: GLESShaderData); + get materialShaderData(): GLESShaderData; + set value2DShaderData(data: GLESShaderData); + get value2DShaderData(): GLESShaderData; + get subShader(): SubShader; + set subShader(value: SubShader); + protected init(): void; + constructor(); + private _nodeCommonMap; + get nodeCommonMap(): string[]; + set nodeCommonMap(value: string[]); + private _renderStateIsBySprite; + get renderStateIsBySprite(): boolean; + set renderStateIsBySprite(value: boolean); + destroy(): void; + } + class GLES3DRenderPassFactory implements I3DRenderPassFactory { + createInstanceBatch(): IInstanceRenderBatch; + createRender3DProcess(): IRender3DProcess; + createRenderContext3D(): IRenderContext3D; + createSetRenderDataCMD(): SetRenderDataCMD; + createSetShaderDefineCMD(): SetShaderDefineCMD; + createDrawNodeCMDData(): DrawNodeCMDData; + createBlitQuadCMDData(): BlitQuadCMDData; + createDrawElementCMDData(): DrawElementCMDData; + createSetViewportCMD(): SetViewportCMD; + createSetRenderTargetCMD(): SetRenderTargetCMD; + createSetRenderData(): GLESSetRenderData; + createSceneRenderManager(): ISceneRenderManager; + createSkinRenderElement(): GLESSkinRenderElement3D; + createInstanceRenderElement3D(): IInstanceRenderElement3D; + createDirectLightShadowRP(): GLESDirectLightShadowRP; + createSpotLightShadowRP(): GLESSpotLightShadowRP; + createForwardAddRP(): GLESForwardAddRP; + createForwardAddCluster(): GLESForwardAddClusterRP; + createRenderElement3D(): GLESRenderElement3D; + } + class GLESDirectLightShadowRP { + private _light; + get light(): RTDirectLight; + set light(value: RTDirectLight); + private _camera; + get camera(): RTCameraNodeData; + set camera(value: RTCameraNodeData); + private _destTarget; + get destTarget(): GLESInternalRT; + set destTarget(value: GLESInternalRT); + _nativeObj: any; + constructor(); + destroy(): void; + private _shadowCasterCommanBuffer; + get shadowCasterCommanBuffer(): CommandBuffer[]; + set shadowCasterCommanBuffer(value: CommandBuffer[]); + private _setCmd; + } + class GLESForwardAddClusterRP { + get enableOpaque(): boolean; + set enableOpaque(value: boolean); + get enableCMD(): boolean; + set enableCMD(value: boolean); + get enableTransparent(): boolean; + set enableTransparent(value: boolean); + get enableOpaqueTexture(): boolean; + set enableOpaqueTexture(value: boolean); + private _destTarget; + get destTarget(): GLESInternalRT; + set destTarget(value: GLESInternalRT); + get pipelineMode(): string; + set pipelineMode(value: string); + private _depthTarget; + get depthTarget(): GLESInternalRT; + set depthTarget(value: GLESInternalRT); + get depthPipelineMode(): string; + set depthPipelineMode(value: string); + private _depthNormalTarget; + get depthNormalTarget(): GLESInternalRT; + set depthNormalTarget(value: GLESInternalRT); + get depthNormalPipelineMode(): string; + set depthNormalPipelineMode(value: string); + private _skyRenderNode; + get skyRenderNode(): RTBaseRenderNode; + set skyRenderNode(value: RTBaseRenderNode); + get depthTextureMode(): DepthTextureMode; + set depthTextureMode(value: DepthTextureMode); + private _opaqueTexture; + get opaqueTexture(): GLESInternalRT; + set opaqueTexture(value: GLESInternalRT); + private _camera; + get camera(): RTCameraNodeData; + set camera(value: RTCameraNodeData); + private _clearColor; + get clearColor(): Color; + set clearColor(value: Color); + get clearFlag(): number; + set clearFlag(value: number); + setCameraCullInfo(value: Camera): void; + setViewPort(value: Viewport): void; + setScissor(value: Vector4): void; + private _getRenderCMDArray; + get opaquePassCommandBuffer(): CommandBuffer; + set opaquePassCommandBuffer(value: CommandBuffer); + setBeforeForwardCmds(value: CommandBuffer[]): void; + setBeforeSkyboxCmds(value: CommandBuffer[]): void; + setBeforeTransparentCmds(value: CommandBuffer[]): void; + _nativeObj: any; + constructor(); + destroy(): void; + } + class GLESForwardAddRP { + get shadowCastPass(): boolean; + set shadowCastPass(value: boolean); + private _directLightShadowPass; + get directLightShadowPass(): GLESDirectLightShadowRP; + set directLightShadowPass(value: GLESDirectLightShadowRP); + get enableDirectLightShadow(): boolean; + set enableDirectLightShadow(value: boolean); + private _spotLightShadowPass; + get spotLightShadowPass(): GLESSpotLightShadowRP; + set spotLightShadowPass(value: GLESSpotLightShadowRP); + get enableSpotLightShadowPass(): boolean; + set enableSpotLightShadowPass(value: boolean); + private _renderpass; + get renderpass(): GLESForwardAddClusterRP; + set renderpass(value: GLESForwardAddClusterRP); + private _enablePostProcess; + get enablePostProcess(): boolean; + set enablePostProcess(value: boolean); + get postProcess(): CommandBuffer; + set postProcess(value: CommandBuffer); + get finalize(): CommandBuffer; + set finalize(value: CommandBuffer); + _nativeObj: any; + constructor(); + private _getRenderCMDArray; + setAfterEventCmd(value: CommandBuffer[]): void; + setBeforeImageEffect(value: CommandBuffer[]): void; + destroy(): void; + } + class GLESRender3DProcess implements IRender3DProcess { + private _nativeObj; + private _tempList; + private renderpass; + constructor(); + private _render3DManager; + get render3DManager(): RTScene3DRenderManager; + set render3DManager(value: RTScene3DRenderManager); + destroy(): void; + initRenderpass(camera: Camera, context: GLESRenderContext3D): void; + renderDepth(camera: Camera): void; + fowardRender(context: GLESRenderContext3D, camera: Camera): void; + renderFowarAddCameraPass(context: GLESRenderContext3D, renderpass: GLESForwardAddRP): void; + } + class GLESDrawNodeCMDData extends DrawNodeCMDData { + type: RenderCMDType; + protected _node: RTBaseRenderNode; + protected _destShaderData: GLESShaderData; + protected _destSubShader: SubShader; + protected _subMeshIndex: number; + get node(): RTBaseRenderNode; + set node(value: RTBaseRenderNode); + get destShaderData(): GLESShaderData; + set destShaderData(value: GLESShaderData); + get destSubShader(): SubShader; + set destSubShader(value: SubShader); + get subMeshIndex(): number; + set subMeshIndex(value: number); + constructor(); + } + class GLESBlitQuadCMDData extends BlitQuadCMDData { + type: RenderCMDType; + protected _dest: GLESInternalRT; + protected _viewport: Viewport; + protected _source: GLESInternalTex; + protected _scissor: Vector4; + protected _offsetScale: Vector4; + protected _element: GLESRenderElement3D; + get dest(): GLESInternalRT; + set dest(value: GLESInternalRT); + get viewport(): Viewport; + set viewport(value: Viewport); + get scissor(): Vector4; + set scissor(value: Vector4); + get source(): GLESInternalTex; + set source(value: GLESInternalTex); + get offsetScale(): Vector4; + set offsetScale(value: Vector4); + get element(): GLESRenderElement3D; + set element(value: GLESRenderElement3D); + constructor(); + } + class GLESDrawElementCMDData extends DrawElementCMDData { + type: RenderCMDType; + private _elemets; + constructor(); + setRenderelements(value: GLESRenderElement3D[]): void; + } + class GLESSetViewportCMD extends SetViewportCMD { + type: RenderCMDType; + protected _viewport: Viewport; + protected _scissor: Vector4; + get viewport(): Viewport; + set viewport(value: Viewport); + get scissor(): Vector4; + set scissor(value: Vector4); + constructor(); + } + class GLESSetRenderTargetCMD extends SetRenderTargetCMD { + type: RenderCMDType; + protected _rt: GLESInternalRT; + protected _clearFlag: number; + protected _clearColorValue: Color; + protected _clearDepthValue: number; + protected _clearStencilValue: number; + get rt(): GLESInternalRT; + set rt(value: GLESInternalRT); + get clearFlag(): number; + set clearFlag(value: number); + get clearColorValue(): Color; + set clearColorValue(value: Color); + get clearDepthValue(): number; + set clearDepthValue(value: number); + get clearStencilValue(): number; + set clearStencilValue(value: number); + constructor(); + } + class GLESSetRenderData extends SetRenderDataCMD { + type: RenderCMDType; + protected _dataType: ShaderDataType; + protected _propertyID: number; + protected _dest: GLESShaderData; + protected _value: ShaderDataItem; + data_v4: Vector4; + data_v3: Vector3; + data_v2: Vector2; + data_mat: Matrix4x4; + data_number: number; + data_texture: BaseTexture; + data_Color: Color; + data_Buffer: Float32Array; + get dataType(): ShaderDataType; + set dataType(value: ShaderDataType); + get propertyID(): number; + set propertyID(value: number); + get dest(): GLESShaderData; + set dest(value: GLESShaderData); + get value(): ShaderDataItem; + set value(value: ShaderDataItem); + constructor(); + } + class GLESSetShaderDefine extends SetShaderDefineCMD { + type: RenderCMDType; + protected _define: RTShaderDefine; + protected _dest: GLESShaderData; + protected _add: boolean; + get define(): RTShaderDefine; + set define(value: RTShaderDefine); + get dest(): GLESShaderData; + set dest(value: GLESShaderData); + get add(): boolean; + set add(value: boolean); + constructor(); + } + class GLESRenderContext3D implements IRenderContext3D { + private _globalShaderData; + get globalShaderData(): GLESShaderData; + set globalShaderData(value: GLESShaderData); + private _sceneData; + get sceneData(): GLESShaderData; + set sceneData(value: GLESShaderData); + private _sceneModuleData; + get sceneModuleData(): RTSceneNodeData; + set sceneModuleData(value: RTSceneNodeData); + private _cameraModuleData; + get cameraModuleData(): RTCameraNodeData; + set cameraModuleData(value: RTCameraNodeData); + private _cameraData; + get cameraData(): GLESShaderData; + set cameraData(value: GLESShaderData); + get sceneUpdataMask(): number; + set sceneUpdataMask(value: number); + get cameraUpdateMask(): number; + set cameraUpdateMask(value: number); + get pipelineMode(): string; + set pipelineMode(value: string); + get invertY(): boolean; + set invertY(value: boolean); + _nativeObj: any; + constructor(); + setRenderTarget(value: GLESInternalRT, clearFlag: RenderClearFlag): void; + setViewPort(value: Viewport): void; + setScissor(value: Vector4): void; + setClearData(clearFlag: number, color: Color, depth: number, stencil: number): number; + private _tempList; + drawRenderElementList(list: FastSinglelist): number; + drawRenderElementOne(node: IRenderElement3D): number; + runOneCMD(cmd: IRenderCMD): void; + runCMDList(cmds: IRenderCMD[]): void; + } + enum RenderElementType { + Base = 0, + Skin = 1, + Instance = 2 + } + class GLESRenderElement3D implements IRenderElement3D { + private _geometry; + private _materialShaderData; + private _renderShaderData; + private _transform; + set geometry(data: GLESRenderGeometryElement); + get geometry(): GLESRenderGeometryElement; + set materialShaderData(data: GLESShaderData); + get materialShaderData(): GLESShaderData; + set renderShaderData(data: GLESShaderData); + get renderShaderData(): GLESShaderData; + set transform(data: RTTransform3D); + get transform(): RTTransform3D; + get isRender(): boolean; + set isRender(data: boolean); + get materialRenderQueue(): number; + set materialRenderQueue(value: number); + private _owner; + get owner(): RTBaseRenderNode; + set owner(value: RTBaseRenderNode); + private _subShader; + get subShader(): SubShader; + set subShader(value: SubShader); + get canDynamicBatch(): boolean; + set canDynamicBatch(value: boolean); + get materialId(): number; + set materialId(value: number); + _nativeObj: any; + constructor(); + destroy(): void; + protected init(): void; + } + class GLESSkinRenderElement3D extends GLESRenderElement3D implements ISkinRenderElement3D { + _skinnedData: Float32Array[]; + constructor(); + get skinnedData(): Float32Array[]; + set skinnedData(data: Float32Array[]); + init(): void; + } + class GLESSpotLightShadowRP { + private _light; + get light(): SpotLightCom; + set light(value: SpotLightCom); + private _destTarget; + get destTarget(): GLESInternalRT; + set destTarget(value: GLESInternalRT); + _nativeObj: any; + constructor(); + destroy(): void; + } + class GLESBufferState implements IBufferState { + _bindedIndexBuffer: IIndexBuffer; + _vertexBuffers: IVertexBuffer[]; + _nativeObj: any; + constructor(); + applyState(vertexBuffers: IVertexBuffer[], indexBuffer: IIndexBuffer): void; + destroy(): void; + } + class GLESCommandUniformMap extends CommandUniformMap { + _nativeObj: any; + constructor(stateName: string); + /** + * 增加一个UniformArray参数 + * @param propertyID + * @param propertyName + */ + addShaderUniformArray(propertyID: number, propertyName: string, uniformtype: ShaderDataType, arrayLength: number, block?: string): void; + /** + * 增加一个Uniform + */ + addShaderBlockUniform(propertyID: number, blockname: string, blockProperty: UniformProperty[]): void; + } + /** + * WebGL mode. + */ + enum GLESMode { + /** Auto, use WebGL2.0 if support, or will fallback to WebGL1.0. */ + Auto = 0, + /** WebGL2.0. */ + WebGL2 = 1, + /** WebGL1.0, */ + WebGL1 = 2 + } + /** + * @private 封装Webgl + */ + class GLESEngine implements IRenderEngine { + _context: any; + _isShaderDebugMode: boolean; + _renderOBJCreateContext: IRenderEngineFactory; + _nativeObj: any; + private _GLTextureContext; + constructor(config: WebGLConfig, webglMode?: GLESMode); + endFrame(): void; + _remapZ: boolean; + _screenInvertY: boolean; + _lodTextureSample: boolean; + _breakTextureSample: boolean; + get _enableStatistics(): boolean; + set _enableStatistics(value: boolean); + resizeOffScreen(width: number, height: number): void; + getDefineByName(name: string): RTShaderDefine; + getNamesByDefineData(defineData: IDefineDatas, out: Array): void; + addTexGammaDefine(key: number, value: RTShaderDefine): void; + initRenderEngine(canvas: any): void; + copySubFrameBuffertoTex(texture: InternalTexture, level: number, xoffset: number, yoffset: number, x: number, y: number, width: number, height: number): void; + propertyNameToID(name: string): number; + propertyIDToName(id: number): string; + getParams(params: RenderParams): number; + getCapable(capatableType: RenderCapable): boolean; + getTextureContext(): ITextureContext; + getCreateRenderOBJContext(): IRenderEngineFactory; + clearStatisticsInfo(): void; + getStatisticsInfo(info: GPUEngineStatisticsInfo): number; + viewport(x: number, y: number, width: number, height: number): void; + scissor(x: number, y: number, width: number, height: number): void; + } + class GLESIndexBuffer implements IIndexBuffer { + destroy(): void; + _setIndexDataLength(data: number): void; + _setIndexData(data: Uint32Array | Uint16Array | Uint8Array, bufferOffset: number): void; + get indexType(): IndexFormat; + set indexType(value: IndexFormat); + get indexCount(): number; + set indexCount(value: number); + _nativeObj: any; + constructor(targetType: BufferTargetType, bufferUsageType: BufferUsage); + } + class GLESInternalRT implements InternalRenderTarget { + _texturesRef: InternalTexture[]; + _depthTextureRef: InternalTexture; + _nativeObj: any; + constructor(nativeObj: any); + get _isCube(): boolean; + set _isCube(value: boolean); + get _samples(): number; + set _samples(value: number); + get _generateMipmap(): boolean; + set _generateMipmap(value: boolean); + get colorFormat(): RenderTargetFormat; + set colorFormat(value: RenderTargetFormat); + get depthStencilFormat(): RenderTargetFormat; + set depthStencilFormat(value: RenderTargetFormat); + get isSRGB(): boolean; + set isSRGB(value: boolean); + get gpuMemory(): number; + set gpuMemory(value: number); + get _textures(): InternalTexture[]; + get _depthTexture(): InternalTexture; + dispose(): void; + } + class GLESRenderDeviceFactory implements IRenderDeviceFactory { + createShaderData(ownerResource: Resource): ShaderData; + private globalBlockMap; + createGlobalUniformMap(blockName: string): GLESCommandUniformMap; + createShaderInstance(shaderProcessInfo: ShaderProcessInfo, shaderPass: ShaderPass): IShaderInstance; + createIndexBuffer(bufferUsage: BufferUsage): IIndexBuffer; + createVertexBuffer(bufferUsageType: BufferUsage): IVertexBuffer; + createBufferState(): IBufferState; + createRenderGeometryElement(mode: MeshTopology, drawType: DrawType): IRenderGeometryElement; + createEngine(config: Config, canvas: any): Promise; + } + class GLESRenderEngineFactory implements IRenderEngineFactory { + _nativeObj: any; + createUniformBufferObject(glPointer: number, name: string, bufferUsage: BufferUsage, byteLength: number, isSingle: boolean): UniformBufferObject; + createEngine(config: Config, canvas: any): Promise; + afterInit(): void; + private static _setVertexDec; + } + class GLESRenderGeometryElement implements IRenderGeometryElement { + _nativeObj: any; + clearRenderParams(): void; + set bufferState(value: IBufferState); + get bufferState(): IBufferState; + set mode(value: MeshTopology); + get mode(): MeshTopology; + set drawType(value: DrawType); + get drawType(): DrawType; + set instanceCount(value: number); + get instanceCount(): number; + set indexFormat(value: IndexFormat); + get indexFormat(): IndexFormat; + } + class GLESShaderData extends ShaderData { + nativeObjID: number; + _nativeObj: any; + _defineDatas: RTDefineDatas; + _textureData: { + [key: number]: BaseTexture; + }; + _bufferData: { + [key: number]: Float32Array; + }; + /** + * + * @param index + * @param value + */ + setUniformBuffer(index: number, value: UniformBufferObject): void; + getUniformBuffer(index: number): UniformBufferObject; + getDefineData(): RTDefineDatas; + /** + * 增加Shader宏定义。 + */ + addDefine(define: RTShaderDefine): void; + addDefines(define: RTDefineDatas): void; + /** + * 移除Shader宏定义。 + */ + removeDefine(define: RTShaderDefine): void; + /** + * 是否包含Shader宏定义。 + */ + hasDefine(define: RTShaderDefine): boolean; + /** + * 清空宏定义。 + */ + clearDefine(): void; + /** + * 获取布尔。 + * @param index shader索引。 + * @return 布尔。 + */ + getBool(index: number): boolean; + /** + * 设置布尔。 + * @param index shader索引。 + * @param value 布尔。 + */ + setBool(index: number, value: boolean): void; + /** + * 获取整形。 + * @param index shader索引。 + * @return 整形。 + */ + getInt(index: number): number; + /** + * 设置整型。 + * @param index shader索引。 + * @param value 整形。 + */ + setInt(index: number, value: number): void; + /** + * 获取浮点。 + * @param index shader索引。 + * @return 浮点。 + */ + getNumber(index: number): number; + /** + * 设置浮点。 + * @param index shader索引。 + * @param value 浮点。 + */ + setNumber(index: number, value: number): void; + /** + * 获取Vector2向量。 + * @param index shader索引。 + * @return Vector2向量。 + */ + getVector2(index: number): Vector2; + /** + * 设置Vector2向量。 + * @param index shader索引。 + */ + setVector2(index: number, value: Vector2): void; + /** + * 获取Vector3向量。 + * @param index shader索引。 + * @return Vector3向量。 + */ + getVector3(index: number): Vector3; + /** + * 设置Vector3向量。 + * @param index shader索引。 + * @param value Vector3向量。 + */ + setVector3(index: number, value: Vector3): void; + /** + * 获取颜色。 + * @param index shader索引。 + * @return 向量。 + */ + getVector(index: number): Vector4; + /** + * 设置向量。 + * @param index shader索引。 + * @param value 向量。 + */ + setVector(index: number, value: Vector4): void; + /** + * 获取颜色 + * @param index 索引 + * @returns 颜色 + */ + getColor(index: number): Color; + /** + * 设置颜色 + * @param index 索引 + * @param value 颜色值 + */ + setColor(index: number, value: Color): void; + /** + * 获取矩阵。 + * @param index shader索引。 + * @return 矩阵。 + */ + getMatrix4x4(index: number): Matrix4x4; + /** + * 设置矩阵。 + * @param index shader索引。 + * @param value 矩阵。 + */ + setMatrix4x4(index: number, value: Matrix4x4): void; + /** + * 获取矩阵 + * @param index + * @returns + */ + getMatrix3x3(index: number): Matrix3x3; + /** + * 设置矩阵。 + * @param index + * @param value + */ + setMatrix3x3(index: number, value: Matrix3x3): void; + /** + * 获取Buffer。 + * @param index shader索引。 + * @return + */ + getBuffer(index: number): Float32Array; + /** + * 设置Buffer。 + * @param index shader索引。 + * @param value buffer数据。 + */ + setBuffer(index: number, value: Float32Array): void; + /** + * 设置纹理。 + * @param index shader索引。 + * @param value 纹理。 + */ + setTexture(index: number, value: BaseTexture): void; + /** + * 获取纹理。 + * @param index shader索引。 + * @return 纹理。 + */ + getTexture(index: number): BaseTexture; + cloneTo(destObject: GLESShaderData): void; + /** + * 克隆。 + * @return 克隆副本。 + */ + clone(): any; + destroy(): void; + } + class GLESTextureContext implements ITextureContext { + needBitmap: boolean; + protected _native: any; + constructor(native: any); + createTextureInternal(dimension: TextureDimension, width: number, height: number, format: TextureFormat, generateMipmap: boolean, sRGB: boolean, premultipliedAlpha: boolean): GLESInternalTex; + setTextureImageData(texture: GLESInternalTex, source: HTMLImageElement | HTMLCanvasElement | ImageBitmap, premultiplyAlpha: boolean, invertY: boolean): void; + setTexturePixelsData(texture: GLESInternalTex, source: ArrayBufferView, premultiplyAlpha: boolean, invertY: boolean): void; + initVideoTextureData(texture: GLESInternalTex): void; + setTextureSubPixelsData(texture: GLESInternalTex, source: ArrayBufferView, mipmapLevel: number, generateMipmap: boolean, xOffset: number, yOffset: number, width: number, height: number, premultiplyAlpha: boolean, invertY: boolean): void; + setTextureSubImageData(texture: GLESInternalTex, source: HTMLImageElement | HTMLCanvasElement | ImageBitmap, x: number, y: number, premultiplyAlpha: boolean, invertY: boolean): void; + setTexture3DImageData(texture: GLESInternalTex, source: HTMLImageElement[] | HTMLCanvasElement[] | ImageBitmap[], depth: number, premultiplyAlpha: boolean, invertY: boolean): void; + createTexture3DInternal(dimension: TextureDimension, width: number, height: number, depth: number, format: TextureFormat, generateMipmap: boolean, sRGB: boolean, premultipliedAlpha: boolean): GLESInternalTex; + setTexture3DPixelsData(texture: GLESInternalTex, source: ArrayBufferView, depth: number, premultiplyAlpha: boolean, invertY: boolean): void; + setTexture3DSubPixelsData(texture: GLESInternalTex, source: ArrayBufferView, mipmapLevel: number, generateMipmap: boolean, xOffset: number, yOffset: number, zOffset: number, width: number, height: number, depth: number, premultiplyAlpha: boolean, invertY: boolean): void; + setTextureHDRData(texture: GLESInternalTex, hdrInfo: HDRTextureInfo): void; + setTextureDDSData(texture: GLESInternalTex, ddsInfo: DDSTextureInfo): void; + setTextureKTXData(texture: GLESInternalTex, ktxInfo: KTXTextureInfo): void; + setCubeImageData(texture: GLESInternalTex, sources: (HTMLImageElement | HTMLCanvasElement | ImageBitmap)[], premultiplyAlpha: boolean, invertY: boolean): void; + setCubePixelsData(texture: GLESInternalTex, source: ArrayBufferView[], premultiplyAlpha: boolean, invertY: boolean): void; + setCubeSubPixelData(texture: GLESInternalTex, source: ArrayBufferView[], mipmapLevel: number, generateMipmap: boolean, xOffset: number, yOffset: number, width: number, height: number, premultiplyAlpha: boolean, invertY: boolean): void; + setCubeDDSData(texture: GLESInternalTex, ddsInfo: DDSTextureInfo): void; + setCubeKTXData(texture: GLESInternalTex, ktxInfo: KTXTextureInfo): void; + setTextureCompareMode(texture: GLESInternalTex, compareMode: TextureCompareMode): TextureCompareMode; + bindRenderTarget(renderTarget: GLESInternalRT, faceIndex?: number): void; + bindoutScreenTarget(): void; + unbindRenderTarget(renderTarget: GLESInternalRT): void; + createRenderTargetInternal(width: number, height: number, colorFormat: RenderTargetFormat, depthStencilFormat: RenderTargetFormat, generateMipmap: boolean, sRGB: boolean, multiSamples: number): GLESInternalRT; + createRenderTargetCubeInternal(size: number, colorFormat: RenderTargetFormat, depthStencilFormat: RenderTargetFormat, generateMipmap: boolean, sRGB: boolean, multiSamples: number): GLESInternalRT; + createRenderTextureCubeInternal(dimension: TextureDimension, size: number, format: RenderTargetFormat, generateMipmap: boolean, sRGB: boolean): GLESInternalTex; + createRenderTargetDepthTexture(renderTarget: GLESInternalRT, dimension: TextureDimension, width: number, height: number): GLESInternalTex; + /** + * @deprecated 请使用readRenderTargetPixelDataAsync函数代替 + * @param renderTarget + * @param xOffset + * @param yOffset + * @param width + * @param height + * @param out + * @returns + */ + readRenderTargetPixelData(renderTarget: GLESInternalRT, xOffset: number, yOffset: number, width: number, height: number, out: ArrayBufferView): ArrayBufferView; + readRenderTargetPixelDataAsync(renderTarget: GLESInternalRT, xOffset: number, yOffset: number, width: number, height: number, out: ArrayBufferView): Promise; + updateVideoTexture(texture: GLESInternalTex, video: HTMLVideoElement, premultiplyAlpha: boolean, invertY: boolean): void; + } + class GLESVertexBuffer implements IVertexBuffer { + _instanceBuffer: boolean; + _nativeObj: any; + constructor(targetType: BufferTargetType, bufferUsageType: BufferUsage); + private _vertexDeclaration; + get vertexDeclaration(): VertexDeclaration; + set vertexDeclaration(value: VertexDeclaration); + get instanceBuffer(): boolean; + set instanceBuffer(value: boolean); + setData(buffer: ArrayBuffer, bufferOffset: number, dataStartIndex: number, dataCount: number): void; + setDataLength(byteLength: number): void; + destroy(): void; + } + enum BaseRenderType { + BaseRender = 0, + MeshRender = 1, + ParticleRender = 2, + TrailRender = 3, + LineRender = 4, + TerrainRender = 5, + SkyRender = 7, + SimpleSkinRender = 8, + SkinnedMeshRender = 9 + } + interface IBaseRenderNode { + renderNodeType: number; + transform: Transform3D; + distanceForSort: number; + sortingFudge: number; + castShadow: boolean; + receiveShadow: boolean; + enable: boolean; + renderbitFlag: number; + layer: number; + bounds: Bounds; + baseGeometryBounds: Bounds; + boundsChange: boolean; + staticMask: number; + shaderData: ShaderData; + lightmapIndex: number; + lightmap: ILightMapData; + probeReflection: IReflectionProbeData; + probeReflectionUpdateMark: number; + reflectionMode: number; + volumetricGI: IVolumetricGIData; + lightProbUpdateMark: number; + irradientMode: IrradianceMode; + set_renderUpdatePreCall(call: any, fun: any): void; + set_caculateBoundingBox(call: any, fun: any): void; + _applyLightProb(): void; + _applyReflection(): void; + } + interface IMeshRenderNode extends IBaseRenderNode { + } + interface ISkinRenderNode extends IBaseRenderNode { + computeSkinnedData(): void; + setRootBoneTransfom(value: Sprite3D): void; + setOwnerTransform(value: Sprite3D): void; + setCacheMesh(cacheMesh: Mesh): void; + setBones(value: Sprite3D[]): void; + setSkinnedData(value: any[]): void; + } + interface ISimpleSkinRenderNode extends IBaseRenderNode { + setSimpleAnimatorParams(value: Vector4): void; + } + interface IDirectLightData { + transform: Transform3D; + shadowResolution: number; + shadowDistance: number; + shadowMode: ShadowMode; + shadowStrength: number; + shadowDepthBias: number; + shadowNormalBias: number; + shadowNearPlane: number; + shadowCascadesMode: ShadowCascadesMode; + shadowTwoCascadeSplits: number; + setShadowFourCascadeSplits(value: Vector3): void; + setDirection(value: Vector3): void; + } + interface ISpotLightData { + transform: Transform3D; + shadowResolution: number; + shadowDistance: number; + shadowMode: ShadowMode; + shadowStrength: number; + shadowDepthBias: number; + shadowNormalBias: number; + shadowNearPlane: number; + spotRange: number; + spotAngle: number; + setDirection(value: Vector3): void; + } + interface IPointLightData { + transform: Transform3D; + range: number; + shadowResolution: number; + shadowDistance: number; + shadowMode: ShadowMode; + shadowStrength: number; + shadowDepthBias: number; + shadowNormalBias: number; + shadowNearPlane: number; + } + interface ILightMapData { + } + interface IReflectionProbeData { + } + interface IVolumetricGIData { + _id: number; + irradiance: InternalTexture; + distance: InternalTexture; + bound: Bounds; + intensity: number; + updateMark: number; + setProbeCounts(value: Vector3): void; + setProbeStep(value: Vector3): void; + setParams(value: Vector4): void; + } + interface ICameraNodeData { + transform: Transform3D; + farplane: number; + nearplane: number; + fieldOfView: number; + aspectRatio: number; + setProjectionViewMatrix(value: Matrix4x4): void; + } + interface ISceneNodeData { + lightmapDirtyFlag: number; + } + interface I3DRenderModuleFactory { + createTransform(owner: Sprite3D): Transform3D; + createBounds(min: Vector3, max: Vector3): any; + createVolumetricGI(): IVolumetricGIData; + createReflectionProbe(): IReflectionProbeData; + createLightmapData(): ILightMapData; + createDirectLight(): IDirectLightData; + createSpotLight(): ISpotLightData; + createPointLight(): IPointLightData; + createCameraModuleData(): ICameraNodeData; + createSceneModuleData(): ISceneNodeData; + createBaseRenderNode(): IBaseRenderNode; + createMeshRenderNode(): IMeshRenderNode; + createSkinRenderNode(): ISkinRenderNode; + createSimpleSkinRenderNode(): ISimpleSkinRenderNode; + } + interface IDefineDatas { + add(define: ShaderDefine): void; + remove(define: ShaderDefine): void; + addDefineDatas(define: IDefineDatas): void; + removeDefineDatas(define: IDefineDatas): void; + has(define: ShaderDefine): boolean; + clear(): void; + cloneTo(destObject: IDefineDatas): void; + clone(): IDefineDatas; + destroy(): void; + } + interface IShaderPassData { + is2D: boolean; + pipelineMode: string; + statefirst: boolean; + validDefine: IDefineDatas; + renderState: RenderState; + nodeCommonMap: string[]; + setCacheShader(defines: IDefineDatas, shaderInstance: IShaderInstance): void; + getCacheShader(defines: IDefineDatas): IShaderInstance; + destroy(): void; + } + interface ISubshaderData { + addShaderPass(pass: IShaderPassData): void; + enableInstance: boolean; + destroy(): void; + } + interface IUnitRenderModuleDataFactory { + createRenderState(): RenderState; + createDefineDatas(): IDefineDatas; + createSubShader(): ISubshaderData; + createShaderPass(pass: ShaderPass): IShaderPassData; + } + /** + * RenderState 类用于控制渲染状态。 + */ + class RenderState { + /**剔除枚举_不剔除。*/ + static CULL_NONE: number; + /**剔除枚举_剔除正面。*/ + static CULL_FRONT: number; + /**剔除枚举_剔除背面。*/ + static CULL_BACK: number; + /**混合枚举_禁用。*/ + static BLEND_DISABLE: number; + /**混合枚举_启用_RGB和Alpha统一混合。*/ + static BLEND_ENABLE_ALL: number; + /**混合枚举_启用_RGB和Alpha单独混合。*/ + static BLEND_ENABLE_SEPERATE: number; + /**混合参数枚举_零,例:RGB(0,0,0),Alpha:(1)。*/ + static BLENDPARAM_ZERO: number; + /**混合参数枚举_一,例:RGB(1,1,1),Alpha:(1)。*/ + static BLENDPARAM_ONE: number; + /**混合参数枚举_源颜色,例:RGB(Rs, Gs, Bs),Alpha(As)。*/ + static BLENDPARAM_SRC_COLOR: number; + /**混合参数枚举_一减源颜色,例:RGB(1-Rs, 1-Gs, 1-Bs),Alpha(1-As)。*/ + static BLENDPARAM_ONE_MINUS_SRC_COLOR: number; + /**混合参数枚举_目标颜色,例:RGB(Rd, Gd, Bd),Alpha(Ad)。*/ + static BLENDPARAM_DST_COLOR: number; + /**混合参数枚举_一减目标颜色,例:RGB(1-Rd, 1-Gd, 1-Bd),Alpha(1-Ad)。*/ + static BLENDPARAM_ONE_MINUS_DST_COLOR: number; + /**混合参数枚举_源透明,例:RGB(As, As, As),Alpha(1-As)。*/ + static BLENDPARAM_SRC_ALPHA: number; + /**混合参数枚举_一减源阿尔法,例:RGB(1-As, 1-As, 1-As),Alpha(1-As)。*/ + static BLENDPARAM_ONE_MINUS_SRC_ALPHA: number; + /**混合参数枚举_目标阿尔法,例:RGB(Ad, Ad, Ad),Alpha(Ad)。*/ + static BLENDPARAM_DST_ALPHA: number; + /**混合参数枚举_一减目标阿尔法,例:RGB(1-Ad, 1-Ad, 1-Ad),Alpha(Ad)。*/ + static BLENDPARAM_ONE_MINUS_DST_ALPHA: number; + /**混合参数枚举_阿尔法饱和,例:RGB(min(As, 1 - Ad), min(As, 1 - Ad), min(As, 1 - Ad)),Alpha(1)。*/ + static BLENDPARAM_SRC_ALPHA_SATURATE: number; + /**混合参数枚举_混合设置颜色 */ + static BLENDPARAM_BLENDCOLOR: number; + /**很合参数枚举_混合颜色取反 */ + static BLENDPARAM_BLEND_ONEMINUS_COLOR: number; + /**混合方程枚举_加法,例:source + destination*/ + static BLENDEQUATION_ADD: number; + /**混合方程枚举_减法,例:source - destination*/ + static BLENDEQUATION_SUBTRACT: number; + /**混合方程枚举_反序减法,例:destination - source*/ + static BLENDEQUATION_REVERSE_SUBTRACT: number; + /**混合方程枚举_取最小 TODO */ + static BLENDEQUATION_MIN: number; + /**混合方程枚举_取最大 TODO*/ + static BLENDEQUATION_MAX: number; + /**深度测试函数枚举_关闭深度测试。*/ + static DEPTHTEST_OFF: number; + /**深度测试函数枚举_从不通过。*/ + static DEPTHTEST_NEVER: number; + /**深度测试函数枚举_小于时通过。*/ + static DEPTHTEST_LESS: number; + /**深度测试函数枚举_等于时通过。*/ + static DEPTHTEST_EQUAL: number; + /**深度测试函数枚举_小于等于时通过。*/ + static DEPTHTEST_LEQUAL: number; + /**深度测试函数枚举_大于时通过。*/ + static DEPTHTEST_GREATER: number; + /**深度测试函数枚举_不等于时通过。*/ + static DEPTHTEST_NOTEQUAL: number; + /**深度测试函数枚举_大于等于时通过。*/ + static DEPTHTEST_GEQUAL: number; + /**深度测试函数枚举_总是通过。*/ + static DEPTHTEST_ALWAYS: number; + static STENCILTEST_OFF: number; + /**深度测试函数枚举_从不通过。*/ + static STENCILTEST_NEVER: number; + /**深度测试函数枚举_小于时通过。*/ + static STENCILTEST_LESS: number; + /**深度测试函数枚举_等于时通过。*/ + static STENCILTEST_EQUAL: number; + /**深度测试函数枚举_小于等于时通过。*/ + static STENCILTEST_LEQUAL: number; + /**深度测试函数枚举_大于时通过。*/ + static STENCILTEST_GREATER: number; + /**深度测试函数枚举_不等于时通过。*/ + static STENCILTEST_NOTEQUAL: number; + /**深度测试函数枚举_大于等于时通过。*/ + static STENCILTEST_GEQUAL: number; + /**深度测试函数枚举_总是通过。*/ + static STENCILTEST_ALWAYS: number; + /**保持当前值*/ + static STENCILOP_KEEP: number; + /**将模板缓冲区值设置为0*/ + static STENCILOP_ZERO: number; + /**将模具缓冲区值设置为指定的参考值*/ + static STENCILOP_REPLACE: number; + /**增加当前模具缓冲区值+1 */ + static STENCILOP_INCR: number; + /**增加当前模具缓冲区值,超过最大值的时候循环*/ + static STENCILOP_INCR_WRAP: number; + /**递减当前模板缓冲区的值*/ + static STENCILOP_DECR: number; + /**递减当前模板缓冲去的值,小于0时会循环*/ + static STENCILOP_DECR_WRAP: number; + /**按位反转当前的模板缓冲区的值*/ + static STENCILOP_INVERT: number; + /**渲染剔除状态。*/ + private _cull; + get cull(): number; + set cull(value: number); + /**透明混合。*/ + private _blend; + get blend(): number; + set blend(value: number); + /**源混合参数,在blend为BLEND_ENABLE_ALL时生效。*/ + private _srcBlend; + get srcBlend(): number; + set srcBlend(value: number); + /**目标混合参数,在blend为BLEND_ENABLE_ALL时生效。*/ + private _dstBlend; + get dstBlend(): number; + set dstBlend(value: number); + /**RGB源混合参数,在blend为BLEND_ENABLE_SEPERATE时生效。*/ + private _srcBlendRGB; + get srcBlendRGB(): number; + set srcBlendRGB(value: number); + /**RGB目标混合参数,在blend为BLEND_ENABLE_SEPERATE时生效。*/ + private _dstBlendRGB; + get dstBlendRGB(): number; + set dstBlendRGB(value: number); + /**Alpha源混合参数,在blend为BLEND_ENABLE_SEPERATE时生效。*/ + private _srcBlendAlpha; + get srcBlendAlpha(): number; + set srcBlendAlpha(value: number); + /**Alpha目标混合参数,在blend为BLEND_ENABLE_SEPERATE时生效。*/ + private _dstBlendAlpha; + get dstBlendAlpha(): number; + set dstBlendAlpha(value: number); + /**混合方程。*/ + private _blendEquation; + get blendEquation(): number; + set blendEquation(value: number); + /**RGB混合方程。*/ + private _blendEquationRGB; + get blendEquationRGB(): number; + set blendEquationRGB(value: number); + /**Alpha混合方程。*/ + private _blendEquationAlpha; + get blendEquationAlpha(): number; + set blendEquationAlpha(value: number); + /**深度测试函数。*/ + private _depthTest; + get depthTest(): number; + set depthTest(value: number); + /**是否深度测试。*/ + private _depthWrite; + get depthWrite(): boolean; + set depthWrite(value: boolean); + /**是否模板写入 */ + private _stencilWrite; + get stencilWrite(): boolean; + set stencilWrite(value: boolean); + /**是否开启模板测试 */ + private _stencilTest; + get stencilTest(): number; + set stencilTest(value: number); + /**模板值 一般会在0-255*/ + private _stencilRef; + get stencilRef(): number; + set stencilRef(value: number); + /**模板设置值 */ + private _stencilOp; + get stencilOp(): Vector3; + set stencilOp(value: Vector3); + protected createObj(): void; + /** + * 创建一个 RenderState 实例。 + */ + constructor(); + /** + * 克隆 + * @param dest + */ + cloneTo(dest: RenderState): void; + /** + * 克隆。 + * @return 克隆副本。 + */ + clone(): RenderState; + } + /** + * ShaderDefine 类用于定义宏数据。 + */ + class ShaderDefine { + /** + * 创建一个宏定义的实例` + * @param index 宏索引 + * @param value 宏值 + */ + constructor(index: number, value: number); + } + class NativeBounds implements IClone { + /**native Share Memory */ + static MemoryBlock_size: number; + get min(): Vector3; + set min(value: Vector3); + get max(): Vector3; + set max(value: Vector3); + /** + * 设置包围盒的最小点。 + * @param value 包围盒的最小点。 + */ + setMin(value: Vector3): void; + /** + * 获取包围盒的最小点。 + * @return 包围盒的最小点。 + */ + getMin(): Vector3; + /** + * 设置包围盒的最大点。 + * @param value 包围盒的最大点。 + */ + setMax(value: Vector3): void; + /** + * 获取包围盒的最大点。 + * @return 包围盒的最大点。 + */ + getMax(): Vector3; + /** + * 设置包围盒的中心点。 + * @param value 包围盒的中心点。 + */ + setCenter(value: Vector3): void; + /** + * 获取包围盒的中心点。 + * @return 包围盒的中心点。 + */ + getCenter(): Vector3; + /** + * 设置包围盒的范围。 + * @param value 包围盒的范围。 + */ + setExtent(value: Vector3): void; + /** + * 获取包围盒的范围。 + * @return 包围盒的范围。 + */ + getExtent(): Vector3; + /** + * 创建一个 Bounds 实例。 + * @param min min 最小坐标 + * @param max max 最大坐标。 + */ + constructor(min?: Vector3, max?: Vector3); + _getBoundBox(): BoundBox; + /** + * @returns -1为不相交 不为0的时候返回值为相交体积 + */ + calculateBoundsintersection(bounds: Bounds): number; + /** + * 克隆。 + * @param destObject 克隆源。 + */ + cloneTo(destObject: NativeBounds): void; + /** + * 克隆。 + * @return 克隆副本。 + */ + clone(): any; + } + class RTCameraNodeData implements ICameraNodeData { + private _transform; + get transform(): RTTransform3D; + set transform(value: RTTransform3D); + get farplane(): number; + set farplane(value: number); + get nearplane(): number; + set nearplane(value: number); + get fieldOfView(): number; + set fieldOfView(value: number); + get aspectRatio(): number; + set aspectRatio(value: number); + _nativeObj: any; + constructor(); + setProjectionViewMatrix(value: Matrix4x4): void; + } + class RTSceneNodeData implements ISceneNodeData { + get lightmapDirtyFlag(): number; + set lightmapDirtyFlag(value: number); + _nativeObj: any; + constructor(); + } + class RT3DRenderModuleFactory implements I3DRenderModuleFactory { + createTransform(owner: Sprite3D): RTTransform3D; + createBounds(min: Vector3, max: Vector3): NativeBounds; + createVolumetricGI(): RTVolumetricGI; + createReflectionProbe(): RTReflectionProb; + createLightmapData(): RTLightmapData; + createDirectLight(): RTDirectLight; + createSpotLight(): RTSpotLight; + createPointLight(): IPointLightData; + createCameraModuleData(): RTCameraNodeData; + createSceneModuleData(): RTSceneNodeData; + createBaseRenderNode(): RTBaseRenderNode; + createMeshRenderNode(): RTMeshRenderNode; + createSkinRenderNode(): ISkinRenderNode; + createSimpleSkinRenderNode(): ISimpleSkinRenderNode; + } + class RTBaseRenderNode implements IBaseRenderNode { + renderelements: IRenderElement3D[]; + private _transform; + get transform(): RTTransform3D; + set transform(value: RTTransform3D); + get distanceForSort(): number; + set distanceForSort(value: number); + get sortingFudge(): number; + set sortingFudge(value: number); + get castShadow(): boolean; + set castShadow(value: boolean); + get enable(): boolean; + set enable(value: boolean); + get renderbitFlag(): number; + set renderbitFlag(value: number); + get layer(): number; + set layer(value: number); + private _bounds; + get bounds(): Bounds; + set bounds(value: Bounds); + private _baseGeometryBounds; + get baseGeometryBounds(): Bounds; + set baseGeometryBounds(value: Bounds); + get boundsChange(): boolean; + set boundsChange(value: boolean); + get customCull(): boolean; + set customCull(value: boolean); + get customCullResoult(): boolean; + set customCullResoult(value: boolean); + get staticMask(): number; + set staticMask(value: number); + private _shaderData; + get shaderData(): ShaderData; + set shaderData(value: ShaderData); + get lightmapIndex(): number; + set lightmapIndex(value: number); + private _lightmap; + get lightmap(): RTLightmapData; + set lightmap(value: RTLightmapData); + private _probeReflection; + get probeReflection(): RTReflectionProb; + set probeReflection(value: RTReflectionProb); + get probeReflectionUpdateMark(): number; + set probeReflectionUpdateMark(value: number); + get reflectionMode(): number; + set reflectionMode(value: number); + private _volumetricGI; + get volumetricGI(): RTVolumetricGI; + set volumetricGI(value: RTVolumetricGI); + get lightProbUpdateMark(): number; + set lightProbUpdateMark(value: number); + private _irradientMode; + get irradientMode(): IrradianceMode; + set irradientMode(value: IrradianceMode); + private _caculateBoundingBoxbindFun; + private _renderUpdatePrebindFun; + /** + * 设置更新数据 + * @param call + * @param fun + */ + set_renderUpdatePreCall(call: any, fun: any): void; + /** + * 设置更新包围盒方法 + * @param call + * @param fun + */ + set_caculateBoundingBox(call: any, fun: any): void; + _nativeObj: any; + protected _getNativeObj(): void; + constructor(); + get renderNodeType(): number; + set renderNodeType(value: number); + get receiveShadow(): boolean; + set receiveShadow(value: boolean); + _applyLightProb(): void; + _applyReflection(): void; + setRenderelements(value: IRenderElement3D[]): void; + setLightmapScaleOffset(value: Vector4): void; + setCommonUniformMap(value: string[]): void; + setOneMaterial(index: number, mat: Material): void; + destroy(): void; + } + class RTDirectLight implements IDirectLightData { + get shadowNearPlane(): number; + set shadowNearPlane(value: number); + get shadowCascadesMode(): ShadowCascadesMode; + set shadowCascadesMode(value: ShadowCascadesMode); + private _transform; + get transform(): RTTransform3D; + set transform(value: RTTransform3D); + get shadowResolution(): number; + set shadowResolution(value: number); + get shadowDistance(): number; + set shadowDistance(value: number); + get shadowMode(): ShadowMode; + set shadowMode(value: ShadowMode); + get shadowStrength(): number; + set shadowStrength(value: number); + get shadowDepthBias(): number; + set shadowDepthBias(value: number); + get shadowNormalBias(): number; + set shadowNormalBias(value: number); + get shadowTwoCascadeSplits(): number; + set shadowTwoCascadeSplits(value: number); + setShadowFourCascadeSplits(value: Vector3): void; + setDirection(value: Vector3): void; + _nativeObj: any; + constructor(); + } + class RTLightmapData implements ILightMapData { + _nativeObj: any; + constructor(); + get lightmapColor(): InternalTexture; + set lightmapColor(value: InternalTexture); + get lightmapDirection(): InternalTexture; + set lightmapDirection(value: InternalTexture); + destroy(): void; + } + class RTMeshRenderNode extends RTBaseRenderNode implements RTMeshRenderNode { + } + class RTPointLight implements IPointLightData { + _nativeObj: any; + private _transform; + get transform(): RTTransform3D; + set transform(value: RTTransform3D); + get range(): number; + set range(value: number); + get shadowResolution(): number; + set shadowResolution(value: number); + get shadowDistance(): number; + set shadowDistance(value: number); + get shadowMode(): ShadowMode; + set shadowMode(value: ShadowMode); + get shadowStrength(): number; + set shadowStrength(value: number); + get shadowDepthBias(): number; + set shadowDepthBias(value: number); + get shadowNormalBias(): number; + set shadowNormalBias(value: number); + get shadowNearPlane(): number; + set shadowNearPlane(value: number); + constructor(); + } + class RTReflectionProb implements IReflectionProbeData { + private static _idCounter; + get boxProjection(): boolean; + set boxProjection(value: boolean); + private _bound; + get bound(): Bounds; + set bound(value: Bounds); + get ambientMode(): AmbientMode; + set ambientMode(value: AmbientMode); + get ambientIntensity(): number; + set ambientIntensity(value: number); + get reflectionIntensity(): number; + set reflectionIntensity(value: number); + private _reflectionTexture; + get reflectionTexture(): InternalTexture; + set reflectionTexture(value: InternalTexture); + private _iblTex; + get iblTex(): InternalTexture; + set iblTex(value: InternalTexture); + get updateMark(): number; + set updateMark(value: number); + get iblTexRGBD(): boolean; + set iblTexRGBD(value: boolean); + setProbePosition(value: Vector3): void; + setAmbientColor(value: Color): void; + setAmbientSH(value: Float32Array): void; + _nativeObj: any; + constructor(); + destroy(): void; + } + class RTScene3DRenderManager implements ISceneRenderManager { + _nativeObj: any; + /** + * @en The list of render objects. + * @zh 渲染对象列表。 + */ + get list(): SingletonList; + set list(value: SingletonList); + private _addBaseRenderNode; + private _removeBaseRenderNode; + private _clearBaseRenderNode; + addRenderObject(object: BaseRender): void; + removeRenderObject(object: BaseRender): void; + removeMotionObject(object: BaseRender): void; + addMotionObject(object: BaseRender): void; + updateMotionObjects(): void; + destroy(): void; + constructor(); + } + class RTSimpleSkinRenderNode extends RTBaseRenderNode implements ISimpleSkinRenderNode { + private _nativeMemory; + private _float32Array; + setSimpleAnimatorParams(value: Vector4): void; + protected _getNativeObj(): void; + constructor(); + } + /** + * 骨骼动画渲染节点,包含骨骼数据计算 + */ + class RTSkinRenderNode extends RTBaseRenderNode implements ISkinRenderNode { + private boneNums; + protected _getNativeObj(): void; + constructor(); + computeSkinnedData(): void; + setRootBoneTransfom(value: Sprite3D): void; + setOwnerTransform(value: Sprite3D): void; + setCacheMesh(cacheMesh: Mesh): void; + setBones(value: Sprite3D[]): void; + setSkinnedData(value: Array): void; + } + class RTSpotLight implements ISpotLightData { + private _transform; + get transform(): RTTransform3D; + set transform(value: RTTransform3D); + get shadowResolution(): number; + set shadowResolution(value: number); + get shadowDistance(): number; + set shadowDistance(value: number); + get shadowMode(): ShadowMode; + set shadowMode(value: ShadowMode); + get shadowStrength(): number; + set shadowStrength(value: number); + get shadowDepthBias(): number; + set shadowDepthBias(value: number); + get shadowNormalBias(): number; + set shadowNormalBias(value: number); + get shadowNearPlane(): number; + set shadowNearPlane(value: number); + get spotRange(): number; + set spotRange(value: number); + get spotAngle(): number; + set spotAngle(value: number); + _nativeObj: any; + constructor(); + setDirection(value: Vector3): void; + } + class RTTransform3D extends Transform3D { + /**native Share Memory */ + private _nativeMemory; + private _nativeFloat32Buffer; + private _nativeUInt32Buffer; + _nativeObj: any; + constructor(owner: Sprite3D); + protected _initProperty(): void; + /** + * 是否未DefaultMatrix + */ + get isDefaultMatrix(): boolean; + protected _setRTSyncFlag(type: number, value: boolean): void; + get _RTtransformFlag(): number; + /** + * 局部位置X轴分量。 + */ + get localPositionX(): number; + set localPositionX(x: number); + /** + * 局部位置Y轴分量。 + */ + get localPositionY(): number; + set localPositionY(y: number); + /** + * 局部位置Z轴分量。 + */ + get localPositionZ(): number; + set localPositionZ(z: number); + /** + * 局部位置。 + */ + get localPosition(): Vector3; + set localPosition(value: Vector3); + /** + * 局部旋转。 + */ + get localRotation(): Quaternion; + set localRotation(value: Quaternion); + /** + * 局部缩放X。 + */ + get localScaleX(): number; + set localScaleX(value: number); + /** + * 局部缩放Y。 + */ + get localScaleY(): number; + set localScaleY(value: number); + /** + * 局部缩放Z。 + */ + get localScaleZ(): number; + set localScaleZ(value: number); + /** + * 局部缩放。 + */ + get localScale(): Vector3; + set localScale(value: Vector3); + /** + * 局部空间欧拉角。 + */ + get localRotationEuler(): Vector3; + set localRotationEuler(value: Vector3); + /** + * 局部矩阵。 + */ + get localMatrix(): Matrix4x4; + set localMatrix(value: Matrix4x4); + /** + * 世界位置。 + */ + get position(): Vector3; + set position(value: Vector3); + /** + * 世界旋转。 + */ + get rotation(): Quaternion; + set rotation(value: Quaternion); + /** + * 世界空间的旋转角度,顺序为x、y、z。 + */ + get rotationEuler(): Vector3; + set rotationEuler(value: Vector3); + /** + * 世界矩阵。 + */ + get worldMatrix(): Matrix4x4; + set worldMatrix(value: Matrix4x4); + /** + * 平移变换。 + * @param translation 移动距离。 + * @param isLocal 是否局部空间。 + */ + translate(translation: Vector3, isLocal?: boolean): void; + /** + * 旋转变换。 + * @param rotation 旋转幅度。 + * @param isLocal 是否局部空间。 + * @param isRadian 是否弧度制。 + */ + rotate(rotation: Vector3, isLocal?: boolean, isRadian?: boolean): void; + getWorldLossyScale(): Vector3; + setWorldLossyScale(value: Vector3): void; + } + class RTVolumetricGI implements IVolumetricGIData { + private static _idCounter; + _id: number; + private _irradiance; + get irradiance(): InternalTexture; + set irradiance(value: InternalTexture); + private _distance; + get distance(): InternalTexture; + set distance(value: InternalTexture); + private _bound; + get bound(): Bounds; + set bound(value: Bounds); + get intensity(): number; + set intensity(value: number); + get updateMark(): number; + set updateMark(value: number); + constructor(); + setParams(value: Vector4): void; + setProbeCounts(value: Vector3): void; + setProbeStep(value: Vector3): void; + } + /** + * 共享内存分配,并且绑定Native共享Buffer + */ + class CommonMemoryAllocater { + /** + * 创建内存,并绑定为共享内存 + * @param size + * @returns + */ + static creatBlock(size: number): ArrayBuffer; + /** + * 释放共享内存 + * @param buffer + */ + static freeMemoryBlock(buffer: ArrayBuffer): void; + } + class NativeMemory { + static NativeSourceID: number; + protected _uidata: Uint32Array; + protected _fdata: Float32Array; + protected _f64data: Float64Array; + protected _byteArray: Uint8Array; + /**数据长度 */ + protected _byteLength: number; + /**销毁标记 */ + protected _destroyed: boolean; + /**数据资源 */ + protected _id: number; + /** + * 实例化一个共享内存 + * @param size byteLength + */ + constructor(size: number, shared: boolean); + /** + * Float32Array Data + */ + get float32Array(): Float32Array; + get float64Array(): Float64Array; + /** + * Uint16Array Data + */ + /** + * Uint8Array Data + */ + get uint8Array(): Uint8Array; + /** + * Int32Array Data + */ + get int32Array(): Int32Array; + get Uint32Array(): Uint32Array; + /** + * 设置数据 + * @param data 数据 + * @param stride 字节偏移 + * //TODO 字节对齐 + */ + /** + * 设置多个参数 + * @param offset + * @param args + * 考虑字节对齐 + */ + /** + * 扩充buffer + * @param size + * @returns + */ + /** + * 删除 + * @returns + */ + destroy(): void; + /** + * 清楚 + */ + clear(): void; + } + class RTDefineDatas implements IDefineDatas { + _nativeObj: any; + constructor(); + get _length(): number; + set _length(value: number); + get _mask(): number[]; + set _mask(value: number[]); + add(define: RTShaderDefine): void; + remove(define: RTShaderDefine): void; + addDefineDatas(define: RTDefineDatas): void; + removeDefineDatas(define: RTDefineDatas): void; + has(define: RTShaderDefine): boolean; + clear(): void; + cloneTo(destObject: RTDefineDatas): void; + clone(): RTDefineDatas; + destroy(): void; + } + class RTRenderState extends RenderState { + _nativeObj: any; + set cull(value: number); + get cull(): number; + set blend(value: number); + get blend(): number; + set srcBlend(value: number); + get srcBlend(): number; + set dstBlend(value: number); + get dstBlend(): number; + set srcBlendRGB(value: number); + get srcBlendRGB(): number; + set dstBlendRGB(value: number); + get dstBlendRGB(): number; + set srcBlendAlpha(value: number); + get srcBlendAlpha(): number; + set dstBlendAlpha(value: number); + get dstBlendAlpha(): number; + set blendEquation(value: number); + get blendEquation(): number; + set blendEquationRGB(value: number); + get blendEquationRGB(): number; + set blendEquationAlpha(value: number); + get blendEquationAlpha(): number; + set depthTest(value: number); + get depthTest(): number; + set depthWrite(value: boolean); + get depthWrite(): boolean; + set stencilWrite(value: boolean); + get stencilWrite(): boolean; + set stencilTest(value: number); + get stencilTest(): number; + set stencilRef(value: number); + get stencilRef(): number; + set stencilOp(value: Vector3); + get stencilOp(): Vector3; + setNull(): void; + protected createObj(): void; + constructor(); + cloneTo(dest: RTRenderState): void; + clone(): RenderState; + } + class RTShaderDefine extends ShaderDefine { + constructor(index: number, value: number); + } + class RTShaderPass implements IShaderPassData { + private _validDefine; + private _createShaderInstanceFun; + _nativeObj: any; + static _globalCompileDefine: RTDefineDatas; + is2D: boolean; + private _pass; + constructor(pass: ShaderPass); + private _nodeCommonMap; + get nodeCommonMap(): string[]; + set nodeCommonMap(value: string[]); + get statefirst(): boolean; + set statefirst(value: boolean); + private _renderState; + get renderState(): RenderState; + set renderState(value: RenderState); + get pipelineMode(): string; + set pipelineMode(value: string); + get validDefine(): RTDefineDatas; + set validDefine(value: RTDefineDatas); + nativeCreateShaderInstance(): any; + destroy(): void; + setCacheShader(defines: IDefineDatas, shaderInstance: IShaderInstance): void; + getCacheShader(defines: IDefineDatas): IShaderInstance; + } + class RTSubShader implements ISubshaderData { + _nativeObj: any; + constructor(); + get enableInstance(): boolean; + set enableInstance(value: boolean); + destroy(): void; + addShaderPass(pass: RTShaderPass): void; + } + class RTUintRenderModuleDataFactory implements IUnitRenderModuleDataFactory { + createSubShader(): RTSubShader; + createShaderPass(pass: ShaderPass): RTShaderPass; + createRenderState(): RTRenderState; + createDefineDatas(): RTDefineDatas; + } + class Web3DRenderModuleFactory implements I3DRenderModuleFactory { + createSimpleSkinRenderNode(): ISimpleSkinRenderNode; + createTransform(owner: Sprite3D): Transform3D; + createBounds(min: Vector3, max: Vector3): BoundsImpl; + createVolumetricGI(): WebVolumetricGI; + createReflectionProbe(): WebReflectionProbe; + createLightmapData(): WebLightmap; + createDirectLight(): WebDirectLight; + createSpotLight(): WebSpotLight; + createPointLight(): IPointLightData; + createCameraModuleData(): WebCameraNodeData; + createSceneModuleData(): WebSceneNodeData; + createBaseRenderNode(): WebBaseRenderNode; + createMeshRenderNode(): WebMeshRenderNode; + createSkinRenderNode(): ISkinRenderNode; + } + class WebBaseRenderNode implements IBaseRenderNode { + renderNodeType: number; + boundsChange: boolean; + distanceForSort: number; + sortingFudge: number; + castShadow: boolean; + receiveShadow: boolean; + enable: boolean; + renderbitFlag: number; + layer: number; + customCull: boolean; + customCullResoult: boolean; + staticMask: number; + lightmapIndex: number; + lightmapDirtyFlag: number; + probeReflectionUpdateMark: number; + reflectionMode: number; + lightProbUpdateMark: number; + irradientMode: IrradianceMode; + renderelements: IRenderElement3D[]; + lightmapScaleOffset: Vector4; + lightmap: WebLightmap; + probeReflection: WebReflectionProbe; + volumetricGI: WebVolumetricGI; + shaderData: ShaderData; + baseGeometryBounds: Bounds; + transform: Transform3D; + _worldParams: Vector4; + _commonUniformMap: string[]; + private _bounds; + private _caculateBoundingBoxCall; + private _caculateBoundingBoxFun; + private _renderUpdatePreCall; + private _renderUpdatePreFun; + private _updateMark; + _calculateBoundingBox(): void; + /** + * get bounds + */ + get bounds(): Bounds; + set bounds(value: Bounds); + constructor(); + /** + * 设置更新数据 + * @param call + * @param fun + */ + set_renderUpdatePreCall(call: any, fun: any): void; + /** + * 设置更新包围盒方法 + * @param call + * @param fun + */ + set_caculateBoundingBox(call: any, fun: any): void; + /** + * 视锥检测包围盒 + * @param boundFrustum + * @returns + */ + _needRender(boundFrustum: BoundFrustum): boolean; + /** + * apply lightProb + * @returns + */ + _applyLightProb(): void; + /** + * apply reflection + * @returns + */ + _applyReflection(): void; + /** + * destroy + */ + destroy(): void; + } + class WebDirectLight implements IDirectLightData { + shadowNearPlane: number; + shadowCascadesMode: ShadowCascadesMode; + transform: Transform3D; + shadowResolution: number; + shadowDistance: number; + shadowMode: ShadowMode; + shadowStrength: number; + shadowDepthBias: number; + shadowNormalBias: number; + shadowTwoCascadeSplits: number; + _shadowFourCascadeSplits: Vector3; + _direction: Vector3; + constructor(); + setShadowFourCascadeSplits(value: Vector3): void; + setDirection(value: Vector3): void; + } + class WebLightmap implements ILightMapData { + } + class WebMeshRenderNode extends WebBaseRenderNode implements IMeshRenderNode { + constructor(); + } + class WebCameraNodeData implements ICameraNodeData { + transform: Transform3D; + farplane: number; + nearplane: number; + fieldOfView: number; + aspectRatio: number; + _projectViewMatrix: Matrix4x4; + constructor(); + setProjectionViewMatrix(value: Matrix4x4): void; + } + class WebSceneNodeData implements ISceneNodeData { + lightmapDirtyFlag: number; + } + class WebPointLight implements IPointLightData { + transform: Transform3D; + range: number; + shadowResolution: number; + shadowDistance: number; + shadowMode: ShadowMode; + shadowStrength: number; + shadowDepthBias: number; + shadowNormalBias: number; + shadowNearPlane: number; + } + class WebReflectionProbe implements IReflectionProbeData { + private static _idCounter; + } + /** + * @en The `WebSceneRenderManager` class is used to manage the rendering nodes of a scene. + * @zh `WebSceneRenderManager` 类用于管理场景的渲染节点。 + */ + class WebSceneRenderManager implements ISceneRenderManager { + /** @ignore */ + constructor(); + /** + * @en The base render list. + * @zh 基础渲染节点列表。 + */ + baseRenderList: SingletonList; + /** + * @en The list of render objects. + * @zh 渲染对象列表。 + */ + get list(): SingletonList; + set list(value: SingletonList); + /** + * @en Adds a render object to the render list. + * @param object The render object to add. + * @zh 向渲染列表添加渲染对象。 + * @param object 要添加的渲染对象。 + */ + addRenderObject(object: BaseRender): void; + /** + * @en Removes a render object from the render list and the base render list. + * @param object The render object to remove. + * @zh 从渲染列表和基础渲染列表中移除渲染对象。 + * @param object 要移除的渲染对象。 + */ + removeRenderObject(object: BaseRender): void; + /** + * @en Removes a motion render object. + * @param object The motion render object to remove. + * @zh 移除运动渲染对象。 + * @param object 要移除的运动渲染对象。 + */ + removeMotionObject(object: BaseRender): void; + /** + * @en Updates all motion render objects. + * @zh 更新所有运动渲染对象。 + */ + updateMotionObjects(): void; + /** + * @en Adds a motion render object. + * @param object The motion render object to add. + * @zh 向管理器添加运动渲染对象。 + * @param object 要添加的运动渲染对象。 + */ + addMotionObject(object: BaseRender): void; + /** + * @en Destroys the render objects and cleans up resources. + * @zh 销毁渲染对象并清理资源。 + */ + destroy(): void; + } + class WebSimpleSkinRenderNode extends WebBaseRenderNode implements ISimpleSkinRenderNode { + _simpleAnimatorParams: Vector4; + constructor(); + setSimpleAnimatorParams(value: Vector4): void; + _renderUpdate(context3D: IRenderContext3D): void; + } + class WebSkinRenderNode extends WebBaseRenderNode implements ISkinRenderNode { + constructor(); + setRootBoneTransfom(value: Sprite3D): void; + setOwnerTransform(value: Sprite3D): void; + setCacheMesh(cacheMesh: Mesh): void; + setBones(value: Sprite3D[]): void; + setSkinnedData(value: any[]): void; + /** + * 计算动画数据 + */ + computeSkinnedData(): void; + _renderUpdate(context3D: IRenderContext3D): void; + } + class WebSpotLight implements ISpotLightData { + transform: Transform3D; + shadowResolution: number; + shadowDistance: number; + shadowMode: ShadowMode; + shadowStrength: number; + shadowDepthBias: number; + shadowNormalBias: number; + shadowNearPlane: number; + spotRange: number; + spotAngle: number; + _direction: Vector3; + setDirection(value: Vector3): void; + getWorldMatrix(out: Matrix4x4): Matrix4x4; + } + class WebVolumetricGI implements IVolumetricGIData { + private static _idCounter; + _id: number; + private _probeCounts; + private _probeStep; + irradiance: InternalTexture; + distance: InternalTexture; + bound: Bounds; + intensity: number; + updateMark: number; + constructor(); + setParams(value: Vector4): void; + setProbeCounts(value: Vector3): void; + setProbeStep(value: Vector3): void; + applyRenderData(data: ShaderData): void; + } + /** + * DefineDatas 类用于创建宏定义数据集合。 + */ + class WebDefineDatas implements IDefineDatas { + /** + * 创建一个 DefineDatas 实例。 + */ + constructor(); + /** + * 添加宏定义值。 + * @param define 宏定义值。 + */ + add(define: ShaderDefine): void; + /** + * 移除宏定义。 + * @param define 宏定义。 + */ + remove(define: ShaderDefine): void; + /** + * 添加宏定义集合。 + * @param define 宏定义集合。 + */ + addDefineDatas(define: WebDefineDatas): void; + /** + * 移除宏定义集合。 + * @param define 宏定义集合。 + */ + removeDefineDatas(define: WebDefineDatas): void; + /** + * 是否有宏定义。 + * @param define 宏定义。 + */ + has(define: ShaderDefine): boolean; + /** + * 清空宏定义。 + */ + clear(): void; + /** + * 克隆。 + * @param destObject 克隆源。 + */ + cloneTo(destObject: WebDefineDatas): void; + /** + * 克隆。 + * @return 克隆副本。 + */ + clone(): any; + destroy(): void; + } + /** + * 着色器数据类。 + */ + class WebGLShaderData extends ShaderData { + get uniformBuffersMap(): Map; + _releaseUBOData(): void; + applyUBOData(): void; + /** + * 增加Shader宏定义。 + */ + addDefine(define: ShaderDefine): void; + addDefines(define: WebDefineDatas): void; + /** + * 移除Shader宏定义。 + */ + removeDefine(define: ShaderDefine): void; + /** + * 是否包含Shader宏定义。 + */ + hasDefine(define: ShaderDefine): boolean; + /** + * 清空宏定义。 + */ + clearDefine(): void; + /** + * 获取布尔。 + * @param index shader索引。 + * @return 布尔。 + */ + getBool(index: number): boolean; + /** + * 设置布尔。 + * @param index shader索引。 + * @param value 布尔。 + */ + setBool(index: number, value: boolean): void; + /** + * 获取整形。 + * @param index shader索引。 + * @return 整形。 + */ + getInt(index: number): number; + /** + * 设置整型。 + * @param index shader索引。 + * @param value 整形。 + */ + setInt(index: number, value: number): void; + /** + * 获取浮点。 + * @param index shader索引。 + * @return 浮点。 + */ + getNumber(index: number): number; + /** + * 设置浮点。 + * @param index shader索引。 + * @param value 浮点。 + */ + setNumber(index: number, value: number): void; + /** + * 获取Vector2向量。 + * @param index shader索引。 + * @return Vector2向量。 + */ + getVector2(index: number): Vector2; + /** + * 设置Vector2向量。 + * @param index shader索引。 + * @param value Vector2向量。 + */ + setVector2(index: number, value: Vector2): void; + /** + * 获取Vector3向量。 + * @param index shader索引。 + * @return Vector3向量。 + */ + getVector3(index: number): Vector3; + /** + * 设置Vector3向量。 + * @param index shader索引。 + * @param value Vector3向量。 + */ + setVector3(index: number, value: Vector3): void; + /** + * 获取颜色。 + * @param index shader索引。 + * @return 向量。 + */ + getVector(index: number): Vector4; + /** + * 设置向量。 + * @param index shader索引。 + * @param value 向量。 + */ + setVector(index: number, value: Vector4): void; + /** + * 获取颜色 + * @param index 索引 + * @returns 颜色 + */ + getColor(index: number): Color; + /** + * 设置颜色 + * @param index 索引 + * @param value 颜色值 + */ + setColor(index: number, value: Color): void; + /** + * 获取矩阵。 + * @param index shader索引。 + * @return 矩阵。 + */ + getMatrix4x4(index: number): Matrix4x4; + /** + * 设置矩阵。 + * @param index shader索引。 + * @param value 矩阵。 + */ + setMatrix4x4(index: number, value: Matrix4x4): void; + /** + * 获取矩阵 + * @param index + * @returns + */ + getMatrix3x3(index: number): Matrix3x3; + /** + * 设置矩阵。 + */ + setMatrix3x3(index: number, value: Matrix3x3): void; + /** + * 获取Buffer。 + * @param index shader索引。 + * @return + */ + getBuffer(index: number): Float32Array; + /** + * 设置Buffer。 + * @param index shader索引。 + * @param value buffer数据。 + */ + setBuffer(index: number, value: Float32Array): void; + /** + * 设置纹理。 + * @param index shader索引。 + * @param value 纹理。 + */ + setTexture(index: number, value: BaseTexture): void; + _setInternalTexture(index: number, value: InternalTexture): void; + /** + * 获取纹理。 + * @param index shader索引。 + * @return 纹理。 + */ + getTexture(index: number): BaseTexture; + getSourceIndex(value: any): number; + setUniformBuffer(index: number, value: UniformBufferObject): void; + getUniformBuffer(index: number): UniformBufferObject; + /** + * 克隆。 + * @param destObject 克隆源。 + */ + cloneTo(destObject: WebGLShaderData): void; + getDefineData(): WebDefineDatas; + /** + * 克隆。 + * @return 克隆副本。 + */ + clone(): any; + reset(): void; + destroy(): void; + } + class WebShaderPass implements IShaderPassData { + is2D: boolean; + pipelineMode: string; + statefirst: boolean; + private _validDefine; + private _renderState; + get renderState(): RenderState; + set renderState(value: RenderState); + get validDefine(): WebDefineDatas; + set validDefine(value: WebDefineDatas); + constructor(pass: ShaderPass); + nodeCommonMap: string[]; + setCacheShader(compileDefine: WebDefineDatas, shader: IShaderInstance): void; + getCacheShader(compileDefine: WebDefineDatas): IShaderInstance; + destroy(): void; + } + class WebSubShader implements ISubshaderData { + enableInstance: boolean; + destroy(): void; + addShaderPass(pass: WebShaderPass): void; + } + class WebUnitRenderModuleDataFactory implements IUnitRenderModuleDataFactory { + createSubShader(): WebSubShader; + createShaderPass(pass: ShaderPass): IShaderPassData; + createRenderState(): RenderState; + createDefineDatas(): WebDefineDatas; + } + class WebGLRender2DProcess implements I2DRenderPassFactory { + createRenderElement2D(): IRenderElement2D; + createRenderContext2D(): IRenderContext2D; + } + class WebglRenderContext2D implements IRenderContext2D { + static isCreateBlitScreenELement: boolean; + static blitScreenElement: WebGLRenderelement2D; + static blitContext: WebglRenderContext2D; + private _clearColor; + _destRT: WebGLInternalRT; + invertY: boolean; + pipelineMode: string; + sceneData: WebGLShaderData; + _globalConfigShaderData: WebDefineDatas; + private _offscreenWidth; + private _offscreenHeight; + constructor(); + /** + * 兼容ConchWebGL + */ + private setBlitScreenElement; + drawRenderElementList(list: FastSinglelist): number; + setOffscreenView(width: number, height: number): void; + setRenderTarget(value: WebGLInternalRT, clear: boolean, clearColor: Color): void; + drawRenderElementOne(node: WebGLRenderelement2D): void; + } + class WebGLRenderelement2D implements IRenderElement2D { + renderStateIsBySprite: boolean; + protected _shaderInstances: FastSinglelist; + geometry: WebGLRenderGeometryElement; + materialShaderData: WebGLShaderData; + value2DShaderData: WebGLShaderData; + subShader: SubShader; + protected _compileShader(context: WebglRenderContext2D): void; + _prepare(context: WebglRenderContext2D): void; + _render(context: WebglRenderContext2D): void; + renderByShaderInstance(shader: WebGLShaderInstance, context: WebglRenderContext2D): void; + destroy(): void; + } + class InstanceRenderElementOBJ extends WebGLRenderElement3D { + private _updateData; + private _updateDataNum; + drawCount: number; + updateNums: number; + /** + * 增加UpdateBuffer + * @param vb + * @param length 每个instance属性的数据长度 + */ + addUpdateBuffer(vb: VertexBuffer3D, length: number): void; + /** + * + * @param index index of Buffer3D + * @param length length of array + */ + getUpdateData(index: number, length: number): Float32Array; + constructor(); + /** + * draw geometry + * @param shaderIns + */ + drawGeometry(shaderIns: IShaderInstance): void; + clear(): void; + } + class WebGL3DRenderPassFactory implements I3DRenderPassFactory { + createInstanceBatch(): IInstanceRenderBatch; + createSetRenderDataCMD(): WebGLSetRenderData; + createSetShaderDefineCMD(): WebGLSetShaderDefine; + createDrawNodeCMDData(): WebGLDrawNodeCMDData; + createBlitQuadCMDData(): WebGLBlitQuadCMDData; + createDrawElementCMDData(): WebGLDrawElementCMDData; + createSetViewportCMD(): WebGLSetViewportCMD; + createSetRenderTargetCMD(): WebGLSetRenderTargetCMD; + createSceneRenderManager(): WebSceneRenderManager; + createSkinRenderElement(): WebGLSkinRenderElement3D; + createRenderContext3D(): WebGLRenderContext3D; + createRenderElement3D(): WebGLRenderElement3D; + createInstanceRenderElement3D(): WebGLInstanceRenderElement3D; + createRender3DProcess(): WebGLRender3DProcess; + } + class WebGLDirectLightShadowRP { + camera: WebCameraNodeData; + destTarget: WebGLInternalRT; + private _shadowCasterCommanBuffer; + get shadowCasterCommanBuffer(): CommandBuffer[]; + set shadowCasterCommanBuffer(value: CommandBuffer[]); + /**light */ + private _light; + set light(value: WebDirectLight); + get light(): WebDirectLight; + constructor(); + /** + * @param context + */ + update(context: WebGLRenderContext3D): void; + /** + * @param context + * @param list + * @param count + */ + render(context: WebGLRenderContext3D, list: WebBaseRenderNode[], count: number): void; + destroy(): void; + /** + * set shaderData after Render shadow + * @param scene + * @param camera + */ + private _applyRenderData; + /** + * apply shadowCast cmd array + */ + private _applyCasterPassCommandBuffer; + private getShadowBias; + } + class WebGLForwardAddClusterRP { + /**enable */ + enableOpaque: boolean; + enableCMD: boolean; + enableTransparent: boolean; + opaqueTexture: InternalRenderTarget; + blitOpaqueBuffer: CommandBuffer; + private _enableOpaqueTexture; + get enableOpaqueTexture(): boolean; + set enableOpaqueTexture(value: boolean); + clearColor: Color; + clearFlag: number; + private _viewPort; + setViewPort(value: Viewport): void; + private _scissor; + setScissor(value: Vector4): void; + private opaqueList; + private transparent; + private _zBufferParams; + private _defaultNormalDepthColor; + constructor(); + setCameraCullInfo(value: Camera): void; + setBeforeForwardCmds(value: CommandBuffer[]): void; + setBeforeSkyboxCmds(value: CommandBuffer[]): void; + setBeforeTransparentCmds(value: CommandBuffer[]): void; + /** + * 渲染主流程(TODO:其他两个pass合并MulTargetRT) + * @param context + * @param list + */ + render(context: WebGLRenderContext3D, list: WebBaseRenderNode[], count: number): void; + /** + * 渲染深度Pass + * @param context + * @param list + */ + private _renderDepthPass; + /** + * @param context + * @private + */ + private _transparentListRender; + /** + * 渲染非透明物体Pass + * @param context + * @param list + */ + private _opaqueListRender; + /** + * 渲染法线深度Pass + * @param context + * @param list + */ + private _renderDepthNormalPass; + private opaqueTexturePass; + private _mainPass; + /** + * @param cmds + * @param context + * @private + */ + private _rendercmd; + private _recoverRenderContext3D; + destroy(): void; + } + class WebGLForwardAddRP { + /**是否开启阴影 */ + shadowCastPass: boolean; + /**directlight shadow */ + directLightShadowPass: WebGLDirectLightShadowRP; + /**enable directlight */ + enableDirectLightShadow: boolean; + /**spot shadow */ + spotLightShadowPass: WebGLSpotLightShadowRP; + /**enable spot */ + enableSpotLightShadowPass: boolean; + shadowParams: Vector4; + enablePostProcess: boolean; + /**main pass */ + renderpass: WebGLForwardAddClusterRP; + finalize: CommandBuffer; + constructor(); + setBeforeImageEffect(value: CommandBuffer[]): void; + setAfterEventCmd(value: CommandBuffer[]): void; + destroy(): void; + } + /** + * 动态合批通用类(目前由WebGPU专用) + */ + class WebGLInstanceRenderBatch { + static MaxInstanceCount: number; + private recoverList; + private _batchOpaqueMarks; + private _updateCountMark; + constructor(); + getBatchMark(element: IRenderElement3D): any; + batch(elements: SingletonList): void; + clearRenderData(): void; + recoverData(): void; + } + interface WebGLInstanceStateInfo { + state: WebGLBufferState; + worldInstanceVB?: WebGLVertexBuffer; + lightmapScaleOffsetVB?: WebGLVertexBuffer; + simpleAnimatorVB?: WebGLVertexBuffer; + } + class WebGLInstanceRenderElement3D extends WebGLRenderElement3D implements IInstanceRenderElement3D { + /** + * get Instance BufferState + */ + private static _instanceBufferStateMap; + static getInstanceBufferState(geometry: WebGLRenderGeometryElement, renderType: number, spriteDefine: WebDefineDatas): WebGLInstanceStateInfo; + /** + * max instance count + */ + static MaxInstanceCount: number; + static create(): WebGLInstanceRenderElement3D; + static _instanceBufferCreate(length: number): Float32Array; + instanceElementList: FastSinglelist; + private _vertexBuffers; + private _updateData; + private _updateDataNum; + private _instanceStateInfo; + drawCount: number; + updateNums: number; + constructor(); + addUpdateData(vb: WebGLVertexBuffer, elementLength: number, maxInstanceCount: number): Float32Array; + protected _compileShader(context: WebGLRenderContext3D): void; + private _updateInstanceData; + /** + * get correct geometry + * @param geometry + */ + setGeometry(geometry: WebGLRenderGeometryElement): void; + /** + * render RenderElement + * context:GLESRenderContext3D + */ + _render(context: WebGLRenderContext3D): void; + /** + * 清理单次渲染生成的数据 + */ + clearRenderData(): void; + /** + * 回收 + */ + recover(): void; + destroy(): void; + } + class WebGLRender3DProcess implements IRender3DProcess { + render3DManager: WebSceneRenderManager; + private renderpass; + initRenderpass(camera: Camera, context: WebGLRenderContext3D): void; + renderDepth(camera: Camera): void; + fowardRender(context: WebGLRenderContext3D, camera: Camera): void; + renderFowarAddCameraPass(context: WebGLRenderContext3D, renderpass: WebGLForwardAddRP, list: WebBaseRenderNode[], count: number): void; + /** + * @param cmds + * @param context + * @private + */ + private _rendercmd; + /** + * @param postprocessCMD + * @param context + * @private + */ + private _renderPostProcess; + destroy(): void; + } + class WebGLDrawNodeCMDData extends DrawNodeCMDData { + type: RenderCMDType; + protected _node: WebBaseRenderNode; + protected _destShaderData: WebGLShaderData; + protected _destSubShader: SubShader; + protected _subMeshIndex: number; + get node(): WebBaseRenderNode; + set node(value: WebBaseRenderNode); + get destShaderData(): WebGLShaderData; + set destShaderData(value: WebGLShaderData); + get destSubShader(): SubShader; + set destSubShader(value: SubShader); + get subMeshIndex(): number; + set subMeshIndex(value: number); + constructor(); + apply(context: WebGLRenderContext3D): void; + } + class WebGLBlitQuadCMDData extends BlitQuadCMDData { + type: RenderCMDType; + private _sourceTexelSize; + protected _dest: WebGLInternalRT; + protected _viewport: Viewport; + protected _source: InternalTexture; + protected _scissor: Vector4; + protected _offsetScale: Vector4; + protected _element: WebGLRenderElement3D; + get dest(): WebGLInternalRT; + set dest(value: WebGLInternalRT); + get viewport(): Viewport; + set viewport(value: Viewport); + get scissor(): Vector4; + set scissor(value: Vector4); + get source(): InternalTexture; + set source(value: InternalTexture); + get offsetScale(): Vector4; + set offsetScale(value: Vector4); + get element(): WebGLRenderElement3D; + set element(value: WebGLRenderElement3D); + constructor(); + apply(context: WebGLRenderContext3D): void; + } + class WebGLDrawElementCMDData extends DrawElementCMDData { + type: RenderCMDType; + private _elemets; + constructor(); + setRenderelements(value: WebGLRenderElement3D[]): void; + apply(context: WebGLRenderContext3D): void; + } + class WebGLSetViewportCMD extends SetViewportCMD { + type: RenderCMDType; + protected _viewport: Viewport; + protected _scissor: Vector4; + get viewport(): Viewport; + set viewport(value: Viewport); + get scissor(): Vector4; + set scissor(value: Vector4); + constructor(); + apply(context: WebGLRenderContext3D): void; + } + class WebGLSetRenderTargetCMD extends SetRenderTargetCMD { + type: RenderCMDType; + protected _rt: InternalRenderTarget; + protected _clearFlag: number; + protected _clearColorValue: Color; + protected _clearDepthValue: number; + protected _clearStencilValue: number; + get rt(): InternalRenderTarget; + set rt(value: InternalRenderTarget); + get clearFlag(): number; + set clearFlag(value: number); + get clearColorValue(): Color; + set clearColorValue(value: Color); + get clearDepthValue(): number; + set clearDepthValue(value: number); + get clearStencilValue(): number; + set clearStencilValue(value: number); + constructor(); + apply(context: WebGLRenderContext3D): void; + } + class WebGLSetRenderData extends SetRenderDataCMD { + type: RenderCMDType; + protected _dataType: ShaderDataType; + protected _propertyID: number; + protected _dest: WebGLShaderData; + protected _value: ShaderDataItem; + data_v4: Vector4; + data_v3: Vector3; + data_v2: Vector2; + data_mat: Matrix4x4; + data_number: number; + data_texture: BaseTexture; + data_Color: Color; + data_Buffer: Float32Array; + get dataType(): ShaderDataType; + set dataType(value: ShaderDataType); + get propertyID(): number; + set propertyID(value: number); + get dest(): WebGLShaderData; + set dest(value: WebGLShaderData); + get value(): ShaderDataItem; + set value(value: ShaderDataItem); + constructor(); + apply(context: WebGLRenderContext3D): void; + } + class WebGLSetShaderDefine extends SetShaderDefineCMD { + type: RenderCMDType; + protected _define: ShaderDefine; + protected _dest: WebGLShaderData; + protected _add: boolean; + get define(): ShaderDefine; + set define(value: ShaderDefine); + get dest(): WebGLShaderData; + set dest(value: WebGLShaderData); + get add(): boolean; + set add(value: boolean); + constructor(); + apply(context: WebGLRenderContext3D): void; + } + class WebGLRenderContext3D implements IRenderContext3D { + _globalConfigShaderData: WebDefineDatas; + private _globalShaderData; + private _cameraModuleData; + get sceneData(): WebGLShaderData; + set sceneData(value: WebGLShaderData); + get cameraData(): WebGLShaderData; + set cameraData(value: WebGLShaderData); + get sceneModuleData(): WebSceneNodeData; + set sceneModuleData(value: WebSceneNodeData); + get cameraModuleData(): WebCameraNodeData; + set cameraModuleData(value: WebCameraNodeData); + get globalShaderData(): WebGLShaderData; + set globalShaderData(value: WebGLShaderData); + setRenderTarget(value: InternalRenderTarget, clearFlag: RenderClearFlag): void; + setViewPort(value: Viewport): void; + setScissor(value: Vector4): void; + get sceneUpdataMask(): number; + set sceneUpdataMask(value: number); + get cameraUpdateMask(): number; + set cameraUpdateMask(value: number); + get pipelineMode(): PipelineMode; + set pipelineMode(value: PipelineMode); + get invertY(): boolean; + set invertY(value: boolean); + /** + * GLESRenderContext3D + */ + constructor(); + runOneCMD(cmd: IRenderCMD): void; + runCMDList(cmds: IRenderCMD[]): void; + setClearData(clearFlag: number, color: Color, depth: number, stencil: number): number; + drawRenderElementList(list: FastSinglelist): number; + drawRenderElementOne(node: WebGLRenderElement3D): number; + drawRenderElementList_StatUse(list: FastSinglelist): number; + drawRenderElementOne_StatUse(node: WebGLRenderElement3D): number; + private _bindRenderTarget; + private _start; + } + class WebGLRenderElement3D implements IRenderElement3D { + protected _shaderInstances: FastSinglelist; + geometry: WebGLRenderGeometryElement; + subShader: SubShader; + materialId: number; + canDynamicBatch: boolean; + materialShaderData: WebGLShaderData; + materialRenderQueue: number; + renderShaderData: WebGLShaderData; + transform: Transform3D; + isRender: boolean; + owner: WebBaseRenderNode; + protected _invertFront: boolean; + constructor(); + _addShaderInstance(shader: WebGLShaderInstance): void; + _clearShaderInstance(): void; + _preUpdatePre(context: WebGLRenderContext3D): void; + protected _getInvertFront(): boolean; + /** + * render RenderElement + * context:GLESRenderContext3D + */ + _render(context: WebGLRenderContext3D): void; + protected _compileShader(context: WebGLRenderContext3D): void; + drawGeometry(shaderIns: WebGLShaderInstance): void; + destroy(): void; + } + class WebGLSkinRenderElement3D extends WebGLRenderElement3D implements ISkinRenderElement3D { + skinnedData: Float32Array[]; + constructor(); + /** 更新数据并且 */ + drawGeometry(shaderIns: WebGLShaderInstance): void; + } + class WebGLSpotLightShadowRP { + destTarget: InternalRenderTarget; + private _renderQueue; + set light(value: WebSpotLight); + get light(): WebSpotLight; + constructor(); + /** + * 更新阴影数据 + */ + update(context: WebGLRenderContext3D): void; + /** + * render + * @param context + * @param list + */ + render(context: WebGLRenderContext3D, list: WebBaseRenderNode[], count: number): void; + destroy(): void; + /** + * get shadow bias + * @param shadowResolution + * @param out + */ + private _getShadowBias; + private _setupShadowCasterShaderValues; + /** + * apply shadowCast cmd array + */ + private _applyCasterPassCommandBuffer; + } + /** + * 将继承修改为类似 WebGLRenderingContextBase, WebGLRenderingContextOverloads 多继承 ? + */ + class GL2TextureContext extends GLTextureContext implements ITextureContext { + protected _gl: WebGL2RenderingContext; + constructor(engine: WebGLEngine); + protected getTarget(dimension: TextureDimension): number; + glTextureParam(format: TextureFormat, useSRGB: boolean): { + internalFormat: number; + format: number; + type: number; + }; + glRenderBufferParam(format: RenderTargetFormat, useSRGB: boolean): { + internalFormat: number; + attachment: number; + }; + glRenderTextureParam(format: RenderTargetFormat, useSRGB: boolean): { + internalFormat: number; + format: number; + type: number; + }; + getGLtexMemory(tex: WebGLInternalTex, depth?: number): number; + supportSRGB(format: TextureFormat | RenderTargetFormat, mipmap: boolean): boolean; + setTextureImageData(texture: WebGLInternalTex, source: HTMLImageElement | HTMLCanvasElement | ImageBitmap, premultiplyAlpha: boolean, invertY: boolean): void; + setTextureSubImageData(texture: WebGLInternalTex, source: HTMLImageElement | HTMLCanvasElement | ImageBitmap, x: number, y: number, premultiplyAlpha: boolean, invertY: boolean): void; + setTexturePixelsData(texture: WebGLInternalTex, source: ArrayBufferView, premultiplyAlpha: boolean, invertY: boolean): void; + createTexture3DInternal(dimension: TextureDimension, width: number, height: number, depth: number, format: TextureFormat, generateMipmap: boolean, sRGB: boolean, premultipliedAlpha: boolean): InternalTexture; + setTexture3DImageData(texture: WebGLInternalTex, sources: HTMLImageElement[] | HTMLCanvasElement[] | ImageBitmap[], depth: number, premultiplyAlpha: boolean, invertY: boolean): void; + setTexture3DPixelsData(texture: WebGLInternalTex, source: ArrayBufferView, depth: number, premultiplyAlpha: boolean, invertY: boolean): void; + setTexture3DSubPixelsData(texture: WebGLInternalTex, source: ArrayBufferView, mipmapLevel: number, generateMipmap: boolean, xOffset: number, yOffset: number, zOffset: number, width: number, height: number, depth: number, premultiplyAlpha: boolean, invertY: boolean): void; + setTextureHDRData(texture: WebGLInternalTex, hdrInfo: HDRTextureInfo): void; + setTextureKTXData(texture: WebGLInternalTex, ktxInfo: KTXTextureInfo): void; + setCubeImageData(texture: WebGLInternalTex, sources: (HTMLImageElement | HTMLCanvasElement | ImageBitmap)[], premultiplyAlpha: boolean, invertY: boolean): void; + setCubePixelsData(texture: WebGLInternalTex, source: ArrayBufferView[], premultiplyAlpha: boolean, invertY: boolean): void; + setCubeKTXData(texture: WebGLInternalTex, ktxInfo: KTXTextureInfo): void; + getCubeKTXRGBMData(texture: WebGLInternalTex, ktxInfo: KTXTextureInfo): void; + setTextureCompareMode(texture: WebGLInternalTex, compareMode: TextureCompareMode): TextureCompareMode; + createRenderbuffer(width: number, height: number, internalFormat: number, samples: number): WebGLRenderbuffer; + protected createRenderTextureInternal(dimension: TextureDimension, width: number, height: number, format: RenderTargetFormat, generateMipmap: boolean, sRGB: boolean): WebGLInternalTex; + createRenderTargetInternal(width: number, height: number, colorFormat: RenderTargetFormat, depthStencilFormat: RenderTargetFormat, generateMipmap: boolean, sRGB: boolean, multiSamples: number): WebGLInternalRT; + createRenderTargetCubeInternal(size: number, colorFormat: RenderTargetFormat, depthStencilFormat: RenderTargetFormat, generateMipmap: boolean, sRGB: boolean, multiSamples: number): WebGLInternalRT; + createRenderTextureCubeInternal(dimension: TextureDimension, size: number, format: RenderTargetFormat, generateMipmap: boolean, sRGB: boolean): WebGLInternalTex; + bindRenderTarget(renderTarget: WebGLInternalRT, faceIndex?: number): void; + unbindRenderTarget(renderTarget: WebGLInternalRT): void; + } + class GLTextureContext extends GLObject implements ITextureContext { + protected _sRGB: any; + protected _oesTextureHalfFloat: any; + protected _compressdTextureS3tc_srgb: any; + protected _compressedTextureEtc1: any; + protected _compressedTextureS3tc: any; + protected _compressedTextureETC: any; + protected _compressedTextureASTC: any; + protected _webgl_depth_texture: any; + needBitmap: boolean; + constructor(engine: WebGLEngine); + createTexture3DInternal(dimension: TextureDimension, width: number, height: number, depth: number, format: TextureFormat, generateMipmap: boolean, sRGB: boolean, premultipliedAlpha: boolean): InternalTexture; + setTexture3DImageData(texture: InternalTexture, source: HTMLImageElement[] | HTMLCanvasElement[] | ImageBitmap[], depth: number, premultiplyAlpha: boolean, invertY: boolean): void; + setTexture3DPixelsData(texture: InternalTexture, source: ArrayBufferView, depth: number, premultiplyAlpha: boolean, invertY: boolean): void; + setTexture3DSubPixelsData(texture: InternalTexture, source: ArrayBufferView, mipmapLevel: number, generateMipmap: boolean, xOffset: number, yOffset: number, zOffset: number, width: number, height: number, depth: number, premultiplyAlpha: boolean, invertY: boolean): void; + _glParam: { + internalFormat: number; + format: number; + type: number; + }; + glTextureParam(format: TextureFormat, useSRGB: boolean): { + internalFormat: number; + format: number; + type: number; + }; + glRenderTextureParam(format: RenderTargetFormat, useSRGB: boolean): { + internalFormat: number; + format: number; + type: number; + }; + glRenderBufferParam(format: RenderTargetFormat, useSRGB: boolean): { + internalFormat: number; + attachment: number; + }; + glRenderTargetAttachment(format: RenderTargetFormat): 36096 | 33306 | 36128 | 36064; + protected getTarget(dimension: TextureDimension): number; + getFormatPixelsParams(format: TextureFormat): { + channels: number; + bytesPerPixel: number; + dataTypedCons: any; + typedSize: number; + }; + /** + * caculate texture memory + * @param tex + * @returns + */ + getGLtexMemory(tex: WebGLInternalTex, depth?: number): number; + getGLRTTexMemory(width: number, height: number, colorFormat: RenderTargetFormat, depthStencilFormat: RenderTargetFormat, generateMipmap: boolean, multiSamples: number, cube: boolean): number; + /** + * 根据 format 判断是否支持 SRGBload + * @param format + * @returns + */ + supportSRGB(format: TextureFormat | RenderTargetFormat, mipmap: boolean): boolean; + supportGenerateMipmap(format: TextureFormat | RenderTargetFormat): boolean; + /** + * 判断 纹理格式 本身是否是 SRGB格式 + * @param format + * @returns + */ + isSRGBFormat(format: TextureFormat | RenderTargetFormat): boolean; + createTextureInternal(dimension: TextureDimension, width: number, height: number, format: TextureFormat, generateMipmap: boolean, sRGB: boolean, premultipliedAlpha: boolean): InternalTexture; + setTextureImageData(texture: WebGLInternalTex, source: HTMLImageElement | HTMLCanvasElement | ImageBitmap, premultiplyAlpha: boolean, invertY: boolean): void; + setTextureSubImageData(texture: WebGLInternalTex, source: HTMLImageElement | HTMLCanvasElement | ImageBitmap, x: number, y: number, premultiplyAlpha: boolean, invertY: boolean): void; + initVideoTextureData(texture: WebGLInternalTex): void; + setTexturePixelsData(texture: WebGLInternalTex, source: ArrayBufferView, premultiplyAlpha: boolean, invertY: boolean): void; + setTextureSubPixelsData(texture: WebGLInternalTex, source: ArrayBufferView, mipmapLevel: number, generateMipmap: boolean, xOffset: number, yOffset: number, width: number, height: number, premultiplyAlpha: boolean, invertY: boolean): void; + setTextureDDSData(texture: WebGLInternalTex, ddsInfo: DDSTextureInfo): void; + setTextureKTXData(texture: WebGLInternalTex, ktxInfo: KTXTextureInfo): void; + setTextureHDRData(texture: WebGLInternalTex, hdrInfo: HDRTextureInfo): void; + setCubeImageData(texture: WebGLInternalTex, sources: (HTMLImageElement | HTMLCanvasElement | ImageBitmap)[], premultiplyAlpha: boolean, invertY: boolean): void; + setCubePixelsData(texture: WebGLInternalTex, source: ArrayBufferView[], premultiplyAlpha: boolean, invertY: boolean): void; + setCubeSubPixelData(texture: WebGLInternalTex, source: ArrayBufferView[], mipmapLevel: number, generateMipmap: boolean, xOffset: number, yOffset: number, width: number, height: number, premultiplyAlpha: boolean, invertY: boolean): void; + setCubeDDSData(texture: WebGLInternalTex, ddsInfo: DDSTextureInfo): void; + setCubeKTXData(texture: WebGLInternalTex, ktxInfo: KTXTextureInfo): void; + setTextureCompareMode(texture: WebGLInternalTex, compareMode: TextureCompareMode): TextureCompareMode; + currentActiveRT: WebGLInternalRT; + bindRenderTarget(renderTarget: WebGLInternalRT, faceIndex?: number): void; + bindoutScreenTarget(): void; + unbindRenderTarget(renderTarget: WebGLInternalRT): void; + createRenderTextureCubeInternal(dimension: TextureDimension, size: number, format: RenderTargetFormat, generateMipmap: boolean, sRGB: boolean): WebGLInternalTex; + createRenderTargetInternal(width: number, height: number, colorFormat: RenderTargetFormat, depthStencilFormat: RenderTargetFormat, generateMipmap: boolean, sRGB: boolean, multiSamples: number): WebGLInternalRT; + createRenderTargetCubeInternal(size: number, colorFormat: RenderTargetFormat, depthStencilFormat: RenderTargetFormat, generateMipmap: boolean, sRGB: boolean, multiSamples: number): WebGLInternalRT; + createRenderbuffer(width: number, height: number, internalFormat: number, samples: number): WebGLRenderbuffer; + protected createRenderTextureInternal(dimension: TextureDimension, width: number, height: number, format: RenderTargetFormat, generateMipmap: boolean, sRGB: boolean): WebGLInternalTex; + createRenderTargetDepthTexture(renderTarget: WebGLInternalRT, dimension: TextureDimension, width: number, height: number): WebGLInternalTex; + /** + * @deprecated 请使用readRenderTargetPixelDataAsync函数代替 + * @param renderTarget + * @param xOffset + * @param yOffset + * @param width + * @param height + * @param out + * @returns + */ + readRenderTargetPixelData(renderTarget: WebGLInternalRT, xOffset: number, yOffset: number, width: number, height: number, out: ArrayBufferView): ArrayBufferView; + readRenderTargetPixelDataAsync(renderTarget: WebGLInternalRT, xOffset: number, yOffset: number, width: number, height: number, out: ArrayBufferView): Promise; + updateVideoTexture(texture: WebGLInternalTex, video: HTMLVideoElement, premultiplyAlpha: boolean, invertY: boolean): void; + } + class WebGLBufferState implements IBufferState { + static _curBindedBufferState: WebGLBufferState; + _glVertexState: GLVertexState; + _bindedIndexBuffer: WebGLIndexBuffer; + _vertexBuffers: WebGLVertexBuffer[]; + constructor(); + private applyVertexBuffers; + protected applyIndexBuffers(): void; + applyState(vertexBuffers: WebGLVertexBuffer[], indexBuffer: WebGLIndexBuffer): void; + /** + * @private + */ + bind(): void; + /** + * @private + */ + unBind(): void; + isBind(): boolean; + destroy(): void; + } + class WebGLCommandUniformMap extends CommandUniformMap { + _stateName: string; + constructor(stateName: string); + hasPtrID(propertyID: number): boolean; + /** + * 增加一个Uniform + */ + addShaderBlockUniform(propertyID: number, blockname: string, blockProperty: UniformProperty[]): void; + } + /** + * 封装Webgl + */ + class WebGLEngine extends EventDispatcher implements IRenderEngine { + static _lastFrameBuffer: WebGLInternalRT; + static _lastFrameBuffer_WebGLOBJ: WebGLFramebuffer; + _context: WebGLRenderingContext | WebGL2RenderingContext; + private _lost; + get lost(): boolean; + private _config; + private _isWebGL2; + private _webglMode; + _enableStatistics: boolean; + private _GLBufferBindMap; + private _curUBOPointer; + private _GLUBOPointerMap; + private _GLBindPointerUBOMap; + private _lastViewport; + private _lastScissor; + private _scissorState; + private _lastClearColor; + private _lastClearDepth; + private _globalWidth; + private _globalHeight; + private _GLParams; + private _GLTextureContext; + private _GLRenderDrawContext; + _remapZ: boolean; + _screenInvertY: boolean; + _lodTextureSample: boolean; + _breakTextureSample: boolean; + _GLRenderState: GLRenderState; + private _GLStatisticsInfo; + static instance: WebGLEngine; + constructor(config: WebGLConfig, webglMode?: WebGLMode); + endFrame(): void; + getInnerWidth(): any; + getInnerHeight(): any; + resizeOffScreen(width: number, height: number): void; + addTexGammaDefine(key: number, value: ShaderDefine): void; + /** + * GL Context + */ + get gl(): WebGLRenderingContext | WebGL2RenderingContext; + get isWebGL2(): boolean; + get webglConfig(): WebGLConfig; + private _initStatisticsInfo; + /** + * create GL + * @param canvas + */ + initRenderEngine(canvas: any): void; + webglContextLost(e: any): void; + private _initBindBufferMap; + _getbindBuffer(target: BufferTargetType): GLBuffer; + _setbindBuffer(target: BufferTargetType, buffer: GLBuffer | null): void; + getCapable(capatableType: RenderCapable): boolean; + viewport(x: number, y: number, width: number, height: number): void; + scissor(x: number, y: number, width: number, height: number): void; + scissorTest(value: boolean): void; + clearRenderTexture(clearFlag: RenderClearFlag, clearcolor?: Color, clearDepth?: number, clearStencilValue?: number): void; + copySubFrameBuffertoTex(texture: WebGLInternalTex, level: number, xoffset: number, yoffset: number, x: number, y: number, width: number, height: number): void; + colorMask(r: boolean, g: boolean, b: boolean, a: boolean): void; + getParams(params: RenderParams): number; + createBuffer(targetType: BufferTargetType, bufferUsageType: BufferUsage): GLBuffer; + createShaderInstance(vs: string, ps: string, attributeMap: { + [name: string]: [ + number, + ShaderDataType + ]; + }): GLShaderInstance; + createVertexState(): GLVertexState; + getUBOPointer(name: string): number; + getTextureContext(): ITextureContext; + getDrawContext(): GLRenderDrawContext; + getCreateRenderOBJContext(): IRenderEngineFactory; + /** + * 通过Shader属性名称获得唯一ID。 + * @param name Shader属性名称。 + * @return 唯一ID。 + */ + propertyNameToID(name: string): number; + propertyIDToName(id: number): string; + getNamesByDefineData(defineData: IDefineDatas, out: Array): void; + /** + * 注册宏定义。 + * @param name + */ + getDefineByName(name: string): ShaderDefine; + unbindVertexState(): void; + } + class GLBuffer extends GLObject { + _glBuffer: WebGLBuffer; + _glTarget: number; + _glUsage: number; + _glTargetType: BufferTargetType; + _glBufferUsageType: BufferUsage; + _byteLength: number; + constructor(engine: WebGLEngine, targetType: BufferTargetType, bufferUsageType: BufferUsage); + private _getGLUsage; + private _getGLTarget; + private _memorychange; + bindBuffer(): boolean; + unbindBuffer(): void; + orphanStorage(): void; + setDataLength(srcData: number): void; + setData(srcData: ArrayBuffer | ArrayBufferView, offset: number): void; + setDataEx(srcData: ArrayBuffer | ArrayBufferView, offset: number, length: number): void; + bindBufferBase(glPointer: number): void; + bindBufferRange(glPointer: number, offset: number, byteCount: number): void; + resizeBuffer(dataLength: number): void; + destroy(): void; + } + class GlCapable { + constructor(glEngine: WebGLEngine); + private initCapable; + private initExtension; + getCapable(type: RenderCapable): boolean; + getExtension(type: WebGLExtension): any; + } + enum WebGLExtension { + OES_vertex_array_object = 0, + ANGLE_instanced_arrays = 1, + OES_texture_half_float = 2, + OES_texture_half_float_linear = 3, + OES_texture_float = 4, + OES_element_index_uint = 5, + OES_texture_float_linear = 6, + EXT_color_buffer_half_float = 7, + EXT_shader_texture_lod = 8, + WEBGL_depth_texture = 9, + EXT_sRGB = 10, + EXT_color_buffer_float = 11, + EXT_texture_filter_anisotropic = 12, + WEBGL_compressed_texture_s3tc = 13, + WEBGL_compressed_texture_s3tc_srgb = 14, + WEBGL_compressed_texture_pvrtc = 15, + WEBGL_compressed_texture_etc1 = 16, + WEBGL_compressed_texture_etc = 17, + WEBGL_compressed_texture_astc = 18, + OES_standard_derivatives = 19 + } + /** + * WebGL mode. + */ + enum WebGLMode { + /** Auto, use WebGL2.0 if support, or will fallback to WebGL1.0. */ + Auto = 0, + /** WebGL2.0. */ + WebGL2 = 1, + /** WebGL1.0, */ + WebGL1 = 2 + } + /** + * WebglObject 基类 + */ + class GLObject { + protected _engine: WebGLEngine; + protected _gl: WebGLRenderingContext | WebGL2RenderingContext; + protected _id: number; + protected _destroyed: boolean; + constructor(engine: WebGLEngine); + get destroyed(): boolean; + /** + * destroy + * @override + * @returns + */ + destroy(): void; + } + /** + * + */ + class GLParams { + _engine: WebGLEngine; + _gl: WebGLRenderingContext | WebGL2RenderingContext; + _glParamsData: Map; + constructor(engine: WebGLEngine); + private _initParams; + getParams(params: RenderParams): number; + } + class GLRenderDrawContext extends GLObject { + constructor(engine: WebGLEngine); + } + class GLRenderState { + /** + * intance glRenderState + * @param engine + */ + constructor(engine: WebGLEngine); + /** + * init + */ + private _initState; + /** + * get gl blend factor + * @param factor + * @returns + */ + _getBlendFactor(factor: BlendFactor): 0 | 1 | 768 | 769 | 774 | 775 | 770 | 771 | 772 | 773 | 776 | 32769 | 32770; + /** + * get gl blend operation + * @param factor + * @returns + */ + _getBlendOperation(factor: BlendEquationSeparate): 32774 | 32778 | 32779; + /** + * get gl compare fun factor + * @param compareFunction + * @returns + */ + _getGLCompareFunction(compareFunction: CompareFunction): number; + /** + * get gl stencil operation + * @param compareFunction + * @returns + */ + _getGLStencilOperation(compareFunction: StencilOperation): number; + /** + * get gl frontface factor + * @param cullmode + * @returns + */ + _getGLFrontfaceFactor(cullmode: CullMode): 2305 | 2304; + /** + * 模板写入开关 + * @param value + */ + setStencilMask(value: boolean): void; + } + class GLShaderInstance extends GLObject { + _engine: WebGLEngine; + _gl: WebGLRenderingContext | WebGL2RenderingContext; + constructor(engine: WebGLEngine, vs: string, ps: string, attributeMap: { + [name: string]: [ + number, + ShaderDataType + ]; + }); + private _create; + private _legalUBObyteLength; + getUniformMap(): ShaderVariable[]; + _uniform_sampler2DArray(one: any, texture: BaseTexture): number; + _uniform_sampler3D(one: any, texture: BaseTexture): number; + destroy(): void; + } + class GLVertexState extends GLObject { + private _angleInstancedArrays; + private _vaoExt; + private _vao; + _vertexDeclaration: { + [key: number]: VertexStateContext; + }[]; + _bindedIndexBuffer: WebGLIndexBuffer; + _vertexBuffers: WebGLVertexBuffer[]; + constructor(engine: WebGLEngine); + applyVertexBuffer(vertexBuffer: WebGLVertexBuffer[]): void; + clearVAO(): void; + applyIndexBuffer(indexBuffer: WebGLIndexBuffer | null): void; + } + class VertexArrayObject { + constructor(); + } + /** + * init Webgl option + */ + class WebGLConfig { + stencil: boolean; + alpha: boolean; + depth: boolean; + antialias: boolean; + failIfMajorPerformanceCaveat: boolean; + premultipliedAlpha: boolean; + preserveDrawingBuffer: boolean; + powerPreference: WebGLPowerPreference; + } + class WebGLIndexBuffer implements IIndexBuffer { + _glBuffer: GLBuffer; + indexType: IndexFormat; + indexCount: number; + constructor(targetType: BufferTargetType, bufferUsageType: BufferUsage); + private _changeMemory; + _setIndexDataLength(data: number): void; + _setIndexData(data: Uint32Array | Uint16Array | Uint8Array, bufferOffset: number): void; + destroy(): void; + } + class WebGLInternalRT extends GLObject implements InternalRenderTarget { + _gl: WebGLRenderingContext | WebGL2RenderingContext; + _framebuffer: WebGLFramebuffer; + _depthbuffer: WebGLRenderbuffer; + _msaaFramebuffer: WebGLFramebuffer; + _msaaRenderbuffer: WebGLRenderbuffer; + _isCube: boolean; + _samples: number; + _generateMipmap: boolean; + _textures: InternalTexture[]; + _depthTexture: InternalTexture; + colorFormat: RenderTargetFormat; + depthStencilFormat: RenderTargetFormat; + isSRGB: boolean; + /**bytelength */ + _gpuMemory: number; + get gpuMemory(): number; + set gpuMemory(value: number); + private _changeTexMemory; + constructor(engine: WebGLEngine, colorFormat: RenderTargetFormat, depthStencilFormat: RenderTargetFormat, isCube: boolean, generateMipmap: boolean, samples: number); + dispose(): void; + } + class WebGLRenderDeviceFactory implements IRenderDeviceFactory { + createShaderData(ownerResource?: Resource): ShaderData; + createShaderInstance(shaderProcessInfo: ShaderProcessInfo, shaderPass: ShaderPass): IShaderInstance; + createIndexBuffer(bufferUsageType: BufferUsage): IIndexBuffer; + createVertexBuffer(bufferUsageType: BufferUsage): IVertexBuffer; + createBufferState(): IBufferState; + createRenderGeometryElement(mode: MeshTopology, drawType: DrawType): IRenderGeometryElement; + private globalBlockMap; + createGlobalUniformMap(blockName: string): WebGLCommandUniformMap; + createEngine(config: Config, canvas: any): Promise; + /**@private test function*/ + private _replaceWebglcall; + } + class WebGLRenderEngineFactory implements IRenderEngineFactory { + createUniformBufferObject(glPointer: number, name: string, bufferUsage: BufferUsage, byteLength: number, isSingle: boolean): UniformBufferObject; + createEngine(config: any, canvas: any): Promise; + /**@private test function*/ + private _replaceWebglcall; + } + class WebGLRenderGeometryElement implements IRenderGeometryElement { + private static _idCounter; + /** + * index format + */ + get indexFormat(): IndexFormat; + set indexFormat(value: IndexFormat); + /** + * Mesh Topology mode + */ + get mode(): MeshTopology; + set mode(value: MeshTopology); + cloneTo(obj: WebGLRenderGeometryElement): void; + } + /** + * ShaderInstance 类用于实现ShaderInstance。 + */ + class WebGLShaderInstance implements IShaderInstance { + private _renderShaderInstance; + /** + * 创建一个 ShaderInstance 实例。 + */ + constructor(); + /** + * get complete + */ + get complete(): boolean; + _create(shaderProcessInfo: ShaderProcessInfo, shaderPass: ShaderPass): void; + private hasSpritePtrID; + /** + * @inheritDoc + * @override + */ + _disposeResource(): void; + /** + * apply shader programe + * @returns + */ + bind(): boolean; + /** + * upload uniform data + * @param shaderUniform + * @param shaderDatas + * @param uploadUnTexture + */ + uploadUniforms(shaderUniform: CommandEncoder, shaderDatas: WebGLShaderData, uploadUnTexture: boolean): void; + /** + * set blend depth stencil RenderState + * @param shaderDatas + */ + uploadRenderStateBlendDepth(shaderDatas: WebGLShaderData): void; + /** + * set blend depth stencil RenderState frome Shader + * @param shaderDatas + */ + uploadRenderStateBlendDepthByShader(shaderDatas: WebGLShaderData): void; + /** + * set blend depth stencil RenderState frome Material + * @param shaderDatas + */ + uploadRenderStateBlendDepthByMaterial(shaderDatas: ShaderData): void; + } + class WebGLVertexBuffer implements IVertexBuffer { + _glBuffer: GLBuffer; + private _vertexDeclaration; + get vertexDeclaration(): VertexDeclaration; + set vertexDeclaration(value: VertexDeclaration); + instanceBuffer: boolean; + constructor(targetType: BufferTargetType, bufferUsageType: BufferUsage); + private _changeMemory; + setDataLength(byteLength: number): void; + setData(buffer: ArrayBuffer, bufferOffset: number, dataStartIndex: number, dataCount: number): void; + /** + * @private + */ + bind(): boolean; + unbind(): void; + /** + * 剥离内存块存储。 + */ + orphanStorage(): void; + destroy(): void; + } + class WebGPURender2DProcess implements I2DRenderPassFactory { + createRenderElement2D(): IRenderElement2D; + createRenderContext2D(): IRenderContext2D; + } + /** + * WebGPU渲染上下文(2D) + */ + class WebGPURenderContext2D implements IRenderContext2D { + device: GPUDevice; + destRT: WebGPUInternalRT; + invertY: boolean; + pipelineMode: string; + sceneData: WebGPUShaderData; + cameraData: WebGPUShaderData; + _globalConfigShaderData: WebDefineDatas; + renderCommand: WebGPURenderCommandEncoder; + pipelineCache: any[]; + private _offscreenWidth; + private _offscreenHeight; + private _needClearColor; + private _needStart; + private _viewport; + private _clearColor; + constructor(); + drawRenderElementList(list: FastSinglelist): number; + setOffscreenView(width: number, height: number): void; + setRenderTarget(value: WebGPUInternalRT, clear: boolean, clearColor: Color): void; + drawRenderElementOne(node: WebGPURenderElement2D): void; + /** + * 提交渲染命令 + */ + private _submit; + /** + * 设置屏幕渲染目标 + */ + private _setScreenRT; + /** + * 准备录制渲染命令 + */ + private _start; + } + class WebGPURenderElement2D implements IRenderElement2D, IRenderPipelineInfo { + static _sceneShaderData: WebGPUShaderData; + static _value2DShaderData: WebGPUShaderData; + static _materialShaderData: WebGPUShaderData; + static _compileDefine: WebDefineDatas; + static _defineStrings: Array; + protected _sceneData: WebGPUShaderData; + protected _cameraData: WebGPUShaderData; + materialShaderData: WebGPUShaderData; + value2DShaderData: WebGPUShaderData; + subShader: SubShader; + geometry: WebGPURenderGeometry; + blendState: WebGPUBlendStateCache; + depthStencilState: WebGPUDepthStencilStateCache; + cullMode: CullMode; + frontFace: FrontFace; + protected _stateKey: string[]; + protected _pipeline: GPURenderPipeline[]; + protected _shaderInstances: WebGPUShaderInstance[]; + protected _passNum: number; + protected _passName: string; + protected _passIndex: number[]; + protected _shaderDataState: { + [key: string]: number[]; + }; + protected _shaderDataObject: { + [key: string]: number[]; + }; + bundleId: number; + needClearBundle: boolean; + static bundleIdCounter: number; + isStatic: boolean; + staticChange: boolean; + globalId: number; + objectName: string; + constructor(); + renderStateIsBySprite: boolean; + /** + * 获取渲染通道的uniform + * @param shaderpass + * @param defineData + */ + private _getShaderPassUniform; + /** + * 收集uniform + * @param compileDefine + */ + protected _collectUniform(compileDefine: WebDefineDatas): { + uniformMap: WebGPUUniformMapType; + arrayMap: NameNumberMap; + }; + /** + * 编译着色器 + * @param context + */ + protected _compileShader(context: WebGPURenderContext2D): void; + /** + * 计算状态值 + * @param shaderInstance + * @param dest + * @param context + */ + protected _calcStateKey(shaderInstance: WebGPUShaderInstance, dest: WebGPUInternalRT, context: WebGPURenderContext2D): string; + /** + * 获取渲染管线 + * @param shaderInstance + * @param dest + * @param context + * @param entries + * @param stateKey + */ + protected _getWebGPURenderPipeline(shaderInstance: WebGPUShaderInstance, dest: WebGPUInternalRT, context: WebGPURenderContext2D, entries: any, stateKey?: string): GPURenderPipeline; + /** + * 获取混合状态 + * @param shaderInstance + */ + private _getBlendState; + private _getRenderStateBlendByShader; + private _getRenderStateBlendByMaterial; + /** + * 获取深度缓存状态 + * @param shaderInstance + * @param dest + */ + private _getDepthStencilState; + private _getRenderStateDepthByShader; + private _getRenderStateDepthByMaterial; + private _getCullFrontMode; + /** + * 着色器数据是否改变 + * @param context + */ + protected _isShaderDataChange(context: WebGPURenderContext2D): boolean; + /** + * 创建绑定组布局 + * @param shaderInstance + */ + protected _createBindGroupLayout(shaderInstance: WebGPUShaderInstance): any[]; + /** + * 绑定资源组 + * @param shaderInstance + * @param command + */ + protected _bindGroup(shaderInstance: WebGPUShaderInstance, command: WebGPURenderCommandEncoder): void; + /** + * 上传uniform数据 + */ + protected _uploadUniform(): void; + /** + * 上传几何数据 + * @param command + */ + protected _uploadGeometry(command: WebGPURenderCommandEncoder): number; + /** + * 用于创建渲染管线的函数 + * @param index + * @param context + * @param shaderInstance + * @param command + * @param stateKey + */ + protected _createPipeline(index: number, context: WebGPURenderContext2D, shaderInstance: WebGPUShaderInstance, command: WebGPURenderCommandEncoder, stateKey?: string): GPURenderPipeline; + /** + * 提取当前渲染通道 + * @param pipelineMode + */ + private _takeCurPass; + /** + * 准备渲染 + * @param context + */ + prepare(context: WebGPURenderContext2D): boolean; + /** + * 渲染 + * @param context + * @param command + */ + render(context: WebGPURenderContext2D, command: WebGPURenderCommandEncoder): number; + /** + * 销毁 + */ + destroy(): void; + } + class WebGPU3DRenderPass implements IRender3DProcess { + private _renderPass; + globalId: number; + objectName: string; + constructor(); + render3DManager: WebSceneRenderManager; + /** + * 初始化渲染流程 + * @param camera + * @param context + */ + private _initRenderPass; + /** + * 渲染深度图设置 + * @param camera + */ + private _renderDepth; + /** + * 前向渲染流程 + * @param context + * @param renderPass + * @param list + * @param count + */ + private _renderForwardAddCameraPass; + /** + * 渲染命令 + * @param cmds + * @param context + */ + private _renderCmd; + /** + * 渲染后处理效果 + * @param postprocessCMD + * @param context + */ + private _renderPostProcess; + /** + * 前向渲染 + * @param context + * @param camera + */ + fowardRender(context: WebGPURenderContext3D, camera: Camera): void; + /** + * 销毁 + */ + destroy(): void; + } + /** + * WebGPU渲染工厂类 + */ + class WebGPU3DRenderPassFactory implements I3DRenderPassFactory { + createInstanceBatch(): IInstanceRenderBatch; + createRender3DProcess(): IRender3DProcess; + createRenderContext3D(): IRenderContext3D; + createRenderElement3D(): IRenderElement3D; + createInstanceRenderElement3D(): WebGPUInstanceRenderElement3D; + createSkinRenderElement(): ISkinRenderElement3D; + createSceneRenderManager(): WebSceneRenderManager; + createDrawNodeCMDData(): DrawNodeCMDData; + createBlitQuadCMDData(): BlitQuadCMDData; + createDrawElementCMDData(): DrawElementCMDData; + createSetViewportCMD(): SetViewportCMD; + createSetRenderTargetCMD(): SetRenderTargetCMD; + createSetRenderDataCMD(): SetRenderDataCMD; + createSetShaderDefineCMD(): SetShaderDefineCMD; + } + /** + * WebGPU全局上下文 + */ + class WebGPUContext { + static lastBundle: WebGPURenderBundle; + static lastCommand: WebGPURenderCommandEncoder; + static lastBundlePipeline: GPURenderPipeline; + static lastCommandPipeline: GPURenderPipeline; + static lastBundleGeometry: WebGPURenderGeometry; + static lastCommandGeometry: WebGPURenderGeometry; + /** + * 开始渲染(清空历史数据) + */ + static startRender(): void; + /** + * 清空上次打包数据 + */ + static clearLastBundle(): void; + /** + * 清空上次命令数据 + */ + static clearLastCommand(): void; + /** + * 设置打包管线 + * @param bundle + * @param pipeline + */ + static setBundlePipeline(bundle: WebGPURenderBundle, pipeline: GPURenderPipeline): void; + /** + * 设置命令管线 + * @param command + * @param pipeline + */ + static setCommandPipeline(command: WebGPURenderCommandEncoder, pipeline: GPURenderPipeline): void; + /** + * 设置打包几何数据 + * @param bundle + * @param geometry + */ + static applyBundleGeometry(bundle: WebGPURenderBundle, geometry: WebGPURenderGeometry): number; + /** + * 设置打包几何数据(部分) + * @param bundle + * @param geometry + * @param part + */ + static applyBundleGeometryPart(bundle: WebGPURenderBundle, geometry: WebGPURenderGeometry, part: number): number; + /** + * 设置命令几何数据 + * @param command + * @param geometry + */ + static applyCommandGeometry(command: WebGPURenderCommandEncoder, geometry: WebGPURenderGeometry): number; + /** + * 设置命令几何数据(部分) + * @param command + * @param geometry + * @param part + */ + static applyCommandGeometryPart(command: WebGPURenderCommandEncoder, geometry: WebGPURenderGeometry, part: number): number; + } + /** + * 线性光源阴影渲染流程 + */ + class WebGPUDirectLightShadowRP { + camera: WebCameraNodeData; + destTarget: InternalRenderTarget; + private _shadowCasterCommanBuffer; + get shadowCasterCommanBuffer(): CommandBuffer[]; + set shadowCasterCommanBuffer(value: CommandBuffer[]); + set light(value: WebDirectLight); + get light(): WebDirectLight; + constructor(); + /** + * 更新 + * @param context + */ + update(context: WebGPURenderContext3D): void; + /** + * 渲染 + * @param context + * @param list + * @param count + */ + render(context: WebGPURenderContext3D, list: WebBaseRenderNode[], count: number): void; + /** + * 设置渲染数据 + * @param sceneData + * @param cameraData + */ + private _applyRenderData; + /** + * 应用阴影渲染命令 + * @param context + */ + private _applyCasterPassCommandBuffer; + /** + * 获取阴影偏移 + * @param shadowProjectionMatrix + * @param shadowResolution + * @param out + */ + private _getShadowBias; + /** + * 设置阴影级联数据模式 + * @param shaderData + * @param shadowSliceData + * @param lightParam + * @param shadowBias + */ + private _setupShadowCasterShaderValues; + } + /** + * WebGPU前向渲染流程 + */ + class WebGPUForwardAddClusterRP extends ForwardAddClusterRP { + /** + * 主渲染流程 + * @param context + */ + protected _mainPass(context: IRenderContext3D): void; + } + class WebGPUForwardAddRP { + /**是否开启阴影 */ + shadowCastPass: boolean; + enablePostProcess: boolean; + /**main pass */ + renderPass: WebGPUForwardAddClusterRP; + /**directlight shadow */ + directLightShadowPass: WebGPUDirectLightShadowRP; + /**enable directlight */ + enableDirectLightShadow: boolean; + /**spot shadow */ + spotLightShadowPass: WebGPUSpotLightShadowRP; + /**enable spot */ + enableSpotLightShadowPass: boolean; + shadowParams: Vector4; + finalize: CommandBuffer; + constructor(); + /** + * 设置后处理之前绘制的渲染命令 + */ + setBeforeImageEffect(value: CommandBuffer[]): void; + /** + * 设置所有渲染都结束后绘制的渲染命令 + */ + setAfterEventCmd(value: CommandBuffer[]): void; + } + /** + * 动态合批 + */ + class WebGPUInstanceRenderBatch implements IInstanceRenderBatch { + static MaxInstanceCount: number; + private recoverList; + private _batchOpaqueMarks; + private _updateCountMark; + constructor(); + getBatchMark(element: IRenderElement3D): any; + batch(elements: SingletonList): void; + clearRenderData(): void; + recoverData(): void; + } + interface WebGPUInstanceStateInfo { + state: WebGPUBufferState; + worldInstanceVB?: WebGPUVertexBuffer; + simpleAnimatorVB?: WebGPUVertexBuffer; + lightmapScaleOffsetVB?: WebGPUVertexBuffer; + } + class WebGPUInstanceRenderElement3D extends WebGPURenderElement3D implements IInstanceRenderElement3D { + static getInstanceBufferState(stateinfo: WebGPUInstanceStateInfo, geometry: WebGPURenderGeometry, renderType: number, spriteDefine: WebDefineDatas): WebGPUInstanceStateInfo; + static MaxInstanceCount: number; + private static _pool; + static create(): WebGPUInstanceRenderElement3D; + private static _bufferPool; + static _instanceBufferCreate(length: number): Float32Array; + instanceElementList: SingletonList; + private _vertexBuffers; + private _updateData; + private _updateDataNum; + private _instanceStateInfo; + drawCount: number; + updateNums: number; + constructor(); + addUpdateBuffer(vb: WebGPUVertexBuffer, length: number): void; + getUpdateData(index: number, length: number): Float32Array; + /** + * 计算状态值 + * @param shaderInstance + * @param dest + * @param context + */ + protected _calcStateKey(shaderInstance: WebGPUShaderInstance, dest: WebGPUInternalRT, context: WebGPURenderContext3D): string; + /** + * 着色器数据是否改变 + * @param context + */ + protected _isShaderDataChange(context: WebGPURenderContext3D): boolean; + protected _compileShader(context: WebGPURenderContext3D): void; + /** + * 创建绑定组布局 + * @param shaderInstance + */ + protected _createBindGroupLayout(shaderInstance: WebGPUShaderInstance): any[]; + /** + * 绑定资源组 + * @param shaderInstance + * @param command + * @param bundle + */ + protected _bindGroup(shaderInstance: WebGPUShaderInstance, command: WebGPURenderCommandEncoder, bundle: WebGPURenderBundle): void; + /** + * 上传uniform数据 + */ + protected _uploadUniform(): void; + private _updateInstanceData; + /** + * 设置几何对象 + * @param geometry + */ + setGeometry(geometry: WebGPURenderGeometry): void; + /** + * 上传几何数据 + * @param command + * @param bundle + */ + protected _uploadGeometry(command: WebGPURenderCommandEncoder, bundle: WebGPURenderBundle): number; + /** + * 清理单次渲染生成的数据 + */ + clearRenderData(): void; + /** + * 回收 + */ + recover(): void; + } + class WebGPUBlitQuadCMDData extends BlitQuadCMDData { + type: RenderCMDType; + private _sourceTexelSize; + protected _dest: WebGPUInternalRT; + protected _viewport: Viewport; + protected _source: InternalTexture; + protected _scissor: Vector4; + protected _offsetScale: Vector4; + protected _element: WebGPURenderElement3D; + get dest(): WebGPUInternalRT; + set dest(value: WebGPUInternalRT); + get viewport(): Viewport; + set viewport(value: Viewport); + get scissor(): Vector4; + set scissor(value: Vector4); + get source(): InternalTexture; + set source(value: InternalTexture); + get offsetScale(): Vector4; + set offsetScale(value: Vector4); + get element(): WebGPURenderElement3D; + set element(value: WebGPURenderElement3D); + constructor(); + apply(context: WebGPURenderContext3D): void; + } + class WebGPUDrawElementCMDData extends DrawElementCMDData { + type: RenderCMDType; + private _elemets; + constructor(); + setRenderelements(value: WebGPURenderElement3D[]): void; + apply(context: WebGPURenderContext3D): void; + } + class WebGPUDrawNodeCMDData extends DrawNodeCMDData { + type: RenderCMDType; + protected _node: WebBaseRenderNode; + protected _destShaderData: WebGPUShaderData; + protected _destSubShader: SubShader; + protected _subMeshIndex: number; + get node(): WebBaseRenderNode; + set node(value: WebBaseRenderNode); + get destShaderData(): WebGPUShaderData; + set destShaderData(value: WebGPUShaderData); + get destSubShader(): SubShader; + set destSubShader(value: SubShader); + get subMeshIndex(): number; + set subMeshIndex(value: number); + constructor(); + apply(context: WebGPURenderContext3D): void; + } + class WebGPUSetRenderData extends SetRenderDataCMD { + type: RenderCMDType; + protected _dataType: ShaderDataType; + protected _propertyID: number; + protected _dest: WebGPUShaderData; + protected _value: ShaderDataItem; + data_v2: Vector2; + data_v3: Vector3; + data_v4: Vector4; + data_mat3: Matrix3x3; + data_mat4: Matrix4x4; + data_color: Color; + data_number: number; + data_texture: BaseTexture; + data_buffer: Float32Array; + get dataType(): ShaderDataType; + set dataType(value: ShaderDataType); + get propertyID(): number; + set propertyID(value: number); + get dest(): WebGPUShaderData; + set dest(value: WebGPUShaderData); + get value(): ShaderDataItem; + set value(value: ShaderDataItem); + constructor(); + apply(context: WebGPURenderContext3D): void; + } + class WebGPUSetRenderTargetCMD extends SetRenderTargetCMD { + type: RenderCMDType; + protected _rt: WebGPUInternalRT; + protected _clearFlag: number; + protected _clearColorValue: Color; + protected _clearDepthValue: number; + protected _clearStencilValue: number; + get rt(): WebGPUInternalRT; + set rt(value: WebGPUInternalRT); + get clearFlag(): number; + set clearFlag(value: number); + get clearColorValue(): Color; + set clearColorValue(value: Color); + get clearDepthValue(): number; + set clearDepthValue(value: number); + get clearStencilValue(): number; + set clearStencilValue(value: number); + constructor(); + apply(context: WebGPURenderContext3D): void; + } + class WebGPUSetShaderDefine extends SetShaderDefineCMD { + type: RenderCMDType; + protected _define: ShaderDefine; + protected _dest: WebGPUShaderData; + protected _add: boolean; + get define(): ShaderDefine; + set define(value: ShaderDefine); + get dest(): WebGPUShaderData; + set dest(value: WebGPUShaderData); + get add(): boolean; + set add(value: boolean); + constructor(); + apply(context: WebGPURenderContext3D): void; + } + class WebGPUSetViewportCMD extends SetViewportCMD { + type: RenderCMDType; + protected _viewport: Viewport; + protected _scissor: Vector4; + get viewport(): Viewport; + set viewport(value: Viewport); + get scissor(): Vector4; + set scissor(value: Vector4); + constructor(); + apply(context: WebGPURenderContext3D): void; + } + /** + * WebGPU渲染上下文 + */ + class WebGPURenderContext3D implements IRenderContext3D { + globalConfigShaderData: WebDefineDatas; + device: GPUDevice; + frameCount: number; + bundleHit: number; + needRemoveBundle: number[]; + bundleManagerSets: Map; + destRT: WebGPUInternalRT; + blitFrameCount: number; + blitScreen: boolean; + renderCommand: WebGPURenderCommandEncoder; + pipelineCache: any[]; + private _viewScissorSaved; + private _viewPortSave; + private _scissorSave; + globalId: number; + objectName: string; + constructor(); + get sceneData(): WebGPUShaderData; + set sceneData(value: WebGPUShaderData); + get cameraData(): WebGPUShaderData; + set cameraData(value: WebGPUShaderData); + get sceneModuleData(): WebSceneNodeData; + set sceneModuleData(value: WebSceneNodeData); + get cameraModuleData(): WebCameraNodeData; + set cameraModuleData(value: WebCameraNodeData); + get globalShaderData(): WebGPUShaderData; + set globalShaderData(value: WebGPUShaderData); + get sceneUpdataMask(): number; + set sceneUpdataMask(value: number); + get cameraUpdateMask(): number; + set cameraUpdateMask(value: number); + get pipelineMode(): PipelineMode; + set pipelineMode(value: PipelineMode); + get invertY(): boolean; + set invertY(value: boolean); + /** + * 设置渲染目标 + * @param rt + * @param clearFlag + */ + setRenderTarget(rt: WebGPUInternalRT, clearFlag: RenderClearFlag): void; + /** + * 设置视口 + * @param value + */ + setViewPort(value: Viewport): void; + /** + * 设置裁剪 + * @param value + */ + setScissor(value: Vector4): void; + /** + * 保存视口 + */ + saveViewPortAndScissor(): void; + /** + * 恢复视口 + */ + restoreViewPortAndScissor(): void; + /** + * 设置清除参数 + * @param flag + * @param color + * @param depth + * @param stencil + */ + setClearData(flag: number, color: Color, depth: number, stencil: number): number; + /** + * 得到GPUBuffer改变的通知 + */ + notifyGPUBufferChange(): void; + /** + * 获取指令缓存组的key + */ + getBundleManagerKey(): string; + /** + * 渲染一组节点 + * @param list + */ + drawRenderElementList(list: FastSinglelist): number; + /** + * 渲染一个节点 + * @param node + */ + drawRenderElementOne(node: WebGPURenderElement3D): number; + /** + * 执行命令列表 + * @param cmds + */ + runCMDList(cmds: IRenderCMD[]): void; + /** + * 执行单个命令 + * @param cmd + */ + runOneCMD(cmd: IRenderCMD): void; + /** + * 清除渲染目标(空白绘制,用于清除颜色或深度缓存) + */ + clearRenderTarget(): void; + /** + * 设置屏幕渲染目标 + */ + private _setScreenRT; + /** + * 准备录制渲染命令 + * @param viewPortAndScissor + */ + private _start; + /** + * 提交渲染命令 + */ + private _submit; + /** + * 销毁 + */ + destroy(): void; + } + /** + * 基本渲染单元 + */ + class WebGPURenderElement3D implements IRenderElement3D, IRenderPipelineInfo { + static _renderShaderData: WebGPUShaderData; + static _compileDefine: WebDefineDatas; + static _defineStrings: Array; + protected _sceneData: WebGPUShaderData; + protected _cameraData: WebGPUShaderData; + renderShaderData: WebGPUShaderData; + materialShaderData: WebGPUShaderData; + materialRenderQueue: number; + materialId: number; + transform: Transform3D; + canDynamicBatch: boolean; + isRender: boolean; + owner: WebBaseRenderNode; + subShader: SubShader; + geometry: WebGPURenderGeometry; + blendState: WebGPUBlendStateCache; + depthStencilState: WebGPUDepthStencilStateCache; + cullMode: CullMode; + frontFace: FrontFace; + protected _invertFrontFace: boolean; + protected _stencilParam: { + [key: string]: any; + }; + protected _stateKey: string[]; + protected _pipeline: GPURenderPipeline[]; + protected _shaderInstances: WebGPUShaderInstance[]; + protected _passNum: number; + protected _passName: string; + protected _passIndex: number[]; + protected _shaderDataState: { + [key: string]: number[]; + }; + bundleId: number; + needClearBundle: boolean; + static bundleIdCounter: number; + isStatic: boolean; + staticChange: boolean; + globalId: number; + objectName: string; + constructor(); + /** + * 是否反转面片 + */ + protected _getInvertFront(): boolean; + /** + * 获取渲染通道的uniform + * @param shaderpass + * @param defineData + */ + private _getShaderPassUniform; + /** + * 收集uniform + * @param compileDefine + */ + protected _collectUniform(compileDefine: WebDefineDatas): { + uniformMap: WebGPUUniformMapType; + arrayMap: NameNumberMap; + }; + /** + * 提取当前渲染通道 + * @param pipelineMode + */ + private _takeCurPass; + /** + * 渲染前更新 + * @param context + */ + _preUpdatePre(context: WebGPURenderContext3D): boolean; + /** + * 编译着色器 + * @param context + */ + protected _compileShader(context: WebGPURenderContext3D): void; + /** + * 计算状态值 + * @param shaderInstance + * @param dest + * @param context + */ + protected _calcStateKey(shaderInstance: WebGPUShaderInstance, dest: WebGPUInternalRT, context: WebGPURenderContext3D): string; + /** + * 获取渲染管线 + * @param shaderInstance + * @param dest + * @param context + * @param entries + * @param stateKey + */ + protected _getWebGPURenderPipeline(shaderInstance: WebGPUShaderInstance, dest: WebGPUInternalRT, context: WebGPURenderContext3D, entries: any, stateKey?: string): GPURenderPipeline; + /** + * 获取混合状态 + * @param shaderInstance + */ + private _getBlendState; + private _getRenderStateBlendByShader; + private _getRenderStateBlendByMaterial; + /** + * 获取深度缓存状态 + * @param shaderInstance + * @param dest + */ + private _getDepthStencilState; + private _getRenderStateDepthByShader; + private _getRenderStateDepthByMaterial; + private _getCullFrontMode; + /** + * 着色器数据是否改变 + * @param context + */ + protected _isShaderDataChange(context: WebGPURenderContext3D): boolean; + /** + * 创建绑定组布局 + * @param shaderInstance + */ + protected _createBindGroupLayout(shaderInstance: WebGPUShaderInstance): any[]; + /** + * 绑定资源组 + * @param shaderInstance + * @param command + * @param bundle + */ + protected _bindGroup(shaderInstance: WebGPUShaderInstance, command: WebGPURenderCommandEncoder, bundle: WebGPURenderBundle): void; + /** + * 上传uniform数据 + */ + protected _uploadUniform(): void; + /** + * 上传模板参考值 + * @param command + */ + protected _uploadStencilReference(command: WebGPURenderCommandEncoder): void; + /** + * 上传几何数据 + * @param command + * @param bundle + */ + protected _uploadGeometry(command: WebGPURenderCommandEncoder, bundle: WebGPURenderBundle): number; + /** + * 用于创建渲染管线的函数 + * @param index + * @param context + * @param shaderInstance + * @param command + * @param bundle + * @param stateKey + */ + protected _createPipeline(index: number, context: WebGPURenderContext3D, shaderInstance: WebGPUShaderInstance, command: WebGPURenderCommandEncoder, bundle: WebGPURenderBundle, stateKey?: string): GPURenderPipeline; + /** + * 转换数据格式 + */ + protected _changeDataFormat(): void; + /** + * 渲染 + * @param context + * @param command + * @param bundle + */ + _render(context: WebGPURenderContext3D, command: WebGPURenderCommandEncoder, bundle: WebGPURenderBundle): number; + /** + * 销毁 + */ + destroy(): void; + } + /** + * 带骨骼的基本渲染单元 + */ + class WebGPUSkinRenderElement3D extends WebGPURenderElement3D implements ISkinRenderElement3D { + skinnedData: Float32Array[]; + renderShaderDatas: WebGPUShaderData[]; + globalId: number; + objectName: string; + constructor(); + /** + * 编译着色器 + * @param context + */ + protected _compileShader(context: WebGPURenderContext3D): void; + /** + * 销毁renderShaderDatas数据 + */ + private _destroyRenderShaderDatas; + /** + * 绑定资源组 + * @param shaderInstance + * @param command + * @param bundle + * @param index + */ + protected _bindGroupEx(shaderInstance: WebGPUShaderInstance, command: WebGPURenderCommandEncoder, bundle: WebGPURenderBundle, index: number): void; + /** + * 上传uniform数据 + * @param index + */ + protected _uploadUniformEx(index: number): void; + /** + * 上传几何数据 + * @param command + * @param bundle + * @param index + */ + protected _uploadGeometryEx(command: WebGPURenderCommandEncoder, bundle: WebGPURenderBundle, index: number): number; + /** + * 渲染 + * @param context + * @param command + * @param bundle + */ + _render(context: WebGPURenderContext3D, command: WebGPURenderCommandEncoder, bundle: WebGPURenderBundle): number; + } + /** + * 聚光灯阴影渲染流程 + */ + class WebGPUSpotLightShadowRP { + protected static _invertYScaleMatrix: Matrix4x4; + destTarget: InternalRenderTarget; + set light(value: WebSpotLight); + get light(): WebSpotLight; + constructor(); + /** + * 更新阴影数据 + * @param context + */ + update(context: WebGPURenderContext3D): void; + /** + * 渲染 + * @param context + * @param list + * @param count + */ + render(context: WebGPURenderContext3D, list: WebBaseRenderNode[], count: number): void; + /** + * get shadow bias + * @param shadowResolution + * @param out + */ + private _getShadowBias; + /** + * 设置阴影级联数据模式 + * @param shaderData + * @param shadowSliceData + * @param shadowParams + * @param shadowBias + */ + private _setupShadowCasterShaderValues; + /** + * 应用阴影渲染命令 + * @param context + */ + private _applyCasterPassCommandBuffer; + /** + * 设置聚光接受阴影的模式 + * @param shaderData 渲染数据 + * @param cameraData 相机数据 + */ + private _applyRenderData; + } + class WebGPU_GLSLCommon { + /** + * 替换字符串的一部分 + * @param str 输入字符串 + * @param replace 替换项 + * @param start 替换开始位置(包含) + * @param end 替换结束位置(不包含) + */ + static replaceStringPart(str: string, replace: string, start: number, end: number): string; + /** + * 在第一对括号内查找参数,查找以逗号分割的参数,括号可以嵌套,不在第一对括号内的逗号不会被分割 + * @param input 输入字符串(带括号) + * @param start 从哪个位置开始查找 + * @param bracket 指定括号(默认为小括号) + */ + static findParamInBracket(input: string, start: number, bracket?: string): { + full: string; + elements: string[]; + index: number; + } | null; + /** + * 根据函数类型替换指定实参 + * @param code 要替换的代码 + * @param variableName 要查找的变量名 + * @param functionNames 包含特定函数名称的数组 + * @param replacementInCategory 替换字符串,如果函数名称在提供的数组中 + * @param replacementOutOfCategory 替换字符串,如果函数名称不在提供的数组中 + * @return 返回替换后的代码 + */ + static replaceArgumentByFunctionCategory(code: string, variableName: string, functionNames: string[], replacementInCategory: string, replacementOutOfCategory: string): string; + /** + * 移除括号内的空格 + * @param str 输入字符串 + * @param bracket 指定括号(默认为小括号) + */ + static removeSpacesInBracket(str: string, bracket?: string): string; + } + /** + * 函数参数 + */ + interface Parameter { + name: string; + type: string; + inout?: string; + precision?: string; + isArray: boolean; + arrayLength?: number; + isStruct: boolean; + } + /** + * 函数调用 + */ + interface FunctionCall { + name: string; + params: string[]; + } + /** + * GLSL函数定义 + */ + class WebGPU_GLSLFunction { + name: string; + return: string; + precision: string; + all: string; + head: string; + body: string; + params: Parameter[]; + calls: FunctionCall[]; + samplerProcessed: boolean; + samplerParams: Parameter[]; + samplerBody: string; + samplerOutput: string; + static variableType: string[]; + constructor(all: string); + /** + * 获取函数头和函数体 + */ + private _getHeadAndBody; + /** + * 解析函数定义 + */ + private _parse; + /** + * 查找函数调用 + * @param glslCode + */ + private _findFunctionCalls; + /** + * 对函数进行处理,将sampler转换为texture和sampler + * @param textureNames + */ + processSampler(textureNames: string[]): void; + } + /** + * GLSL宏定义 + */ + class WebGPU_GLSLMacro { + all: string; + name: string; + params?: string[]; + replace?: string; + constructor(all: string); + /** + * 解析 + */ + private _parse; + /** + * 替换GLSL代码中的宏 + * @param glslCode 原始GLSL代码 + * @returns 替换后的GLSL代码 + */ + replaceMacros(glslCode: string): string; + } + /** + * GLSL代码处理 + */ + class WebGPU_GLSLProcess { + glInter: string[]; + globals: string[]; + macros: WebGPU_GLSLMacro[]; + structs: WebGPU_GLSLStruct[]; + uniforms: WebGPU_GLSLUniform[]; + functions: WebGPU_GLSLFunction[]; + textureNames: string[]; + glslCode: string; + haveVertexID: boolean; + /** + * 处理GLSL代码 + * @param glslCode GLSL代码 + * @param textureNames 所有的贴图名称 + */ + process(glslCode: string, textureNames: string[]): void; + /** + * 获取Uniform信息 + * @param glslCode + */ + getUniforms(glslCode: string): WebGPU_GLSLUniform[]; + /** + * 移除注释 + * @param glslCode + */ + private _removeComments; + /** + * 移除不必要的空格 + * @param glslCode + */ + private _removeSpaces; + /** + * 提取宏定义 + * @param glslCode + */ + private _extractMacros; + /** + * 执行宏替换 + * @param glslCode + */ + private _replaceMacros; + /** + * 提取内置变量 + * @param glslCode + */ + private _extractInternals; + /** + * 提取全局变量 + * @param glslCode + */ + private _extractGlobals; + /** + * 提取结构体定义 + * @param glslCode + */ + private _extractStructs; + /** + * 提取Uniform定义 + * @param glslCode + */ + private _extractUniforms; + /** + * 提取函数定义 + * @param glslCode + */ + private _extractFunctions; + /** + * 查找被使用的函数 + */ + private _findUsedFunctions; + /** + * 输出处理后的GLSL代码 + */ + private _outputGLSL; + /** + * 获取一个变量 + * @param name + * @param isArray + */ + private _getVariable; + /** + * 打印调试信息 + */ + debugInfo(): void; + } + /** + * 结构体字段 + */ + interface StructField { + type: string; + name: string; + precision?: string; + isArray?: boolean; + arrayLength?: number; + } + /** + * GLSL结构体定义 + */ + class WebGPU_GLSLStruct { + all: string; + name: string; + fields: StructField[]; + constructor(all: string); + /** + * 解析结构体定义 + * @param all + */ + private _parse; + /** + * 获取字段 + * @param name 字段名称 + * @param isArray 是否是数组 + * @returns 字段 + */ + getArrayField(name: string, isArray?: boolean): StructField; + } + /** + * uniform字段 + */ + interface UniformField { + type: string; + name: string; + precision?: string; + isArray: boolean; + arrayLength?: number; + } + /** + * GLSLUniform块定义 + */ + class WebGPU_GLSLUniform { + all: string; + name: string; + fields: UniformField; + constructor(all: string); + /** + * 解析uniform定义 + * @param all + */ + private _parse; + } + class NagaWASM { + /** + * 初始化wasm库 + */ + init(): Promise; + /** + * 将GLSL4.5转译成WGSL + */ + compileGLSL2WGSL(code: string, type: string): any; + } + /** + * Converts a `GPUExtent3D` into an array of numbers + * + * `GPUExtent3D` has two forms `[width, height?, depth?]` or + * `{width: number, height?: number, depthOrArrayLayers?: number}` + * + * You pass one of those in here and it returns an array of 3 numbers + * so that your code doesn't have to deal with multiple forms. + * + * @param size + * @returns an array of 3 numbers, [width, height, depthOrArrayLayers] + */ + function normalizeGPUExtent3D(size: GPUExtent3D): number[]; + /** + * Given a GPUExtent3D returns the number of mip levels needed + * + * @param size + * @returns number of mip levels needed for the given size + */ + function numMipLevels(size: GPUExtent3D, dimension?: GPUTextureDimension): number; + /** + * Generates mip levels from level 0 to the last mip for an existing texture + * + * The texture must have been created with TEXTURE_BINDING and RENDER_ATTACHMENT + * and been created with mip levels + * + * @param device A GPUDevice + * @param texture The texture to create mips for + * @param textureBindingViewDimension This is only needed in compatibility mode + * and it is only needed when the texture is going to be used as a cube map. + */ + function genMipmap(device: GPUDevice, texture: GPUTexture, textureBindingViewDimension?: GPUTextureViewDimension): void; + /** + * 对贴图中的像素做预乘处理 + * + * @param device A GPUDevice + * @param tex The texture to premultiply Alpha + * @param xOffset horizon offset + * @param yOffset vertical offset + * @param width + * @param height + */ + function doPremultiplyAlpha(device: GPUDevice, tex: WebGPUInternalTex, xOffset: number, yOffset: number, width: number, height: number): void; + class WebGPUBuffer { + _source: GPUBuffer; + _usage: GPUBufferUsageFlags; + _size: number; + private _isCreate; + private _mappedAtCreation; + globalId: number; + objectName: string; + constructor(usage: GPUBufferUsageFlags, byteSize?: number, mappedAtCreation?: boolean); + /** + * @param length + */ + setDataLength(length: number): void; + private _create; + setData(srcData: ArrayBuffer | ArrayBufferView, srcOffset: number): void; + setDataEx(srcData: ArrayBuffer | ArrayBufferView, srcOffset: number, byteLength: number, dstOffset?: number): void; + readDataFromBuffer(): Promise; + readFromBuffer(buffer: GPUBuffer, size: number): Promise; + release(): void; + } + enum WebGPUVertexStepMode { + vertex = "vertex", + instance = "instance" + } + class WebGPUBufferState implements IBufferState { + static idCounter: number; + id: number; + stateId: string; + updateBufferLayoutFlag: number; + vertexState: GPUVertexBufferLayout[]; + _bindedIndexBuffer: WebGPUIndexBuffer; + _vertexBuffers: WebGPUVertexBuffer[]; + globalId: number; + objectName: string; + /** + * 是否需要转换顶点数据格式 + */ + isNeedChangeFormat(): boolean; + applyState(vertexBuffers: WebGPUVertexBuffer[], indexBuffer: WebGPUIndexBuffer): void; + constructor(); + private _getVertexBufferLayoutArray; + private _getvertexAttributeFormat; + private _getvertexAttributeSymbol; + destroy(): void; + } + /** + * 渲染指令缓存 + * 用于缓存渲染指令,提高渲染效率 + * 一个渲染指令缓存对象缓存了若干个渲染节点的渲染指令 + * 如果下一帧渲染流程中,缓存的渲染节点命中率高于一定的程度,则可以直接使用缓存的渲染指令 + * 对于动态节点,要求命中率为100%,对于静态节点,要求命中率可低于100%(比如70%) + */ + class WebGPURenderBundle { + private _engine; + private _encoder; + private _elements; + private _shotNum; + private _shotCount; + private _shotRateSet; + private _shotEstimate; + renderBundle: GPURenderBundle; + renderTimeStamp: number; + renderTriangles: number; + id: number; + static idCounter: number; + constructor(device: GPUDevice, dest: WebGPUInternalRT, shotRateSet: number); + /** + * 添加渲染节点,将节点的渲染指令添加到命令缓存中 + * @param context + * @param element + */ + render(context: WebGPURenderContext3D, element: WebGPURenderElement3D): void; + /** + * 结束渲染指令的编码,生成渲染命令缓存对象 + */ + finish(): void; + /** + * 判断是否包含某个渲染节点 + * @param elementId + */ + hasElement(elementId: number): boolean; + /** + * 增加命中的渲染节点数量 + */ + addShot(): void; + /** + * 把本缓存对象的所有渲染节点从总体渲染节点集合中移除 + * @param elements 总体渲染节点集合 + */ + removeMyIds(elements: Map): void; + /** + * 清除命中的渲染节点数量 + */ + clearShotNum(): void; + /** + * 判断是否是低命中率 + */ + isLowShotRate(): boolean; + /** + * 设置渲染管线 + * @param pipeline + */ + setPipeline(pipeline: GPURenderPipeline): void; + /** + * 设置索引缓冲区 + * @param buffer + * @param indexFormat + * @param byteSize + * @param offset + */ + setIndexBuffer(buffer: GPUBuffer, indexFormat: GPUIndexFormat, byteSize: number, offset?: number): void; + /** + * 设置顶点缓冲区 + * @param slot + * @param buffer + * @param offset + * @param size + */ + setVertexBuffer(slot: number, buffer: GPUBuffer, offset?: number, size?: number): void; + /** + * 设置绑定组 + * @param index + * @param bindGroup + * @param dynamicOffsets + */ + setBindGroup(index: GPUIndex32, bindGroup: GPUBindGroup, dynamicOffsets?: Iterable): void; + /** + * 上传几何数据 + * @param geometry + * @param setBuffer + */ + applyGeometry(geometry: WebGPURenderGeometry, setBuffer?: boolean): number; + /** + * 上传几何数据 + * @param geometry + * @param part + * @param setBuffer + */ + applyGeometryPart(geometry: WebGPURenderGeometry, part: number, setBuffer?: boolean): number; + /** + * 销毁 + */ + destroy(): void; + } + /** + * 渲染指令缓存管理器 + */ + class WebGPURenderBundleManager { + elementsMaxPerBundleStatic: number; + elementsMaxPerBundleDynamic: number; + bundles: WebGPURenderBundle[]; + renderTimeStamp: number; + private _triangles; + private _elementsMap; + private _renderBundles; + private _needUpdateRenderBundles; + /** + * 提交缓存渲染命令 + * @param passEncoder + */ + renderBundles(passEncoder: GPURenderPassEncoder): void; + /** + * 渲染元素是否在缓存中 + * @param elementId + */ + has(elementId: number): boolean; + /** + * 根据渲染元素id查找渲染缓存对象 + * @param elementId + */ + getBundle(elementId: number): WebGPURenderBundle; + /** + * 通过渲染元素组创建渲染缓存对象 + * @param context + * @param elements + * @param shotRateSet + */ + createBundle(context: WebGPURenderContext3D, elements: WebGPURenderElement3D[], shotRateSet: number): void; + /** + * 移除渲染缓存对象 + * @param bundle + */ + removeBundle(bundle: WebGPURenderBundle): void; + /** + * 通过指定元素id移除渲染缓存对象 + * @param elementId + */ + removeBundleByElement(elementId: number): void; + /** + * 清除所有渲染缓存对象 + */ + clearBundle(): void; + /** + * 清除所有渲染缓存对象的命中计数 + */ + clearShot(): void; + /** + * 移除命中率低的渲染缓存对象 + */ + removeLowShotBundle(): boolean; + /** + * 销毁 + */ + destroy(): void; + } + class WebGPURenderBundleManagerSet { + key: string; + bundleManager: WebGPURenderBundleManager; + elementsToBundleStatic: WebGPURenderElement3D[]; + elementsToBundleDynamic: WebGPURenderElement3D[]; + /** + * 清除渲染指令缓存 + */ + clearBundle(): void; + } + class WebGPUCapable { + constructor(descriptor: GPUDeviceDescriptor); + initCapable(descriptor: GPUDeviceDescriptor): void; + getCapable(type: RenderCapable): boolean; + } + /** + * attribute列表 + */ + type WebGPUAttributeMapType = { + [key: string]: [ + number, + ShaderDataType + ]; + }; + /** + * uniform列表 + */ + type WebGPUUniformMapType = { + [key: string]: { + name: string; + type: ShaderDataType; + shadow?: boolean; + }; + }; + /** + * 绑定类型(uniformBlock,texture或sampler) + */ + enum WebGPUBindingInfoType { + buffer = 0, + texture = 1, + sampler = 2 + } + /** + * uniform详细内容(可能是uniformBlock,texture或sampler) + */ + interface WebGPUUniformPropertyBindingInfo { + id: number; + set: number; + binding: number; + name: string; + propertyId: number; + visibility: GPUShaderStageFlags; + type: WebGPUBindingInfoType; + uniform?: WebGPUUniformBlockInfo; + buffer?: GPUBufferBindingLayout; + texture?: GPUTextureBindingLayout; + sampler?: GPUSamplerBindingLayout; + } + /** + * WGSL代码转译 + */ + class WebGPUCodeGenerator { + static naga: NagaWASM; + static inited: boolean; + static forNaga: boolean; + /** + * 初始化nageWASM库 + * @param next + */ + static init(next?: Function): Promise; + /** + * 生成attribute字符串 + * @param attributeMap + */ + private static _attributeString; + /** + * 生成varying字符串 + * @param varyingMap + * @param io 'in' or 'out' + */ + private static _varyingString; + /** + * 生成uniform字符串 + * @param uniformMap + * @param arrayMap 数组uniform映射表(表示哪些uniform是数组,长度是多少) + */ + private static _uniformString2D; + /** + * 生成uniform字符串 + * @param uniformMap + * @param arrayMap 数组uniform映射表(表示哪些uniform是数组,长度是多少) + */ + private static _uniformString3D; + /** + * 生成sampler和texuture字符串 + */ + private static _textureString; + /** + * 去除naga转译报错的代码 + * @param code + */ + private static _changeUnfitCode; + /** + * 生成a_WorldMat拼合代码 + */ + private static _genAWorldMat; + /** + * 生成inverse函数(因为WGSL缺乏内置的inverse函数) + */ + private static _genInverseFunc; + /** + * 生成Uniform数据块信息 + * @param name + * @param binding + * @param uniforms + * @param arrayMap + */ + private static _genUniformBlockInfo; + /** + * 转译Attribute类型(Type到String) + * @param type + */ + private static _getAttributeT2S; + /** + * 转译Attribute类型(String到Type) + * @param name + */ + private static _getAttributeS2T; + /** + * 转译Attribute类型(String到Number),用于分组 + * @param name + */ + private static _getAttributeS2N; + /** + * 执行WGSL转译 + * @param defineString + * @param attributeMap + * @param uniformMap + * @param VS + * @param FS + * @param is2D + */ + static shaderLanguageProcess(defineString: string[], attributeMap: WebGPUAttributeMapType, uniformMap: WebGPUUniformMapType, arrayMap: NameNumberMap, VS: ShaderNode, FS: ShaderNode, is2D: boolean): { + glsl_vs: string; + glsl_fs: string; + vs: any; + fs: any; + uniformInfo: WebGPUUniformPropertyBindingInfo[]; + }; + /** + * 收集Uniform信息 + * @param defineString + * @param uniformMap + * @param VS + * @param FS + */ + static collectUniform(defineString: string[], uniformMap: UniformMapType, VS: ShaderNode, FS: ShaderNode): { + uniform: WebGPUUniformMapType; + arr: NameNumberMap; + }; + } + class WebGPUCommandUniformMap extends CommandUniformMap { + _stateName: string; + constructor(stateName: string); + hasPtrID(propertyID: number): boolean; + /** + * 增加一个UniformArray参数 + * @param propertyID + * @param propertyName + */ + addShaderUniformArray(propertyID: number, propertyName: string, uniformtype: ShaderDataType, arrayLength: number, block?: string): void; + /** + * 增加一个Uniform + */ + addShaderBlockUniform(propertyID: number, blockname: string, blockProperty: UniformProperty[]): void; + } + type OffsetAndSize = { + offset: number; + size: number; + }; + type NameAndType = { + name: string; + type: string; + set: number; + }; + type NameStringMap = Record; + type NameNumberMap = Record; + type NameBooleanMap = Record; + /** + * 向上圆整到align的整数倍 + * @param n + * @param align + */ + function roundUp(n: number, align: number): number; + /** + * 向下圆整到align的整数倍 + * @param n + * @param align + */ + function roundDown(n: number, align: number): number; + /** + * 是否是TypedArray + * @param arr + */ + const isTypedArray: (arr: any) => boolean; + class WebGPUIndexBuffer implements IIndexBuffer { + source: WebGPUBuffer; + indexType: IndexFormat; + indexCount: number; + globalId: number; + objectName: string; + constructor(targetType: BufferTargetType, bufferUsageType: BufferUsage); + _setIndexDataLength(length: number): void; + _setIndexData(data: Uint8Array | Uint16Array | Uint32Array, bufferOffset: number): void; + destroy(): void; + } + class WebGPUInternalRT implements InternalRenderTarget { + _isCube: boolean; + _samples: number; + _generateMipmap: boolean; + _textures: WebGPUInternalTex[]; + _texturesResolve: WebGPUInternalTex[]; + _depthTexture: WebGPUInternalTex; + colorFormat: RenderTargetFormat; + depthStencilFormat: RenderTargetFormat; + isSRGB: boolean; + gpuMemory: number; + formatId: string; + _colorStates: GPUColorTargetState[]; + _depthState: GPUColorTargetState; + _renderPassDescriptor: GPURenderPassDescriptor; + _renderBundleDescriptor: GPURenderBundleEncoderDescriptor; + globalId: number; + objectName: string; + constructor(colorFormat: RenderTargetFormat, depthStencilFormat: RenderTargetFormat, isCube: boolean, generateMipmap: boolean, samples: number, sRGB: boolean); + dispose(): void; + } + class WebGPUInternalTex implements InternalTexture { + resource: GPUTexture; + dimension: TextureDimension; + width: number; + height: number; + depth: number; + isPotSize: boolean; + mipmap: boolean; + mipmapCount: number; + baseMipmapLevel: number; + maxMipmapLevel: number; + useSRGBLoad: boolean; + gammaCorrection: number; + multiSamplers: number; + _webGPUFormat: WebGPUTextureFormat; + private _engine; + private _statistics_M_TextureX; + private _statistics_M_TextureA; + private _statistics_RC_TextureX; + private _statistics_RC_TextureA; + globalId: number; + objectName: string; + private _filterMode; + get filterMode(): FilterMode; + set filterMode(value: FilterMode); + private _wrapU; + get wrapU(): WrapMode; + set wrapU(value: WrapMode); + private _wrapV; + get wrapV(): WrapMode; + set wrapV(value: WrapMode); + private _wrapW; + get wrapW(): WrapMode; + set wrapW(value: WrapMode); + private _anisoLevel; + get anisoLevel(): number; + set anisoLevel(value: number); + private _compareMode; + get compareMode(): TextureCompareMode; + set compareMode(value: TextureCompareMode); + private _webGPUSamplerParams; + private _webgpuSampler; + get sampler(): WebGPUSampler; + private _gpuMemory; + get gpuMemory(): number; + set gpuMemory(value: number); + constructor(width: number, height: number, depth: number, dimension: TextureDimension, mipmap: boolean, multiSamples: number, useSRGBLoader: boolean, gammaCorrection: number); + statisAsRenderTexture(): void; + getTextureView(): GPUTextureView; + private _changeTexMemory; + dispose(): void; + } + class WebGPURenderCommandEncoder { + _commandEncoder: GPUCommandEncoder; + _encoder: GPURenderPassEncoder; + _engine: WebGPURenderEngine; + _device: GPUDevice; + globalId: number; + objectName: string; + constructor(); + startRender(renderPassDesc: GPURenderPassDescriptor): void; + setPipeline(pipeline: GPURenderPipeline): void; + setIndexBuffer(buffer: GPUBuffer, indexFormat: GPUIndexFormat, byteSize: number, offset?: number): void; + setVertexBuffer(slot: number, buffer: GPUBuffer, offset?: number, size?: number): void; + drawIndirect(indirectBuffer: GPUBuffer, indirectOffset: GPUSize64): void; + drawIndexedIndirect(indirectBuffer: GPUBuffer, indirectOffset: GPUSize64): void; + setBindGroup(index: GPUIndex32, bindGroup: GPUBindGroup, dynamicOffsets?: Iterable): void; + setBindGroupByDataOffaset(index: GPUIndex32, bindGroup: GPUBindGroup, dynamicOffsetsData: Uint32Array, dynamicOffsetsDataStart: GPUSize64, dynamicOffsetsDataLength: GPUSize32): void; + setViewport(x: number, y: number, width: number, height: number, minDepth: number, maxDepth: number): void; + setScissorRect(x: GPUIntegerCoordinate, y: GPUIntegerCoordinate, width: GPUIntegerCoordinate, height: GPUIntegerCoordinate): void; + setStencilReference(ref: number): void; + end(): void; + finish(): GPUCommandBuffer; + playBundle(bundles: GPURenderBundle[]): void; + /** + * 上传几何数据 + * @param geometry + * @param setBuffer + */ + applyGeometry(geometry: WebGPURenderGeometry, setBuffer?: boolean): number; + /** + * 上传几何数据 + * @param geometry + * @param part + * @param setBuffer + */ + applyGeometryPart(geometry: WebGPURenderGeometry, part: number, setBuffer?: boolean): number; + destroy(): void; + } + class WebGPURenderDeviceFactory implements IRenderDeviceFactory { + createShaderInstance(shaderProcessInfo: ShaderProcessInfo, shaderPass: ShaderCompileDefineBase): IShaderInstance; + createIndexBuffer(bufferUsage: BufferUsage): IIndexBuffer; + createVertexBuffer(bufferUsageType: BufferUsage): IVertexBuffer; + createBufferState(): IBufferState; + createRenderGeometryElement(mode: MeshTopology, drawType: DrawType): IRenderGeometryElement; + createEngine(config: Config, canvas: any): Promise; + static globalBlockMap: { + [key: string]: WebGPUCommandUniformMap; + }; + createGlobalUniformMap(blockName: string): WebGPUCommandUniformMap; + createShaderData(ownerResource?: Resource): ShaderData; + } + class WebGPUConfig { + /** + * Defines the category of adapter to use. + */ + powerPreference: GPUPowerPreference; + /** + * Defines the device descriptor used to create a device. + */ + deviceDescriptor?: GPUDeviceDescriptor; + /** + * context params + */ + swapChainFormat?: WebGPUTextureFormat; + /** + * canvans alpha mode + */ + alphaMode: GPUCanvasAlphaMode; + /** + * attach canvans usage + */ + usage?: GPUTextureUsageFlags; + /** + * color space + */ + colorSpace?: string; + /** + * depth and stencil + */ + depthStencilFormat: WebGPUTextureFormat; + /** + * multi sample(msaa = 4x) + */ + msaa: boolean; + } + /** + * WebGPU渲染引擎 + */ + class WebGPURenderEngine implements IRenderEngine { + static _offscreenFormat: GPUTextureFormat; + static _instance: WebGPURenderEngine; + _isShaderDebugMode: boolean; + _renderOBJCreateContext: IRenderEngineFactory; + _canvas: HTMLCanvasElement; + _context: GPUCanvasContext; + _config: WebGPUConfig; + screenResized: boolean; + _screenRT: WebGPUInternalRT; + _remapZ: boolean; + _screenInvertY: boolean; + _lodTextureSample: boolean; + _breakTextureSample: boolean; + _enableStatistics: boolean; + private _adapter; + private _device; + private _supportCapatable; + private _textureContext; + private _adapterSupportedExtensions; + private _deviceEnabledExtensions; + private _GPUStatisticsInfo; + gpuBufferMgr: WebGPUBufferManager; + globalId: number; + objectName: string; + /** + * 实例化一个webgpuEngine + */ + constructor(config: WebGPUConfig, canvas: any); + /** + * 获取适配器 + */ + private _getAdapter; + /** + * 初始化适配器 + * @param adapter + */ + private _initAdapter; + /** + * 获取WebGPU设备 + * @param deviceDescriptor + */ + private _getGPUdevice; + /** + * 显示错误信息 + * @param event + */ + private _unCapturedErrorCall; + /** + * 设备丢失 + * @param info + */ + private _deviceLostCall; + /** + * 初始化WebGPU设备 + * @param device + */ + private _initDevice; + /** + * 初始化WebGPU + */ + _initAsync(): Promise; + /** + * 画布尺寸改变 + * @param width + * @param height + */ + resizeOffScreen(width: number, height: number): void; + getDevice(): GPUDevice; + /** + * 开始新的一帧 + */ + startFrame(): void; + /** + * 上传数据 + */ + upload(): void; + /** + * 设置WebGPU画图上下文 + */ + private _initContext; + /** + * 初始化渲染引擎 + */ + initRenderEngine(): Promise; + copySubFrameBuffertoTex(texture: InternalTexture, level: number, xoffset: number, yoffset: number, x: number, y: number, width: number, height: number): void; + propertyNameToID(name: string): number; + propertyIDToName(id: number): string; + getDefineByName(name: string): ShaderDefine; + getNamesByDefineData(defineData: IDefineDatas, out: string[]): void; + _texGammaDefine: { + [key: number]: ShaderDefine; + }; + addTexGammaDefine(key: number, value: ShaderDefine): void; + /**获得各个参数 */ + getParams(params: RenderParams): number; + /**获得是否支持某种能力 */ + getCapable(capatableType: RenderCapable): boolean; + getTextureContext(): ITextureContext; + getCreateRenderOBJContext(): WebGPURenderEngineFactory; + private _initStatisticsInfo; + /** + * 创建屏幕渲染目标 + */ + createScreenRT(): void; + endFrame(): void; + } + class WebGPURenderEngineFactory implements IRenderEngineFactory { + createUniformBufferObject(glPointer: number, name: string, bufferUsage: BufferUsage, byteLength: number, isSingle: boolean): UniformBufferObject; + createEngine(config: Config, canvas: any): Promise; + } + enum WebGPUPrimitiveTopology { + point_list = "point-list", + line_list = "line-list", + line_strip = "line-strip", + triangle_list = "triangle-list", + triangle_strip = "triangle-strip" + } + class WebGPURenderGeometry implements IRenderGeometryElement { + checkDataFormat: boolean; + gpuIndexFormat: GPUIndexFormat; + gpuIndexByte: number; + _id: number; + static _idCounter: number; + get instanceCount(): number; + set instanceCount(value: number); + get mode(): MeshTopology; + set mode(value: MeshTopology); + get indexFormat(): IndexFormat; + set indexFormat(value: IndexFormat); + globalId: number; + objectName: string; + setDrawArrayParams(first: number, count: number): void; + setDrawElemenParams(count: number, offset: number): void; + setInstanceRenderOffset(offset: number, instanceCount: number): void; + clearRenderParams(): void; + cloneTo(obj: WebGPURenderGeometry): void; + destroy(): void; + } + class WebGPURenderPassHelper { + static getDescriptor(rt: WebGPUInternalRT, clearflag: RenderClearFlag, clearColor?: Color, clearDepthValue?: number, clearStencilValue?: number): GPURenderPassDescriptor; + static getBundleDescriptor(rt: WebGPUInternalRT): GPURenderBundleEncoderDescriptor; + static setColorAttachments(desc: GPURenderPassDescriptor, rt: WebGPUInternalRT, clear: boolean, clearColor?: Color): void; + static setDepthAttachments(desc: GPURenderPassDescriptor, rt: WebGPUInternalRT, clear: boolean, clearDepthValue?: number, clearStencilValue?: number): void; + } + interface WebGPUBlendStateCache { + state: GPUBlendState; + key: number; + id: number; + } + class WebGPUBlendState { + private static _idCounter; + private static _pointer_BlendType; + private static _pointer_OperationRGB_BlendEquationSeparate; + private static _pointer_OperationAlpha_BlendEquationSeparate; + private static _pointer_srcBlendRGB_BlendFactor; + private static _pointer_dstBlendRGB_BlendFactor; + private static _pointer_srcBlendAlpha_BlendFactor; + private static _pointer_dstBlendAlpha_BlendFactor; + private static _cache; + static getBlendState(blend: BlendType, operationRGB: BlendEquationSeparate, srcBlendRGB: BlendFactor, dstBlendRGB: BlendFactor, operationAlpha: BlendEquationSeparate, srcBlendAlpha: BlendFactor, dstBlendAlpha: BlendFactor): WebGPUBlendStateCache; + private static _getBlendStateCacheID; + private static _createBlendState; + private static _getFactor; + private static _getComponent; + } + interface WebGPUDepthStencilStateCache { + state: GPUDepthStencilState; + key: number; + id: number; + } + class WebGPUDepthStencilState { + private static _idCounter; + private static _pointer_DepthWriteEnable; + private static _pointer_DepthCompare; + private static _pointer_DepthFormat; + private static _pointer_StencilTest; + private static _pointer_StencilOp1; + private static _pointer_StencilOp2; + private static _pointer_StencilOp3; + private static _cache; + static getDepthStencilState(format: RenderTargetFormat, depthWriteEnabled: boolean, depthCompare: CompareFunction, stencilParam?: any, depthBiasParam?: any): WebGPUDepthStencilStateCache; + private static _getDepthStencilCacheID; + private static _createDepthStencilState; + } + interface WebGPUPrimitiveStateCache { + state: GPUPrimitiveState; + key: number; + id: number; + } + class WebGPUPrimitiveState { + private static _idCounter; + private static _pointer_Topology; + private static _pointer_FrontFace; + private static _pointer_CullMode; + private static _cache; + static getGPUPrimitiveState(topology: MeshTopology, frontFace: FrontFace, cullMode: CullMode): WebGPUPrimitiveStateCache; + private static _getGPUPrimitiveStateID; + private static _createPrimitiveState; + } + interface IRenderPipelineInfo { + geometry: WebGPURenderGeometry; + blendState: WebGPUBlendStateCache; + depthStencilState: WebGPUDepthStencilStateCache; + cullMode: CullMode; + frontFace: FrontFace; + } + class WebGPURenderPipeline { + static idCounter: number; + /** + * 获取渲染管线,如果缓存中存在,直接取出,否则创建一个,放入缓存 + * @param info + * @param shaderInstance + * @param renderTarget + * @param entries + * @param stateKey + */ + static getRenderPipeline(info: IRenderPipelineInfo, shaderInstance: WebGPUShaderInstance, renderTarget: WebGPUInternalRT, entries: any, stateKey: string): GPURenderPipeline; + /** + * 创建渲染管线 + * @param blendState + * @param depthState + * @param primitiveState + * @param vertexBuffers + * @param shaderInstance + * @param renderTarget + * @param entries + * @param stateKey + */ + private static _createRenderPipeline; + } + /** + * WebGPU内存回收(需要延迟一帧回收的内存) + */ + class WebGPUResourceRecover { + recoverList: WebGPUBuffer[]; + frameCount: number; + needRecover(res: WebGPUBuffer): void; + recover(): void; + } + interface WebGPUSamplerParams { + comparedMode: TextureCompareMode; + wrapU: WrapMode; + warpV: WrapMode; + warpW: WrapMode; + mipmapFilter: FilterMode; + filterMode: FilterMode; + anisoLevel: number; + } + class WebGPUSampler { + static pointer_wrapU: number; + static pointer_warpV: number; + static pointer_warpW: number; + static pointer_filterMode: number; + static pointer_mipmapFilter: number; + static pointer_comparedMode: number; + static pointer_anisoLevel: number; + private static _cacheMap; + private _descriptor; + source: GPUSampler; + globalId: number; + objectName: string; + constructor(obj: WebGPUSamplerParams); + static getWebGPUSampler(params: WebGPUSamplerParams): WebGPUSampler; + private static _getCacheSamplerKey; + private _createGPUSampler; + private _getSamplerDescriptor; + private _getSamplerAddressMode; + private _getFilterMode; + private _getGPUCompareFunction; + } + /** + * 着色器数据 + */ + class WebGPUShaderData extends ShaderData { + private static _bindGroupCounter; + private static _dummyTexture2D; + private static _dummyTextureCube; + stateKey: string; + static _stateKeyMap: Set; + private _destroyed; + private _infoId; + private _uniformBuffer; + private _bindGroupMap; + private _bindGroup; + private _bindGroupLayoutEntries; + private _bindGroupResourceSet; + private _bindGroupKey; + skinShaderData: WebGPUShaderData[]; + instShaderData: WebGPUShaderData; + private _isShare; + get isShare(): boolean; + set isShare(value: boolean); + private _isStatic; + get isStatic(): boolean; + set isStatic(value: boolean); + changeMark: number; + globalId: number; + objectName: string; + static objectCount: number; + static __init__(): void; + constructor(ownerResource?: Resource); + /** + * 创建UniformBuffer + * @param info + * @param single + * @param inst + */ + createUniformBuffer(info: WebGPUUniformPropertyBindingInfo, single?: boolean, inst?: boolean): void; + /** + * 将数据更新到UniformBuffer中 + */ + private _updateUniformData; + /** + * 删除包含指定资源的缓存 + * @param index 资源id + */ + removeBindGroup(index: number): void; + /** + * 清理缓存的BindGroup + */ + clearBindGroup(): void; + /** + * 创建绑定组项 + * @param info + */ + createBindGroupLayoutEntry(info: WebGPUUniformPropertyBindingInfo[]): ({ + binding: number; + visibility: number; + buffer: GPUBufferBindingLayout; + texture?: undefined; + sampler?: undefined; + } | { + binding: number; + visibility: number; + texture: GPUTextureBindingLayout; + buffer?: undefined; + sampler?: undefined; + } | { + binding: number; + visibility: number; + sampler: GPUSamplerBindingLayout; + buffer?: undefined; + texture?: undefined; + })[]; + /** + * 绑定资源组 + * @param groupId + * @param name + * @param info + * @param command + * @param bundle + */ + bindGroup(groupId: number, name: string, info: WebGPUUniformPropertyBindingInfo[], command: WebGPURenderCommandEncoder, bundle?: WebGPURenderBundle): GPUBindGroupLayoutEntry[] | ({ + binding: number; + visibility: number; + buffer: GPUBufferBindingLayout; + texture?: undefined; + sampler?: undefined; + } | { + binding: number; + visibility: number; + texture: GPUTextureBindingLayout; + buffer?: undefined; + sampler?: undefined; + } | { + binding: number; + visibility: number; + sampler: GPUSamplerBindingLayout; + buffer?: undefined; + texture?: undefined; + })[]; + /** + * 上传数据 + */ + uploadUniform(): void; + /** + * 获取数据对象 + */ + getData(): any; + /** + * 获取宏定义数据 + */ + getDefineData(): WebDefineDatas; + /** + * 增加Shader宏定义 + */ + addDefine(define: ShaderDefine): void; + addDefines(defines: WebDefineDatas): void; + /** + * 移除Shader宏定义 + */ + removeDefine(define: ShaderDefine): void; + /** + * 是否包含Shader宏定义 + */ + hasDefine(define: ShaderDefine): boolean; + /** + * 清空宏定义 + */ + clearDefine(): void; + /** + * 获取布尔 + * @param index shader索引 + * @return 布尔 + */ + getBool(index: number): boolean; + /** + * 设置布尔 + * @param index shader索引 + * @param value 布尔 + */ + setBool(index: number, value: boolean): void; + /** + * 获取整型 + * @param index shader索引 + * @return 整型 + */ + getInt(index: number): number; + /** + * 设置整型 + * @param index shader索引 + * @param value 整型 + */ + setInt(index: number, value: number): void; + /** + * 获取浮点 + * @param index shader索引 + * @return 浮点 + */ + getNumber(index: number): number; + /** + * 设置浮点 + * @param index shader索引 + * @param value 浮点 + */ + setNumber(index: number, value: number): void; + /** + * 获取Vector2向量 + * @param index shader索引 + * @return Vector2向量 + */ + getVector2(index: number): Vector2; + /** + * 设置Vector2向量 + * @param index shader索引 + * @param value Vector2向量 + */ + setVector2(index: number, value: Vector2): void; + /** + * 获取Vector3向量 + * @param index shader索引 + * @return Vector3向量 + */ + getVector3(index: number): Vector3; + /** + * 设置Vector3向量 + * @param index shader索引 + * @param value Vector3向量 + */ + setVector3(index: number, value: Vector3): void; + /** + * 获取向量 + * @param index shader索引 + * @return 向量 + */ + getVector(index: number): Vector4; + /** + * 设置向量 + * @param index shader索引 + * @param value 向量 + */ + setVector(index: number, value: Vector4): void; + /** + * 获取颜色 + * @param index 索引 + * @returns 颜色 + */ + getColor(index: number): Color; + /** + * 设置颜色 + * @param index 索引 + * @param value 颜色值 + */ + setColor(index: number, value: Color): void; + /** + * 获取矩阵 + * @param index + * @returns + */ + getMatrix3x3(index: number): Matrix3x3; + /** + * 设置矩阵 + * @param index + * @param value + */ + setMatrix3x3(index: number, value: Matrix3x3): void; + /** + * 获取矩阵 + * @param index shader索引 + * @return 矩阵 + */ + getMatrix4x4(index: number): Matrix4x4; + /** + * 设置矩阵 + * @param index shader索引 + * @param value 矩阵 + */ + setMatrix4x4(index: number, value: Matrix4x4): void; + /** + * 获取Buffer + * @param index shader索引 + * @return + */ + getBuffer(index: number): Float32Array; + /** + * 设置Buffer + * @param index shader索引 + * @param value buffer数据 + */ + setBuffer(index: number, value: Float32Array): void; + /** + * 设置纹理 + * @param index shader索引 + * @param value 纹理 + */ + setTexture(index: number, value: BaseTexture): void; + /** + * 设置内部纹理 + * @param index shader索引 + * @param value 纹理 + */ + _setInternalTexture(index: number, value: InternalTexture): void; + /** + * 获取纹理 + * @param index shader索引 + * @return 纹理 + */ + getTexture(index: number): BaseTexture; + getSourceIndex(value: any): number; + /** + * 克隆 + * @param dest + */ + cloneTo(dest: WebGPUShaderData): void; + /** + * 克隆 + */ + clone(): WebGPUShaderData; + _releaseUBOData(): void; + /** + * 清理 + */ + clear(): void; + /** + * 销毁 + */ + destroy(): void; + } + /** + * WebGPU着色器实例 + */ + class WebGPUShaderInstance implements IShaderInstance { + static idCounter: number; + _id: number; + _shaderPass: ShaderPass; + private _vsShader; + private _fsShader; + destroyed: boolean; + name: string; + complete: boolean; + renderPipelineMap: Map; + uniformInfo: WebGPUUniformPropertyBindingInfo[]; + uniformSetMap: { + [set: number]: WebGPUUniformPropertyBindingInfo[]; + }; + globalId: number; + objectName: string; + constructor(name: string); + /** + * 获取渲染管线描述 + */ + getRenderPipelineDescriptor(): GPURenderPipelineDescriptor; + /** + * 创建ShaderInstance + * @param shaderProcessInfo + * @param shaderPass + */ + _create(shaderProcessInfo: ShaderProcessInfo, shaderPass: ShaderPass): void; + /** + * 基于WebGPUUniformPropertyBindingInfo创建PipelineLayout + * @param device + * @param name + * @param entries + */ + createPipelineLayout(device: GPUDevice, name: string, entries?: any): GPUPipelineLayout; + /** + * 销毁 + */ + _disposeResource(): void; + } + class WebGPUGlobal { + static debug: boolean; + static useCache: boolean; + static useBundle: boolean; + static useBigBuffer: boolean; + static useGlobalContext: boolean; + private static _idCounter; + private static _uniformInfoIdCounter; + static getUniformInfoId(): number; + static getId(object?: any): number; + static releaseId(object: any): void; + static action(object: any, action: string, memory?: number): void; + static reset(): void; + static get idCounter(): number; + } + class WebGPUStatis { + private static _start; + private static _totalStatis; + private static _frameStatis; + private static _dataTiming; + private static _dataCreate; + private static _dataRelease; + private static _textureStatis; + static startFrame(): void; + static addUploadNum(n?: number): void; + static addUploadBytes(n?: number): void; + static addRenderElement(n?: number): void; + static addSubmit(n?: number): void; + static addTexture(texture: any): void; + static trackObjectCreation(name: string, id: number, object?: any, memory?: number): void; + static trackObjectRelease(name: string, id: number, object?: any, memory?: number): void; + static trackObjectAction(name: string, id: number, action: string, object?: any, memory?: number): void; + static printStatisticsAsTable(): void; + static printTotalStatis(): void; + static printFrameStatis(): void; + static printTextureStatis(): void; + } + enum WebGPUTextureDimension { + D1D = "1d", + D2D = "2d", + D3D = "3d" + } + enum WebGPUTextureFormat { + r8unorm = "r8unorm", + r8snorm = "r8snorm", + r8uint = "r8uint", + r8sint = "r8sint", + r16uint = "r16uint", + r16sint = "r16sint", + r16float = "r16float", + rg8unorm = "rg8unorm", + rg8snorm = "rg8snorm", + rg8uint = "rg8uint", + rg8sint = "rg8sint", + r32uint = "r32uint", + r32sint = "r32sint", + r32float = "r32float", + rg16uint = "rg16uint", + rg16sint = "rg16sint", + rg16float = "rg16float", + rgba8unorm = "rgba8unorm", + rgba8unorm_srgb = "rgba8unorm-srgb", + rgba8snorm = "rgba8snorm", + rgba8uint = "rgba8uint", + rgba8sint = "rgba8sint", + bgra8unorm = "bgra8unorm", + bgra8unorm_srgb = "bgra8unorm-srgb", + rgb9e5ufloat = "rgb9e5ufloat", + rgb10a2unorm = "rgb10a2unorm", + rg11b10ufloat = "rg11b10ufloat", + rg32uint = "rg32uint", + rg32sint = "rg32sint", + rg32float = "rg32float", + rgba16uint = "rgba16uint", + rgba16sint = "rgba16sint", + rgba16float = "rgba16float", + rgba32uint = "rgba32uint", + rgba32sint = "rgba32sint", + rgba32float = "rgba32float", + stencil8 = "stencil8", + depth16unorm = "depth16unorm", + depth24plus = "depth24plus", + depth24plus_stencil8 = "depth24plus-stencil8", + depth32float = "depth32float", + depth32float_stencil8 = "depth32float-stencil8", + bc1_rgba_unorm = "bc1-rgba-unorm", + bc1_rgba_unorm_srgb = "bc1-rgba-unorm-srgb", + bc2_rgba_unorm = "bc2-rgba-unorm", + bc2_rgba_unorm_srgb = "bc2-rgba-unorm-srgb", + bc3_rgba_unorm = "bc3-rgba-unorm", + bc3_rgba_unorm_srgb = "bc3-rgba-unorm-srgb", + bc4_r_unorm = "bc4-r-unorm", + bc4_r_snorm = "bc4-r-snorm", + bc5_rg_unorm = "bc5-rg-unorm", + bc5_rg_snorm = "bc5-rg-snorm", + bc6h_rgb_ufloat = "bc6h-rgb-ufloat", + bc6h_rgb_float = "bc6h-rgb-float", + bc7_rgba_unorm = "bc7-rgba-unorm", + bc7_rgba_unorm_srgb = "bc7-rgba-unorm-srgb", + etc2_rgb8unorm = "etc2-rgb8unorm", + etc2_rgb8unorm_srgb = "etc2-rgb8unorm-srgb", + etc2_rgb8a1unorm = "etc2-rgb8a1unorm", + etc2_rgb8a1unorm_srgb = "etc2-rgb8a1unorm-srgb", + etc2_rgba8unorm = "etc2-rgba8unorm", + etc2_rgba8unorm_srgb = "etc2-rgba8unorm-srgb", + astc_4x4_unorm = "astc-4x4-unorm", + astc_4x4_unorm_srgb = "astc-4x4-unorm-srgb", + astc_5x4_unorm = "astc-5x4-unorm", + astc_5x4_unorm_srgb = "astc-5x4-unorm-srgb", + astc_5x5_unorm = "astc-5x5-unorm", + astc_5x5_unorm_srgb = "astc-5x5-unorm-srgb", + astc_6x5_unorm = "astc-6x5-unorm", + astc_6x5_unorm_srgb = "astc-6x5-unorm-srgb", + astc_6x6_unorm = "astc-6x6-unorm", + astc_6x6_unorm_srgb = "astc-6x6-unorm-srgb", + astc_8x5_unorm = "astc-8x5-unorm", + astc_8x5_unorm_srgb = "astc-8x5-unorm-srgb", + astc_8x6_unorm = "astc-8x6-unorm", + astc_8x6_unorm_srgb = "astc-8x6-unorm-srgb", + astc_8x8_unorm = "astc-8x8-unorm", + astc_8x8_unorm_srgb = "astc-8x8-unorm-srgb", + astc_10x5_unorm = "astc-10x5-unorm", + astc_10x5_unorm_srgb = "astc-10x5-unorm-srgb", + astc_10x6_unorm = "astc-10x6-unorm", + astc_10x6_unorm_srgb = "astc-10x6-unorm-srgb", + astc_10x8_unorm = "astc-10x8-unorm", + astc_10x8_unorm_srgb = "astc-10x8-unorm-srgb", + astc_10x10_unorm = "astc-10x10-unorm", + astc_10x10_unorm_srgb = "astc-10x10-unorm-srgb", + astc_12x10_unorm = "astc-12x10-unorm", + astc_12x10_unorm_srgb = "astc-12x10-unorm-srgb", + astc_12x12_unorm = "astc-12x12-unorm", + astc_12x12_unorm_srgb = "astc-12x12-unorm-srgb" + } + class WebGPUTextureContext implements ITextureContext { + private _engine; + constructor(engine: WebGPURenderEngine); + needBitmap: boolean; + createTexture3DInternal(dimension: TextureDimension, width: number, height: number, depth: number, format: TextureFormat, generateMipmap: boolean, sRGB: boolean, premultipliedAlpha: boolean): InternalTexture; + setTexture3DImageData(texture: InternalTexture, source: HTMLImageElement[] | HTMLCanvasElement[] | ImageBitmap[], depth: number, premultiplyAlpha: boolean, invertY: boolean): Promise; + setTexture3DPixelsData(texture: WebGPUInternalTex, source: ArrayBufferView, depth: number, premultiplyAlpha: boolean, invertY: boolean): void; + setTexture3DSubPixelsData(texture: WebGPUInternalTex, source: ArrayBufferView, mipmapLevel: number, generateMipmap: boolean, xOffset: number, yOffset: number, zOffset: number, width: number, height: number, depth: number, premultiplyAlpha: boolean, invertY: boolean): void; + private _getGPUTexturePixelByteSize; + private _getGPURenderTexturePixelByteSize; + private _getGPUTextureFormat; + private _getGPURenderTargetFormat; + private isCompressTexture; + getFormatPixelsParams(format: TextureFormat): { + channels: number; + bytesPerPixel: number; + dataTypedCons: any; + typedSize: number; + }; + private _getGPUTextureDescriptor; + createTextureInternal(dimension: TextureDimension, width: number, height: number, format: TextureFormat, generateMipmap: boolean, sRGB: boolean, premultipliedAlpha: boolean): InternalTexture; + setTextureImageData(texture: InternalTexture, source: HTMLCanvasElement | HTMLImageElement | ImageBitmap, premultiplyAlpha: boolean, invertY: boolean): Promise; + setTextureSubImageData(texture: InternalTexture, source: HTMLCanvasElement | HTMLImageElement | ImageBitmap, x: number, y: number, premultiplyAlpha: boolean, invertY: boolean): void; + setTexturePixelsData(texture: WebGPUInternalTex, source: ArrayBufferView, premultiplyAlpha: boolean, invertY: boolean): void; + setTextureSubPixelsData(texture: WebGPUInternalTex, source: ArrayBufferView, mipmapLevel: number, generateMipmap: boolean, xOffset: number, yOffset: number, width: number, height: number, premultiplyAlpha: boolean, invertY: boolean): void; + setTextureDDSData(texture: WebGPUInternalTex, ddsInfo: DDSTextureInfo): void; + setTextureKTXData(texture: WebGPUInternalTex, ktxInfo: KTXTextureInfo): void; + setTextureHDRData(texture: WebGPUInternalTex, hdrInfo: HDRTextureInfo): void; + setCubeImageData(texture: InternalTexture, source: (HTMLCanvasElement | HTMLImageElement | ImageBitmap)[], premultiplyAlpha: boolean, invertY: boolean): void; + setCubePixelsData(texture: WebGPUInternalTex, source: ArrayBufferView[], premultiplyAlpha: boolean, invertY: boolean): void; + setCubeSubPixelData(texture: WebGPUInternalTex, source: ArrayBufferView[], mipmapLevel: number, generateMipmap: boolean, xOffset: number, yOffset: number, width: number, height: number, premultiplyAlpha: boolean, invertY: boolean): void; + setCubeKTXData(texture: WebGPUInternalTex, ktxInfo: KTXTextureInfo): void; + setCubeDDSData(texture: WebGPUInternalTex, ddsInfo: DDSTextureInfo): void; + setTextureCompareMode(texture: InternalTexture, compareMode: TextureCompareMode): TextureCompareMode; + createRenderTextureInternal(dimension: TextureDimension, width: number, height: number, format: RenderTargetFormat, generateMipmap: boolean, sRGB: boolean): InternalTexture; + /** + * 判断 纹理格式 本身是否是 SRGB格式 + * @param format + * @returns + */ + isSRGBFormat(format: TextureFormat | RenderTargetFormat): boolean; + supportSRGB(format: TextureFormat | RenderTargetFormat, mipmap: boolean): boolean; + supportGenerateMipmap(format: TextureFormat | RenderTargetFormat): boolean; + createRenderTargetInternal(width: number, height: number, colorFormat: RenderTargetFormat, depthStencilFormat: RenderTargetFormat, generateMipmap: boolean, sRGB: boolean, multiSamples: number): InternalRenderTarget; + createRenderTargetDepthTexture(renderTarget: WebGPUInternalRT, dimension: TextureDimension, width: number, height: number): WebGPUInternalTex; + createRenderTargetCubeInternal(size: number, colorFormat: RenderTargetFormat, depthStencilFormat: RenderTargetFormat, generateMipmap: boolean, sRGB: boolean, multiSamples: number): InternalRenderTarget; + bindRenderTarget(renderTarget: InternalRenderTarget, faceIndex?: number): void; + bindoutScreenTarget(): void; + unbindRenderTarget(renderTarget: InternalRenderTarget): void; + /** + * @deprecated 请使用readRenderTargetPixelDataAsync函数代替 + * @param renderTarget + * @param xOffset + * @param yOffset + * @param width + * @param height + * @param out + */ + readRenderTargetPixelData(renderTarget: InternalRenderTarget, xOffset: number, yOffset: number, width: number, height: number, out: ArrayBufferView): ArrayBufferView; + readRenderTargetPixelDataAsync(renderTarget: InternalRenderTarget, xOffset: number, yOffset: number, width: number, height: number, out: ArrayBufferView): Promise; + initVideoTextureData(texture: WebGPUInternalTex): void; + updateVideoTexture(texture: InternalTexture, video: HTMLVideoElement, premultiplyAlpha: boolean, invertY: boolean): Promise; + getRenderTextureDataAsync(internalTex: InternalRenderTarget, x: number, y: number, width: number, height: number): Promise; + } + /** + * 单独的UniformBuffer + */ + class WebGPUBufferAlone extends UniformBufferAlone { + globalId: number; + objectName: string; + constructor(size: number, manager: WebGPUBufferManager); + /** + * 销毁 + */ + destroy(): boolean; + } + /** + * Uniform内存块(小内存块) + */ + class WebGPUBufferBlock extends UniformBufferBlock { + globalId: number; + objectName: string; + constructor(sn: number, buffer: WebGPUBufferCluster, index: number, size: number, alignedSize: number, user: WebGPUUniformBuffer); + /** + * 销毁 + */ + destroy(): boolean; + } + /** + * Uniform内存块(大内存块) + */ + class WebGPUBufferCluster extends UniformBufferCluster { + globalId: number; + objectName: string; + constructor(blockSize: number, blockNum: number, manager: WebGPUBufferManager); + /** + * 销毁 + */ + destroy(): boolean; + } + /** + * Uniform内存块管理 + */ + class WebGPUBufferManager extends UniformBufferManager { + globalId: number; + objectName: string; + constructor(useBigBuffer: boolean); + /** + * 销毁 + */ + destroy(): boolean; + /** + * 创建GPU内存对象 + * @param size 字节长度 + * @param name 名称 + */ + createGPUBuffer(size: number, name?: string): any; + /** + * 将数据写入GPU内存 + * @param buffer GPU内存对象 + * @param data CPU数据对象 + * @param offset 数据在大内存中的偏移量(字节) + * @param size 写入的数据长度(字节) + */ + writeBuffer(buffer: any, data: ArrayBuffer, offset: number, size: number): void; + /** + * 统计GPU内存使用量 + * @param bytes 字节 + */ + statisGPUMemory(bytes: number): void; + /** + * 统计上传次数 + * @param count 上传次数 + * @param bytes 上传字节 + */ + statisUpload(count: number, bytes: number): void; + } + /** + * 每一个Uniform变量的具体信息 + */ + type WebGPUUniformBlockItemType = { + propertyId: number; + name: string; + type: string; + size: number; + align: number; + offset: number; + element: number; + count: number; + }; + /** + * UniformBlock信息 + */ + class WebGPUUniformBlockInfo { + name: string; + size: number; + items: WebGPUUniformBlockItemType[]; + globalId: number; + objectName: string; + constructor(name: string, size: number); + /** + * 添加uniform字段 + * @param name + * @param type + * @param offset + * @param align + * @param size + * @param element + * @param count + */ + addUniform(name: string, type: string, offset: number, align: number, size: number, element: number, count: number): void; + /** + * 是否具有指定的uniform + * @param propertyId + */ + hasUniform(propertyId: number): boolean; + /** + * 输出调试信息 + */ + debugInfo(): void; + /** + * 销毁 + */ + destroy(): void; + } + class WebGPUUniformBuffer extends UniformBufferUser { + set: number; + binding: number; + uniformStr: string; + globalId: number; + objectName: string; + private _gpuBuffer; + private _gpuBindGroupEntry; + constructor(name: string, set: number, binding: number, size: number, manager: WebGPUBufferManager, data: WebGPUShaderData); + /** + * 通知GPUBuffer改变 + */ + notifyGPUBufferChange(): void; + /** + * 清除GPUBuffer绑定 + */ + clearGPUBufferBind(): void; + /** + * 获取WebGPU绑定资源入口 + */ + getGPUBindEntry(): GPUBindGroupEntry; + /** + * 获取uniform名称列表 + */ + getUniformNameStr(): string; + /** + * 输出调试信息 + */ + debugInfo(): void; + /** + * 销毁 + */ + destroy(): boolean; + } + class WebGPUVertexBuffer implements IVertexBuffer { + source: WebGPUBuffer; + vertexDeclaration: VertexDeclaration; + instanceBuffer: boolean; + buffer: ArrayBuffer; + globalId: number; + objectName: string; + constructor(targetType: BufferTargetType, bufferUsageType: BufferUsage); + setData(buffer: ArrayBuffer, bufferOffset?: number, dataStartIndex?: number, dataCount?: number): void; + setDataLength(byteLength: number): void; + destroy(): void; + } + enum enumInOut { + in = 0, + out = 1, + inout = 2 + } + enum enumDescribe { + uniform = 0, + varying = 1, + const = 2, + mediump = 3, + highp = 4, + lowp = 5, + attribute = 6 + } + enum enumOperator { + "!=" = 0, + "==" = 1, + "<=" = 2, + ">=" = 3, + "||" = 4, + "&&" = 5, + ">>" = 6, + "<<" = 7, + "++" = 8, + "^^" = 9, + "--" = 10, + "!" = 11, + "+" = 12, + "-" = 13, + "*" = 14, + "/" = 15, + "=" = 16, + "<" = 17, + ">" = 18, + "&" = 19, + "|" = 20, + "^" = 21, + "%" = 22 + } + const boolCheck: string[]; + const _clearCR: RegExp; + type TypeOut = { + type: string; + struct?: WebGPUShaderToken; + length?: number[]; + blockName?: string; + }; + type TypeOutData = { + uniform?: Record; + varying?: Record; + attribute?: Record; + variable?: Set; + }; + class WebGPUShaderCompileCode { + /**如果parameterNode有值,则代表当前正在解析参数,可能是函数也可能是函数调用 */ + private static _parameterNode; + /**当前的父节点,一般都是往父节点里面添加节点 */ + private static _parentNode; + /**是否当前正在检测Type */ + private static _isCheckType; + /**当前正在处理中的Node节点,一般是parameterNode的child的最后一个或者——parentNode的child最后一个节点 */ + private static __currNode; + /**当前刚刚设置过名字的Node,如果后面发现是个函数的话,直接给該node这是parameter属性 */ + private static _currNameNode; + /**当前的函数参数,或者函数调用的参数 */ + private static _currParame; + /**用户当前checkBodyName的函数体,如果未写大括号会临时放到这里面 */ + private static _currTmpBody; + private static _isCheckBody3; + private static _uniform; + private static _attribute; + private static _varying; + private static _variable; + private static _struct; + private static _varUniform; + /**宏替换参数 */ + private static _define; + static compile(code: string): WebGPUShaderToken; + private static get _currNode(); + private static set _currNode(value); + private static get isCheckType(); + private static set isCheckType(value); + private static get currNode(); + /** + * 当退出一个函数参数,需要更新currNode为当前_parentNode的最后一个或者_parameterNode的最后一个节点 + */ + private static updateCurrNode; + /** + * @param parameterType 0为(),1为[] + */ + private static newParameterNode; + static isEmptyNode(node: WebGPUShaderToken, isCheckParent?: boolean): boolean; + /** + * + * @param isForceCreate 设置force以后,自动会给当前的_parameterNode节点或者_parentNode节点下面增加一个新的节点并且返回 + * @returns + */ + private static nextCurrNode; + private static _compileToTree; + private static _checkStructDef; + private static _checkTypeByString; + private static get _isFor(); + private static _parseParameter; + private static _addParam; + private static _checkParameter; + private static _body3Fin; + /** 这里是对类似if,for,while没有加{}做判断的逻辑 */ + private static _checkBody3; + private static _checkBody; + private static _splitTextCheck; + private static _childFin; + private static _checkType; + /**对于等号的检测 */ + private static _checkEqual; + /**这是给当前节点设置nodeName,一般是在checktype里面调用,也可以确定value里面不会存在表达式的时候直接调用*/ + private static _setNodeName; + /**分解运算符等等,设置函数名,变量名或者常量理论上这里不应该出现函数嵌套,设置node的Name也应该用setNodeName */ + private static _checkBody2; + private static _checkOperator; + private static _parseNode; + /** + * 移除代码中的所有注释 + * @param text + * @returns + */ + private static removeAnnotation; + } + class WebGPUShaderCompileDef { + /**当前的父节点,一般都是往父节点里面添加节点 */ + private static _parentNode; + /**当前正在处理中的Node节点,一般是parameterNode的child的最后一个或者——parentNode的child最后一个节点 */ + private static _currNode; + private static _defs; + static compile(code: string, defs?: Set): WebGPUShaderToken; + static isEmptyNode(node: WebGPUShaderToken): boolean; + /** + * + * @param isForceCreate 设置force以后,自动会给当前的_parameterNode节点或者_parentNode节点下面增加一个新的节点并且返回 + * @returns + */ + private static nextCurrNode; + private static get currNode(); + private static _compileToTree; + private static _parseNode; + } + class WebGPUShaderCompileUtil { + static checkDef(node: WebGPUShaderToken, _defs: Set): void; + /** + * 提取宏定义 + * @param code + */ + static extractMacros(code: string): WebGPU_GLSLMacro[]; + static macrosToVariable(macros: WebGPU_GLSLMacro[]): Set; + static toScript(root: WebGPUShaderToken, def?: Record, outData?: TypeOutData): string; + static removeUniform(code: string): string; + static removeVarying(code: string): string; + static checkCondition(st: WebGPUShaderToken, def: Record): boolean; + private static _parseChilds; + } + class WebGPUShaderDefine { + /** + * 查找代码中的数字宏定义 + * @param code + * @param map + */ + static findNumberDefine(code: string, map?: Map): Map; + } + class WebGPUShaderToken { + uniform: Record; + variable: Set; + structs: Record; + varying: Record; + attribute: Record; + /**是否是赋值状态 */ + assign: boolean; + /**类似于+=、-=、/=、*=、>>=、<<=这种逻辑 */ + assignLeft: enumOperator; + includefiles: any[]; + describe: enumDescribe; + childs: WebGPUShaderToken[]; + parent: WebGPUShaderToken; + inOrOut: enumInOut; + /**如果是函数,这里就是函数名,否则是变量名,或者是精度定义 */ + name: string; + /**原始未解析的代码 */ + code: string; + /**用原始code分析出来的语法树 */ + root: WebGPUShaderToken; + /**节点的类型,例如vec4,float...如果是函数,则是函数的返回值,还有可能是参数的分隔符,或者?或者: */ + type: string; + /**操作符,例如=、+、-、*、/ */ + operator: enumOperator; + /**操作符是在name的左侧还是右侧,通常是用于++和--,但是有时也会用于= */ + operatorRight: boolean; + /**函数类型的话会有这些参数数据 */ + parameter: WebGPUShaderToken; + /**这里是数组参数a[][]这种,支持多维数组 */ + parameterArr: WebGPUShaderToken[]; + /**参数数据的数据源 */ + owner: WebGPUShaderToken; + /**ifdef的参数 */ + defParam: string[] | WebGPUShaderToken; + /**这里是uniform或者struct后面默认追加变量定义的地方 */ + varNames: string[]; + z: number; + constructor(includefiles?: any[]); + condition(def: Record): boolean; + addParameterArr(param: WebGPUShaderToken, parent?: WebGPUShaderToken): void; + setParameter(param: WebGPUShaderToken, parent?: WebGPUShaderToken): void; + addBody(body: WebGPUShaderToken): void; + setParent(parent: WebGPUShaderToken): void; + private _parseShaderNode; + private _getParameter; + private _getParameterArr; + toscript(def?: Record, out?: string[]): string[]; + } + class BlendState { + static _blend_All_pool: any; + static _blend_seperate_pool: any; + static create(blendType: number, colorBlendhash: BlendComponent, alphaBlendComponent: BlendComponent): void; + /** Whether to enable blend. */ + blendType: BlendType; + colorBlendComponent: BlendComponent; + alphaBlendComponent: BlendComponent; + constructor(blendType: number); + } + class BlendComponent { + static _pool: any; + static getHash(blendOperationGLData: number, sourceBlendFactor: number, destinationFactor: number): number; + static getBlendComponent(blendOperationGLData: number, sourceBlendFactor: number, destinationFactor: number): any; + _blendOperation: BlendEquationSeparate; + _blendOperationGLData: number; + _sourceBlendFactor: BlendFactor; + _sourceBlendFactorGLData: number; + _destinationFactor: BlendFactor; + _destinationFactorGLData: number; + _hashIndex: number; + constructor(blendOperationGLData: BlendEquationSeparate, sourceBlendFactor: BlendFactor, destinationFactor: BlendFactor, hashindex: number); + } + class Buffer { + _buffer: Float32Array | Uint16Array | Uint8Array | Uint32Array; + _bufferType: number; + _bufferUsage: number; + _byteLength: number; + get bufferUsage(): number; + constructor(targetType: BufferTargetType, bufferUsageType: BufferUsage); + /** + * @private + */ + destroy(): void; + } + /** + * dds 未存储 color space 需要手动指定 + */ + class DDSTextureInfo { + width: number; + height: number; + mipmapCount: number; + isCube: boolean; + bpp: number; + blockBytes: number; + format: TextureFormat; + compressed: boolean; + dataOffset: number; + source: ArrayBuffer; + constructor(width: number, height: number, mipmapCount: number, isCube: boolean, bpp: number, blockBytes: number, dataOffset: number, format: TextureFormat, compressed: boolean, sourceData: ArrayBuffer); + static getDDSTextureInfo(source: ArrayBuffer): DDSTextureInfo; + } + class DepthState { + } + /** + * https://floyd.lbl.gov/radiance/framer.html + */ + class HDRTextureInfo { + source: ArrayBuffer; + byteOffset: number; + decreaseX: boolean; + decreaseY: boolean; + width: number; + height: number; + format: TextureFormat; + static HDRTEXTURE: string; + static _parseHDRTexture(data: ArrayBuffer, propertyParams?: any, constructParams?: any[]): Texture2D; + /** + * + * @param source + */ + static getHDRInfo(source: ArrayBuffer): HDRTextureInfo; + private static getLineString; + constructor(source: ArrayBuffer, byteOffset: number, decreaseX: boolean, decreaseY: boolean, width: number, height: number, format: TextureFormat); + get_32_bit_rle_rgbe(): ArrayBufferView; + /** + * https://www.radiance-online.org/archived/radsite/radiance/refer/Notes/picture_format.html + */ + readScanLine(): ArrayBufferView; + readcolors(scanlineArray: Uint8Array, getc: () => number, wrong: () => void): void; + olddreadcolors(scanlineArray: Uint8Array, getc: () => number, r: number, g: number, b: number, e: number): void; + color_color(col: Vector4, clr: Vector4): void; + } + class IndexBuffer extends Buffer { + constructor(targetType: BufferTargetType, bufferUsageType: BufferUsage); + } + /** + * https://www.khronos.org/registry/KTX/specs/1.0/ktxspec_v1.html + * https://www.khronos.org/registry/KTX/specs/2.0/ktxspec_v2.html + */ + class KTXTextureInfo { + source: ArrayBuffer; + compress: boolean; + sRGB: boolean; + dimension: TextureDimension; + width: number; + height: number; + format: TextureFormat; + mipmapCount: number; + bytesOfKeyValueData: number; + headerOffset: number; + static getLayaFormat(glFormat: number, glInternalFormat: number, glType: number, glTypeSize: number): { + format: TextureFormat; + sRGB: boolean; + }; + static getKTXTextureInfo(source: ArrayBuffer): KTXTextureInfo; + static createKTX1Info(source: ArrayBuffer): KTXTextureInfo; + constructor(source: ArrayBuffer, compress: boolean, sRGB: boolean, dimension: TextureDimension, width: number, height: number, format: TextureFormat, mipmapCount: number, bytesOfKeyValueData: number, headerOffset: number); + } + enum BlendEquationSeparate { + ADD = 0, + SUBTRACT = 1, + REVERSE_SUBTRACT = 2, + MIN = 3, + MAX = 4 + } + enum BlendFactor { + /** (0, 0, 0, 0)*/ + Zero = 0, + /** (1, 1, 1, 1)*/ + One = 1, + /** (Rs, Gs, Bs, As) */ + SourceColor = 2, + /** (1 - Rs, 1 - Gs, 1 - Bs, 1 - As)*/ + OneMinusSourceColor = 3, + /** (Rd, Gd, Bd, Ad)*/ + DestinationColor = 4, + /** (1 - Rd, 1 - Gd, 1 - Bd, 1 - Ad)*/ + OneMinusDestinationColor = 5, + /** (As, As, As, As)*/ + SourceAlpha = 6, + /** (1 - As, 1 - As, 1 - As, 1 - As)*/ + OneMinusSourceAlpha = 7, + /** (Ad, Ad, Ad, Ad)*/ + DestinationAlpha = 8, + /** (1 - Ad, 1 - Ad, 1 - Ad, 1 - Ad)*/ + OneMinusDestinationAlpha = 9, + /** (min(As, 1 - Ad), min(As, 1 - Ad), min(As, 1 - Ad), 10)*/ + SourceAlphaSaturate = 10, + /** (Rc, Gc, Bc, Ac)*/ + BlendColor = 11, + /** (1 - Rc, 1 - Gc, 1 - Bc, 1 - Ac)*/ + OneMinusBlendColor = 12 + } + enum BlendType { + /**混合枚举_禁用。*/ + BLEND_DISABLE = 0, + /**混合枚举_启用_RGB和Alpha统一混合。*/ + BLEND_ENABLE_ALL = 1, + /**混合枚举_启用_RGB和Alpha单独混合。*/ + BLEND_ENABLE_SEPERATE = 2 + } + enum BufferTargetType { + ARRAY_BUFFER = 0, + ELEMENT_ARRAY_BUFFER = 1, + UNIFORM_BUFFER = 2, + COPY_READ_BUFFER = 3, + COPY_WRITE_BUFFER = 4, + TRANSFORM_FEEDBACK_BUFFER = 5 + } + /** + * Buffer usage. + */ + enum BufferUsage { + /** The buffer content are intended to be specified once, and used many times */ + Static = 0, + /** The buffer contents are intended to be respecified repeatedly, and used many times */ + Dynamic = 1, + /** The buffer contents are intended to be specified once, and used at most a few times */ + Stream = 2 + } + enum CompareFunction { + /** never pass. */ + Never = 0, + /** pass if the incoming value is less than the depth/stencil buffer value. */ + Less = 1, + /** pass if the incoming value equals the depth/stencil buffer value. */ + Equal = 2, + /** pass if the incoming value is less than or equal to the depth/stencil buffer value. */ + LessEqual = 3, + /** pass if the incoming value is greater than the depth/stencil buffer value. */ + Greater = 4, + /** pass if the incoming value is not equal to the depth/stencil buffer value. */ + NotEqual = 5, + /** pass if the incoming value is greater than or equal to the depth/stencil buffer value. */ + GreaterEqual = 6, + /** always pass. */ + Always = 7, + /** off */ + Off = 8 + } + enum CullMode { + /** Disable culling. */ + Off = 0, + /** cut the front-face of the polygons. */ + Front = 1, + /** cut the back-face of the polygons. */ + Back = 2 + } + enum FrontFace { + /** Clockwise front faces. */ + CW = 0, + /** Counter-clockwise front faces. */ + CCW = 1 + } + enum DrawType { + DrawArray = 0, + DrawArrayInstance = 1, + DrawElement = 2, + DrawElementInstance = 3 + } + /** + * 纹理的过滤模式。 + */ + enum FilterMode { + /**点过滤。*/ + Point = 0, + /**双线性过滤。*/ + Bilinear = 1, + /**三线性过滤。*/ + Trilinear = 2 + } + enum HDREncodeFormat { + NONE = 0, + RGBM = 1, + RGBD = 2 + } + enum IndexFormat { + /** 8 位无符号整型索引格式。*/ + UInt8 = 0, + /** 16 位无符号整型索引格式。*/ + UInt16 = 1, + /** 32 位无符号整型索引格式。*/ + UInt32 = 2 + } + enum RenderCapable { + Element_Index_Uint32 = 0, + TextureFormat_R32G32B32A32 = 1, + TextureFormat_R16G16B16A16 = 2, + Texture_anisotropic = 3, + RenderTextureFormat_R16G16B16A16 = 4, + RenderTextureFormat_R32G32B32A32 = 5, + RenderTextureFormat_Depth = 6, + RenderTextureFormat_ShadowMap = 7, + Vertex_VAO = 8, + DrawElement_Instance = 9, + Shader_TextureLod = 10, + COMPRESS_TEXTURE_S3TC = 11, + COMPRESS_TEXTURE_S3TC_SRGB = 12, + COMPRESS_TEXTURE_PVRTC = 13, + COMPRESS_TEXTURE_ETC1 = 14, + COMPRESS_TEXTURE_ETC = 15, + COMPRESS_TEXTURE_ASTC = 16, + Texture_SRGB = 17, + MSAA = 18, + UnifromBufferObject = 19, + Texture3D = 20, + Texture_FloatLinearFiltering = 21, + Texture_HalfFloatLinearFiltering = 22 + } + enum RenderClearFlag { + Nothing = 0, + Color = 1, + Depth = 2, + Stencil = 4 + } + enum RenderDrawMode { + TRIANGLES = 0, + POINTS = 1, + LINES = 2 + } + enum RenderIndexMode { + UNSIGNED_BYTE = 0, + UNSIGNED_SHORT = 1, + UNSIGNED_INT = 2 + } + enum RenderParams { + Max_Active_Texture_Count = 0, + Max_Uniform_Count = 1, + Max_AnisoLevel_Count = 2, + MAX_Texture_Size = 3, + MAX_Texture_Image_Uint = 4, + SHADER_CAPAILITY_LEVEL = 5, + FLOAT = 6, + UNSIGNED_BYTE = 7, + BYTE = 8, + UNSIGNED_SHORT = 9 + } + /** + * Mesh topology. + */ + enum MeshTopology { + /** Draws a single dot */ + Points = 0, + /** Draws a line between a pair of vertices */ + Lines = 1, + /** Draws a straight line to the next vertex, and connects the last vertex back to the first */ + LineLoop = 2, + /** Draws a straight line to the next vertex. */ + LineStrip = 3, + /** Draws a triangle for a group of three vertices */ + Triangles = 4, + /** Draws a triangle strip */ + TriangleStrip = 5, + /** Draws a triangle fan */ + TriangleFan = 6 + } + enum RenderStateType { + DepthTest = 0, + DepthMask = 1, + DepthFunc = 2, + StencilTest = 3, + StencilMask = 4, + StencilFunc = 5, + StencilOp = 6, + BlendType = 7, + BlendEquation = 8, + BlendEquationSeparate = 9, + BlendFunc = 10, + BlendFuncSeperate = 11, + CullFace = 12, + FrontFace = 13 + } + /** + * 渲染统计数据 + */ + enum GPUEngineStatisticsInfo { + C_UniformBufferUploadCount = 0, + C_GeometryBufferUploadCount = 1, + C_TriangleCount = 2, + C_SetRenderPassCount = 3, + C_DrawCallCount = 4, + C_Instancing_DrawCallCount = 5, + C_ShaderCompile = 6, + T_ShaderCompile = 7, + FrameClearCount = 8, + M_GPUMemory = 9, + M_GPUBuffer = 10, + M_VertexBuffer = 11, + M_IndexBuffer = 12, + M_UniformBlockBuffer = 13, + RC_GPUBuffer = 14, + RC_VertexBuffer = 15, + RC_IndexBuffer = 16, + RC_UniformBlockBuffer = 17, + M_ALLTexture = 18, + M_Texture2D = 19, + M_TextureCube = 20, + M_Texture3D = 21, + M_Texture2DArray = 22, + RC_ALLTexture = 23, + RC_Texture2D = 24, + RC_TextureCube = 25, + RC_Texture3D = 26, + RC_Texture2DArray = 27, + M_ALLRenderTexture = 28, + RC_ALLRenderTexture = 29, + Count = 30 + } + /** + * 渲染流程统计数据 + */ + enum RenderPassStatisticsInfo { + T_CameraRender = 0, + T_Render_OpaqueRender = 1, + T_Render_TransparentRender = 2, + T_Render_PostProcess = 3, + T_Render_CameraEventCMD = 4, + T_Render_ShadowPassMode = 5, + T_Render_CameraOtherDest = 6, + T_RenderPreUpdate = 7, + T_OtherRender = 8, + T_OnlyMeshRender = 9, + T_OnlySkinnedMeshRender = 10, + T_OnlyShurikenParticleRender = 11, + T_CameraMainCull = 12, + T_ShadowMapCull = 13, + RenderPassStatisticCount = 14 + } + enum RenderTargetFormat { + None = -1, + /**使用RGB的纹理,不可设置SRGB参数 */ + R8G8B8 = 0, + R8G8B8A8 = 1, + R16G16B16A16 = 17, + R32G32B32 = 30, + R32G32B32A32 = 15, + R16G16B16 = 31, + DEPTH_16 = 35, + STENCIL_8 = 36, + DEPTHSTENCIL_24_8 = 37, + DEPTH_32 = 38, + DEPTHSTENCIL_24_Plus = 39 + } + enum StencilOperation { + /** Keeps the current value. */ + Keep = 0, + /** Sets the stencil buffer value to 0. */ + Zero = 1, + /** Sets the stencil buffer value to the reference value. */ + Replace = 2, + /** Increments the current stencil buffer value. Clamps to the maximum representable unsigned value. */ + IncrementSaturate = 3, + /** Decrements the current stencil buffer value. Clamps to 0. */ + DecrementSaturate = 4, + /** Inverts the current stencil buffer value bitwise. */ + Invert = 5, + /** Increments the current stencil buffer value. Wraps stencil buffer value to zero when incrementing the maximum representable unsigned value. */ + IncrementWrap = 6, + /** Decrements the current stencil buffer value. Wraps stencil buffer value to the maximum representable unsigned value when decrementing a stencil buffer value of 0. */ + DecrementWrap = 7 + } + enum TextureCompareMode { + None = 0, + LEQUAL = 1, + GEQUAL = 2, + LESS = 3, + GREATER = 4, + EQUAL = 5, + NOTEQUAL = 6, + ALWAYS = 7, + NEVER = 8 + } + /** + * 纹理解码格式。 + */ + enum TextureDecodeFormat { + /** 常规解码方式,直接采样纹理颜色。*/ + Normal = 0, + /** 按照RGBM方式解码并计算最终RGB颜色。 */ + RGBM = 1 + } + enum TextureDimension { + Tex2D = 0, + Cube = 1, + Tex3D = 2, + Texture2DArray = 3, + CubeArray = 4, + Unkonw = 5, + None = 6 + } + /** + * 纹理格式 + */ + enum TextureFormat { + /**纹理格式_R8G8B8。*/ + R8G8B8 = 0, + /**纹理格式_R8G8B8A8。*/ + R8G8B8A8 = 1, + /**RGB格式纹理,R通道5位,G通道6位,B通道5位。*/ + R5G6B5 = 16, + /**纹理格式_ALPHA8。*/ + Alpha8 = 2, + /**纹理格式_DXT1。*/ + DXT1 = 3, + /**纹理格式_DXT3 */ + DXT3 = 29, + /**纹理格式_DXT5。*/ + DXT5 = 4, + /**纹理格式_ETC2RGB。*/ + ETC1RGB = 5, + ETC2RGB = 6, + ETC2RGBA = 7, + /**纹理格式_ETC2RGB_PUNCHTHROUGHALPHA。*/ + /**纹理格式_PVRTCRGB_2BPPV。*/ + ETC2SRGB_Alpha8 = 8, + /** 纹理格式_ETC2SRGB*/ + ETC2SRGB = 28, + /** 纹理格式 RGB8_PUNCHTHROUGH_ALPHA1_ETC2 */ + ETC2RGB_Alpha1 = 32, + /** 纹理格式 SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 */ + ETC2SRGB_Alpha1 = 33, + /** 纹理格式_PVRTCRGB_2BPPV*/ + PVRTCRGB_2BPPV = 9, + /**纹理格式_PVRTCRGBA_2BPPV。*/ + PVRTCRGBA_2BPPV = 10, + /**纹理格式_PVRTCRGB_4BPPV。*/ + PVRTCRGB_4BPPV = 11, + /**纹理格式_PVRTCRGBA_4BPPV。*/ + PVRTCRGBA_4BPPV = 12, + /**RGBA格式纹理,每个通道32位浮点数。*/ + R32G32B32A32 = 15, + /**R32G32B32 */ + R32G32B32 = 30, + /**RGBA格式纹理,每个通道16位浮点数。 */ + R16G16B16A16 = 17, + /**R16 G16 B6 */ + R16G16B16 = 31, + /**ASTC 4x4*/ + ASTC4x4 = 18, + /**ASTC sRGB 4x4 */ + ASTC4x4SRGB = 23, + /**ASTC 6x6*/ + ASTC6x6 = 19, + /**ASTC 6x6*/ + ASTC6x6SRGB = 24, + /**ASTC 8x8 */ + ASTC8x8 = 20, + /**ASTC srgb 8x8 */ + ASTC8x8SRGB = 25, + /**ASTC 10x10 */ + ASTC10x10 = 21, + /**ASTC srgb 10x10 */ + ASTC10x10SRGB = 26, + /**ASTC 12x12 */ + ASTC12x12 = 22, + /**ASTC srgb 12x12 */ + ASTC12x12SRGB = 27, + /**ktx图片 */ + KTXTEXTURE = -1, + /**pvr图片 */ + PVRTEXTURE = -2 + } + /** + * 纹理寻址模式。 + */ + enum WrapMode { + /** 循环平铺。*/ + Repeat = 0, + /** 超过UV边界后采用最后一个像素。*/ + Clamp = 1, + /** 镜像采样 */ + Mirrored = 2 + } + interface IShaderObjStructor { + name: string; + enableInstancing: boolean; + supportReflectionProbe: boolean; + surportVolumetricGI: boolean; + attributeMap: any; + uniformMap: any; + defaultValue: any; + shaderPass: Array; + } + interface IShaderpassStructor { + VS?: string; + FS?: string; + VSPath?: string; + FSPath?: string; + pipeline?: string; + statefirst?: boolean; + renderState?: Record; + } + enum ShaderFeatureType { + DEFAULT = 0, + D3 = 1, + D2 = 2, + PostProcess = 3, + Sky = 4, + Effect = 5 + } + /** + * Shader3D 类用于创建Shader3D。 + */ + class Shader3D { + static _configDefineValues: IDefineDatas; + /**渲染状态_剔除。*/ + static CULL: number; + /**渲染状态_混合。*/ + static BLEND: number; + /**渲染状态_混合源。*/ + static BLEND_SRC: number; + /**渲染状态_混合目标。*/ + static BLEND_DST: number; + /**渲染状态_混合源RGB。*/ + static BLEND_SRC_RGB: number; + /**渲染状态_混合目标RGB。*/ + static BLEND_DST_RGB: number; + /**渲染状态_混合源ALPHA。*/ + static BLEND_SRC_ALPHA: number; + /**渲染状态_混合目标ALPHA。*/ + static BLEND_DST_ALPHA: number; + /**渲染状态_混合方程。*/ + static BLEND_EQUATION: number; + /**渲染状态_混合方程。*/ + static BLEND_EQUATION_RGB: number; + /**渲染状态_ALPHA混合方程。*/ + static BLEND_EQUATION_ALPHA: number; + /**渲染状态_深度测试。*/ + static DEPTH_TEST: number; + /**渲染状态_深度写入。*/ + static DEPTH_WRITE: number; + /**渲染状态_模板测试。*/ + static STENCIL_TEST: number; + /**渲染状态_模板写入 */ + static STENCIL_WRITE: number; + /**渲染状态_模板写入值 */ + static STENCIL_Ref: number; + /**渲染状态_模板写入设置 */ + static STENCIL_Op: number; + /**shader变量提交周期,自定义。*/ + static PERIOD_CUSTOM: number; + /**shader变量提交周期,逐材质。*/ + static PERIOD_MATERIAL: number; + /**shader变量提交周期,逐精灵和相机,注:因为精灵包含MVP矩阵,为复合属性,所以摄像机发生变化时也应提交。*/ + static PERIOD_SPRITE: number; + /**shader变量提交周期,逐相机。*/ + static PERIOD_CAMERA: number; + /**shader变量提交周期,逐场景。*/ + static PERIOD_SCENE: number; + /**是否开启调试模式。 */ + static debugMode: boolean; + static init(): void; + /** + * 注册宏定义。 + * @param name + */ + static getDefineByName(name: string): ShaderDefine; + /** + * 通过Shader属性名称获得唯一ID。 + * @param name Shader属性名称。 + * @return 唯一ID。 + */ + static propertyNameToID(name: string): number; + static propertyIDToName(id: number): string; + /** + * 添加函数库引用。 + * @param fileName 文件名字。 + * @param txt 文件内容 + */ + static addInclude(fileName: string, txt: string): void; + /** + * 通过宏定义名字编译shader。 + * @param shaderName Shader名称。 + * @param subShaderIndex 子着色器索引。 + * @param passIndex 通道索引。 + * @param defineNames 宏定义名字集合。 + */ + static compileShaderByDefineNames(shaderName: string, subShaderIndex: number, passIndex: number, defineNames: string[], nodeCommonMap: string[]): boolean; + /** + * 添加预编译shader文件,主要是处理宏定义 + */ + static add(name: string, enableInstancing?: boolean, supportReflectionProbe?: boolean): Shader3D; + /** + * 获取ShaderCompile3D。 + * @param name + * @return ShaderCompile3D。 + */ + static find(name: string): Shader3D; + static parse(data: IShaderObjStructor, basePath: string): Shader3D; + shaderType: ShaderFeatureType; + /** + * 名字。 + */ + get name(): string; + /** + * 创建一个 Shader3D 实例。 + */ + constructor(name: string, enableInstancing: boolean, supportReflectionProbe: boolean); + /** + * 添加子着色器。 + */ + addSubShader(subShader: SubShader): void; + /** + * 在特定索引获取子着色器。 + * @param index 索引。 + * @return 子着色器。 + */ + getSubShaderAt(index: number): SubShader; + } + /** + * ShaderPass 类用于实现ShaderPass。 + */ + class ShaderPass extends ShaderCompileDefineBase { + get pipelineMode(): string; + set pipelineMode(value: string); + set nodeCommonMap(value: Array); + get nodeCommonMap(): Array; + /** 优先 ShaderPass 渲染状态 */ + private _statefirst; + get statefirst(): boolean; + set statefirst(value: boolean); + moduleData: IShaderPassData; + /** + * 渲染状态。 + */ + get renderState(): RenderState; + constructor(owner: SubShader, compiledObj: IShaderCompiledObj); + } + /** + * shaderVariable 类用于保存shader变量上传相关信息。 + */ + class ShaderVariable { + static pointID: number; + /** + * 创建一个 shaderVariable 实例。 + */ + constructor(); + } + /** + * 着色器变种。 + */ + class ShaderVariant { + /** + * 着色器。 + */ + get shader(): Shader3D; + /** + * 子着色器索引。 + */ + get subShaderIndex(): number; + /** + * 通道索引。 + */ + get passIndex(): number; + /** + * 宏定义集合。 + */ + get defineNames(): Readonly; + /** + * 创建着色器变种。 + * @param shader 着色器 + * @param subShaderIndex 子着色器索引 + * @param passIndex 通道索引 + * @param defines 宏定义集合 + */ + constructor(shader: Shader3D, subShaderIndex: number, passIndex: number, defines: string[]); + /** + * 给着色器变种赋值。 + * @param shader 着色器 + * @param subShaderIndex 子着色器索引 + * @param passIndex 通道索引 + * @param defineNames 宏定义集合 + */ + setValue(shader: Shader3D, subShaderIndex: number, passIndex: number, defineNames: string[]): void; + /** + * 是否相等。 + * @param other 其它着色器变种 + * @return 是否相等。 + */ + equal(other: ShaderVariant): boolean; + /** + * 克隆。 + * @return 着色器变种。 + */ + clone(): ShaderVariant; + } + interface IShaderVariant { + subShaderIndex: number; + passIndex: number; + defines: string[]; + nodeCommonMap: string[]; + } + /** + * 着色器变种集合。 + */ + class ShaderVariantCollection { + static active: ShaderVariantCollection; + items: Record; + constructor(items?: Record); + add(shaderPass: ShaderPass, defines: ReadonlyArray): void; + compileAll(): void; + } + type UniformMapType = { + [blockName: string]: { + [uniformName: string]: ShaderDataType; + } | ShaderDataType; + }; + type AttributeMapType = { + [name: string]: [ + number, + ShaderDataType + ]; + }; + /** + * SubShader 类用于创建SubShader。 + */ + class SubShader { + static IncludeUniformMap: any; + /** + * 注册glsl所用到的Uniform + * 会在生成Uniformmap的时候根据包含的Include文件,添加所需要的uniform因素 + */ + static regIncludeBindUnifrom(includeName: string, uniformMap: { + [name: string]: ShaderDataType; + }, defaultValue: { + [key: string]: any; + }): void; + static readonly DefaultAttributeMap: { + [name: string]: [ + number, + ShaderDataType + ]; + }; + moduleData: ISubshaderData; + /** + * 创建一个 SubShader 实例。 + * @param attributeMap 顶点属性表。 + * @param uniformMap uniform属性表。 + */ + constructor(attributeMap?: { + [name: string]: [ + number, + ShaderDataType + ]; + }, uniformMap?: UniformMapType, uniformDefaultValue?: { + [name: string]: ShaderDataItem; + }); + /** + * 添加着色器Pass + * @param vs + * @param ps + * @param pipelineMode 渲染管线模式。 + */ + addShaderPass(vs: string, ps: string, pipelineMode?: string): ShaderPass; + _addShaderPass(compiledObj: IShaderCompiledObj, pipelineMode?: string): ShaderPass; + private _addIncludeUniform; + } + /** + * ... + * @author ... + */ + class VertexMesh { + /**顶点位置数据 */ + static MESH_POSITION0: number; + /**顶点顶点色数据 */ + static MESH_COLOR0: number; + /**顶点UV0数据 */ + static MESH_TEXTURECOORDINATE0: number; + /**顶点法线数据 */ + static MESH_NORMAL0: number; + /**顶点切线数据 */ + static MESH_TANGENT0: number; + /**顶点骨骼索引数据 */ + static MESH_BLENDINDICES0: number; + /**顶点骨骼权重数据 */ + static MESH_BLENDWEIGHT0: number; + /**顶点UV1数据 */ + static MESH_TEXTURECOORDINATE1: number; + /**顶点世界矩阵数据Row0 */ + static MESH_WORLDMATRIX_ROW0: number; + /**顶点世界矩阵数据Row1 */ + static MESH_WORLDMATRIX_ROW1: number; + /**顶点世界矩阵数据Row2 */ + static MESH_WORLDMATRIX_ROW2: number; + /**顶点世界矩阵数据Row3 */ + static MESH_WORLDMATRIX_ROW3: number; + /**简单数据动画数据 */ + static MESH_SIMPLEANIMATOR: number; + /**光照贴图的缩放和偏移 */ + static MESH_LIGHTMAPSCALEOFFSET: number; + /**instanceworld顶点描述 */ + static instanceWorldMatrixDeclaration: VertexDeclaration; + /**instanceSimple动画数据顶点描述 */ + static instanceSimpleAnimatorDeclaration: VertexDeclaration; + /**instanceLightMap光照贴图的缩放和偏移顶点描述 */ + static instanceLightMapScaleOffsetDeclaration: VertexDeclaration; + /**自定义attribute instance 预留位*/ + /**顶点自定义数据0 */ + static MESH_CUSTOME0: number; + /**顶点自定义数据1 */ + static MESH_CUSTOME1: number; + /**顶点自定义数据2 */ + static MESH_CUSTOME2: number; + /**顶点自定义数据3 */ + static MESH_CUSTOME3: number; + /** + * 获取顶点声明。 + * @param vertexFlag 顶点声明标记字符,格式为:"POSITION,NORMAL,COLOR,UV,UV1,BLENDWEIGHT,BLENDINDICES,TANGENT"。 + * @return 顶点声明。 + */ + static getVertexDeclaration(vertexFlag: string, compatible?: boolean): VertexDeclaration; + } + /** + * @private + */ + class RenderStateContext { + /** + * 模板写入开关 + * @param gl + * @param value + */ + static setStencilMask(value: boolean): void; + } + class StencilState { + } + class SubUniformBufferData extends UnifromBufferData { + /** + * create UniformBufferData Instance + * @param uniformParamsStat Params describe + */ + constructor(uniformParamsStat: Map, bufferOffset: number); + } + /** + * 管理 + */ + class UniformBufferBase { + } + /** + *描述UniformBuffer参数类型 + */ + enum UniformBufferParamsType { + Number = 0, + Vector2 = 1, + Vector3 = 2, + Vector4 = 3, + Matrix4x4 = 4, + Vector4Array = 5, + MatrixArray = 6 + } + /** + * 实例化UniformBuffer数据 + * 注:要与glsl中Uniform block结构相同 + */ + class UnifromBufferData { + /** + * Buffer Data + */ + _buffer: Float32Array; + /** + * create UniformBufferData Instance + * @param uniformParamsStat Params describe + */ + constructor(uniformParamsStat: Map); + /** + * get Buffer byte length + * @returns + */ + getbyteLength(): number; + /** + * set Vector4Array by paramsName + * @param name uniform params name + * @param value vector4Array data + */ + setVector4Array(name: string, value: Vector4[]): void; + /** + * set Vector4Array by paramsIndex + * @param uniformID uniform params index + * @param value vector4Array data + * @returns + */ + setVector4ArraybyIndex(uniformID: number, value: Vector4[]): void; + /** + * set MatrixArray by paramsName + * @param name uniform params name + * @param value MatrixArray data + */ + setMatrixArray(name: string, value: Matrix4x4[]): void; + /** + * set MatrixArray by paramsIndex + * @param uniformID uniform params index + * @param value MatrixArray data + * @returns + */ + setMatrixArraybyIndex(uniformID: number, value: Matrix4x4[]): void; + /** + * set Number by paramsName + * @param name uniform params name + * @param value Number data + */ + setNumber(name: string, value: number): void; + /** + * set Number by paramsIndex + * @param uniformID uniform params index + * @param value Number data + * @returns + */ + setNumberbyIndex(uniformID: number, value: number): void; + /** + * set Vector2 by paramsName + * @param name uniform params name + * @param value Vector2 data + */ + setVector2(name: string, value: Vector2): void; + /** + * set Vector2 by paramsIndex + * @param uniformID uniform params index + * @param value Vector2 data + * @returns + */ + setVector2byIndex(uniformID: number, value: Vector2): void; + /** + * set Vector3 by paramsName + * @param name uniform params name + * @param value Vector3 data + */ + setVector3(name: string, value: Vector3): void; + /** + * set Vector3 by uniformID + * @param uniformID uniform params index + * @param value Vector3 data + * @returns + */ + setVector3byIndex(uniformID: number, value: Vector3): void; + /** + * set Vector4 by paramsName + * @param name uniform params name + * @param value Vector4 data + */ + setVector4(name: string, value: Vector4): void; + /** + * set Vector4 by paramsIndex + * @param uniformID uniform params index + * @param value Vector4 data + * @returns + */ + setVector4byIndex(uniformID: number, value: Vector4): void; + /** + * set Color by paramsName + * @param name uniform params name + * @param value Color data + */ + setColor(name: string, value: Color): void; + setColorbyIndex(uniformID: number, value: Color): void; + /** + * set Matrix by paramsName + * @param name uniform params name + * @param value Matrix data + */ + setMatrix(name: string, value: Matrix4x4): void; + /** + * set Matrix by paramsIndex + * @param uniformID uniform params index + * @param value Matrix data + * @returns + */ + setMatrixbyIndex(uniformID: number, value: Matrix4x4): void; + clone(): UnifromBufferData; + cloneTo(destObject: UnifromBufferData): void; + } + /** + * 类封装WebGL2UniformBufferObect + */ + class UniformBufferObject { + static UBONAME_SCENE: string; + static UBONAME_CAMERA: string; + static UBONAME_SPRITE3D: string; + static UBONAME_SHADOW: string; + /** + * create Uniform Buffer Base + * @param name Uniform block name(must pitch Shader) + * @param bufferUsage config usage + * @param bytelength byte length + * @returns + */ + static create(name: string, bufferUsage: number, bytelength: number, isSingle?: boolean): UniformBufferObject; + /** + * get Uniform Buffer by name + * @param name Uniform block name(must pitch Shader) + * @returns + */ + static getBuffer(name: string, index: number): UniformBufferObject; + _glBuffer: GLBuffer; + /**buffer name */ + _name: string; + /**all byte length */ + byteLength: number; + bufferType: BufferTargetType; + bufferUsage: BufferUsage; + /** + * 重置buffer长度 + * @param bytelength + */ + _reset(bytelength: number): void; + /** + * @inheritDoc + * @override + */ + bind(): boolean; + /** + * set UniformBuffer data by UniformBufferData + * @param buffer Float32Array data + * @param bufferOffset byteOffset + * @param byteCount byteCount + * @returns + */ + setData(buffer: Float32Array, bufferOffset?: number, byteCount?: number): void; + /** + * set UniformBuffer data by UniformBufferData + * @param bufferData + */ + setDataByUniformBufferData(bufferData: UnifromBufferData): void; + /** + * set Data by subUniformBufferData + * @param bufferData sub UniformBufferData + * @param offset + */ + setDataByByUniformBufferDataOffset(bufferData: SubUniformBufferData, offset: number): void; + /** + * @private + */ + destroy(): void; + } + interface VAElement { + format: string; + stride: number; + shaderLocation: number; + } + class VertexAttributeLayout { + static IPoint: number; + static _pool: { + [key: number]: VertexAttributeLayout; + }; + static getVertexLayoutByPool(vertexs: VertexBuffer[]): VertexAttributeLayout; + /** + * vertex attribute byte size Array + */ + attributeByteSize: Array; + /** + * vertex Layout des + */ + VAElements: Array; + instanceMode: Array; + /** + * pool index + */ + id: number; + /** + * instance one VertexAttributeLayout + * @param vertexs + */ + constructor(vertexs: VertexBuffer[]); + } + class VertexBuffer extends Buffer { + private _instanceBuffer; + _buffer: Float32Array | Uint16Array | Uint8Array | Uint32Array; + /** + * 获取顶点声明。 + */ + get vertexDeclaration(): VertexDeclaration | null; + set vertexDeclaration(value: VertexDeclaration | null); + get instanceBuffer(): boolean; + set instanceBuffer(value: boolean); + constructor(targetType: BufferTargetType, bufferUsageType: BufferUsage); + } + class VertexStateContext { + elementCount: number; + elementType: number; + normalized: number; + vertexStride: number; + elementOffset: number; + elementString: string; + } + /** + * VertexDeclaration 类用于生成顶点声明。 + */ + class VertexDeclaration { + /** + * 获取唯一标识ID(通常用于优化或识别)。 + * @return 唯一标识ID + */ + get id(): number; + /** + * 顶点跨度,以字节为单位。 + */ + get vertexStride(): number; + /** + * 顶点元素的数量。 + */ + get vertexElementCount(): number; + /** + * 创建一个 VertexDeclaration 实例。 + * @param vertexStride 顶点跨度。 + * @param vertexElements 顶点元素集合。 + */ + constructor(vertexStride: number, vertexElements: Array); + /** + * 通过索引获取顶点元素。 + * @param index 索引。 + */ + getVertexElementByIndex(index: number): VertexElement; + /** + * get vertexElement by usage + */ + getVertexElementByUsage(usage: number): VertexElement; + } + interface IGraphicCMD { + run(context: Context, gx: number, gy: number): void; + recover(): void; + get cmdID(): string; + percent?: boolean; + pivotX?: number; + pivotY?: number; + scaleX?: number; + scaleY?: number; + angle?: number; + tx?: number; + ty?: number; + matrix?: Matrix; + x?: number; + y?: number; + width?: number; + height?: number; + points?: any; + } + /** + * @private + */ + class Context { + private static _MAXVERTNUM; + static MAXCLIPRECT: Rectangle; + private _alpha; + private static SEGNUM; + private static _contextcount; + private _drawTexToDrawTri_Vert; + private _drawTexToDrawTri_Index; + private _tempUV; + private _drawTriUseAbsMatrix; + private _other; + private _path; + private _width; + private _height; + private _renderCount; + private _meshQuatTex; + private _meshVG; + private _meshTex; + private _transedPoints; + private _temp4Points; + private _clipID_Gen; + private _lastMat_a; + private _lastMat_b; + private _lastMat_c; + private _lastMat_d; + /** + * 所cacheAs精灵 + * 对于cacheas bitmap的情况,如果图片还没准备好,需要有机会重画,所以要保存sprite。例如在图片 + * 加载完成后,调用repaint + */ + sprite: Sprite | null; + private _fillColor; + private _flushCnt; + private defTexture; + drawTexAlign: boolean; + private _isMain; + private _render2D; + private _clearColor; + private _clear; + private _shaderValueNeedRelease; + _render2DManager: RenderManager2D; + static __init__(): void; + constructor(); + copyState(ctx: Context): void; + set isMain(v: boolean); + get isMain(): boolean; + set render2D(render: Render2D); + get render2D(): Render2D; + /**@private */ + get lineJoin(): string; + /**@private */ + set lineJoin(value: string); + /**@private */ + get lineCap(): string; + /**@private */ + set lineCap(value: string); + /**@private */ + get miterLimit(): string; + /**@private */ + set miterLimit(value: string); + /** + * 添加需要touch的资源 + * @param res + */ + touchRes(res: IAutoExpiringResource): void; + transformByMatrix(matrix: Matrix, tx: number, ty: number): void; + drawRect(x: number, y: number, width: number, height: number, fillColor: any, lineColor: any, lineWidth: number): void; + alpha(value: number): void; + drawCurves(x: number, y: number, points: any[], lineColor: any, lineWidth: number): void; + private _fillAndStroke; + static set2DRenderConfig(): void; + clearBG(r: number, g: number, b: number, a: number): void; + /** + * 释放占用内存 + */ + private _releaseMem; + /** + * 释放所有资源 + */ + destroy(): void; + clear(): void; + /** + * 设置ctx的size,这个不允许直接设置,必须是canvas调过来的。所以这个函数里也不用考虑canvas相关的东西 + * @param w + * @param h + */ + size(w: number, h: number): void; + get width(): number; + set width(w: number); + get height(): number; + set height(h: number); + /** + * 获得当前矩阵的缩放值 + * 避免每次都计算getScaleX + * @return + */ + getMatScaleX(): number; + getMatScaleY(): number; + getFillColor(): number; + set fillStyle(value: any); + get fillStyle(): any; + set globalAlpha(value: number); + get globalAlpha(): number; + set textAlign(value: string); + get textAlign(): string; + set textBaseline(value: string); + get textBaseline(): string; + set globalCompositeOperation(value: string); + get globalCompositeOperation(): string; + set strokeStyle(value: any); + get strokeStyle(): any; + translate(x: number, y: number): void; + set lineWidth(value: number); + get lineWidth(): number; + save(): void; + restore(): void; + fillText(txt: string | WordText, x: number, y: number, fontStr: string, color: string, align: string, lineWidth?: number, borderColor?: string): void; + drawText(text: string | WordText, x: number, y: number, font: string, color: string, textAlign: string): void; + strokeWord(text: string | WordText, x: number, y: number, font: string, color: string, lineWidth: number, textAlign: string): void; + fillBorderText(txt: string | WordText, x: number, y: number, font: string, color: string, borderColor: string, lineWidth: number, textAlign: string): void; + private _fillRect; + fillRect(x: number, y: number, width: number, height: number, fillStyle: any): void; + fillTexture(texture: Texture, x: number, y: number, width: number, height: number, type: string, offset: Point, color: number): void; + /** + * 反正只支持一种filter,就不要叫setFilter了,直接叫setColorFilter + * @param value + */ + setColorFilter(filter: ColorFilter): void; + drawTexture(tex: Texture, x: number, y: number, width: number, height: number, color?: number): void; + drawTextures(tex: Texture, pos: ArrayLike, tx: number, ty: number, colors: number[]): void; + private isStopMerge; + drawCallOptimize(enable: boolean): boolean; + private _drawToRender2D; + private _drawMesh; + private fillShaderValue; + /** + * pt所描述的多边形完全在clip外边,整个被裁掉了 + * @param pt + * @return + */ + private clipedOff; + /** + * 应用当前矩阵。把转换后的位置放到输出数组中。 + * @param x + * @param y + * @param w + * @param h + * @param italicDeg 倾斜角度,单位是度。0度无,目前是下面不动。以后要做成可调的 + */ + private transformQuad; + /** + * 强制拒绝submit合并 + * 例如切换rt的时候 + */ + breakNextMerge(): void; + private _repaintSprite; + /** + * + * @param tex + * @param x + * @param y + * @param width + * @param height + * @param transform 图片本身希望的矩阵 + * @param tx 节点的位置 + * @param ty + * @param alpha + */ + drawTextureWithTransform(tex: Texture, x: number, y: number, width: number, height: number, transform: Matrix | null, tx: number, ty: number, alpha: number, blendMode: string | null, uv?: number[], color?: number): void; + drawGeo(geo: IRenderGeometryElement, material: Material, x: number, y: number): void; + drawGeos(geo: IRenderGeometryElement, elements: [ + Material, + number, + number + ][], x: number, y: number): void; + drawTriangles(tex: Texture, x: number, y: number, vertices: Float32Array, uvs: Float32Array, indices: Uint16Array, matrix: Matrix, alpha: number | null, blendMode: string, colorNum?: number): void; + transform(a: number, b: number, c: number, d: number, tx: number, ty: number): void; + rotate(angle: number): void; + scale(scaleX: number, scaleY: number): void; + clipRect(x: number, y: number, width: number, height: number, escape?: boolean): void; + startRender(): void; + endRender(): void; + drawLeftData(): void; + flush(): void; + beginPath(convex?: boolean): void; + closePath(): void; + /** + * 添加一个path。 + * @param points [x,y,x,y....] 这个会被保存下来,所以调用者需要注意复制。 + * @param close 是否闭合 + * @param convex 是否是凸多边形。convex的优先级是这个最大。fill的时候的次之。其实fill的时候不应该指定convex,因为可以多个path + * @param dx 需要添加的平移。这个需要在应用矩阵之前应用。 + * @param dy + */ + addPath(points: any[], close: boolean, convex: boolean, dx: number, dy: number): void; + fill(): void; + private addVGSubmit; + stroke(): void; + moveTo(x: number, y: number): void; + /** + * + * @param x + * @param y + * @param b 是否应用矩阵 + */ + lineTo(x: number, y: number): void; + arcTo(x1: number, y1: number, x2: number, y2: number, r: number): void; + arc(cx: number, cy: number, rx: number, ry: number, startAngle: number, endAngle: number, counterclockwise?: boolean, b?: boolean, minNum?: number): void; + quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): void; + /** + * 把颜色跟当前设置的alpha混合 + * @return + */ + mixRGBandAlpha(color: number): number; + strokeRect(x: number, y: number, width: number, height: number, parameterLineWidth: number): void; + /*******************************************end矢量绘制***************************************************/ + drawParticle(x: number, y: number, pt: any): void; + private _getPath; + /**获取canvas*/ + get canvas(): HTMLCanvas; + /** + * 专用函数。通过循环创建来水平填充 + * @param tex + * @param bmpid + * @param uv 希望循环的部分的uv + * @param oriw + * @param orih + * @param x + * @param y + * @param w + */ + private _fillTexture_h; + /** + * 专用函数。通过循环创建来垂直填充 + * @param tex + * @param imgid + * @param uv + * @param oriw + * @param orih + * @param x + * @param y + * @param h + */ + private _fillTexture_v; + private static tmpUVRect; + drawTextureWithSizeGrid(tex: Texture, tx: number, ty: number, width: number, height: number, sizeGrid: any[], gx: number, gy: number, color: number): void; + } + class DefferTouchResContext extends Context { + cache: CachePage; + mustTouchRes: IAutoExpiringResource[]; + randomTouchRes: IAutoExpiringResource[]; + genID: number; + /** + * 添加需要touch的资源 + * @param res + */ + touchRes(res: IAutoExpiringResource): void; + } + /** + * Render 是渲染管理类。它是一个单例,可以使用 Laya.render 访问。 + */ + class Render { + /** 表示是否是 3D 模式。*/ + static is3DMode: boolean; + /**自定义帧循环 */ + static _customRequestAnimationFrame: any; + /**帧循环函数 */ + static _loopFunction: any; + /** 当前的帧数 */ + private static lastFrm; + /** 第一次运行标记 */ + private _first; + /** 刚启动的时间。由于微信的rAF不标准,传入的stamp参数不对,因此自己计算一个从启动开始的相对时间 */ + private _startTm; + static _Render: Render; + static customRequestAnimationFrame(value: any, loopFun: any): void; + private static _customEngine; + static set customRenderEngine(engine: IRenderEngine); + static get customRenderEngine(): IRenderEngine; + static gc(): void; + /** + * 初始化引擎。 + * @param width 游戏窗口宽度。 + * @param height 游戏窗口高度。 + */ + constructor(width: number, height: number, mainCanv: HTMLCanvas); + /**@private */ + private _timeId; + /**@private */ + /** + * @performanceTool func count + */ + private _onVisibilitychange; + /** + * 获取帧对齐的时间。 + * 用这个做动画的时间参数会更平滑。 + * 从render构造开始算起。 + * @returns + */ + static vsyncTime(): number; + initRender(canvas: HTMLCanvas, w: number, h: number): boolean; + /**@private */ + private _enterFrame; + /** 目前使用的渲染器。*/ + static get context(): Context; + /** 渲染使用的原生画布引用。 */ + static get canvas(): any; + } + interface ISprite2DGeometry { + readonly vertexDeclarition: VertexDeclaration; + vbBuffer: ArrayBuffer; + ibBuffer: ArrayBuffer; + } + abstract class Render2D { + protected _renderTexture: RenderTexture2D; + constructor(out?: RenderTexture2D); + setRenderTarget(rt: RenderTexture2D): void; + abstract clone(out: RenderTexture2D): Render2D; + get out(): RenderTexture2D; + abstract renderStart(clear: boolean, clearColor: Color): void; + abstract draw(mesh: ISprite2DGeometry, vboff: number, vblen: number, iboff: number, iblen: number, mtl: Value2D, customMaterial: Material): void; + abstract drawMesh(mesh: IRenderGeometryElement, mtl: Material): void; + abstract drawElement(ele: IRenderElement2D): void; + abstract renderEnd(): void; + } + /** + * 直接渲染,不攒submit + */ + class Render2DSimple extends Render2D { + static rendercontext2D: IRenderContext2D; + private _renderElement; + private static _geoMap; + constructor(out?: RenderTexture2D); + clone(out: RenderTexture2D): Render2D; + private _createMesh; + private getGeo; + renderStart(clear: boolean, clearColor: Color): void; + setRenderTarget(rt: RenderTexture2D): void; + drawMesh(geo: IRenderGeometryElement, mtl: Material): void; + drawElement(ele: IRenderElement2D): void; + draw(mesh2d: ISprite2DGeometry, vboff: number, vblen: number, iboff: number, iblen: number, mtl: Value2D, customMaterial: Material): void; + renderEnd(): void; + } + /** + * + * @author laya + */ + class RenderInfo { + /**当前帧的开始时间 */ + static loopStTm: number; + /**主舞台 Stage 渲染次数计数。 */ + static loopCount: number; + } + /** + * @ignore + */ + interface _RenderFunction { + (sp: Sprite, ctx: Context, x: number, y: number): void; + } + /** + * @ignore + * @en Sprite renderer. + * @zh 精灵渲染器 + */ + class RenderSprite { + /** @private*/ + static cacheNormalEnable: boolean; + /** @private */ + static renders: RenderSprite[]; + /** @private */ + protected static NORENDER: RenderSprite; + private static _initRenderFun; + private static _getTypeRender; + constructor(type: number, next: RenderSprite | null); + _renderNode2D(sprite: Sprite, context: Context, x: number, y: number): void; + /** + * 把sprite的下一步渲染到缓存的rt上 + * 要求外面可以直接使用,不用考虑图集的偏移之类的问题 + * @param sprite + * @param context + * @returns + */ + _renderNextToCacheRT(sprite: Sprite, context: Context, marginLeft?: number, marginTop?: number, marginRight?: number, marginBottom?: number): boolean; + /** + * @en Renders a sprite to a RenderTexture2D. Determines the render target based on the provided parameters. If a render texture is provided, it uses that. Otherwise, it creates a new one based on the sprite's cache rect and other factors. Optionally, can draw a render rectangle based on the isDrawRenderRect parameter. + * @param sprite The sprite to be rendered. + * @param context The context for rendering. + * @param x The x-coordinate for rendering. + * @param y The y-coordinate for rendering. + * @param renderTexture The optional RenderTexture2D to render to. If not provided, a new one will be created if needed. + * @param isDrawRenderRect A boolean indicating whether to draw the render rectangle. When true, it starts drawing from (0,0) of the render texture and subtracts the offset of the cache rectangle. When false, it keeps the sprite's original relative position for drawing. + * @returns The RenderTexture2D that the sprite is rendered to. + * @zh 将一个精灵渲染到一个渲染纹理上。根据提供的参数确定渲染目标。如果提供了渲染纹理,则使用该纹理。否则,根据精灵的缓存矩形和其他因素创建一个新的。可以根据 isDrawRenderRect 参数选择是否绘制渲染矩形。 + * @param sprite 要被渲染的精灵。 + * @param context 用于渲染的上下文。 + * @param x 渲染的 x 坐标。 + * @param y 渲染的 y 坐标。 + * @param renderTexture 可选的渲染纹理。如果未提供,在需要时会创建一个新的。 + * @param isDrawRenderRect 一个布尔值,表示是否绘制渲染矩形。为 true 时,从渲染纹理的(0,0)点开始绘制,但要减去缓存矩形的偏移;为 false 时,保持精灵的原始相对位置进行绘制。 + * @returns 渲染的 RenderTexture2D。 + */ + static RenderToRenderTexture(sprite: Sprite, context: Context | null, x: number, y: number, renderTexture?: RenderTexture2D, isDrawRenderRect?: boolean): RenderTexture2D; + /** + * @en Renders a sprite to a cache texture. Checks if the sprite needs repainting or if the cache texture is missing or if there is a global repaint. If so, creates a new cache texture by rendering the sprite to a RenderTexture2D. + * @param sprite The sprite to be rendered. + * @param context The context for rendering. + * @param x The x-coordinate for rendering. + * @param y The y-coordinate for rendering. + * @param isDrawRenderRect A boolean indicating whether to draw the render rectangle. When true, it starts drawing from (0,0) of the render texture and subtracts the offset of the cache rectangle. When false, it keeps the sprite's original relative position for drawing. + * @returns A boolean indicating whether a new cache texture was created (true for repaint, false otherwise). + * @zh 将精灵画在当前贴图的 x,y 位置。检查精灵是否需要重绘、缓存纹理是否缺失或者是否有全局重绘。如果是,则通过将精灵渲染到一个渲染纹理来创建新的缓存纹理。 + * @param sprite 要被渲染的精灵。 + * @param context 用于渲染的上下文。 + * @param x 渲染的 x 坐标。 + * @param y 渲染的 y 坐标。 + * @param isDrawRenderRect 一个布尔值,表示是否绘制渲染矩形。为 true 时,从渲染纹理的(0,0)点开始绘制,但要减去缓存矩形的偏移;为 false 时,保持精灵的原始相对位置进行绘制。 + * @returns 一个布尔值,表示是否创建了新的缓存纹理(true 表示重绘,false 表示未重绘)。 + */ + static RenderToCacheTexture(sprite: Sprite, context: Context | null, x: number, y: number, isDrawRenderRect?: boolean): boolean; + private static _transBound; + private _spriteRect_TextureSpace; + private _maskRect_TextureSpace; + _mask(sprite: Sprite, ctx: Context, x: number, y: number): void; + } + class RenderToCache extends Render2D { + renderResult: RenderObject2D[]; + private _tex_vert_decl; + constructor(); + clone(out: RenderTexture2D): RenderToCache; + private _createMesh; + private setVertexDecl; + renderStart(): void; + draw(mesh2d: ISprite2DGeometry, vboff: number, vblen: number, iboff: number, iblen: number, mtl: Value2D): void; + drawMesh(mesh: IRenderGeometryElement, mtl: Material): void; + drawElement(ele: IRenderElement2D): void; + renderEnd(): void; + } + interface IAutoExpiringResource { + isRandomTouch: boolean; + touch(): void; + } + class RenderObject2D implements ISprite2DGeometry { + vboff: number; + vblen: number; + iboff: number; + iblen: number; + mtl: Value2D; + localClipMatrix: Matrix; + dynaResourcesNeedTouch: any[]; + vertexDeclarition: VertexDeclaration; + vbBuffer: ArrayBuffer; + ibBuffer: ArrayBuffer; + geo: IRenderGeometryElement; + renderElement: IRenderElement2D; + constructor(mesh: ISprite2DGeometry, vboff: number, vblen: number, iboff: number, iblen: number, mtl: Value2D); + toNativeMesh(): void; + destroyGPUResource(): void; + } + class Cache_Info { + page: CachePage; + mat: Matrix; + alpha: number; + blend: string; + contextID: number; + clipMatrix: Matrix; + reset(): void; + } + class RenderPageContext { + curMatrix: Matrix; + alpha: number; + render2d: Render2D; + width: number; + height: number; + clipInfo: Matrix; + blend: number; + /** + * 这里的xy就是渲染的xy,需要这个参数是为了正确计算当前矩阵 + * @param ctx + * @param x + * @param y + */ + constructor(ctx: Context, x: number, y: number); + _copyClipInfo(shaderValue: Value2D): void; + clipRect(rect: Rectangle): void; + setBlendMode(blend: string): void; + _applyBlend(shaderValue: Value2D): void; + } + class CachePage { + sprite: Sprite; + meshes: RenderObject2D[]; + defferTouchRes: IAutoExpiringResource[]; + defferTouchResRand: IAutoExpiringResource[]; + children: Sprite[]; + reset(): void; + private clearGPUObject; + /** + * 根据sprite的相对矩阵(相对于parent)画出缓存的mesh + * 为了位置能正确,需要context中提供的矩阵是sprite的parent的世界矩阵 + * @param sprite + * @param context + * @param isRoot 如果为true的话,则可以直接使用当前矩阵。优化用。 + */ + render(sprite: Sprite, context: RenderPageContext, isRoot: boolean): void; + } + /** + * 把渲染结果保存成mesh和材质 + */ + class SpriteCache { + /** + * 已知sprite和当前世界矩阵curMat, 把sprite的偏移减掉,就是得到parent的世界矩阵 + * @param sprite + * @param curMat 当前的矩阵,这是增加了sprite自身的偏移后的矩阵 + * @param outMat 把curMat去掉sprite自身的偏移得到的结果 + */ + static curMatSubSpriteMat(sprite: Sprite, curMat: Matrix, outMat: Matrix): Matrix; + static renderCacheAsNormal(context: Context | DefferTouchResContext, sprite: Sprite, next: RenderSprite, x: number, y: number): boolean; + } + /** + * VertexElement 类用于创建顶点结构分配。 + */ + class VertexElement { + /** + * 顶点偏移 + */ + get offset(): number; + /** + * 顶点信息名称 + */ + get elementFormat(): string; + /** + * 顶点宏标记 + */ + get elementUsage(): number; + /** + * 创建顶点结构分配实例 + * @param offset 顶点偏移 + * @param elementFormat 顶点数据格式名称 + * @param elementUsage 顶点宏标记 + */ + constructor(offset: number, elementFormat: string, elementUsage: number); + } + /** + * 类用来定义顶点元素格式 + */ + class VertexElementFormat { + /**单精度浮点数 */ + static Single: string; + /**vec2 数据*/ + static Vector2: string; + /**vec3 数据*/ + static Vector3: string; + /**vec4 数据 */ + static Vector4: string; + /**颜色 */ + static Color: string; + /**字节数组4 */ + static Byte4: string; + /**字节数组3 */ + static Byte3: string; + /**字节数组2 */ + static Byte2: string; + /**字节数组1 */ + static ByteOne: string; + /**半精度浮点数数组2 */ + static Short2: string; + /**半精度浮点数数组4 */ + static Short4: string; + /**归一化半精度浮点数组2 */ + static NormalizedShort2: string; + /**归一化半精度浮点数组4 */ + static NormalizedShort4: string; + /** + * 获取顶点元素格式信息。 + * @param element 元素名称 + * @returns 返回顶点元素信息 + */ + static getElementInfos(element: string): any[]; + } + /** + * @en This class is used to describe resources. + * @zh 此类用来描述资源 + */ + class AssetDb { + /** + * @en Default resource instance. + * @zh 默认资源实例。 + */ + static inst: AssetDb; + /** + * @en UUID data. + * @zh UUID 数据。 + */ + uuidMap: Record; + /** + * @en Shader name data. + * @zh 着色器名称数据。 + */ + shaderNameMap: Record; + /** + * @en Metadata for resources. + * @zh 资源的元数据。 + */ + metaMap: Record; + /** + * @en Gets the URL from the UUID. + * @param uuid The UUID. + * @returns The URL corresponding to the UUID. + * @zh 根据 UUID 获取 URL。 + * @param uuid UUID + * @returns UUID 对应的 URL + */ + UUID_to_URL(uuid: string): string; + /** + * @en Asynchronously gets the URL from the UUID. + * @param uuid The UUID. + * @returns A promise. + * @zh 异步根据 uuid 获取 URL。 + * @param uuid UUID + * @returns 一个promise。 + */ + UUID_to_URL_async(uuid: string): Promise; + /** + * @en Asynchronously gets the UUID from the URL. + * @param url The URL. + * @returns A promise. + * @zh 异步根据 URL 获取 UUID。 + * @param url URL + * @returns 一个 promise。 + */ + URL_to_UUID_async(url: string): Promise; + /** + * @en Resolves the real URL from a given URL. + * @param url The original URL. + * @param onResolve Optional callback when the URL is resolved. + * @returns A promise that resolves to the real URL. + * @zh 根据给定的 URL 解析真实的 URL。 + * @param url 原始 URL。 + * @param onResolve 可选的回调函数,当 URL 被解析时调用。 + * @returns 一个promise,解析为真实的 URL。 + */ + resolveURL(url: string, onResolve?: (url: string) => void): Promise; + /** + * @en Finds the URL for a shader name. + * @param shaderName The shader name. + * @returns The URL corresponding to the shader name. + * @zh 根据着色器名称查找 URL。 + * @param shaderName 着色器名称。 + * @returns 着色器名称对应的 URL。 + */ + shaderName_to_URL(shaderName: string): string; + /** + * @en Asynchronously finds the URL for a shader name. + * @param shaderName The shader name. + * @returns A promise. + * @zh 异步根据着色器名称查找 URL。 + * @param shaderName 着色器名称。 + * @returns 一个 promise。 + */ + shaderName_to_URL_async(shaderName: string): Promise; + /** + * @en Gets the metadata for a resource. + * @param url The resource URL. + * @param uuid The resource UUID. + * @returns A promise. + * @zh 获取资源的元数据。 + * @param url 资源的 URL。 + * @param uuid 资源的 UUID。 + * @returns 一个 promise。 + */ + getMeta(url: string, uuid: string): Promise; + /** + * @en Gets the URL for a sub-asset. + * @param url The base resource URL. + * @param uuid The UUID of the base resource. + * @param subAssetName The name of the sub-asset. + * @param subAssetExt The file extension of the sub-asset. + * @returns The URL for the sub-asset. + * @zh 获取子资源的 URL。 + * @param url 基础资源的 URL。 + * @param uuid 基础资源的 UUID。 + * @param subAssetName 子资源的名称。 + * @param subAssetExt 子资源的文件扩展名。 + * @returns 子资源的 URL。 + */ + getSubAssetURL(url: string, uuid: string, subAssetName: string, subAssetExt: string): string; + } + /** + * @en Resource class for managing an atlas, which is a collection of textures and their frames. + * @zh 管理大图合集资源的类,该类包含纹理和它们的帧。 + */ + class AtlasResource extends Resource { + /** + * @en The directory where the atlas resource is stored. + * @zh 存储大图合集资源的目录。 + */ + readonly dir: string; + /** + * @en An array of textures contained within the atlas. + * @zh 包含在大图合集中的纹理数组。 + */ + readonly textures: Array; + /** + * @en An array of texture frames, which are individual images within the atlas. + * @zh 大图合集中的纹理帧数组,它们是大图中的单个图像。 + */ + readonly frames: Array; + /** + * @en Creates a new instance of the AtlasResource class. + * @param dir Directory of the atlas. + * @param textures Array of textures in the atlas. + * @param frames Array of frames corresponding to the textures. + * @zh 创建AtlasResource类的新实例。实例化大图合集资源。 + * @param dir 大图合集的目录路径。 + * @param textures 大图合集中的纹理数组。 + * @param frames 对应纹理的帧数组。 + */ + constructor(dir: string, textures: Array, frames: Array); + /** + * @en Disposes of the resources used by the atlas, destroying all textures and frames. + * @zh 释放大图合集使用的资源,销毁所有纹理和帧。 + */ + protected _disposeResource(): void; + } + /** + * @en The `BaseTexture` class is an abstract class and serves as the base class for textures. It should not be instantiated directly. + * @zh `BaseTexture` 类是纹理的父类,是一个抽象类,不允许直接实例化。 + */ + class BaseTexture extends Resource { + /** + * @en hdr encode format + * @zh hdr编码格式 + */ + hdrEncodeFormat: HDREncodeFormat; + protected _width: number; + protected _height: number; + /** + * @en The width of the texture. + * @zh 纹理的宽度。 + */ + get width(): number; + set width(width: number); + /** + * @en The height of the texture. + * @zh 纹理的高度。 + */ + get height(): number; + set height(height: number); + protected _dimension: TextureDimension; + /** + * @en The texture dimension. + * @zh 纹理几何属性 + */ + get dimension(): TextureDimension; + protected _format: TextureFormat; + /** + * @en The format of the texture. + * @zh 纹理的格式。 + */ + get format(): TextureFormat; + /** + * @en Whether to generate mipmap + * @zh 是否生成mipmap + */ + get mipmap(): boolean; + /** + * @en The number of mipmap generated for this texture. + * @zh 为此纹理生成的mipmap数量。 + */ + get mipmapCount(): number; + /** + * @en The anisotropy value of texture + * @zh 纹理的各向异性值 + */ + get anisoLevel(): number; + set anisoLevel(value: number); + /** + * @en The sampling filtering mode of the texture. + * @zh 纹理的采样过滤模式。 + */ + get filterMode(): FilterMode; + set filterMode(value: FilterMode); + /** + * @en U-direction sampling mode + * @zh U方向采样模式 + */ + get wrapModeU(): WrapMode; + set wrapModeU(value: WrapMode); + /** + * @en V-direction sampling mode + * @zh V方向采样模式 + */ + get wrapModeV(): WrapMode; + set wrapModeV(value: WrapMode); + /** + * @en W-direction sampling mode + * @zh W方向采样模式 + */ + get wrapModeW(): WrapMode; + set wrapModeW(value: WrapMode); + /** + * @en The texture compare mode. + * @zh 贴图压缩格式 + */ + get compareMode(): TextureCompareMode; + set compareMode(value: TextureCompareMode); + /** + * @en The gamma correction value of the texture. If set to 1.0, texture sampling will be linear without any correction. + * @zh 纹理的伽马校正值。如果设置为1.0,则纹理采样将为线性,不进行任何校正。 + */ + get gammaCorrection(): number; + /** + * @en The base mipmap level of the texture. + * @zh 纹理的mipmap起始等级。 + */ + get baseMipmapLevel(): number; + set baseMipmapLevel(value: number); + /** + * @en The maximum mipmap level of the texture. + * @zh 纹理的最大mipmap等级。 + */ + get maxMipmapLevel(): number; + set maxMipmapLevel(value: number); + /** + * @en Gets whether the texture is using gamma space. + * @zh 判断纹理是否使用伽马空间。 + */ + get gammaSpace(): boolean; + /** + * @en Creates an instance of BaseTexture. + * @param width The width of the texture. + * @param height The height of the texture. + * @param format The format of the texture, specified as a number. + * @zh 创建 BaseTexture 类的实例。 + * @param width 纹理的宽度。 + * @param height 纹理的高度。 + * @param format 纹理的格式,以数字形式指定。 + */ + constructor(width: number, height: number, format: number); + /** + * @en Checks if the texture is in a GPU compressed format. + * @returns True if the texture is in a GPU compressed format, otherwise false. + * @zh 是否是gpu压缩纹理格式 + * @returns 如果纹理是gpu压缩格式,则返回true,否则返回false。 + */ + gpuCompressFormat(): boolean; + /** + * @en The default texture. + * @zh 默认贴图 + */ + get defaultTexture(): BaseTexture; + protected _disposeResource(): void; + } + /** + * @en Prefab class. + * @zh 预制体类。 + */ + class Prefab extends Resource { + /** + * @readonly + * @en The version number of the prefab resource. + * @zh 预制体资源的版本号。 + */ + readonly version: number; + /** + * @en Whether the prefab is generated by the DCC tool. + * @zh 预制体是否是由 DCC 工具生成的。 + */ + fromDCC: boolean; + /** + * @ignore + * @en Create an instance of the prefab. + * @param version The version number of the prefab resource. + * @zh 创建一个预制体实例。 + * @param version 预制体资源的版本号。 + */ + constructor(version?: number); + /** + * @en Create an instance of the prefab. + * @param options Instantiation options. + * @param errors Error content. + * @zh 创建一个预制体的实例。 + * @param options 实例化选项 + * @param errors 错误内容 + */ + create(options?: Record, errors?: Array): Node; + } + type HierarchyResource = Prefab; + var HierarchyResource: typeof Prefab; + /** + * @en `HTMLCanvas` is a proxy class for the HTML Canvas, encapsulating the properties and methods of the Canvas. + * @zh `HTMLCanvas` 是 Html Canvas 的代理类,封装了 Canvas 的属性和方法。 + */ + class HTMLCanvas extends Resource { + private _ctx; + protected _width: number; + protected _height: number; + /** + * @en The source of the canvas element. + * @zh Canvas 元素的源。 + */ + get source(): HTMLCanvasElement; + /** + * @en The width of the canvas. + * @zh 画布宽度。 + */ + get width(): number; + set width(width: number); + /** + * @en The height of the canvas. + * @zh 画布高度。 + */ + get height(): number; + set height(height: number); + /** + * @en According to the specified type, create an HTMLCanvas instance. + * @param createCanvas If true, creates a new canvas element. If false, uses the instance itself as the canvas source. + * @zh 根据指定的类型,创建一个 HTMLCanvas 实例。 + * @param createCanvas 如果为true,则创建一个新的画布元素。如果为 false,则使用当前实例作为画布源。 + */ + constructor(createCanvas?: boolean); + /** + * @en Clear the canvas content. + * @zh 清空画布内容。 + */ + clear(): void; + /** + * @en Destroys the HTMLCanvas instance, releasing all associated resources. + * @zh 销毁 HTMLCanvas 实例,释放所有相关资源。 + */ + destroy(): void; + /** + * @en Releases the resources of the HTMLCanvas instance. + * @zh 释放 HTMLCanvas 实例的资源。 + */ + release(): void; + /** + * @en The Canvas rendering context. + * @zh Canvas 渲染上下文。 + */ + get context(): Context; + /** + * @en Get the Canvas rendering context. + * @param contextID The context ID. + * @param other + * @return The Canvas rendering context Context object. + * @zh 获取 Canvas 渲染上下文。 + * @param contextID 上下文ID. + * @param other + * @return Canvas 渲染上下文 Context 对象。 + */ + getContext(contextID: string, other?: any): Context; + /** + * @en Get the memory size. + * @return The memory size. + * @zh 获取内存大小。 + * @return 内存大小。 + */ + getMemSize(): number; + /** + * @en Set the width and height of the Canvas. + * @param w The width of the Canvas. + * @param h The height of the Canvas. + * @zh 设置画布的宽度和高度。 + * @param w 画布的宽度。 + * @param h 画布的高度。 + */ + size(w: number, h: number): void; + /** + * @en Get the texture instance. + * @zh 获取纹理实例 + */ + getTexture(): Texture | BaseTexture; + /** + * @en Convert the image to base64 information + * @param type The image type "image/png" + * @param encoderOptions quality parameter, range 0-1 + * @zh 把图片转换为base64信息 + * @param type 图片格式 "image/png" + * @param encoderOptions 质量参数,取值范围为0-1 + */ + toBase64(type: string, encoderOptions: number): string | null; + } + /** + * @en The material render mode. + * @zh 材质渲染模式。 + */ + enum MaterialRenderMode { + /** + * @en RenderMode: Opaque + * @zh 渲染状态:不透明。 + */ + RENDERMODE_OPAQUE = 0, + /** + * @en RenderMode: Alpha Testing + * @zh 渲染状态:阿尔法测试。 + */ + RENDERMODE_CUTOUT = 1, + /** + * @en RenderMode: Transparent + * @zh 渲染状态:透明。 + */ + RENDERMODE_TRANSPARENT = 2, + /** + * @en RenderMode: additive mixing + * @zh 渲染状态:加色法混合。 + */ + RENDERMODE_ADDTIVE = 3, + /** + * @en RenderMode: Alpha Blending mixture + * @zh 渲染状态:透明混合。 + */ + RENDERMODE_ALPHABLENDED = 4, + /** + * @en RenderMode: Custom + * @zh 渲染状态:自定义 + */ + RENDERMODE_CUSTOME = 5 + } + /** + * @en The Material class is used to create materials. + * @zh Material 类用于创建材质。 + */ + class Material extends Resource implements IClone { + /** + * @en RenderQueue: Opaque + * @zh 渲染队列:不透明。 + */ + static RENDERQUEUE_OPAQUE: number; + /** + * @en RenderQueue: Alpha Testing + * @zh 渲染队列:阿尔法测试。 + */ + static RENDERQUEUE_ALPHATEST: number; + /** + * @en RenderQueue: Transparent + * @zh 渲染队列:透明。 + */ + static RENDERQUEUE_TRANSPARENT: number; + /** + * @en Shader variables, transparent test values. + * @zh 着色器变量,透明测试值。 + */ + static ALPHATESTVALUE: number; + /** + * @en Material grade shader macro definition, transparency testing. + * @zh 材质级着色器宏定义,透明测试。 + */ + static SHADERDEFINE_ALPHATEST: ShaderDefine; + /** + * @en Material grade shader macro definition, main texture. + * @zh 材质级着色器宏定义,主贴图。 + */ + static SHADERDEFINE_MAINTEXTURE: ShaderDefine; + /** + * @en Material grade shader macro definition, additive fog. + * @zh 材质级着色器宏定义,叠加雾效。 + */ + static SHADERDEFINE_ADDTIVEFOG: ShaderDefine; + /** + * @deprecated 请使用Loader.load(url:string, type: ILaya.Loader.MATERIAL) + * @en Loads a material from a URL. + * @param url The URL from which to load the material. + * @param complete A callback function that is called when the material has been loaded. + * @zh 从URL加载材质。 + * @param url 材质的URL。 + * @param complete 加载完成后的回调函数。 + */ + static load(url: string, complete: Handler): void; + private _matRenderNode; + private _renderQueue; + /** + * @en The rendering queue of the material. + * @zh 所属渲染队列. + */ + get renderQueue(): number; + set renderQueue(value: number); + /** + * @en Owner element. + * @zh 所属元素 + */ + ownerElements: Set; + /** + * @en The shader data. + * @zh 着色器数据。 + */ + get shaderData(): ShaderData; + /** + * @en The alpha test value used for the alpha test mode of the material. + * @zh 材质用于透明测试模式的透明测试值。 + */ + get alphaTestValue(): number; + set alphaTestValue(value: number); + /** + * @en Whether the material uses alpha cut mode. + * @zh 材质是否使用透明裁剪模式。 + */ + get alphaTest(): boolean; + set alphaTest(value: boolean); + /** + * @en Adds a shader define to the material's shader data. + * @param define The shader define to add. + * @zh 向材质的着色器数据添加着色器宏定义。 + * @param define 要添加的着色器宏定义。 + */ + addDefine(define: ShaderDefine): void; + /** + * @en Removes a shader define from the material's shader data. + * @param define The shader define to remove. + * @zh 从材质的着色器数据移除着色器宏定义。 + * @param define 要移除的着色器宏定义。 + */ + removeDefine(define: ShaderDefine): void; + /** + * @en Enables or disables a shader define. + * @param define The shader define to enable or disable. + * @param value true to add the define, false to remove it. + * @zh 开启或关闭着色器宏定义。 + * @param define 要开启或关闭的着色器宏定义。 + * @param value true 表示添加宏定义,false 表示移除宏定义。 + */ + setDefine(define: ShaderDefine, value: boolean): void; + /** + * @en Checks if a shader define is present. + * @param define The shader define to check for. + * @returns true if the define is present, false otherwise. + * @zh 检查是否包含特定的着色器宏定义。 + * @param define 要检查的着色器宏定义。 + * @returns 如果存在宏定义返回 true,否则返回 false。 + */ + hasDefine(define: ShaderDefine): boolean; + /** + * @en Whether depth writing is enabled for this material. + * @zh 此材质是否启用深度写入。 + */ + get depthWrite(): boolean; + set depthWrite(value: boolean); + /** + * @en The culling mode for this material. + * @zh 此材质的剔除方式。 + */ + get cull(): number; + set cull(value: number); + /** + * @en The blend mode for this material. + * @zh 此材质的混合方式。 + */ + get blend(): number; + set blend(value: number); + /** + * @en The blend source for this material. + * @zh 此材质的混合源。 + */ + get blendSrc(): number; + set blendSrc(value: number); + /** + * @en The blend destination for this material. + * @zh 此材质的混合目标。 + */ + get blendDst(): number; + set blendDst(value: number); + /** + * @en The Alpha value of the blend source for this material. + * @zh 此材质的混合源的 Alpha 值。 + */ + get blendSrcAlpha(): number; + set blendSrcAlpha(value: number); + /** + * @en The RGB value of the blend source for this material. + * @zh 此材质的混合源的 RGB 值。 + */ + get blendSrcRGB(): number; + set blendSrcRGB(value: number); + /** + * @en The RGB value of the blend destination for this material. + * @zh 此材质的混合目标的 RGB 值。 + */ + get blendDstRGB(): number; + set blendDstRGB(value: number); + /** + * @en The Alpha value of the blend destination for this material. + * @zh 此材质的混合目标的 Alpha 值。 + */ + get blendDstAlpha(): number; + set blendDstAlpha(value: number); + /** + * @en The blend equation for this material. + * @zh 此材质的混合方程。 + */ + get blendEquation(): number; + set blendEquation(value: number); + /** + * @en The RGB value of the blend equation for this material. + * @zh 此材质的混合方程的 RGB 值。 + */ + get blendEquationRGB(): number; + set blendEquationRGB(value: number); + /** + * @en The Alpha value of the blend equation for this material. + * @zh 此材质的混合方程的 Alpha 值。 + */ + get blendEquationAlpha(): number; + set blendEquationAlpha(value: number); + /** + * @en The depth test mode. + * @zh 深度测试方式。 + */ + get depthTest(): number; + set depthTest(value: number); + /** + * @en The stencil test mode. + * @zh 模板测试方式 + */ + get stencilTest(): number; + set stencilTest(value: number); + /** + * @en Whether to write it into the stencil + * @zh 是否写入模板。 + */ + get stencilWrite(): boolean; + set stencilWrite(value: boolean); + /** + * @en Stencil values + * @zh 模板值 + */ + get stencilRef(): number; + set stencilRef(value: number); + /** + * @en The stencil operation settings for testing. The vector contains (fail, zfail, zpass) . + * @zh 模板测试设置,向量包含(fail,zfail,zpass)。 + */ + get stencilOp(): Vector3; + set stencilOp(value: Vector3); + /** + * @en The material properties. + * @zh 材质属性。 + */ + get MaterialProperty(): any; + /** + * @en The material defines. + * @zh 材质宏定义。 + */ + get MaterialDefine(): Array; + /** + * @en Material rendering mode + * @zh 材质渲染模式 + */ + get materialRenderMode(): MaterialRenderMode; + set materialRenderMode(value: MaterialRenderMode); + /** + * @ignore + * @en Creates an instance of the Material. + * @zh 创建一个Material实例。 + */ + constructor(); + private _bindShaderInfo; + private _releaseUBOData; + /** + * @en Destroys the resources. + * @zh 销毁资源。 + */ + protected _disposeResource(): void; + /** + * @en The shader of the material. + * @zh 材质的着色器。 + */ + get shader(): Shader3D; + /** + * @en Gets all uniform properties of the material. + * @returns The map of uniform properties. + * @zh 获取材质的所有uniform属性。 + * @returns uniform属性的映射表。 + */ + effectiveProperty(): Map; + /** + * @en Sets the shader by its name. + * @param name The name of the shader to set. + * @zh 通过名称设置使用Shader。 + * @param name 要设置的着色器名称。 + */ + setShaderName(name: string): void; + /** + * @en Gets the boolean uniform value by index. + * @param uniformIndex The index of the uniform. + * @returns The boolean value of the property. + * @zh 通过uniform索引获取布尔值。 + * @param uniformIndex uniform索引。 + * @returns uniform索引的布尔值。 + */ + getBoolByIndex(uniformIndex: number): boolean; + /** + * @en Sets the boolean value by uniform index. + * @param uniformIndex The index of the uniform. + * @param value The bool value to set. + * @zh 通过uniform索引设置布尔值。 + * @param uniformIndex uniform索引。 + * @param value 要设置的布尔值。 + */ + setBoolByIndex(uniformIndex: number, value: boolean): void; + /** + * @en Gets a boolean value of uniformIndex by property name. + * @param name The name of the property. + * @returns The boolean value. + * @zh 根据属性名称获得uniform索引的布尔值。 + * @param name 属性名称。 + * @returns uniform索引的布尔值。 + */ + getBool(name: string): boolean; + /** + * @en Sets a boolean value by property name. + * @param name The name of the property. + * @param value The value to set. + * @zh 设置属性名称对应的布尔值。 + * @param name 属性名称。 + * @param value 要设置的值。 + */ + setBool(name: string, value: boolean): void; + /** + * @en Gets a float value by uniform index. + * @param uniformIndex The index of the property. + * @returns The float value. + * @zh 通过属性索引获得浮点值。 + * @param uniformIndex 属性索引。 + * @returns 浮点值。 + */ + getFloatByIndex(uniformIndex: number): number; + /** + * @en Sets a float value by uniform index. + * @param uniformIndex The index of the property. + * @param value The value to set. + * @zh 通过属性索引设置浮点值。 + * @param uniformIndex 属性索引。 + * @param value 要设置的值。 + */ + setFloatByIndex(uniformIndex: number, value: number): void; + /** + * @en Gets a float value by property name. + * @param name The name of the property. + * @returns The float value. + * @zh 根据属性名称获得浮点值。 + * @param name 属性名称。 + * @returns 浮点值。 + */ + getFloat(name: string): number; + /** + * @en Sets a float value by property name. + * @param name The name of the property. + * @param value The value to set. + * @zh 设置属性名称对应的浮点值。 + * @param name 属性名称。 + * @param value 要设置的值。 + */ + setFloat(name: string, value: number): void; + /** + * @en Gets an integer value by uniform index. + * @param uniformIndex The index of the property. + * @returns The integer value. + * @zh 通过属性索引获得整数值。 + * @param uniformIndex 属性索引。 + * @returns 整数值。 + */ + getIntByIndex(uniformIndex: number): number; + /** + * @en Sets an integer value by uniform index. + * @param uniformIndex The index of the property. + * @param value The value to set. + * @zh 通过属性索引设置整数值。 + * @param uniformIndex 属性索引。 + * @param value 要设置的值。 + */ + setIntByIndex(uniformIndex: number, value: number): void; + /** + * @en Gets an integer value by property name. + * @param name The name of the property. + * @returns The integer value. + * @zh 根据属性名称获得整数值。 + * @param name 属性名称。 + * @returns 整数值。 + */ + getInt(name: string): number; + /** + * @en Sets an integer value by property name. + * @param name The name of the property. + * @param value The value to set. + * @zh 设置属性名称对应的整数值。 + * @param name 属性名称。 + * @param value 要设置的值。 + */ + setInt(name: string, value: number): void; + /** + * @en Gets a Vector2 value by uniform index. + * @param uniformIndex The index of the property. + * @returns The Vector2 value. + * @zh 通过属性索引获得Vector2值。 + * @param uniformIndex 属性索引。 + * @returns Vector2值。 + */ + getVector2ByIndex(uniformIndex: number): Vector2; + /** + * @en Sets a Vector2 value by uniform index. + * @param uniformIndex The index of the property. + * @param value The Vector2 value to set. + * @zh 通过属性索引设置Vector2值。 + * @param uniformIndex 属性索引。 + * @param value 要设置的Vector2值。 + */ + setVector2ByIndex(uniformIndex: number, value: Vector2): void; + /** + * @en Gets a Vector2 value by property name. + * @param name The name of the property. + * @returns The Vector2 value. + * @zh 根据属性名称获得Vector2值。 + * @param name 属性名称。 + * @returns Vector2值。 + */ + getVector2(name: string): Vector2; + /** + * @en Sets a Vector2 value by property name. + * @param name The name of the property. + * @param value The Vector2 value to set. + * @zh 设置属性名称对应的Vector2值。 + * @param name 属性名称。 + * @param value 要设置的Vector2值。 + */ + setVector2(name: string, value: Vector2): void; + /** + * @en Retrieves a Vector3 value by its uniform index. + * @param uniformIndex The index of the property. + * @returns The retrieved Vector3 value. + * @zh 通过属性索引获得Vector3值。 + * @param uniformIndex 属性索引。 + * @returns 检索到的Vector3值。 + */ + getVector3ByIndex(uniformIndex: number): Vector3; + /** + * @en Sets a Vector3 value by its uniform index. + * @param uniformIndex The index of the property. + * @param value The Vector3 value to set. + * @zh 通过属性索引设置Vector3值。 + * @param uniformIndex 属性索引。 + * @param value 要设置的Vector3值。 + */ + setVector3ByIndex(uniformIndex: number, value: Vector3): void; + /** + * @en Retrieves a Vector3 value by its property name. + * @param name The name of the property as defined in the shader. + * @returns The retrieved Vector3 value. + * @zh 根据属性名称获得Vector3值。 + * @param name 着色器中定义的属性名称。 + * @returns 检索到的Vector3值。 + */ + getVector3(name: string): Vector3; + /** + * @en Sets a Vector3 value by its property name. + * @param name The name of the property as defined in the shader. + * @param value The Vector3 value to set. + * @zh 设置属性名称对应的Vector3值。 + * @param name 着色器中定义的属性名称。 + * @param value 要设置的Vector3值。 + */ + setVector3(name: string, value: Vector3): void; + /** + * @en Sets a Vector4 value by uniform index. + * @param uniformIndex The index of the property. + * @param value The Vector4 value to set. + * @zh 通过属性索引设置Vector4值。 + * @param uniformIndex 属性索引。 + * @param value 要设置的Vector4值。 + */ + setVector4ByIndex(uniformIndex: number, value: Vector4): void; + /** + * @en Retrieves a Vector4 value by uniform index. + * @param uniformIndex The index of the property. + * @returns The retrieved Vector4 value. + * @zh 通过属性索引获取Vector4值。 + * @param uniformIndex 属性索引。 + * @returns 检索到的Vector4值。 + */ + getVector4ByIndex(uniformIndex: number): Vector4; + /** + * @en Sets a Vector4 value by property name. + * @param name The name of the property. + * @param value The Vector4 value to set. + * @zh 设置属性名称对应的Vector4值。 + * @param name 属性名称。 + * @param value 要设置的Vector4值。 + */ + setVector4(name: string, value: Vector4): void; + /** + * @en Retrieves a Vector4 value by property name. + * @param name The name of the property. + * @returns The retrieved Vector4 value. + * @zh 根据属性名称获得Vector4值。 + * @param name 属性名称。 + * @returns 检索到的Vector4值。 + */ + getVector4(name: string): Vector4; + /** + * @en Retrieves a Color value by its uniform index. + * @param uniformIndex The index of the property. + * @returns The retrieved Color value. + * @zh 通过属性索引获得颜色值。 + * @param uniformIndex 属性索引。 + * @returns 检索到的颜色值。 + */ + getColorByIndex(uniformIndex: number): Color; + /** + * @en Sets a Color value by its uniform index. + * @param uniformIndex The index of the property. + * @param value The Color value to set. + * @zh 通过属性索引设置颜色值。 + * @param uniformIndex 属性索引。 + * @param value 要设置的颜色值。 + */ + setColorByIndex(uniformIndex: number, value: Color): void; + /** + * @en Retrieves a Color value by property name. + * @param name The name of the property. + * @returns The retrieved Color value. + * @zh 根据属性名称获得颜色值。 + * @param name 属性名称。 + * @returns 检索到的颜色值。 + */ + getColor(name: string): Color; + /** + * @en Sets a Color value by property name. + * @param name The name of the property. + * @param value The Color value to set. + * @zh 设置属性名称对应的颜色值。 + * @param name 属性名称。 + * @param value 要设置的颜色值。 + */ + setColor(name: string, value: Color): void; + /** + * @en Retrieves a Matrix4x4 value by its uniform index. + * @param uniformIndex The index of the property. + * @returns The retrieved Matrix4x4 value. + * @zh 通过属性索引获得4x4矩阵值。 + * @param uniformIndex 属性索引。 + * @returns 检索到的4x4矩阵值。 + */ + getMatrix4x4ByIndex(uniformIndex: number): Matrix4x4; + /** + * @en Sets a Matrix4x4 value by its uniform index. + * @param uniformIndex The index of the property. + * @param value The Matrix4x4 value to set. + * @zh 通过属性索引设置4x4矩阵值。 + * @param uniformIndex 属性索引。 + * @param value 要设置的4x4矩阵值。 + */ + setMatrix4x4ByIndex(uniformIndex: number, value: Matrix4x4): void; + /** + * @en Retrieves a Matrix4x4 value by property name. + * @param name The name of the property. + * @returns The retrieved Matrix4x4 value. + * @zh 根据属性名称获得4x4矩阵值。 + * @param name 属性名称。 + * @returns 检索到的4x4矩阵值。 + */ + getMatrix4x4(name: string): Matrix4x4; + /** + * @en Sets a Matrix4x4 value by property name. + * @param name The name of the property. + * @param value The Matrix4x4 value to set. + * @zh 设置属性名称对应的4x4矩阵值。 + * @param name 属性名称。 + * @param value 要设置的4x4矩阵值。 + */ + setMatrix4x4(name: string, value: Matrix4x4): void; + /** + * @en Retrieves a 3x3 matrix value by its index. + * @param index The index of the matrix within the shader data. + * @returns The retrieved 3x3 matrix value. + * @zh 通过索引获取3x3矩阵值。 + * @param index 着色器数据中矩阵的索引。 + * @returns 检索到的3x3矩阵值。 + */ + getMatrix3x3ByIndex(index: number): Matrix3x3; + /** + * @en Sets a 3x3 matrix value by its index. + * @param index The index of the matrix within the shader data. + * @param value The 3x3 matrix value to set. + * @zh 通过索引设置3x3矩阵值。 + * @param index 着色器数据中矩阵的索引。 + * @param value 要设置的3x3矩阵值。 + */ + setMatrix3x3ByIndex(index: number, value: Matrix3x3): void; + /** + * @en Retrieves a 3x3 matrix value by its property name. + * @param name The name of the property. + * @returns The retrieved 3x3 matrix value. + * @zh 根据属性名称获取3x3矩阵值。 + * @param name 属性名称。 + * @returns 检索到的3x3矩阵值。 + */ + getMatrix3x3(name: string): Matrix3x3; + /** + * @en Sets a 3x3 matrix value by its property name. + * @param name The name of the property. + * @param value The 3x3 matrix value to set. + * @zh 设置属性名称对应的3x3矩阵值。 + * @param name 属性名称。 + * @param value 要设置的3x3矩阵值。 + */ + setMatrix3x3(name: string, value: Matrix3x3): void; + /** + * @en Sets a texture by its uniform index. + * @param uniformIndex The index of the property. + * @param texture The texture to set. + * @zh 通过属性索引设置纹理。 + * @param uniformIndex 属性索引。 + * @param texture 要设置的纹理。 + */ + setTextureByIndex(uniformIndex: number, texture: BaseTexture): void; + private reSetTexture; + /** + * @en Retrieves a texture by its uniform index. + * @param uniformIndex The index of the property. + * @returns The retrieved texture. + * @zh 通过属性索引获得纹理。 + * @param uniformIndex 属性索引。 + * @returns 检索到的纹理。 + */ + getTextureByIndex(uniformIndex: number): BaseTexture; + /** + * @en Sets a texture by property name. + * @param name The name of the property. + * @param texture The texture to set. + * @zh 根据属性名称设置纹理。 + * @param name 属性名称。 + * @param texture 要设置的纹理。 + */ + setTexture(name: string, texture: BaseTexture): void; + /** + * @en Retrieves a texture by property name. + * @param name The name of the property. + * @returns The retrieved texture. + * @zh 根据属性名称获得纹理。 + * @param name 属性名称。 + * @returns 检索到的纹理。 + */ + getTexture(name: string): BaseTexture; + /** + * @en Retrieves a buffer by its uniform index. + * @param uniformIndex The index of the property. + * @returns The retrieved buffer. + * @zh 通过属性索引获得Buffer。 + * @param uniformIndex 属性索引。 + * @returns 检索到的Buffer。 + */ + getBufferByIndex(uniformIndex: number): Float32Array; + /** + * @en Sets a buffer by its uniform index. + * @param uniformIndex The index of the property. + * @param value The buffer to set. + * @zh 通过属性索引设置Buffer。 + * @param uniformIndex 属性索引。 + * @param value 要设置的Buffer值。 + */ + setBufferByIndex(uniformIndex: number, value: Float32Array): void; + /** + * @en Retrieves a buffer by property name. + * @param name The name of the property. + * @returns The retrieved buffer. + * @zh 根据属性名称获得Buffer。 + * @param name 属性名称。 + * @returns 检索到的Buffer。 + */ + getBuffer(name: string): Float32Array; + /** + * @en Sets a buffer by property name. + * @param name The name of the property. + * @param value The buffer to set. + * @zh 根据属性名称设置Buffer。 + * @param name 属性名称。 + * @param value 要设置的Buffer值。 + */ + setBuffer(name: string, value: Float32Array): void; + /** + * @en Sets the attribute value of ShaderData by uniform index. + * @param uniformIndex The index of the attribute. + * @param type The type of the value to be set. + * @param value The value to be set. + * @zh 通过属性索引设置ShaderData的属性值。 + * @param uniformIndex 属性索引。 + * @param type 要设置的值的类型。 + * @param value 要设置的值。 + */ + setShaderDataByIndex(uniformIndex: number, type: ShaderDataType, value: ShaderDataItem): void; + /** + * @en Sets the attribute value of ShaderData by property name. + * @param name The name of the property. + * @param type The type of the value to be set. + * @param value The value to be set. + * @zh 根据属性名称设置ShaderData的属性值。 + * @param name 属性名称。 + * @param type 要设置的值的类型。 + * @param value 要设置的值。 + */ + setShaderData(name: string, type: ShaderDataType, value: ShaderDataItem): void; + /** + * @en Retrieves the attribute value of ShaderData by property name. + * @param name The name of the property. + * @param type The type of the value to be retrieved. + * @returns The retrieved ShaderData attribute value. + * @zh 根据属性名称获得ShaderData的属性值。 + * @param name 属性名称。 + * @param type 要检索的值的类型。 + * @returns 检索到的ShaderData属性值。 + */ + getShaderData(name: string, type: ShaderDataType): ShaderDataItem; + /** + * @en Retrieves the attribute value of ShaderData by uniform index. + * @param uniformIndex The index of the attribute. + * @param type The type of the value to be retrieved. + * @returns The retrieved ShaderData attribute value. + * @zh 通过属性索引获得ShaderData的属性值。 + * @param uniformIndex 属性索引。 + * @param type 要检索的值的类型。 + * @returns 检索到的ShaderData属性值。 + */ + getShaderDataByIndex(uniformIndex: number, type: ShaderDataType): ShaderDataItem; + /** + * @en Clones the current material to destination material object. + * @param destObject The destination material object. + * @zh 克隆当前材质到目标材质对象。 + * @param destObject 目标材质对象。 + */ + cloneTo(destObject: Material): void; + /** + * @en Creates a clone of the current material. + * @returns A new material instance that is a clone of the current material. + * @zh 创建当前材质的克隆副本。 + * @returns 一个克隆自当前材质的新材质实例。 + */ + clone(): any; + /** + * @en The material define. + * @zh 材质宏 + */ + get _defineDatas(): IDefineDatas; + /** + * @en Compatible with old parsing end events + * @zh 兼容老的解析结束事件 + */ + oldparseEndEvent(): void; + } + /** + * @en Class is used to process 2D vertex meshes + * @zh 类用于处理2D顶点网格 + */ + class VertexMesh2D { + private static _vertexDeclarationMap; + /** + * @en Retrieves the vertex declaration based on the provided vertex flags. + * @param vertexFlags An array of vertex declaration flag characters, formatted as: "POSITION,COLOR,UV,BLENDWEIGHT,BLENDINDICES". + * @param compatible Whether to enable compatible mode. + * @return An array of vertex declarations. + * @zh 根据提供的顶点声明标志字符获取顶点声明。 + * @param vertexFlags 顶点声明标志字符数组,格式为:"POSITION,COLOR,UV,BLENDWEIGHT,BLENDINDICES"。 + * @param compatible 是否启用兼容模式。 + * @return 顶点声明数组。 + */ + static getVertexDeclaration(vertexFlags: string[], compatible?: boolean): VertexDeclaration[]; + } + /** + * @en The `Mesh2D` class represents a 2D mesh in the engine. + * @zh `Mesh2D` 类表示引擎中的2D网格。 + */ + class Mesh2D extends Resource { + /** + * @deprecated 请使用Loader.load(url:string, type: ILaya.Loader.MESH) + * @en Loads a mesh template from the specified URL. + * @param url The URL address of the mesh template. + * @param complete A callback function that is executed when the mesh template is loaded. + * @zh 从指定URL加载网格模板。 + * @param url 网格模板的地址。 + * @param complete 加载完成时的回调函数。 + */ + static load(url: string, complete: Handler): void; + /** + * @en Get the vertex buffer of the mesh. + * @zh 获取网格的顶点缓冲。 + */ + get vertexBuffers(): IVertexBuffer[]; + /** + * @en Get the index buffer of the mesh. + * @zh 获取网格的索引缓冲。 + */ + get indexBuffer(): IIndexBuffer; + /** + * @en Get the number of vertices in the mesh. + * @zh 获取网格中的顶点数。 + */ + get vertexCount(): number; + /** + * @en Get the index number of the mesh. + * @zh 获取网格的索引数。 + */ + get indexCount(): number; + /** + * @en Get the number of SubMeshes in the mesh. + * @zh 获取网格中子网格的个数。 + */ + get subMeshCount(): number; + /** + * @en The index format used by the mesh. + * @zh 网格使用的索引格式。 + */ + get indexFormat(): IndexFormat; + set indexFormat(value: IndexFormat); + /** + * @ignore + * @en prohibition of use. + * @zh 禁止使用 + */ + constructor(); + /** + * @en Destroy the resource. + * @zh 销毁资源 + */ + protected _disposeResource(): void; + /** + * @en Retrieves a SubMesh based on its index. + * @param index The index of the SubMesh. + * @returns The SubMesh at the specified index. + * @zh 根据索引获取子网格。 + * @param index 子网格的索引。 + * @returns 索引指定的子网格。 + */ + getSubMesh(index: number): IRenderGeometryElement; + /** + * @en Sets the vertex data for the mesh. + * @param vertices An array of ArrayBuffer objects containing vertex data. + * @zh 设置网格的顶点数据。 + * @param vertices 顶点数据数组。 + */ + setVertices(vertices: ArrayBuffer[]): void; + /** + * @en Sets the indices for the mesh. + * @param indices An array containing the mesh indices. + * @zh 设置网格的索引。 + * @param indices 索引数据数组。 + */ + setIndices(indices: Uint8Array | Uint16Array | Uint32Array): void; + } + /** + * @en Hierarchy parser API. + * @zh 层次结构分析器 API。 + */ + interface IHierarchyParserAPI { + /** + * @en Collect resource links required by the data. + * @param data The data object to process. + * @param basePath The base path used to resolve resource links. + * @returns An array of strings or ILoadURL objects representing the resource links. + * @zh 收集数据所需的资源链接。 + * @param data 需要处理的数据对象。 + * @param basePath 用于解析资源链接的基础路径。 + * @returns 返回表示资源链接的字符串或 ILoadURL 对象数组。 + */ + collectResourceLinks: (data: any, basePath: string) => (string | ILoadURL)[]; + /** + * @en Parse the data and create a hierarchy of nodes. + * @param data The data object to parse. + * @param options Optional settings for parsing. + * @param errors Array to store any errors encountered during parsing. + * @returns An array of nodes or a single node if only one is created. + * @zh 解析数据并创建节点的层次结构。 + * @param data 需要解析的数据对象。 + * @param options 解析的可选设置。 + * @param errors 存储解析过程中遇到的错误的数组。 + * @zh 返回节点数组或如果只创建了一个节点,则返回单个节点。 + */ + parse: (data: any, options?: Record, errors?: Array) => Array | Node; + } + /** + * @en This class is used to import prefabs. + * @zh 该类用于导入预制体。 + */ + class PrefabImpl extends Prefab { + /** + * @en The prefab data. + * @zh 预制体数据。 + */ + data: any; + /** + * @en The hierarchy parser API used to parse the prefab data. + * @zh 用于解析预制体数据的层次结构 API。 + */ + api: IHierarchyParserAPI; + /** + * @en Create an instance of the PrefabImpl class. + * @param api The hierarchy parser API. + * @param data The data to initialize the prefab instance with. + * @param version The version of the prefab. + * @zh 创建 PrefabImpl 类的实例。 + * @param api 层次结构API + * @param data 用于初始化预制体实例的数据。 + * @param version 预制体的版本。 + */ + constructor(api: IHierarchyParserAPI, data: any, version: number); + /** + * @en Create an instance of the prefab. + * @param options Optional parameters for instance creation. + * @param errors Array to store any errors encountered during instance creation. + * @returns The prefab instance. + * @zh 创建预制体的实例。 + * @param options 创建实例时的可选参数。 + * @param errors 存储实例创建过程中遇到的错误的数组。 + * @returns 预制体实例。 + */ + create(options?: Record, errors?: any[]): Node; + } + /** + * @en Depth texture mode + * @zh 深度贴图模式 + */ + enum DepthTextureMode { + /** + * @en Do not generate depth texture. + * @zh 不生成深度贴图。 + */ + None = 0, + /** + * @en Generate depth texture. + * @zh 生成深度贴图。 + */ + Depth = 1, + /** + * @en Generate depth and normal textures. + * @zh 生成深度和法线贴图。 + */ + DepthNormals = 2, + /** + * @en Generate depth and depth normals textures, and indicate whether motion vectors should be rendered. + * @zh 生成深度和深度法线贴图,并指示是否应该渲染运动矢量。 + */ + DepthAndDepthNormals = 3, + /** + * @en Generate motion vectors texture. + * @zh 生成运动矢量贴图。 + */ + MotionVectors = 4 + } + /** + * @en RenderTexture class used to create render texture. + * @zh RenderTexture 类用于创建渲染纹理。 + */ + class RenderTexture extends BaseTexture implements IRenderTarget { + private static _pool; + private static _poolMemory; + /** + * @en Creates a RenderTexture instance from the pool. + * @param width Width of the RenderTexture. + * @param height Height of the RenderTexture. + * @param colorFormat Color format of the RenderTexture. + * @param depthFormat Depth format of the RenderTexture. + * @param mipmap Whether to generate mipmaps for the RenderTexture. + * @param multiSamples Number of multisamples for the RenderTexture. + * @param depthTexture Whether to generate a depth texture. + * @param sRGB Whether the RenderTexture is in sRGB space. + * @returns A RenderTexture instance. + * @zh 从对象池中创建一个RenderTexture实例。 + * @param width 宽度。 + * @param height 高度。 + * @param colorFormat 颜色格式。 + * @param depthFormat 深度格式。 + * @param mipmap 是否生成多级纹理。 + * @param multiSamples 多采样次数。 + * @param depthTexture 是否生成深度纹理。 + * @param sRGB 是否sRGB空间。 + * @returns RenderTexture实例。 + */ + static createFromPool(width: number, height: number, colorFormat: RenderTargetFormat, depthFormat: RenderTargetFormat, mipmap?: boolean, multiSamples?: number, depthTexture?: boolean, sRGB?: boolean): RenderTexture; + /** + * @en Recovers the RenderTexture to the pool for reuse. + * @param rt The RenderTexture to recover. + * @zh 回收渲染纹理到对象池以便重用。 + * @param rt 要回收的渲染纹理。 + */ + static recoverToPool(rt: RenderTexture): void; + /** + * @en Clears the RenderTexture pool. + * @zh 清空渲染纹理对象池。 + */ + static clearPool(): void; + /** 最后绑定到主画布上的结果 此值可能为null*/ + private static _bindCanvasRender; + /** + * @en The RenderTexture bound to the main canvas. + * @zh 绑定到主画布上的渲染纹理。 + */ + static get bindCanvasRender(): RenderTexture; + static set bindCanvasRender(value: RenderTexture); + private _generateDepthTexture; + /** + * @en Whether to generate depth texture maps. + * @zh 是否生成深度纹理贴图。 + */ + get generateDepthTexture(): boolean; + set generateDepthTexture(value: boolean); + /** + * @en Depth and stencil removal texture mapping + * @zh 深度与模板剔除纹理贴图 + */ + private _depthStencilTexture; + /** + * @en Depth and stencil removal texture mapping + * @zh 深度与模板剔除纹理贴图 + */ + get depthStencilTexture(): BaseTexture; + /** + * @en Color format + * @zh 颜色格式 + */ + get colorFormat(): RenderTargetFormat; + /** + * @en Depth and stencil removal format + * @zh 深度与模板剔除的格式 + */ + protected _depthStencilFormat: RenderTargetFormat; + /** + * @en Depth and stencil removal format + * @zh 深度与模板剔除的格式 + */ + get depthStencilFormat(): RenderTargetFormat; + /** + * @en Number of multisamples. + * @zh 多采样次数 + */ + protected _multiSamples: number; + /** + * @en Number of multisamples. + * @zh 多采样次数 + */ + get multiSamples(): number; + /** + * @en Whether the RenderTexture is a cube texture. + * @zh 是否是立方体贴图 + */ + get isCube(): boolean; + /** + * @en Sampling times + * @zh 采样次数 + */ + get samples(): number; + /** + * @en Whether to generate multi-level textures. + * @zh 是否生成多级纹理。 + */ + get generateMipmap(): boolean; + /** + * @en Create an instance of the RenderTexture class. + * @param width Width of the RenderTexture. + * @param height Height of the RenderTexture. + * @param colorFormat Color format for the RenderTexture. + * @param depthFormat Depth format for the RenderTexture. + * @param generateMipmap Whether to generate mipmaps for the RenderTexture. + * @param multiSamples Number of multisamples for the RenderTexture. + * @param generateDepthTexture Whether to generate a depth texture for the RenderTexture. + * @param sRGB Whether the RenderTexture uses sRGB color space. + * @zh 创建 RenderTexture 类的实例。 + * @param width 宽度。 + * @param height 高度。 + * @param colorFormat 颜色格式。 + * @param depthFormat 深度格式。 + * @param generateMipmap 是否生成多级纹理。 + * @param multiSamples 多采样次数。 + * @param generateDepthTexture 是否生成深度纹理。 + * @param sRGB 是否sRGB空间。 + */ + constructor(width: number, height: number, colorFormat: RenderTargetFormat, depthFormat: RenderTargetFormat, generateMipmap?: boolean, multiSamples?: number, generateDepthTexture?: boolean, sRGB?: boolean); + /** + * @en Recreates the RenderTexture with the specified parameters. + * @param width New width of the RenderTexture. + * @param height New height of the RenderTexture. + * @param colorFormat New color format for the RenderTexture. + * @param depthFormat New depth format for the RenderTexture. + * @param generateMipmap Whether to regenerate mipmaps for the RenderTexture. + * @param multiSamples New number of multisamples for the RenderTexture. + * @param generateDepthTexture Whether to generate a new depth texture for the RenderTexture. + * @param sRGB Whether the RenderTexture uses sRGB color space. + * @zh 使用指定参数重新创建RenderTexture。 + * @param width 新宽度。 + * @param height 新高度。 + * @param colorFormat 新颜色格式。 + * @param depthFormat 新深度格式。 + * @param generateMipmap 是否重新生成多级纹理。 + * @param multiSamples 新多采样次数。 + * @param generateDepthTexture 是否生成新的深度纹理。 + * @param sRGB 是否sRGB空间。 + */ + recreate(width: number, height: number, colorFormat: RenderTargetFormat, depthFormat: RenderTargetFormat, generateMipmap?: boolean, multiSamples?: number, generateDepthTexture?: boolean, sRGB?: boolean): void; + /** + * @deprecated 请使用getDataAsync函数代替 + * 获取渲染纹理的像素数据 + * @param xOffset x偏移值 + * @param yOffset y偏移值 + * @param width 宽度 + * @param height 高度 + * @param out 输出 + * @returns 二进制数据 + */ + getData(xOffset: number, yOffset: number, width: number, height: number, out: Uint8Array | Float32Array): Uint8Array | Float32Array; + /** + * @en Asynchronously retrieves pixel data from the RenderTexture. + * @param xOffset The x-offset value. + * @param yOffset The y-offset value. + * @param width The width of the area to retrieve. + * @param height The height of the area to retrieve. + * @param out The array to hold the output data. + * @returns binary data + * @zh 异步获取渲染纹理的像素数据。 + * @param xOffset x偏移值 + * @param yOffset y偏移值 + * @param width 要检索的区域的宽度。 + * @param height 要检索的区域的高度。 + * @param out 用于保存输出数据的数组。 + * @returns 二进制数据 + */ + getDataAsync(xOffset: number, yOffset: number, width: number, height: number, out: Uint8Array | Float32Array): Promise; + /** + * @en Destroy the Resource. + * @zh 销毁资源 + */ + protected _disposeResource(): void; + } + /** + * @en RenderTexture2D class used to create 2D render targets. + * @zh RenderTexture2D 类用于创建2D渲染目标。 + */ + class RenderTexture2D extends BaseTexture implements IRenderTarget { + private static _currentActive; + static _clearColor: Color; + static _clear: boolean; + static _clearLinearColor: Color; + /** + * @en Default UV coordinates. + * @zh 默认的UV坐标。 + */ + static defuv: any[]; + /** + * @en Default flipped UV coordinates. + * @zh 默认翻转的UV坐标。 + */ + static flipyuv: any[]; + /** + * @en The currently active RenderTexture. + * @zh 当前激活的渲染纹理。 + */ + static get currentActive(): RenderTexture2D; + private _depthStencilFormat; + private _colorFormat; + /** + * @en Depth format. + * @zh 深度格式。 + */ + get depthStencilFormat(): number; + /** + * @en The default texture. + * @zh 默认纹理。 + */ + get defaultTexture(): BaseTexture; + /** + * @en Checks whether the RenderTexture2D is ready. + * @zh 检查2D渲染纹理是否准备好。 + */ + getIsReady(): boolean; + /** + * @en get the colorFormat from RenderInternalRT + * @zh 得到此渲染纹理的颜色格式 + */ + getColorFormat(): RenderTargetFormat; + /** + * @en The source width of the RenderTexture2D. + * @zh 2D渲染纹理的源宽度。 + */ + get sourceWidth(): number; + /** + * @en The source height of the RenderTexture2D. + * @zh 2D渲染纹理的源高度。 + */ + get sourceHeight(): number; + /** + * @en The X-axis offset of the RenderTexture2D. + * @zh 2D渲染纹理的X轴偏移。 + */ + get offsetX(): number; + /** + * @en The Y-axis offset of the RenderTexture2D. + * @zh 2D渲染纹理的Y轴偏移。 + */ + get offsetY(): number; + /** + * @en Depth stencil texture + * @zh 深度模板纹理 + */ + depthStencilTexture: BaseTexture; + /** + * @ignore + * @en The RenderTarget. + * @zh 渲染目标。 + */ + _renderTarget: InternalRenderTarget; + /** + * @en Whether the RenderTexture2D is a CameraTarget. + * @zh 是否是CameraTarget + */ + _isCameraTarget: boolean; + /** + * @en Creates an instance of RenderTexture2D. + * @param width The width. + * @param height The height. + * @param format The texture format. + * @param depthStencilFormat The depth format. + * @zh 创建 RenderTexture2D 类的实例。 + * @param width 宽度。 + * @param height 高度。 + * @param format 纹理格式。 + * @param depthStencilFormat 深度格式。 + */ + constructor(width: number, height: number, format?: RenderTargetFormat, depthStencilFormat?: RenderTargetFormat); + /** + * @en Whether the render target is a cube render target. + * @zh 渲染目标是否是立方体贴图渲染目标。 + */ + get isCube(): boolean; + /** + * @en The number of samples for the render target. + * @zh 渲染目标的采样数。 + */ + get samples(): number; + /** + * @en Checks if mipmaps are generated for the render target. + * @zh 检查是否为渲染目标生成了mipmaps。 + */ + get generateMipmap(): boolean; + /** + * @en Clears the render texture. + * @param r The red component. + * @param g The green component. + * @param b The blue component. + * @param a The alpha component, default is 1.0 for full opacity. + * @zh 清理渲染纹理。 + * @param r 红色分量。 + * @param g 绿色分量。 + * @param b 蓝色分量。 + * @param a 透明度分量,默认为1.0表示完全不透明。 + */ + clear(r?: number, g?: number, b?: number, a?: number): void; + /** + * @en Gets the pixel data from the render texture within the specified area. + * @param x The X coordinate of the pixel area. + * @param y The Y coordinate of the pixel area. + * @param width The width of the pixel area. + * @param height The height of the pixel area. + * @returns The pixel data from the specified area. + * @zh 从指定区域获取渲染纹理的像素数据。 + * @param x 像素区域的X坐标。 + * @param y 像素区域的Y坐标。 + * @param width 像素区域的宽度。 + * @param height 像素区域的高度。 + * @returns 指定区域的像素数据。 + */ + getData(x: number, y: number, width: number, height: number): ArrayBufferView; + /** + * @en Asynchronously retrieves pixel data from the RenderTexture. + * @param xOffset The x-offset value. + * @param yOffset The y-offset value. + * @param width The width of the area to retrieve. + * @param height The height of the area to retrieve. + * @param out The array to hold the output data. + * @returns binary data + * @zh 异步获取渲染纹理的像素数据。 + * @param xOffset x偏移值 + * @param yOffset y偏移值 + * @param width 要检索的区域的宽度。 + * @param height 要检索的区域的高度。 + * @param out 用于保存输出数据的数组。 + * @returns 二进制数据 + */ + getDataAsync(xOffset: number, yOffset: number, width: number, height: number, out: Uint8Array | Float32Array): Promise; + } + /** + * @en The `RenderTextureCube` class is used for creating cube map render textures. + * @zh `RenderTextureCube` 类用于创建立方体贴图渲染纹理。 + */ + class RenderTextureCube extends RenderTexture { + /** + * @en The index of the cube face, which can be +x, -x, +y, -y, +z, or -z. + * @zh 立方体贴图的面索引,可以是 +x, -x, +y, -y, +z 或 -z。 + */ + faceIndex: number; + /** + * @en Create a new instance of `RenderTextureCube`. + * @param size The size of the texture. + * @param colorFormat The color format of the render target. + * @param depthFormat The depth format of the render target. + * @param generateMipmap Whether to generate mipmaps for the render texture. + * @param multiSamples The number of samples for multi-sampling. + * @zh 创建一个 `RenderTextureCube` 实例。 + * @param size 纹理的尺寸。 + * @param colorFormat 渲染目标的颜色格式。 + * @param depthFormat 渲染目标的深度格式。 + * @param generateMipmap 是否为渲染纹理生成 mipmaps。 + * @param multiSamples 多采样的样本数量。 + */ + constructor(size: number, colorFormat: RenderTargetFormat, depthFormat: RenderTargetFormat, generateMipmap: boolean, multiSamples: number); + } + /** + * @en The `Resource` class used for resource access. + * @zh `Resource` 类用于资源存取。 + */ + class Resource extends EventDispatcher { + /**@ignore */ + static _idResourcesMap: any; + /** 以字节为单位。*/ + private static _cpuMemory; + /** 以字节为单位。*/ + private static _gpuMemory; + /** + * @en Whether the debug mode is enabled. + * @zh 是否开启调试模式。 + */ + static DEBUG: boolean; + /** + * @en The current CPU memory, in bytes. + * @zh 当前内存,以字节为单位。 + */ + static get cpuMemory(): number; + /** + * @en The current GPU memory, in bytes. + * @zh 当前显存,以字节为单位。 + */ + static get gpuMemory(): number; + /** + * @en Destroy unused resources, this function will ignore resources with lock=true. + * @zh 销毁当前没有被使用的资源,该函数会忽略lock=true的资源。 + */ + static destroyUnusedResources(): void; + private static _destroyUnusedResources; + private _cpuMemory; + private _gpuMemory; + _id: number; + protected _destroyed?: boolean; + protected _referenceCount: number; + protected _obsolute: boolean; + protected _deps: Array; + /** 是否建立引用跟踪链。 */ + protected _traceDeps: boolean; + /** + * @en Whether to lock the resource, if true, the resource cannot be automatically released. + * @zh 是否加锁,如果true为不能使用自动释放机制。 + */ + lock?: boolean; + /** + * @en The name of the resource. + * @zh 资源名称。 + */ + name?: string; + /** + * @en The URL of the resource. + * @zh 获取资源的URL地址。 + */ + url: string; + /** + * @en The UUID of the resource. + * @zh 获取资源的UUID。 + */ + uuid: string; + /** + * @en Whether to delete the resource immediately when the reference count is 0. + * @zh 是否在引用计数为0的时候立马删除他 + */ + destroyedImmediately: boolean; + /** + * @en Unique identifier ID, usually used for identification. + * @zh 唯一标识ID,通常用于识别。 + */ + get id(): number; + /** + * @en CPU memory size. + * @zh 内存大小。 + */ + get cpuMemory(): number; + /** + * @en GPU memory size. + * @zh 显存大小。 + */ + get gpuMemory(): number; + /** + * @en Whether the resource has been destroyed. + * @zh 是否已销毁。 + */ + get destroyed(): boolean; + /** + * @en If a cached resource observer is set to true, then: + * - 1) getRes will still return this resource; + * - 2) next time loading will ignore this cached resource and reload it. + * @zh 如果设置一个已缓存的资源obsolute为true,则 + * - 1)getRes仍然可以返回这个资源; + * - 2)下次加载时会忽略这个缓存而去重新加载。。 + */ + get obsolute(): boolean; + set obsolute(value: boolean); + /** + * @en The list of dependencies for the resource. + * @zh 资源的依赖列表。 + */ + get deps(): ReadonlyArray; + /** + * @en The reference count of the resource. + * @zh 资源的引用计数。 + */ + get referenceCount(): number; + /** + * @en Creates an instance of Resource. + * @param managed If set to true, the resource will be automatically released when the reference count is 0. Default is true. + * @zh 创建一个 Resource 实例。 + * @param managed 如果设置为true,则在destroyUnusedResources时会检测引用计数并自动释放如果计数为0。默认为true。 + */ + protected constructor(managed?: boolean); + /** + * @en Adjusts the cpu memory usage by the specified value. + * @param value The amount by which to adjust the CPU memory usage. + * @zh 根据指定的值调整内存使用量。 + * @param value 要调整的内存使用量。 + */ + _setCPUMemory(value: number): void; + /** + * @en Adjusts the GPU memory usage by the specified value. + * @param value The amount by which to adjust the GPU memory usage. + * @zh 根据指定的值调整显存使用量。 + * @param value 要调整的显存使用量。 + */ + _setGPUMemory(value: number): void; + /** + * @en Sets the URL and UUID used to create this resource. + * @param url The URL used to create the resource. + * @param uuid The optional UUID of the resource. + * @zh 设置用于创建此资源的 URL 和 UUID。 + * @param url 用于创建资源的 URL。 + * @param uuid 资源的可选UUID。 + */ + _setCreateURL(url: string, uuid?: string): void; + /** + * @en Checks if the resource is created from the specified URL. + * @param url The URL to check against the resource's creation URL. + * @returns True if the resource is created from the specified URL, otherwise false. + * @zh 检查资源是否从指定的 URL 创建。 + * @param url 要检查的资源创建 URL。 + * @returns 如果资源是从指定的 URL 创建的,则返回 true,否则返回 false。 + */ + isCreateFromURL(url: string): boolean; + /** + * @en Increments the reference count of the resource by the specified amount. + * @param count The amount by which to increment the reference count, default is 1. + * @zh 按指定数量增加资源的引用计数。 + * @param count 要增加的引用计数,默认为1。 + */ + _addReference(count?: number): void; + /** + * @en Decrements the reference count of the resource by the specified amount. If the reference count reaches zero and certain conditions are met, the resource may be destroyed. + * @param count The amount by which to decrement the reference count, default is 1. + * @zh 按指定数量减少资源的引用计数。如果引用计数达到零并且满足特定条件,资源可能会被销毁。 + * @param count 要减少的引用计数,默认为1。 + */ + _removeReference(count?: number): void; + /** + * @en Clears the reference count of the resource. + * @zh 清除引用 + */ + _clearReference(): void; + /** + * 增加一个依赖内容 + * @param res 依赖内容 + */ + addDep(res: Resource): void; + /** + * 增加多个依赖内容 + * @param resArr 依赖内容 + */ + addDeps(resArr: Array): void; + private onDepObsolute; + protected _disposeResource(): void; + /** + * @en Destroys the resource, the resource cannot be recovered. + * @zh 销毁资源,销毁后资源不能恢复。 + */ + destroy(): void; + } + /** + * @en Enum for text resource formats. + * @zh 文字资源格式的枚举类型。 + */ + enum TextResourceFormat { + /** + * @en Represents the buffer format. + * @zh 表示缓冲区格式。 + */ + Buffer = 0, + /** + * @en Represents the plain text format. + * @zh 表示纯文本格式。 + * TODO: + */ + Plain = 1, + /** + * @en Represents the JSON format. + * @zh 表示JSON格式。 + */ + JSON = 2, + /** + * @en Represents the XML format. + * @zh 表示XML格式。 + */ + XML = 3 + } + /** + * @en The `TextResource` class represents a text resource. + * @zh `TextResource` 类表示文字资源。 + */ + class TextResource extends Resource { + /** + * @en The data of the text resource, read-only. + * @zh 文字资源的数据,只读。 + */ + readonly data: any; + /** + * @en The format of the text resource, read-only. + * @zh 文字资源的格式,只读。 + */ + readonly format: TextResourceFormat; + /** + * @en Creates a new instance of the `TextResource` class. + * @param data The data of the text resource. + * @param format The format of the text resource. + * @zh 创建 TextResource 类的新实例。 + * @param data 文字资源的数据。 + * @param format 文字资源的格式 + */ + constructor(data: any, format: TextResourceFormat); + } + /** + * @en The Texture is a texture processing class. + * @zh Texture 是一个纹理处理类。 + */ + class Texture extends Resource { + /** + * @en Default UV information. + * @zh 默认 UV 信息。 + */ + static readonly DEF_UV: Float32Array; + /** + * @en No UV information. + * @zh 无 UV 信息 + */ + static readonly NO_UV: Float32Array; + /** + * @en Inverse UV information. + * @zh 反转 UV 信息。 + */ + static readonly INV_UV: Float32Array; + /** + * @en Range of UV + * @zh uv的范围 + */ + uvrect: number[]; + private _bitmap; + private _w; + private _h; + /** + * @en The offset along the X-axis. + * @zh 沿 X 轴的偏移量。 + */ + offsetX: number; + /** + * @en The offset along the Y-axis. + * @zh 沿 Y 轴的偏移量。 + */ + offsetY: number; + /** + * @en The original width of the texture, including any transparent areas that have been cropped out. + * @zh 包括已被裁剪掉的透明区域的纹理原始宽度。 + */ + sourceWidth: number; + /** + * @en The original height of the texture, including any transparent areas that have been cropped out. + * @zh 包括已被裁剪掉的透明区域的纹理原始高度。 + */ + sourceHeight: number; + /** + * @en The URL of the texture image. + * @zh 纹理图片的地址。 + */ + url: string; + /** + * @en The UUID of the texture. + * @zh 纹理的 UUID。 + */ + uuid: string; + /** + * @en The scale rate of the texture. + * @zh 纹理的缩放率。 + */ + scaleRate: number; + /** + * @en Creates a `Texture` object based on the specified source, coordinates, dimensions, and offsets. + * @param source The source texture, either a `Texture2D` or a `Texture` object. + * @param x The starting absolute x coordinate. + * @param y The starting absolute y coordinate. + * @param width The absolute width. + * @param height The absolute height. + * @param offsetX The offset on the X-axis (optional). It is the position of [x, y] relative to the original small image. Generally, it is positive, indicating that the size of the blank edge has been cut off. If it is negative, it usually indicates that a protective edge has been added + * @param offsetY The offset on the Y-axis (optional). + * @param sourceWidth The original width, including any cropped transparent areas (optional). + * @param sourceHeight The original height, including any cropped transparent areas (optional). + * @returns A `Texture` object. + * @zh 根据指定的资源、坐标、宽高和偏移量等创建 `Texture` 对象。 + * @param source 资源,可以是 `Texture2D` 或 `Texture` 对象。 + * @param x 绝对坐标 x 。 + * @param y 绝对坐标 y 。 + * @param width 绝对宽度。 + * @param height 绝对高度。 + * @param offsetX X 轴偏移量(可选)。 就是[x,y]相对于原始小图片的位置。一般都是正的,表示裁掉了空白边的大小,如果是负的一般表示加了保护边 + * @param offsetY Y 轴偏移量(可选)。 + * @param sourceWidth 原始宽度,包括被裁剪的透明区域(可选)。 + * @param sourceHeight 原始高度,包括被裁剪的透明区域(可选)。 + * @return `Texture` 对象。 + */ + static create(source: Texture | BaseTexture, x: number, y: number, width: number, height: number, offsetX?: number, offsetY?: number, sourceWidth?: number, sourceHeight?: number): Texture; + /** + * @en Creates a new `Texture` by cropping a part of an existing `Texture`. If the two areas do not intersect, it returns null. + * @param texture The target `Texture` to crop. + * @param x The x position relative to the target `Texture`. + * @param y The y position relative to the target `Texture`. + * @param width The width to crop. + * @param height The height to crop. + * @returns A new `Texture` or null if the areas do not intersect. + * @zh 截取 `Texture` 的一部分区域,生成一个新的 `Texture`,如果两个区域没有相交,则返回 null。 + * @param texture 目标 `Texture` 。 + * @param x 相对于目标 `Texture` 的 x 位置。 + * @param y 相对于目标 `Texture` 的 y 位置。 + * @param width 截取的宽度。 + * @param height 截取的高度。 + * @return 一个新的 `Texture` 或 null,如果两个区域没有相交。 + */ + static createFromTexture(texture: Texture, x: number, y: number, width: number, height: number): Texture; + /** + * @en The UV coordinates of the texture. + * @zh 纹理的 UV 坐标。 + */ + get uv(): ArrayLike; + set uv(value: ArrayLike); + /** + * @en The actual width of the texture. + * @zh 纹理的实际宽度。 + */ + get width(): number; + set width(value: number); + /** + * @en The actual height of the texture. + * @zh 纹理的实际高度。 + */ + get height(): number; + set height(value: number); + /** + * @en The bitmap of the texture. + * @zh 纹理的位图。 + */ + get bitmap(): BaseTexture; + set bitmap(value: BaseTexture); + /** + * @en Creates an instance of Texture class. + * @param source Bitmap resource. + * @param uv UV data information. + * @zh 创建 Texture 类的新实例 + * @param source 位图资源。 + * @param uv UV 数据信息。 + */ + constructor(source?: Texture | BaseTexture, uv?: ArrayLike, sourceWidth?: number, sourceHeight?: number); + /** + * @en Sets the bitmap resource and UV data information for this object. + * @param bitmap The bitmap resource. + * @param uv The UV data information. + * @param sourceWidth The original width of the texture. + * @param sourceHeight The original height of the texture. + * @zh 设置此对象的位图资源和 UV 数据信息。 + * @param bitmap 位图资源。 + * @param uv UV 数据信息。 + * @param sourceWidth 纹理原始宽度。 + * @param sourceHeight 纹理原始高度。 + */ + setTo(bitmap?: BaseTexture, uv?: ArrayLike, sourceWidth?: number, sourceHeight?: number): void; + /** + * @deprecated 请使用Loader.load(url:string, type: ILaya.Loader.IMAGE) + * @en Loads an image from the specified URL. + * @param url The URL of the image to load. + * @param complete An optional callback function that is called when the image is loaded. + * @returns A promise that resolves to the loaded image. + * @zh 从指定的 URL 加载图片。 + * @param url 图片地址。 + * @param complete 加载完成回调。 + * @returns 一个 Promise 对象,解析为加载的图片。 + */ + load(url: string, complete?: Handler): Promise; + /** + * @en Retrieves the pixel data from a region of the texture. + * @param x The x-coordinate of the region. + * @param y The y-coordinate of the region. + * @param width The width of the region. + * @param height The height of the region. + * @returns A Uint8Array containing the pixel data. + * @zh 从纹理的特定区域获取像素数据。 + * @param x 区域的 x 坐标。 + * @param y 区域的 y 坐标。 + * @param width 区域的宽度。 + * @param height 区域的高度。 + * @return 一个 Uint8Array 对象,包含了像素数据。 + */ + getTexturePixels(x: number, y: number, width: number, height: number): Uint8Array; + /** + * @en Retrieves the pixel data from a specific area of the `Texture`. + * @param x The x-coordinate of the area. + * @param y The y-coordinate of the area. + * @param width The width of the area. + * @param height The height of the area. + * @returns A `Uint8Array` containing the pixel data. + * @zh 从 `Texture` 的特定区域获取像素点集合。 + * @param x 区域的 x 坐标。 + * @param y 区域的 y 坐标。 + * @param width 区域的宽度。 + * @param height 区域的高度。 + * @return 一个 `Uint8Array` 对象,包含了像素点集合。 + */ + getPixels(x: number, y: number, width: number, height: number): Uint8Array; + /** + * @en Forces the recovery of the `bitmap` from the URL. + * @param callback An optional callback function to call after the bitmap is recovered. + * @zh 通过 URL 强制恢复 `bitmap`。 + * @param callback 位图恢复后调用的可选回调函数。 + */ + recoverBitmap(callback?: () => void): void; + /** + * @en Forces the disposal of the `bitmap`, regardless of references. + * @zh 强制释放 `bitmap`,无论它是否被引用。 + */ + disposeBitmap(): void; + /** + * @en Whether the texture is valid. + * @zh 纹理是否有效。 + */ + get valid(): boolean; + /** + * @en Whether the texture is considered obsolete. + * @zh 纹理是否被认为是过时的。 + */ + get obsolute(): boolean; + set obsolute(value: boolean); + /** + * @en Destroys the resource. + * @zh 销毁资源。 + */ + protected _disposeResource(): void; + /** + * @en Retrieves a clipped sub-texture from this texture and caches it for future access. + * @param x The x-coordinate of the clip area. + * @param y The y-coordinate of the clip area. + * @param width The width of the clip area. + * @param height The height of the clip area. + * @returns A `Texture` object representing the clipped sub-texture, or null if the clip area is out of bounds. + * @zh 从当前纹理获取裁剪后的子纹理,并将其缓存以供将来访问。 + * @param x 裁剪区域的 x 坐标。 + * @param y 裁剪区域的 y 坐标。 + * @param width 裁剪区域的宽度。 + * @param height 裁剪区域的高度。 + * @return 一个 `Texture` 对象,表示裁剪后的子纹理,如果裁剪区域越界,则返回 null。 + */ + getCachedClip(x: number, y: number, width: number, height: number): Texture; + } + /** + * @en Interface for texture property parameters. + * @zh 纹理属性参数接口。 + */ + interface TexturePropertyParams { + /** + * @en Texture U-coordinate line break mode. + * @zh 纹理 U 坐标换行模式。 + */ + wrapModeU?: number; + /** + * @en Texture V-coordinate line break mode. + * @zh 纹理 V 坐标换行模式。 + */ + wrapModeV?: number; + /** + * @en The filter mode for the texture. + * @zh 纹理的过滤模式。 + */ + filterMode?: FilterMode; + /** + * @en The anisotropic filtering level for the texture. + * @zh 纹理的各向异性过滤级别。 + */ + anisoLevel?: number; + /** + * @en Whether to premultiply the alpha channel. + * @zh 是否预乘alpha通道。 + */ + premultiplyAlpha?: boolean; + /** + * @en The HDR encoding format for the texture. + * @zh 纹理的HDR编码格式。 + */ + hdrEncodeFormat?: HDREncodeFormat; + } + type TextureConstructParams = ConstructorParameters; + /** + * @en The Texture2D class is used to generate 2D textures. + * @zh Texture2D 类用于生成2D纹理。 + */ + class Texture2D extends BaseTexture { + /** + * @en The identifier for Texture2D resources. + * @zh Texture2D 资源的标识符。 + */ + static TEXTURE2D: string; + /** + * @en A pure gray texture. + * @zh 纯灰色纹理。 + */ + static grayTexture: Texture2D; + /** + * @en A pure white texture. + * @zh 纯白色纹理。 + */ + static whiteTexture: Texture2D; + /** + * @en A pure black texture. + * @zh 纯黑色纹理。 + */ + static blackTexture: Texture2D; + /** + * @en The default normal map texture. + * @zh 默认法线纹理。 + */ + static normalTexture: Texture2D; + /** + * @en The error texture displayed when a texture fails to load. + * @zh 当纹理加载失败时显示的错误纹理。 + */ + static errorTexture: Texture2D; + /** + * @deprecated 请使用Loader.load(url:string, type: ILaya.Loader.TEXTURE2D) + * @en Loads a texture from the specified URL. + * @param url The path to the texture file. + * @param complete The callback function to be called after the texture is loaded. + * @zh 从指定的 URL 加载纹理。 + * @param url 纹理文件的路径。 + * @param complete 纹理加载完成后的回调函数。 + */ + static load(url: string, complete: Handler): void; + /** + * @en Creates an instance of Texture2D. + * @param width The width of the texture. + * @param height The height of the texture. + * @param format The format of the texture. + * @param mipmap Indicates whether to generate mipmaps for the texture. + * @param canRead Indicates whether the texture data can be read. + * @param sRGB Indicates whether the texture uses sRGB color space. + * @param premultiplyAlpha Indicates whether the texture data is premultiplied by the alpha channel. + * @zh 创建 Texture2D 类的实例。 + * @param width 纹理的宽度。 + * @param height 纹理的高度。 + * @param format 纹理的格式。 + * @param mipmap 是否为纹理生成mipmap。 + * @param canRead 纹理数据是否可以读取。 + * @param sRGB 纹理是否使用sRGB色彩空间。 + * @param premultiplyAlpha 纹理数据是否预乘alpha通道。 + */ + constructor(width: number, height: number, format: TextureFormat, mipmap: boolean, canRead: boolean, sRGB?: boolean, premultiplyAlpha?: boolean); + /** + * @en Sets the image data for the texture. + * @param source The image source, can be an `HTMLImageElement`, `HTMLCanvasElement`, or `ImageBitmap`. + * @param premultiplyAlpha Whether to premultiply the alpha. + * @param invertY Whether to invert the Y-axis of the image. + * @zh 设置纹理的图像数据。 + * @param source 图像源,可以是 `HTMLImageElement`、`HTMLCanvasElement` 或 `ImageBitmap`。 + * @param premultiplyAlpha 是否预乘 alpha。 + * @param invertY 是否反转图像的 Y 轴。 + */ + setImageData(source: HTMLImageElement | HTMLCanvasElement | ImageBitmap, premultiplyAlpha: boolean, invertY: boolean): void; + /** + * @en Sets the pixel data for the texture. + * @param source The pixel data to be set. + * @param premultiplyAlpha Whether to premultiply the alpha. + * @param invertY Whether to invert the Y-axis of the pixel data. + * @zh 设置纹理的像素数据。 + * @param source 要设置的像素数据。 + * @param premultiplyAlpha 是否预乘 alpha。 + * @param invertY 是否反转像素数据的 Y 轴。 + */ + setPixelsData(source: ArrayBufferView, premultiplyAlpha: boolean, invertY: boolean): void; + /** + * @en Sets a sub-region of pixel data for the texture. + * @param xOffset The x-offset for the sub-region. + * @param yOffset The y-offset for the sub-region. + * @param width The width of the sub-region. + * @param height The height of the sub-region. + * @param pixels The pixel data for the sub-region. + * @param mipmapLevel The mipmap level to update, if mipmap is enabled. + * @param generateMipmap Whether to generate mipmaps for the updated region. + * @param premultiplyAlpha Whether to premultiply the alpha channel of the pixel data. + * @param invertY Whether to invert the Y-axis of the pixel data. + * @zh 设置纹理的子区域像素数据。 + * @param xOffset 子区域的 x 偏移。 + * @param yOffset 子区域的 y 偏移。 + * @param width 子区域的宽度。 + * @param height 子区域的高度。 + * @param pixels 子区域的像素数据。 + * @param mipmapLevel 要更新的mipmap等级,如果mipmap为true。 + * @param generateMipmap 是否为更新的区域生成mipmap。 + * @param premultiplyAlpha 是否预乘子区域的像素数据的 alpha 通道。 + * @param invertY 是否反转子区域的像素数据的 Y 轴。 + */ + setSubPixelsData(xOffset: number, yOffset: number, width: number, height: number, pixels: ArrayBufferView, mipmapLevel: number, generateMipmap: boolean, premultiplyAlpha: boolean, invertY: boolean): void; + /** + * @en Sets the DDS data for the texture. + * @param ddsInfo The DDS texture information containing the data to be set. + * @zh 设置纹理的 DDS 数据。 + * @param ddsInfo DDS 纹理信息,包含要设置的数据。 + */ + setDDSData(ddsInfo: DDSTextureInfo): void; + /** + * @en Sets the KTX data for the texture. + * @param ktxInfo The KTX texture information containing the data to be set. + * @zh 设置纹理的 KTX 数据。 + * @param ktxInfo KTX 纹理信息,包含要设置的数据。 + */ + setKTXData(ktxInfo: KTXTextureInfo): void; + /** + * @en Sets the HDR data for the texture. + * @param hdrInfo The HDR texture information containing the data to be set. + * @zh 设置纹理的 HDR 数据。 + * @param hdrInfo HDR 纹理信息,包含要设置的数据。 + */ + setHDRData(hdrInfo: HDRTextureInfo): void; + /** + * @en The default texture. + * @zh 默认纹理。 + */ + get defaultTexture(): BaseTexture; + /** + * @en Retrieves the pixel data from the texture. + * @zh 从纹理中检索像素数据。 + */ + getPixels(): Uint8Array; + private setProperties; + } + /** + * @en `Texture2DArray` represents a 2D texture array. + * @zh `Texture2DArray` 类表示一个2D纹理数组。 + */ + class Texture2DArray extends BaseTexture { + private static _defaultTexture; + /** + * @en The default texture. + * @zh 默认纹理。 + */ + static get defaultTexture(): Texture2DArray; + /** + * @en The number of texture layers. + * @zh 纹理层的数量。 + */ + depth: number; + /** + * @en Creates a `Texture2DArray` instance. + * @zh Texture2DArray 的构造函数 + * @param width The width of the texture + * @param height The height of the texture + * @param depth The depth of the texture array + * @param format The format of the texture + * @param mipmap Whether to generate mipmaps + * @param canRead Whether the texture can be read + * @param sRGB Whether the texture is in sRGB color space + * @zh 创建 Texture2DArray 类的实例。 + * @param width 纹理的宽度 + * @param height 纹理的高度 + * @param depth 纹理数组的深度 + * @param format 纹理的格式 + * @param mipmap 是否生成 mipmap + * @param canRead 纹理是否可读 + * @param sRGB 纹理是否在 sRGB 颜色空间中 + */ + constructor(width: number, height: number, depth: number, format: TextureFormat, mipmap: boolean, canRead: boolean, sRGB?: boolean); + /** + * @en Sets the image data for the texture. + * @param sources The array of images to set. + * @param premultiplyAlpha Whether to premultiply the alpha channel. + * @param invertY Whether to invert the Y-axis of the image. + * @zh 设置纹理的图像数据。 + * @param sources 要设置的图像数组。 + * @param premultiplyAlpha 是否预乘 alpha。 + * @param invertY 是否反转图像 Y 轴。 + */ + setImageData(sources: HTMLImageElement[] | HTMLCanvasElement[] | ImageBitmap[], premultiplyAlpha: boolean, invertY: boolean): void; + /** + * @en Sets the pixel data for the texture. + * @param source The pixel data to set. + * @param premultiplyAlpha Whether to premultiply the alpha channel. + * @param invertY Whether to invert the Y-axis of the image. + * @zh 设置纹理的像素数据。 + * @param source 要设置的像素数据。 + * @param premultiplyAlpha 是否预乘 alpha。 + * @param invertY 是否反转图像 Y 轴。 + */ + setPixelsData(source: ArrayBufferView, premultiplyAlpha: boolean, invertY: boolean): void; + /** + * @en Updates the sub-pixel data for the texture. + * @param xOffset The x-offset. + * @param yOffset The y-offset. + * @param zOffset The z-offset. + * @param width The width of the data to update. + * @param height The height of the data to update. + * @param depth The depth level of the data to update. + * @param pixels The pixel data to update. + * @param mipmapLevel The mipmap level to update. + * @param generateMipmap Whether to generate mipmaps after the update. + * @param premultiplyAlpha Whether to premultiply the alpha channel. + * @param invertY Whether to invert the Y-axis of the image. + * @zh 更新纹理的子像素数据。 + * @param xOffset x 偏移 + * @param yOffset y 偏移 + * @param zOffset z 偏移 + * @param width 要更新的数据的宽度。 + * @param height 要更新的数据的高度。 + * @param depth 要更新的数据的深度。 + * @param pixels 要更新的像素数据。 + * @param mipmapLevel 要更新的 mipmap 等级。 + * @param generateMipmap 是否在更新后生成 mipmap。 + * @param premultiplyAlpha 是否预乘 alpha。 + * @param invertY 是否反转图像 Y 轴。 + */ + setSubPixelsData(xOffset: number, yOffset: number, zOffset: number, width: number, height: number, depth: number, pixels: ArrayBufferView, mipmapLevel: number, generateMipmap: boolean, premultiplyAlpha: boolean, invertY: boolean): void; + } + /** + * @en The Texture3D class is used to generate 3D textures. + * @zh Texture3D 类用于生成 3D 纹理。 + */ + class Texture3D extends BaseTexture { + private static _defaultTexture; + /** + * @en The default texture for 3D textures. + * @zh 3D纹理的默认纹理。 + */ + static get defaultTexture(): Texture3D; + /** + * @en The depth of the 3D texture. + * @zh 3D纹理的深度。 + */ + depth: number; + /** + * @en Creates an instance of Texture3D. + * @param width The width of the texture. + * @param height The height of the texture. + * @param depth The depth of the texture. + * @param format The format of the texture. + * @param mipmap Indicates whether to generate mipmaps for the texture. + * @param sRGB Indicates whether the texture uses sRGB color space. + * @zh 创建 Texture3D 类的实例。 + * @param width 纹理的宽度。 + * @param height 纹理的高度。 + * @param depth 纹理的深度。 + * @param format 纹理的格式。 + * @param mipmap 是否为纹理生成 mipmap。 + * @param sRGB 纹理是否使用 sRGB 色彩空间。 + */ + constructor(width: number, height: number, depth: number, format: TextureFormat, mipmap?: boolean, sRGB?: boolean); + /** + * @en Sets the pixel data for the 3D texture. + * @param source The source pixel data to set. + * @zh 设置3D纹理的像素数据。 + * @param source 要设置的源像素数据。 + */ + setPixelsData(source: ArrayBufferView): void; + /** + * @en Update pixel data of 3D texture in sub regions + * @param xOffset The x-offset within the texture. + * @param yOffset The y-offset within the texture. + * @param zOffset The z-offset within the texture. + * @param width The width of the sub-region to update. + * @param height The height of the sub-region to update. + * @param depth The depth of the sub-region to update. + * @param pixels The pixel data to update. + * @param mipmapLevel The mipmap level to update. + * @param generateMipmap Whether to generate mipmaps after the update. + * @zh 更新子区域3D纹理的像素数据。 + * @param xOffset 纹理内的 x 偏移。 + * @param yOffset 纹理内的 y 偏移。 + * @param zOffset 纹理内的 z 偏移。 + * @param width 要更新的子区域的宽度。 + * @param height 要更新的子区域的高度。 + * @param depth 要更新的子区域的深度。 + * @param pixels 要更新的像素数据。 + * @param mipmapLevel 要更新的 mipmap 等级。 + * @param generateMipmap 是否在更新后生成 mipmap。 + */ + setSubPixelsData(xOffset: number, yOffset: number, zOffset: number, width: number, height: number, depth: number, pixels: ArrayBufferView, mipmapLevel: number, generateMipmap: boolean): void; + } + /** + * @en Enum for the map faces of a cube texture. + * @zh 表示立方体纹理各个面面的枚举。 + */ + enum TextureCubeFace { + /** + * @en The positive X face of the cube map. + * @zh 立方体贴图的正X面。 + */ + PositiveX = 0, + /** + * @en The negative X face of the cube map. + * @zh 立方体贴图的负X面。 + */ + NegativeX = 1, + /** + * @en The positive Y face of the cube map. + * @zh 立方体贴图的正Y面。 + */ + PositiveY = 2, + /** + * @en The negative Y face of the cube map. + * @zh 立方体贴图的负Y面。 + */ + NegativeY = 3, + /** + * @en The positive Z face of the cube map. + * @zh 立方体贴图的正Z面。 + */ + PositiveZ = 4, + /** + * @en The negative Z face of the cube map. + * @zh 立方体贴图的负Z面。 + */ + NegativeZ = 5 + } + /** + * @en TextureCube class used to generate cube texture. + * @zh TextureCube 类用于生成立方体纹理。 + */ + class TextureCube extends BaseTexture { + private static _blackTexture; + private static _grayTexture; + private static _whiteTexture; + private static _errorTexture; + /** + * @en The black solid color texture. + * @zh 黑色纯色纹理。 + */ + static get blackTexture(): TextureCube; + /** + * @en The gray solid color texture. + * @zh 灰色纯色纹理。 + */ + static get grayTexture(): TextureCube; + /** + * @en The white solid color texture. + * @zh 白色纯色纹理。 + */ + static get whiteTexture(): TextureCube; + /** + * @en The error texture used for cube textures. + * @zh 立方体贴图的错误纹理。 + */ + static get errorTexture(): TextureCube; + /** + * @en Creates an instance of TextureCube. + * @param size The size of each face of the cube texture. + * @param format The texture format. + * @param mipmap Indicates whether to generate mipmaps for the cube texture. + * @param sRGB Indicates whether the texture uses sRGB color space. + * @param premultiplyAlpha Indicates whether the texture data is premultiplied by the alpha channel. + * @zh 创建 TextureCube 类的实例。 + * @param size 立方体纹理各个面大小。 + * @param format 纹理格式。 + * @param mipmap 是否为立方体纹理生成mipmap。 + * @param sRGB 是否使用sRGB色彩空间。 + * @param premultiplyAlpha 是否预乘Alpha。 + */ + constructor(size: number, format: TextureFormat, mipmap?: boolean, sRGB?: boolean, premultiplyAlpha?: boolean); + /** + * @en Sets the image data for each face of the cube texture. + * @param source An array of image elements, one for each face of the cube. + * @param premultiplyAlpha Whether to premultiply the alpha channel of the image data. + * @param invertY Whether to invert the Y-axis of the image data. + * @zh 为立方体贴图的每个面设置图像数据。 + * @param source 图像元素数组,每个面一个。 + * @param premultiplyAlpha 是否预乘Alpha通道。 + * @param invertY 是否翻转Y轴。 + */ + setImageData(source: (HTMLImageElement | HTMLCanvasElement | ImageBitmap)[], premultiplyAlpha: boolean, invertY: boolean): void; + /** + * @en Sets the pixel data for each face of the cube texture. + * @param source An array of pixel data, one for each face of the cube. + * @param premultiplyAlpha Whether to premultiply the alpha. + * @param invertY Whether to invert the Y-axis of the pixel data. + * @zh 为立方体贴图的每个面设置像素数据。 + * @param source 像素数据数组,每个面一个。 + * @param premultiplyAlpha 是否预乘Alpha。 + * @param invertY 是否翻转Y轴。 + */ + setPixelsData(source: ArrayBufferView[], premultiplyAlpha: boolean, invertY: boolean): void; + /** + * @en Updates sub-pixel data for the cube texture faces. + * @param source An array of pixel data for each face of the cube texture. + * @param xOffset The x-offset for the sub-pixel data. + * @param yOffset The y-offset for the sub-pixel data. + * @param width The width of the sub-region to update. + * @param height The height of the sub-region to update. + * @param mipmapLevel The mipmap level to update. + * @param generateMipmap Whether to generate mipmaps after the update. + * @param premultiplyAlpha Whether to premultiply the alpha. + * @param invertY Whether to invert the Y-axis of the pixel data. + * @zh 更新立方体贴图的子像素数据。 + * @param source 像素数据数组,每个面一个。 + * @param xOffset 子像素数据x偏移。 + * @param yOffset 子像素数据y偏移。 + * @param width 子像素数据宽度。 + * @param height 子像素数据高度。 + * @param mipmapLevel 子像素数据mipmap等级。 + * @param generateMipmap 是否生成mipmap。 + * @param premultiplyAlpha 是否预乘Alpha。 + * @param invertY 是否翻转Y轴。 + */ + updateSubPixelsData(source: ArrayBufferView[], xOffset: number, yOffset: number, width: number, height: number, mipmapLevel: number, generateMipmap: boolean, premultiplyAlpha: boolean, invertY: boolean): void; + /** + * @en Sets the DDS data for the cube texture. + * @param ddsInfo The DDS texture information containing the data to be set. + * @zh 设置立方体贴图的 DDS 数据。 + * @param ddsInfo DDS纹理信息,包含要设置的数据。 + */ + setDDSData(ddsInfo: DDSTextureInfo): void; + /** + * @en Sets the KTX data for the cube texture. + * @param ktxInfo The KTX texture information containing the data to be set. + * @zh 设置立方体贴图的 KTX 数据。 + * @param ktxInfo KTX纹理信息,包含要设置的数据。 + */ + setKTXData(ktxInfo: KTXTextureInfo): void; + /** + * @en The default texture for cube textures. + * @zh 立方体贴图的默认纹理。 + */ + get defaultTexture(): BaseTexture; + } + /** + * @en WebGLRTMgr is a manager for creating and recycling WebGLRenderTarget. + * TODO The demand is not high and the management cost is high. Remove it first. + * @zh WebGLRTMgr 管理WebGLRenderTarget的创建和回收 + * TODO 需求不大,管理成本高。先去掉。 + */ + class WebGLRTMgr { + private static dict; + /** + * @en Retrieves a render target with the specified width and height. For now, the search is based strictly on size. + * @param w The width of the render target. + * @param h The height of the render target. + * @returns A RenderTexture2D instance. + * @zh 根据指定的宽度和高度获得一个渲染目标。目前,搜索是基于严格大小判断的。 + * @param w 渲染目标的宽度。 + * @param h 渲染目标的高度。 + * @returns RenderTexture2D实例。 + */ + static getRT(w: number, h: number): RenderTexture2D; + /** + * @en Releases a render target back to the manager for recycling. + * @param rt The RenderTexture2D instance to be recycled. + * @zh 将渲染目标回收至管理器以供循环使用。 + * @param rt 要回收的渲染目标。 + */ + static releaseRT(rt: RenderTexture2D): void; + } + /** + * @en Class representing an external skin for a Spine skeleton. + * @zh 表示 Spine 骨骼的外部皮肤的类。 + */ + class ExternalSkin { + /** + * @en The target Spine skeleton. + * @zh 目标 Spine 骨骼。 + */ + target: ISpineSkeleton; + /** + * @en The source of the external skin Spine. + * @zh 外部皮肤spine的源。 + */ + get source(): string; + set source(value: string); + /** + * @en The content of the external skin. + * @zh 要设置的外部皮肤的内容。 + */ + get items(): ExternalSkinItem[]; + set items(value: ExternalSkinItem[]); + /** + * @en Get the reference of the animation template. + * @zh 得到动画模板的引用。 + */ + get templet(): SpineTemplet; + set templet(value: SpineTemplet); + /** + * @en Initialize the external skin with a given template. + * @param templet The animation template reference. + * @zh 使用给定的模板初始化外部皮肤。 + * @param templet 动画模板的引用。 + */ + protected init(templet: SpineTemplet): void; + /** + * @en Replace the external skin Spine. + * @zh 替换外部皮肤 Spine。 + */ + flush(): void; + } + class ExternalSkinItem { + /** + * @en The skin. + * @zh 皮肤。 + */ + get skin(): string; + set skin(value: string); + /** + * @en The slot. + * @zh 槽位。 + */ + get slot(): string; + set slot(value: string); + /** + * @en The attachment. + * @zh 附件。 + */ + get attachment(): string; + set attachment(value: string); + } + interface ISpineRender { + draw(skeleton: spine.Skeleton, renderNode: Spine2DRenderNode, slotRangeStart?: number, slotRangeEnd?: number): void; + } + interface ISpineSkeleton { + templet: SpineTemplet; + getSkeleton(): spine.Skeleton; + changeNormal(): void; + } + /** + * @en SpineShaderInit class handles the initialization and management of Spine shader-related components. + * @zh SpineShaderInit 类用于处理 Spine 着色器相关组件的初始化和管理。 + */ + class SpineShaderInit { + /** + * @en Vertex declaration for fast Spine rendering. + * @zh 用于快速 Spine 渲染的顶点声明。 + */ + static SpineFastVertexDeclaration: VertexDeclaration; + /** + * @en Vertex declaration for normal Spine rendering. + * @zh 用于普通 Spine 渲染的顶点声明。 + */ + static SpineNormalVertexDeclaration: VertexDeclaration; + /** + * @en Vertex declaration for Spine rendering with runtime blending. + * @zh 用于运行时混合的 Spine 渲染的顶点声明。 + */ + static SpineRBVertexDeclaration: VertexDeclaration; + /** + * @en Vertex declaration for instance normal matrix. + * @zh 实例法线矩阵的顶点声明。 + */ + static instanceNMatrixDeclaration: VertexDeclaration; + /** + * @en Vertex declaration for instance simple animator. + * @zh 实例简单动画器的顶点声明。 + */ + static instanceSimpleAnimatorDeclaration: VertexDeclaration; + /** + * @en Set the blend mode for Spine material. + * @param value The blend mode value. + * @param mat The material to set the blend mode for. + * @param premultipliedAlpha Whether to premultiply the alpha channel. + * @zh 设置 Spine 材质的混合模式。 + * @param value 混合模式值。 + * @param mat 要设置混合模式的材质。 + * @param premultipliedAlpha 是否预乘alpha通道。 + */ + static SetSpineBlendMode(value: number, mat: Material, premultipliedAlpha?: boolean): void; + /** + * @en Initialize the Spine material with default settings. + * @param mat The material to initialize. + * @zh 使用默认设置初始化 Spine 材质。 + * @param mat 要初始化的材质。 + */ + static initSpineMaterial(mat: Material): void; + /** + * @en Property ID for bone matrix. + * @zh 骨骼矩阵的属性 ID。 + */ + static BONEMAT: number; + /** + * @en Property ID for normal matrix. + * @zh 法线矩阵的属性 ID。 + */ + static NMatrix: number; + /** + * @en Property ID for color. + * @zh 颜色的属性 ID。 + */ + static Color: number; + /** + * @en Property ID for size. + * @zh 尺寸的属性 ID。 + */ + static Size: number; + /** + * @en Property ID for Spine texture. + * @zh Spine 纹理的属性 ID。 + */ + static SpineTexture: number; + /** + * @en Shader define for fast Spine rendering. + * @zh 快速 Spine 渲染的着色器定义。 + */ + static SPINE_FAST: ShaderDefine; + /** + * @en Shader define for Spine rendering with runtime blending. + * @zh 运行时混合 Spine 渲染的着色器定义。 + */ + static SPINE_RB: ShaderDefine; + /** + * @en Shader define for simple Spine rendering. + * @zh 简单 Spine 渲染的着色器定义。 + */ + static SPINE_SIMPLE: ShaderDefine; + /** + * @en Shader define for GPU instance rendering. + * @zh GPU 实例渲染的着色器定义。 + */ + static SPINE_GPU_INSTANCE: ShaderDefine; + static SPINE_PREMULTIPLYALPHA: ShaderDefine; + /** + * @en TextureSV Mesh Descript. + * @zh 纹理 Spine 顶点属性描述。 + */ + static readonly textureSpineAttribute: { + [name: string]: [ + number, + ShaderDataType + ]; + }; + /** + * @en Initialize Spine shader-related components. + * @zh 初始化 Spine 着色器相关组件。 + */ + static init(): void; + } + /** + * @en Abstract base class for Spine mesh rendering. + * @zh Spine 网格渲染的抽象基类。 + */ + abstract class SpineMeshBase { + /** + * @en Maximum number of vertices. Limited by 64K indexbuffer constraint. + * @zh 最大顶点数。受64K索引缓冲区限制。 + */ + static maxVertex: number; + /** + * @en Render element for 2D rendering. + * @zh 用于2D渲染的渲染元素。 + */ + element: IRenderElement2D; + /** + * @en Geometry element for rendering. + * @zh 用于渲染的几何元素。 + */ + geo: IRenderGeometryElement; + private _material; + /** + * @en The material of the mesh. + * @zh 网格的材质。 + */ + get material(): Material; + set material(value: Material); + /** + * @en Vertex buffer interface. + * @zh 顶点缓冲区接口。 + */ + protected vb: IVertexBuffer; + /** + * @en Index buffer interface. + * @zh 索引缓冲区接口。 + */ + protected ib: IIndexBuffer; + /** + * @en Vertex array. + * @zh 顶点数组。 + */ + protected vertexArray: Float32Array; + /** + * @en Index array. + * @zh 索引数组。 + */ + protected indexArray: Uint16Array; + /** + * @en Vertex array length. + * @zh 顶点数组中顶点的数量。 + */ + protected verticesLength: number; + /** + * @en Index array length. + * @zh 引数组中索引的数量。 + */ + protected indicesLength: number; + /** + * @en Create a new instance of SpineMeshBase. + * @param material The material to use for this mesh. + * @zh 创建 SpineMeshBase 类的新实例。 + * @param material 网格使用的材质。 + */ + constructor(material: Material); + /** + * @en Initialize the mesh. + * @zh 初始化网格。 + */ + init(): void; + /** + * @en Get the vertex declaration for this mesh. + * @zh 获取此网格的顶点声明。 + */ + abstract get vertexDeclarition(): VertexDeclaration; + /** + * @en Add the mesh to the rendering queue. + * @zh 添加到渲染队列。 + */ + draw(): void; + /** + * @en Draw the mesh using provided vertex and index data. + * @param vertices Vertex data array. + * @param vblength Number of vertices. + * @param indices Index data array. + * @param iblength Number of indices. + * @zh 使用提供的顶点和索引数据绘制网格。 + * @param vertices 顶点数据数组。 + * @param vblength 顶点数量。 + * @param indices 索引数据数组。 + * @param iblength 索引数量。 + */ + drawByData(vertices: Float32Array, vblength: number, indices: Uint16Array, iblength: number): void; + /** + * @en Clear the mesh data. + * @zh 清空网格数据。 + */ + clear(): void; + } + /** + * @en SpineVirtualMesh class for handling Spine skeleton mesh rendering. + * @zh SpineVirtualMesh 类用于处理 Spine 骨骼网格渲染。 + */ + class SpineVirtualMesh extends SpineMeshBase { + /** + * @en Size of each vertex in the vertex array. + * @zh 顶点数组中每个顶点的大小。 + */ + static vertexSize: number; + /** + * @en Size of each vertex in the vertex array with Two Color. + * @zh 双顶点色模式顶点数组中每个顶点的大小。 + */ + static vertexSize_TwoColor: number; + /** + * @en Shared vertex array for all instances. + * @zh 所有实例共享的顶点数组。 + */ + static vertexArray: Float32Array; + /** + * @en Shared index array for all instances. + * @zh 所有实例共享的索引数组。 + */ + static indexArray: Uint16Array; + /** + * @en Create a SpineVirtualMesh instance. + * @param material Material to be used for rendering. + * @zh 创建 SpineVirtualMesh 实例。 + * @param material 用于渲染的材质。 + */ + constructor(material: Material); + /** + * @en Append clipped vertices and indices. + * @param vertices Array of vertex data. + * @param indices Array of index data. + * @zh 裁剪后的顶点和索引。 + * @param vertices 顶点数据数组。 + * @param indices 索引数据数组。 + */ + appendVerticesClip(vertices: ArrayLike, indices: ArrayLike): void; + /** + * @en Check if the mesh can append more vertices and indices. + * @param verticesLength Number of vertices to be appended. + * @param indicesLength Number of indices to be appended. + * @returns True if the mesh can append, false otherwise. + * @zh 检查网格是否能够添加更多的顶点和索引。 + * @param verticesLength 要添加的顶点数量。 + * @param indicesLength 要添加的索引数量。 + * @returns 如果网格可以添加则返回 true,否则返回 false。 + */ + canAppend(verticesLength: number, indicesLength: number): boolean; + /** + * @en Append vertices to the mesh. + * @param vertices Array of vertex positions. + * @param verticesLength Number of vertices to append. + * @param indices Array of indices. + * @param indicesLength Number of indices to append. + * @param finalColor Color to apply to vertices. + * @param uvs Array of UV coordinates. + * @zh 向网格添加顶点。 + * @param vertices 顶点位置数组。 + * @param verticesLength 要添加的顶点数量。 + * @param indices 索引数组。 + * @param indicesLength 要添加的索引数量。 + * @param finalColor 应用于顶点的颜色。 + * @param uvs UV 坐标数组。 + */ + appendVertices(vertices: ArrayLike, verticesLength: number, indices: number[], indicesLength: number, finalColor: spine.Color, uvs: ArrayLike): void; + /** + * @en The vertex declaration for the mesh. + * @zh 网格的顶点声明。 + */ + get vertexDeclarition(): VertexDeclaration; + } + /** + * @en SpineWasmVirturalMesh class for handling Spine skeleton mesh rendering using WebAssembly. + * @zh SpineWasmVirturalMesh 类用于使用 WebAssembly 处理 Spine 骨骼网格渲染。 + */ + class SpineWasmVirturalMesh extends SpineMeshBase { + private _renderElement2D; + /** + * @en Create a SpineWasmVirturalMesh instance. + * @param material Material to be used for rendering. + * @zh 创建 SpineWasmVirturalMesh 实例。 + * @param material 用于渲染的材质。 + */ + constructor(material: Material); + /** + * @en The vertex declaration for the mesh. + * @zh 网格的顶点声明。 + */ + get vertexDeclarition(): VertexDeclaration; + } + /** + * @en Abstract base class for Spine normal rendering. + * @zh Spine 普通渲染的抽象基类。 + */ + abstract class SpineNormalRenderBase { + /** + * @en Array of SpineMeshBase objects. + * @zh SpineMeshBase 对象数组。 + */ + protected vmeshs: SpineMeshBase[]; + /** + * @en Index for the next batch. + * @zh 下一批次的索引。 + */ + protected nextBatchIndex: number; + /** + * @en Clears all batches by resetting meshes and batch index. + * @zh 通过重置网格和批次索引来清除所有批次。 + */ + protected clearBatch(): void; + /** + * @en Abstract method to create a mesh with the given material. + * @param material The material to be used for the mesh. + * @zh 创建具有给定材质的网格的抽象方法。 + * @param material 用于网格的材质。 + */ + abstract createMesh(material: Material): SpineMeshBase; + /** + * @en Prepares the next batch for rendering. + * @param material The material to be used for the batch. + * @param spineRenderNode The Spine2DRenderNode to be rendered. + * @zh 准备下一批次用于渲染。 + * @param material 用于批次的材质。 + * @param spineRenderNode 要渲染的 Spine2DRenderNode。 + */ + protected nextBatch(material: Material, spineRenderNode: Spine2DRenderNode): SpineMeshBase; + } + /** + * @en SpineSkeletonRenderer class for rendering Spine skeletons. + * @zh SpineSkeletonRenderer 类用于渲染 Spine 骨骼。 + */ + class SpineSkeletonRenderer extends SpineNormalRenderBase implements ISpineRender { + /** + * @en Indicates if alpha should be premultiplied. + * @zh 指示是否应预乘 alpha。 + */ + premultipliedAlpha: boolean; + /** + * @en Vertex effect to be applied during rendering. + * @zh 渲染期间要应用的顶点效果。 + */ + vertexEffect: spine.VertexEffect; + /** + * @en Spine templet associated with this renderer. + * @zh 与此渲染器关联的 Spine 模板。 + */ + templet: SpineTemplet; + private tempColor; + private tempColor2; + private static vertices; + private vertexSize; + private twoColorTint; + private renderable; + private clipper; + /** + * @en Create a mesh with the given material. + * @param material The material to be used for the mesh. + * @returns A SpineMeshBase object. + * @zh 创建具有给定材质的网格。 + * @param material 用于网格的材质。 + * @returns SpineMeshBase 对象。 + */ + createMesh(material: Material): SpineMeshBase; + /** + * @en Create a new instance of the SpineSkeletonRenderer class. + * @param templet The Spine templet to use. + * @param twoColorTint Whether to use two-color tinting. + * @zh 创建 SpineSkeletonRenderer 类的新实例。 + * @param templet 要使用的 Spine 模板。 + * @param twoColorTint 是否使用双色调色。 + */ + constructor(templet: SpineTemplet, twoColorTint?: boolean); + /** + * @en Draw the skeleton. + * @param skeleton The skeleton to draw. + * @param renderNode The render node. + * @param slotRangeStart The starting slot index. + * @param slotRangeEnd The ending slot index. + * @zh 绘制骨骼。 + * @param skeleton 要绘制的骨骼。 + * @param renderNode 渲染节点。 + * @param slotRangeStart 起始插槽索引。 + * @param slotRangeEnd 结束插槽索引。 + */ + draw(skeleton: spine.Skeleton, renderNode: Spine2DRenderNode, slotRangeStart?: number, slotRangeEnd?: number): void; + } + /** + * @en SpineWasmRender class for rendering Spine skeletons using WebAssembly. + * @zh SpineWasmRender 类用于使用 WebAssembly 渲染 Spine 骨骼。 + */ + class SpineWasmRender extends SpineNormalRenderBase implements ISpineRender { + /** + * @en Spine templet associated with this renderer. + * @zh 与此渲染器关联的 Spine 模板。 + */ + templet: SpineTemplet; + private twoColorTint; + /** + * @en Graphics object for rendering. + * @zh 用于渲染的图形对象。 + */ + graphics: Graphics; + /** + * @en Spine render object. + * @zh Spine 渲染对象。 + */ + spineRender: any; + /** + * @en Creates a new SpineWasmRender instance. + * @param templet The Spine templet to use. + * @param twoColorTint Whether to use two-color tinting. + * @zh 创建 SpineWasmRender 类的新实例。 + * @param templet 要使用的 Spine 模板。 + * @param twoColorTint 是否使用双色调色。 + */ + constructor(templet: SpineTemplet, twoColorTint?: boolean); + /** + * @en Create a mesh with the given material. + * @param material The material to be used for the mesh. + * @returns A SpineMeshBase object. + * @zh 创建具有给定材质的网格。 + * @param material 用于网格的材质。 + * @returns SpineMeshBase 对象。 + */ + createMesh(material: Material): SpineMeshBase; + /** + * @en Draw the skeleton. + * @param skeleton The skeleton to draw. + * @param renderNode The render node. + * @param slotRangeStart The starting slot index. + * @param slotRangeEnd The ending slot index. + * @zh 绘制骨骼。 + * @param skeleton 要绘制的骨骼。 + * @param renderNode 渲染节点。 + * @param slotRangeStart 起始插槽索引。 + * @param slotRangeEnd 结束插槽索引。 + */ + draw(skeleton: spine.Skeleton, renderNode: Spine2DRenderNode, slotRangeStart?: number, slotRangeEnd?: number): void; + } + /** + * @en Represents an animation renderer for spine animations. + * @zh 表示骨骼动画的动画渲染器。 + */ + class AnimationRender { + /** + * @en Temporary IBCreator for index buffer creation. + * @zh 用于创建索引缓冲区的临时IBCreator。 + */ + static tempIbCreate: IBCreator; + /** + * @en Name of the animation. + * @zh 动画的名称。 + */ + name: string; + /** + * @en Map of frame numbers to arrays of IChange objects. + * @zh 帧号到IChange对象数组的映射。 + */ + changeIB: Map; + /** + * @en Array of vertex buffer changes. + * @zh 顶点缓冲区变化的数组。 + */ + changeVB: IVBChange[]; + /** + * @en Array of frame numbers. + * @zh 帧号数组。 + */ + frames: number[]; + /** + * @en Total number of frames in the animation. + * @zh 动画中的总帧数。 + */ + frameNumber: number; + /** + * @en Array of skin animation render data. + * @zh 皮肤动画渲染数据数组。 + */ + skinDataArray: SkinAniRenderData[]; + /** + * @en Array of bone transforms for each frame. + * @zh 每帧的骨骼变换数组。 + */ + boneFrames: Float32Array[][]; + /** + * @en Array of events for each frame. + * @zh 每帧的事件数组。 + */ + eventsFrames: spine.Event[][]; + /** + * @en Indicates if the animation is cached. + * @zh 指示动画是否已缓存。 + */ + isCache: boolean; + /** + * @en Creates a Float32Array representing a bone's transform. + * @param bone The spine bone to get the transform from. + * @zh 创建表示骨骼变换的Float32Array。 + * @param bone 要获取变换的spine骨骼。 + */ + static getFloat32Array(bone: spine.Bone): Float32Array; + /** @ignore */ + constructor(); + private checkChangeVB; + /** + * @en Gets the frame index for a given time. + * @param time The time to get the frame index for. + * @param frameIndex The current frame index. + * @zh 获取给定时间的帧索引。 + * @param time 要获取帧索引的时间。 + * @param frameIndex 当前帧索引。 + */ + getFrameIndex(time: number, frameIndex: number): number; + /** + * @en Caches bone transforms for the animation. + * @param preRender The pre-renderer to use for caching. + * @zh 缓存动画的骨骼变换。 + * @param preRender 用于缓存的预渲染器。 + */ + cacheBones(preRender: IPreRender): void; + /** + * @en Checks and prepares the animation data. + * @param animation The spine animation to check. + * @param preRender The pre-renderer to use. + * @zh 检查并准备动画数据。 + * @param animation 要检查的spine动画。 + * @param preRender 要使用的预渲染器。 + */ + check(animation: spine.Animation, preRender: IPreRender): void; + /** + * @en Creates skin animation render data. + * @param mainVB The main vertex buffer creator. + * @param mainIB The main index buffer creator. + * @param slotAttachMap Map of slot attachments. + * @param attachMap Array of attachment parses. + * @returns The created skin animation render data. + * @zh 创建皮肤动画渲染数据。 + * @param mainVB 主顶点缓冲区创建器。 + * @param mainIB 主索引缓冲区创建器。 + * @param slotAttachMap 插槽附件映射。 + * @param attachMap 附件解析数组。 + * @returns 创建的皮肤动画渲染数据。 + */ + createSkinData(mainVB: VBCreator, mainIB: IBCreator, slotAttachMap: Map>, attachMap: AttachmentParse[]): SkinAniRenderData; + } + /** + * @en Represents skin animation render data for spine animations. + * @zh 表示骨骼动画的皮肤动画渲染数据。 + */ + class SkinAniRenderData { + /** + * @en Name of the skin animation. + * @zh 皮肤动画的名称。 + */ + name: string; + /** + * @en Indicates if the skin can be instanced. + * @zh 指示皮肤是否可以实例化。 + */ + canInstance: boolean; + /** + * @en Array of index buffer render data. + * @zh 索引缓冲区渲染数据数组。 + */ + ibs: IBRenderData[]; + /** + * @en Main index buffer render data. + * @zh 主索引缓冲区渲染数据。 + */ + mainibRender: IBRenderData; + /** + * @en Vertex buffer creator. + * @zh 顶点缓冲区创建器。 + */ + vb: VBCreator; + /** + * @en Main index buffer creator. + * @zh 主索引缓冲区创建器。 + */ + mainIB: IBCreator; + /** + * @en Indicates if multiple render calls are possible. + * @zh 指示是否可能进行多次渲染调用。 + */ + mutiRenderAble: boolean; + /** + * @en Indicates if normal rendering is required. + * @zh 指示是否需要正常渲染。 + */ + isNormalRender: boolean; + /** + * @en Function to check vertex buffer changes. + * @zh 检查顶点缓冲区变化的函数。 + */ + checkVBChange: (slots: spine.Slot[]) => boolean; + /** + * @en Function to update bone matrices. + * @zh 更新骨骼矩阵的函数。 + */ + updateBoneMat: (delta: number, animation: AnimationRender, bones: spine.Bone[], state: spine.AnimationState, boneMat: Float32Array) => void; + /** + * @en Array of vertex buffer changes. + * @zh 顶点缓冲区变化数组。 + */ + changeVB: IVBChange[]; + /** @ignore */ + constructor(); + /** + * @en Empty check for vertex buffer changes. + * @param slots Spine slots. + * @zh 空的顶点缓冲区变化检查。 + * @param slots 骨骼插槽。 + */ + checkVBChangeEmpty(slots: spine.Slot[]): boolean; + /** + * @en Checks for vertex buffer changes. + * @param slots Spine slots. + * @zh 检查顶点缓冲区变化。 + * @param slots 骨骼插槽。 + */ + checkVBChangeS(slots: spine.Slot[]): boolean; + /** + * @en Gets the index buffer for a given frame index. + * @param frameIndex The frame index. + * @zh 获取给定帧索引的索引缓冲区。 + * @param frameIndex 帧索引。 + */ + getIB(frameIndex: number): IBRenderData; + /** + * @en Updates bone matrices using cached data. + * @param delta Time delta. + * @param animation Animation render data. + * @param bones Spine bones. + * @param state Spine animation state. + * @param boneMat Bone matrix array. + * @zh 使用缓存数据更新骨骼矩阵。 + * @param delta 时间增量。 + * @param animation 动画渲染数据。 + * @param bones 骨骼数组。 + * @param state 骨骼动画状态。 + * @param boneMat 骨骼矩阵数组。 + */ + updateBoneMatCache(delta: number, animation: AnimationRender, bones: spine.Bone[], state: spine.AnimationState, boneMat: Float32Array): void; + /** + * @en Updates bone matrices using cached data and handles events. + * @param delta Time delta. + * @param animation Animation render data. + * @param bones Spine bones. + * @param state Spine animation state. + * @param boneMat Bone matrix array. + * @zh 使用缓存数据更新骨骼矩阵并处理事件。 + * @param delta 时间增量。 + * @param animation 动画渲染数据。 + * @param bones 骨骼数组。 + * @param state 骨骼动画状态。 + * @param boneMat 骨骼矩阵数组。 + */ + updateBoneMatCacheEvent(delta: number, animation: AnimationRender, bones: spine.Bone[], state: spine.AnimationState, boneMat: Float32Array): void; + /** + * @en Updates bone matrices using individual bone data. + * @param delta Time delta. + * @param animation Animation render data. + * @param bones Spine bones. + * @param state Spine animation state. + * @param boneMat Bone matrix array. + * @zh 使用单个骨骼数据更新骨骼矩阵。 + * @param delta 时间增量。 + * @param animation 动画渲染数据。 + * @param bones 骨骼数组。 + * @param state 骨骼动画状态。 + * @param boneMat 骨骼矩阵数组。 + */ + updateBoneMatByBone(delta: number, animation: AnimationRender, bones: spine.Bone[], state: spine.AnimationState, boneMat: Float32Array): void; + /** + * @en Initializes the skin animation render data. + * @param tempMap Map of frame changes. + * @param mainVB Main vertex buffer creator. + * @param mainIB Main index buffer creator. + * @param tempArray Array of frame numbers. + * @param slotAttachMap Map of slot attachments. + * @param attachMap Array of attachment parses. + * @param changeVB Array of vertex buffer changes. + * @zh 初始化皮肤动画渲染数据。 + * @param tempMap 帧变化映射。 + * @param mainVB 主顶点缓冲区创建器。 + * @param mainIB 主索引缓冲区创建器。 + * @param tempArray 帧号数组。 + * @param slotAttachMap 插槽附件映射。 + * @param attachMap 附件解析数组。 + * @param changeVB 顶点缓冲区变化数组。 + */ + init(tempMap: Map, mainVB: VBCreator, mainIB: IBCreator, tempArray: number[], slotAttachMap: Map>, attachMap: AttachmentParse[], changeVB: IVBChange[]): void; + } + /** + * @en Animation rendering proxy class for managing animation state and rendering. + * @zh 动画渲染代理类,用于管理动画状态和渲染。 + */ + class AnimationRenderProxy { + /** + * @en The animation state. + * @zh 动画状态。 + */ + state: spine.AnimationState; + /** + * @en The current animation time. + * @zh 当前动画时间。 + */ + currentTime: number; + /** + * @en The current frame index. + * @zh 当前帧索引。 + */ + currentFrameIndex: number; + /** + * @en The animation renderer. + * @zh 动画渲染器。 + */ + animator: AnimationRender; + /** + * @en The current skin animation render data. + * @zh 当前皮肤动画渲染数据。 + */ + currentSKin: SkinAniRenderData; + /** + * @en Creates an instance of AnimationRenderProxy. + * @param animator The animation renderer. + * @zh 创建 AnimationRenderProxy 的实例。 + * @param animator 动画渲染器。 + */ + constructor(animator: AnimationRender); + /** + * @en Sets the skin index. + * @param value The skin index to set. + * @zh 设置皮肤索引。 + * @param value 要设置的皮肤索引。 + */ + set skinIndex(value: number); + /** + * @en Gets the name of the animator. + * @returns The name of the animator. + * @zh 获取动画器的名称。 + * @returns 动画器的名称。 + */ + get name(): string; + /** + * @en Resets the animation state. + * @zh 重置动画状态。 + */ + reset(): void; + /** + * @en Renders the animation without matrix transformation. + * @param slots The slots to render. + * @param updator The VB/IB updater. + * @param curTime The current animation time. + * @zh 不进行矩阵变换的动画渲染。 + * @param slots 要渲染的插槽。 + * @param updator VB/IB 更新器。 + * @param curTime 当前动画时间。 + */ + renderWithOutMat(slots: spine.Slot[], updator: IVBIBUpdate, curTime: number): void; + /** + * @en Renders the animation with matrix transformation. + * @param bones The bones to render. + * @param slots The slots to render. + * @param updator The VB/IB updater. + * @param curTime The current animation time. + * @param boneMat The bone matrix. + * @zh 进行矩阵变换的动画渲染。 + * @param bones 要渲染的骨骼。 + * @param slots 要渲染的插槽。 + * @param updator VB/IB 更新器。 + * @param curTime 当前动画时间。 + * @param boneMat 骨骼矩阵。 + */ + render(bones: spine.Bone[], slots: spine.Slot[], updator: IVBIBUpdate, curTime: number, boneMat: Float32Array): void; + } + /** + * @en Represents a parser for spine attachments. + * @zh 表示一个spine附件解析器。 + */ + class AttachmentParse { + /** + * @en The ID of the slot. + * @zh 插槽的ID。 + */ + slotId: number; + /** + * @en The name of the attachment. + * @zh 附件的名称。 + */ + attachment: string; + /** + * @en The color of the attachment. + * @zh 附件的颜色。 + */ + color: TColor; + /** + * @en The specific color of the attachment. + * @zh 附件的特定颜色。 + */ + attachmentColor: TColor; + /** + * @en The blend mode of the attachment. + * @zh 附件的混合模式。 + */ + blendMode: number; + /** + * @en The vertex array of the attachment. + * @zh 附件的顶点数组。 + */ + vertexArray: Float32Array; + /** + * @en The index array of the attachment. + * @zh 附件的索引数组。 + */ + indexArray: Array; + /** + * @en The UV coordinates of the attachment. + * @zh 附件的UV坐标。 + */ + uvs: spine.ArrayLike; + /** + * @en The stride of the vertex data. + * @zh 顶点数据的步长。 + */ + stride: number; + /** + * @en The index of the bone. + * @zh 骨骼的索引。 + */ + boneIndex: number; + /** + * @en The name of the texture. + * @zh 纹理的名称。 + */ + textureName: string; + /** + * @en Indicates if the attachment is a clipping attachment. + * @zh 指示附件是否为裁剪附件。 + */ + isclip: boolean; + isPath: boolean; + /** + * @en The source data of the attachment. + * @zh 附件的源数据。 + */ + sourceData: spine.Attachment; + /** + * @en The number of vertices in the attachment. + * @zh 附件中的顶点数量。 + */ + vertexCount: number; + /** + * @en Indicates if normal rendering is required. + * @zh 指示是否需要正常渲染。 + */ + isNormalRender: boolean; + /** + * @en The number of bones that affect a vertex. + * @zh 影响一个顶点的最大骨骼数。 + */ + vertexBones: number; + /** + * @en Initializes the attachment parser with the given parameters. + * @param attachment The spine attachment to parse. + * @param boneIndex The index of the bone. + * @param slotId The ID of the slot. + * @param deform The deformation array. + * @param slot The slot data. + * @zh 使用给定的参数初始化附件解析器。 + * @param attachment 要解析的spine附件。 + * @param boneIndex 骨骼的索引。 + * @param slotId 插槽的ID。 + * @param deform 变形数组。 + * @param slot 插槽数据。 + */ + init(attachment: spine.Attachment, boneIndex: number, slotId: number, deform: number[], slot: spine.SlotData): boolean; + } + type TColor = { + r: number; + g: number; + b: number; + a: number; + }; + /** + * @en Represents a change in deformation for a slot in a spine animation. + * @zh 表示骨骼动画中一个插槽的变形变化。 + */ + class ChangeDeform implements IVBChange { + /** + * @en The ID of the slot affected by this deformation change. + * @zh 受此变形变化影响的插槽ID。 + */ + slotId: number; + /** + * @en Map storing the attachment positions for the slot. + * @zh 存储插槽附件位置的映射。 + */ + sizeMap: Map; + /** @ignore */ + constructor(); + /** + * @en Initializes the change with the given VBCreator. + * @param vb The VBCreator to initialize with. + * @returns True if initialization is successful, false otherwise. + * @zh 使用给定的VBCreator初始化变化。 + * @param vb 用于初始化的VBCreator。 + * @returns 如果初始化成功则返回true,否则返回false。 + */ + initChange(vb: VBCreator): boolean; + /** + * @en Updates the vertex buffer based on the deformation change. + * @param vb The VBCreator to update. + * @param slots Array of spine slots. + * @returns True if the update is successful, false otherwise. + * @zh 根据变形变化更新顶点缓冲区。 + * @param vb 要更新的VBCreator。 + * @param slots 骨骼插槽数组。 + * @returns 如果更新成功则返回true,否则返回false。 + */ + updateVB(vb: VBCreator, slots: spine.Slot[]): boolean; + /** + * @en Creates a clone of this ChangeDeform instance. + * @returns A new IVBChange instance with the same properties as this one. + * @zh 创建此ChangeDeform实例的克隆。 + * @returns 具有与此实例相同属性的新IVBChange实例。 + */ + clone(): IVBChange; + } + /** + * @en Represents a change in draw order for spine animation. + * @zh 表示骨骼动画中绘制顺序的变化。 + */ + class ChangeDrawOrder implements IChange { + /** + * @en The new draw order for slots. + * @zh 插槽的绘制顺序。 + */ + order: number[]; + /** + * @en Changes the draw order of attachments. + * @param attachMap An array of AttachmentParse objects. + * @returns The new draw order as an array of numbers, or null if no change is needed. + * @zh 更改附件的绘制顺序。 + * @param attachMap AttachmentParse对象的数组。 + * @returns 新的绘制顺序(数字数组),如果不需要更改则返回null。 + */ + changeOrder(attachMap: AttachmentParse[]): number[] | null; + /** + * @en Applies the draw order change to the vertex buffer. + * @param vb The VBCreator to update. + * @param slotAttachMap A map of slot IDs to their attachment maps. + * @zh 将绘制顺序变化应用到顶点缓冲区。 + * @param vb 要更新的VBCreator。 + * @param slotAttachMap 插槽ID到其附件映射的Map。 + */ + change(vb: VBCreator, slotAttachMap: Map>): boolean; + } + /** + * @en Represents a change in RGBA color for a slot in a spine animation. + * @zh 表示骨骼动画中一个插槽的RGBA颜色变化。 + */ + class ChangeRGBA implements IVBChange { + /** + * @en The ID of the slot affected by this color change. + * @zh 受此颜色变化影响的插槽ID。 + */ + slotId: number; + /** + * @en Map storing the attachment positions for the slot. + * @zh 存储插槽附件位置的映射。 + */ + sizeMap: Map; + /** + * @en Creates a new instance of ChangeRGBA. + * @param slotId The ID of the slot to change. + * @zh 创建ChangeRGBA的新实例。 + * @param slotId 要更改的插槽ID。 + */ + constructor(slotId: number); + /** + * @en Initializes the change with the given VBCreator. + * @param vb The VBCreator to initialize with. + * @returns True if initialization is successful, false otherwise. + * @zh 使用给定的VBCreator初始化变化。 + * @param vb 用于初始化的VBCreator。 + * @returns 如果初始化成功则返回true,否则返回false。 + */ + initChange(vb: VBCreator): boolean; + /** + * @en Updates the vertex buffer with new RGBA values. + * @param vb The VBCreator to update. + * @param slots Array of spine slots. + * @returns True if the update is successful, false otherwise. + * @zh 使用新的RGBA值更新顶点缓冲区。 + * @param vb 要更新的VBCreator。 + * @param slots 骨骼插槽数组。 + * @returns 如果更新成功则返回true,否则返回false。 + */ + updateVB(vb: VBCreator, slots: spine.Slot[]): boolean; + /** + * @en Creates a clone of this ChangeRGBA instance. + * @returns A new IVBChange instance with the same slot ID. + * @zh 创建此ChangeRGBA实例的克隆。 + * @returns 具有相同插槽ID的新IVBChange实例。 + */ + clone(): IVBChange; + } + /** + * @en Represents a change in slot attachment for a spine animation. + * @zh 表示骨骼动画中插槽附件的变化。 + */ + class ChangeSlot implements IChange { + /** + * @en The ID of the slot to change. + * @zh 要更改的插槽ID。 + */ + slotId: number; + /** + * @en The name of the new attachment. + * @zh 新附件的名称。 + */ + attachment: string; + /** + * @en The parsed attachment data. + * @zh 解析后的附件数据。 + */ + attachmentParse: AttachmentParse; + /** + * @en Applies the slot change to the vertex buffer. + * @param vb The VBCreator to update. + * @param slotAttachMap A map of slot IDs to their attachment maps. + * @zh 将插槽变化应用到顶点缓冲区。 + * @param vb 要更新的VBCreator。 + * @param slotAttachMap 插槽ID到其附件映射的Map。 + */ + change(vb: VBCreator, slotAttachMap: Map>): boolean; + /** + * @en Updates the attachment map with the new attachment. + * @param attachMap An array of AttachmentParse objects. + * @zh 使用新附件更新附件映射。 + * @param attachMap AttachmentParse对象的数组。 + */ + changeOrder(attachMap: AttachmentParse[]): number[] | null; + } + /** + * @en Creator class for index buffer (IB) in spine rendering. + * @zh Spine渲染中用于创建索引缓冲区(IB)的类。 + */ + class IBCreator { + /** + * @en The index buffer array. + * @zh 索引缓冲区数组。 + */ + ib: Uint16Array; + /** + * @en The actual length of the index buffer. + * @zh 索引缓冲区的实际长度。 + */ + ibLength: number; + /** + * @en The output render data for multiple renders. + * @zh 用于多重渲染的输出渲染数据。 + */ + outRenderData: MultiRenderData; + private _realib; + /** + * @en The actual index buffer. + * @zh 实际索引缓冲区。 + */ + get realIb(): Uint16Array; + /** @ignore */ + constructor(); + } + interface IChange { + change(vb: VBCreator, slotAttachMap: Map>): boolean; + changeOrder(attachMap: AttachmentParse[]): number[] | null; + } + interface IGetBone { + getBoneId(boneIndex: number): number; + } + interface IPreRender { + canCache: boolean; + _updateState(delta: number): spine.Bone[]; + _play(animationName: string): number; + } + interface ISpineOptimizeRender { + init(skeleton: spine.Skeleton, templet: SpineTemplet, renderNode: BaseRenderNode2D, state: spine.AnimationState): void; + play(animationName: string): void; + render(time: number): void; + setSkinIndex(index: number): void; + initBake(obj: TSpineBakeData): void; + changeSkeleton(skeleton: spine.Skeleton): void; + getSpineColor(): Color; + destroy(): void; + } + interface IVBChange { + initChange(vb: VBCreator): boolean; + updateVB(vb: VBCreator, slots: spine.Slot[]): boolean; + clone(): IVBChange; + } + interface IVBIBUpdate { + updateVB(vertexArray: Float32Array, vbLength: number): void; + updateIB(indexArray: Uint16Array, ibLength: number, mutiRenderData: MultiRenderData, isMuti: boolean): void; + } + type RenderData = { + material?: Material; + textureName: string; + blendMode: number; + offset: number; + length: number; + }; + /** + * @en Represents a collection of multiple render data. + * @zh 表示多个渲染数据的集合。 + */ + class MultiRenderData { + /** + * @en Unique identifier for MultiRenderData instances. + * @zh MultiRenderData 实例的唯一标识符。 + */ + static ID: number; + id: number; + /** + * @en Render data array. + * @zh 渲染数据数组。 + */ + renderData: RenderData[]; + /** + * @en The current RenderData being processed. + * @zh 当前正在处理的 RenderData。 + */ + currentData: RenderData; + /** @ignore */ + constructor(); + /** + * @en Adds new render data to the collection. + * @param textureName The name of the texture. + * @param blendMode The blend mode for rendering. + * @param offset The starting offset in the vertex buffer. + * @param length The initial length of data. + * @zh 向集合中添加新的渲染数据。 + * @param textureName 纹理的名称。 + * @param blendMode 渲染的混合模式。 + * @param offset 顶点缓冲区中的起始偏移量。 + * @param length 数据的初始长度。 + */ + addData(textureName: string, blendMode: number, offset: number, length: number): void; + /** + * @en Finalizes the current render data by updating its length. + * @param length The final length of the data. + * @zh 通过更新长度来完成当前渲染数据的处理。 + * @param length 数据的最终长度。 + */ + endData(length: number): void; + } + /** + * @en SketonOptimise class used for skeleton optimization. + * @zh SketonOptimise 类用于骨骼优化。 + */ + class SketonOptimise implements IPreRender { + /** + * @en Switch for normal rendering mode. + * @zh 普通渲染模式的开关。 + */ + static normalRenderSwitch: boolean; + /** optimise render的最大骨骼数 */ + static MAX_BONES: number; + /** + * @en Switch for caching mode. + * @zh 缓存模式的开关。 + */ + static cacheSwitch: boolean; + /** + * @en Indicates whether caching is possible. + * @zh 表示是否可以缓存。 + */ + canCache: boolean; + /** + * @en The spine skeleton object. + * @zh spine骨骼对象。 + */ + sketon: spine.Skeleton; + _stateData: spine.AnimationStateData; + _state: spine.AnimationState; + /** + * @en Map of blend modes. + * @zh 混合模式的映射。 + */ + blendModeMap: Map; + /** + * @en Array of animation renderers. + * @zh 动画渲染器数组。 + */ + animators: AnimationRender[]; + /** + * @en Array of skin attachments. + * @zh 皮肤附件数组。 + */ + skinAttachArray: SkinAttach[]; + /** + * @en Default skin attachment. + * @zh 默认皮肤附件。 + */ + defaultSkinAttach: SkinAttach; + /** + * @en Maximum number of bones. + * @zh 最大骨骼数量。 + */ + maxBoneNumber: number; + /** + * @en Baked spine data. + * @zh 烘焙的spine数据。 + */ + bakeData: TSpineBakeData; + /** @ignore */ + constructor(); + /** + * @en Check and initialize the main attachment. + * @param skeletonData The skeleton data to check. + * @zh 检查并初始化主附件。 + * @param skeletonData 要检查的骨骼数据。 + */ + checkMainAttach(skeletonData: spine.SkeletonData): void; + /** + * @en Parse attachments from skeleton data. + * @param skeletonData The skeleton data to parse. + * @zh 从骨骼数据解析附件。 + * @param skeletonData 要解析的骨骼数据。 + */ + attachMentParse(skeletonData: spine.SkeletonData): void; + /** + * @en Initialize animations from the skeleton data. + * @param animations Array of animations to initialize. + * @zh 从骨骼数据初始化动画。 + * @param animations 要初始化的动画数组。 + */ + initAnimation(animations: spine.Animation[]): void; + /** + * @en Cache bone data for optimization. + * @zh 缓存骨骼数据以进行优化。 + */ + cacheBone(): void; + /** + * @en Initialize the skeleton with given slots. + * @param slots Array of spine slots. + * @zh 使用给定的插槽初始化骨骼。 + * @param slots spine插槽数组。 + */ + init(slots: spine.Slot[]): void; + } + /** + * @en SkinAttach class represents skin attachment. + * @zh SkinAttach类表示皮肤附件。 + */ + class SkinAttach { + /** + * @en Name of the skin attachment. + * @zh 皮肤附件的名称。 + */ + name: string; + /** + * @en Attachments for each slot + * @zh 每个插槽的附件。 + */ + slotAttachMap: Map>; + /** + * @en Order of main attachments. + * @zh 主要附件的顺序。 + */ + mainAttachMentOrder: AttachmentParse[]; + /** + * @en Indicates if normal rendering is used. + * @zh 表示是否使用普通渲染。 + */ + isNormalRender: boolean; + /** + * @en Main vertex buffer creator. + * @zh 主顶点缓冲区创建器。 + */ + mainVB: VBCreator; + /** + * @en Main index buffer creator. + * @zh 主索引缓冲区创建器。 + */ + mainIB: IBCreator; + /** + * @en Indicates if there's any normal rendering. + * @zh 表示是否存在任何普通渲染。 + */ + hasNormalRender: boolean; + /** + * @en Type of spine rendering. + * @zh spine渲染的类型。 + */ + type: ESpineRenderType; + /** + * @en The number of bones that affect a vertex. + * @zh 影响一个顶点的最大骨骼数。 + */ + vertexBones: number; + /** @ignore */ + constructor(); + /** + * @en Copy data from another SkinAttach. + * @param other The SkinAttach to copy from. + * @zh 从另一个SkinAttach复制数据。 + * @param other 要复制的SkinAttach。 + */ + copyFrom(other: SkinAttach): void; + /** + * @en Check and set up the main attachment. + * @param slots Array of spine slot data. + * @zh 检查并设置主附件。 + * @param slots spine插槽数据数组。 + */ + checkMainAttach(slots: spine.SlotData[]): void; + /** + * @en Parse attachments from skin data. + * @param skinData The spine skin data. + * @param slots Array of spine slot data. + * @zh 从皮肤数据解析附件。 + * @param skinData spine皮肤数据。 + * @param slots spine插槽数据数组。 + */ + attachMentParse(skinData: spine.Skin, slots: spine.SlotData[]): void; + /** + * @en Initialize the skin attachment. + * @param slots Array of spine slot data. + * @zh 初始化皮肤附件。 + * @param slots spine插槽数据数组。 + */ + init(slots: spine.SlotData[]): void; + /** + * @en Initialize an animator with this skin attachment. + * @param animator The animation renderer to initialize. + * @zh 使用此皮肤附件初始化动画器。 + * @param animator 要初始化的动画渲染器。 + */ + initAnimator(animator: AnimationRender): void; + } + type IBRenderData = { + realIb: Uint16Array; + outRenderData: MultiRenderData; + }; + type TSpineBakeData = { + bonesNums: number; + aniOffsetMap: { + [key: string]: number; + }; + texture2d?: Texture2D; + simpPath?: string; + }; + /** + * @en Utility class for Spine slot operations. + * @zh Spine 插槽操作的实用工具类。 + */ + class SlotUtils { + /** + * @en Check the type of attachment and determine the appropriate render type. + * @param attachment The spine attachment to check. + * @zh 检查附件的类型并确定适当的渲染类型。 + * @param attachment 要检查的 Spine 附件。 + */ + static checkAttachment(attachment: spine.Attachment): ESpineRenderType; + /** + * @en Append index array from attachment parse to the target index array. + * @param attachmentParse The attachment parse containing the source index array. + * @param indexArray The target index array to append to. + * @param size The size to offset each index by. + * @param offset The starting offset in the target index array. + * @zh 将附件解析中的索引数组追加到目标索引数组。 + * @param attachmentParse 包含源索引数组的附件解析。 + * @param indexArray 要追加到的目标索引数组。 + * @param size 每个索引的偏移量。 + * @param offset 目标索引数组中的起始偏移量。 + */ + static appendIndexArray(attachmentParse: AttachmentParse, indexArray: Uint16Array, size: number, offset: number): number; + } + /** + * @en Script class for baking Spine animations. + * @zh 用于烘焙 Spine 动画的脚本类。 + */ + class SpineBakeScript extends Script { + /** + * @en URL of the data. + * @zh 数据的地址。 + */ + url: string; + /** + * @en Bake data in string format. + * @zh 字符串格式的烘焙数据。 + */ + bakeData: string; + /** @ignore */ + constructor(); + /** + * @en Called when the script is enabled. + * @zh 当脚本被启用时调用。 + */ + onEnable(): void; + /** + * @en Called when the script is disabled. + * @zh 当脚本被禁用时调用。 + */ + onDisable(): void; + /** + * @en Attaches bake data to the spine renderer. + * @param spine The spine optimizer renderer interface. + * @zh 将烘焙数据附加到 Spine 渲染器。 + * @param spine Spine 优化渲染器接口。 + */ + attach(spine: ISpineOptimizeRender): Promise; + private initBake; + } + /** + * @en Empty implementation of the renderer for optimizing Spine animations. + * @zh 空实现的渲染器,用于优化 Spine 动画的渲染。 + */ + class SpineEmptyRender implements ISpineOptimizeRender { + getSpineColor(): Color; + /** + * @en Changes the skeleton. + * @param skeleton The new spine skeleton. + * @zh 更改骨骼。 + * @param skeleton 新的 Spine 骨骼。 + */ + changeSkeleton(skeleton: spine.Skeleton): void; + /** + * @en Singleton instance of SpineEmptyRender. + * @zh SpineEmptyRender 的单例实例。 + */ + static instance: SpineEmptyRender; + /** + * @en Initializes the renderer. + * @param skeleton The spine skeleton. + * @param templet The spine templet. + * @param renderNode The base render node. + * @param state The spine animation state. + * @zh 初始化渲染器。 + * @param skeleton Spine 骨骼。 + * @param templet Spine 模板。 + * @param renderNode 基础渲染节点。 + * @param state Spine 动画状态。 + */ + init(skeleton: spine.Skeleton, templet: SpineTemplet, renderNode: BaseRenderNode2D, state: spine.AnimationState): void; + /** + * @en Plays the specified animation. + * @param animationName The name of the animation to play. + * @zh 播放指定的动画。 + * @param animationName 要播放的动画名称。 + */ + play(animationName: string): void; + /** + * @en Renders the spine animation. + * @param time The current time for rendering. + * @zh 渲染 Spine 动画。 + * @param time 当前渲染时间。 + */ + render(time: number): void; + /** + * @en Sets the skin index. + * @param index The index of the skin to set. + * @zh 设置皮肤索引。 + * @param index 要设置的皮肤索引。 + */ + setSkinIndex(index: number): void; + /** + * @en Initializes bake data. + * @param obj The spine bake data. + * @zh 初始化烘焙数据。 + * @param obj Spine 烘焙数据。 + */ + initBake(obj: TSpineBakeData): void; + /** + * @en Destroys the renderer. + * @zh 销毁渲染器。 + */ + destroy(): void; + } + /** + * @en SpineInstanceBatch used for efficient rendering Spine instances. + * @zh SpineInstanceBatch 用于高效渲染 Spine 实例。 + */ + class SpineInstanceBatch implements IBatch2DRender { + /** + * @en The instance of SpineInstanceBatch. + * @zh SpineInstanceBatch 的实例。 + */ + static instance: SpineInstanceBatch; + _recoverList: FastSinglelist; + /** + * @en Check if two render elements can be merged. + * @param left The left render element to compare. + * @param right The right render element to compare. + * @returns True if the elements can be merged, false otherwise. + * @zh 检测两个渲染元素是否可以合并。 + * @param left 要比较的左侧渲染元素。 + * @param right 要比较的右侧渲染元素。 + * @returns 如果元素可以合并则返回 true,否则返回 false。 + */ + check(left: IRenderElement2D, right: IRenderElement2D): boolean; + /** + * @en Batch render elements. + * @param list The list of render elements. + * @param start The starting index in the list. + * @param length The number of elements to process. + * @zh 批量渲染元素。 + * @param list 渲染元素列表。 + * @param start 列表中的起始索引。 + * @param length 要处理的元素数量。 + */ + batchRenderElement(list: FastSinglelist, start: number, length: number): void; + /** + * @en Update the instance buffer with new data. + * @param info The SpineInstanceInfo object. + * @param nMatrixData The new matrix data. + * @param simpleAnimatorData The new animator data. + * @param instanceCount The number of instances. + * @zh 使用新数据更新实例缓冲区。 + * @param info SpineInstanceInfo 对象。 + * @param nMatrixData 新的矩阵数据。 + * @param simpleAnimatorData 新的动画器数据。 + * @param instanceCount 实例数量。 + */ + updateBuffer(info: SpineInstanceInfo, nMatrixData: Float32Array, simpleAnimatorData: Float32Array, instanceCount: number): void; + /** + * @en Organize instance data for batching. + * @param list The list of render elements. + * @param start The starting index in the list. + * @param length The number of elements to process. + * @zh 组织实例数据以进行批处理。 + * @param list 渲染元素列表。 + * @param start 列表中的起始索引。 + * @param length 要处理的元素数量。 + */ + batch(list: FastSinglelist, start: number, length: number): void; + /** + * @en Recover instance data. + * @zh 回收实例数据。 + */ + recover(): void; + } + interface SpineInstanceInfo { + element: IRenderElement2D; + source: IRenderGeometryElement; + state: IBufferState; + nMatrixInstanceVB?: IVertexBuffer; + simpleAnimatorVB?: IVertexBuffer; + } + /** + * @en Tool class for managing Spine instance elements in 2D rendering. + * @zh 用于管理 2D 渲染中的 Spine 实例元素的工具类。 + */ + class SpineInstanceElement2DTool { + /** + * @en Maximum number of instances that can be batched. + * @zh 可以批处理的最大实例数量。 + */ + static MaxInstanceCount: number; + /** + * get Instance BufferState + */ + private static _instanceBufferInfoMap; + /** + * @en Get or create a SpineInstanceInfo for a given geometry. + * @param geometry The render geometry element. + * @zh 获取或创建给定几何体的 SpineInstanceInfo。 + * @param geometry 渲染几何体元素。 + */ + static getInstanceInfo(geometry: IRenderGeometryElement): SpineInstanceInfo; + /** + * @en Create a new SpineInstanceInfo for a given geometry. + * @param geometry The render geometry element. + * @zh 为给定的几何体创建一个新的 SpineInstanceInfo。 + * @param geometry 渲染几何体元素。 + */ + static createInstanceInfo(geometry: IRenderGeometryElement): SpineInstanceInfo; + /** + * @en Recover a SpineInstanceInfo object. + * @param info The SpineInstanceInfo to recover. + * @zh 回收一个 SpineInstanceInfo 对象。 + * @param info 要回收的 SpineInstanceInfo。 + */ + static recover(info: SpineInstanceInfo): void; + static _instanceBufferCreate(length: number): Float32Array; + static _instanceBufferRecover(float32: Float32Array): void; + } + /** + * @en Class for normal Spine rendering implementation. + * @zh 普通 Spine 渲染实现类。 + */ + class SpineNormalRender implements ISpineOptimizeRender { + getSpineColor(): Color; + /** + * @en Destroys the renderer. + * @zh 销毁渲染器。 + */ + destroy(): void; + /** + * @en Initializes bake data. + * @param obj The spine bake data. + * @zh 初始化烘焙数据。 + * @param obj Spine 烘焙数据。 + */ + initBake(obj: TSpineBakeData): void; + /** + * @en Initializes the renderer. + * @param skeleton The spine skeleton. + * @param templet The spine templet. + * @param renderNode The Spine2DRenderNode. + * @param state The spine animation state. + * @zh 初始化渲染器。 + * @param skeleton Spine 骨骼。 + * @param templet Spine 模板。 + * @param renderNode Spine2DRenderNode。 + * @param state Spine 动画状态。 + */ + init(skeleton: spine.Skeleton, templet: SpineTemplet, renderNode: Spine2DRenderNode, state: spine.AnimationState): void; + /** + * @en Plays the specified animation. + * @param animationName The name of the animation to play. + * @zh 播放指定的动画。 + * @param animationName 要播放的动画名称。 + */ + play(animationName: string): void; + /** + * @en Sets the skin index. + * @param index The index of the skin to set. + * @zh 设置皮肤索引。 + * @param index 要设置的皮肤索引。 + */ + setSkinIndex(index: number): void; + /** + * @en Changes the skeleton. + * @param skeleton The new spine skeleton. + * @zh 更改骨骼。 + * @param skeleton 新的 Spine 骨骼。 + */ + changeSkeleton(skeleton: spine.Skeleton): void; + /** + * @en Renders the spine animation. + * @param time The current time for rendering. + * @zh 渲染 Spine 动画。 + * @param time 当前渲染时间。 + */ + render(time: number): void; + } + /** + * @en Constants used in Spine optimization. + * @zh Spine 优化中使用的常量。 + */ + class SpineOptimizeConst { + /** + * @en The number of vertices for a bone in the optimized Spine rendering. + * @zh 优化后的 Spine 渲染中,一个骨骼的顶点数。 + */ + static BONEVERTEX: number; + /** + * @en The number of vertices for a rigid body in the optimized Spine rendering. + * @zh 优化后的 Spine 渲染中,一个刚体的顶点数。 + */ + static RIGIDBODYVERTEX: number; + } + /** + * @en SpineOptimizeRender used for optimized rendering of Spine animations. + * @zh SpineOptimizeRender 类用于优化 Spine 动画的渲染。 + */ + class SpineOptimizeRender implements ISpineOptimizeRender { + /** + * @en Map of animation names to AnimationRenderProxy objects. + * @zh 动画名称到 AnimationRenderProxy 对象的映射。 + */ + animatorMap: Map; + /** + * @en Current animation being rendered. + * @zh 当前正在渲染的动画。 + */ + currentAnimation: AnimationRenderProxy; + /** + * @en Array of Spine bones. + * @zh Spine 骨骼数组。 + */ + bones: spine.Bone[]; + /** + * @en Array of Spine slots. + * @zh Spine 插槽数组。 + */ + slots: spine.Slot[]; + /** + * @en Array of SkinRender objects. + * @zh SkinRender 对象数组。 + */ + skinRenderArray: SkinRender[]; + /** + * @en Current SkinRender being used. + * @zh 当前使用的 SkinRender。 + */ + currentRender: SkinRender; + /** + * @en Map of ESpineRenderType to TGeo objects. + * @zh ESpineRenderType 到 TGeo 对象的映射。 + */ + geoMap: Map; + private _isRender; + /** + * @en Color of the Spine object. + * @zh Spine 对象的颜色。 + */ + spineColor: Color; + /** + * @en Current render proxy. + * @zh 当前渲染代理。 + */ + renderProxy: IRender; + /** + * @en Map of ERenderProxyType to IRender objects. + * @zh ERenderProxyType 到 IRender 对象的映射。 + */ + renderProxyMap: Map; + /** + * @en Float32Array for bone matrices. + * @zh 用于骨骼矩阵的 Float32Array。 + */ + boneMat: Float32Array; + /** + * @en Indicates if the animation is baked. + * @zh 指示动画是否被烘焙。 + */ + isBake: boolean; + /** + * @en Bake data for the Spine animation. + * @zh Spine 动画的烘焙数据。 + */ + bakeData: TSpineBakeData; + private _renderProxytype; + /** + * @en Create a new SpineOptimizeRender instance. + * @param spineOptimize SketonOptimise object containing optimization data. + * @zh 创建 SpineOptimizeRender 的新实例。 + * @param spineOptimize 包含优化数据的 SketonOptimise 对象。 + */ + constructor(spineOptimize: SketonOptimise); + getSpineColor(): Color; + /** + * @en Destroy the SpineOptimizeRender instance. + * @zh 销毁 SpineOptimizeRender 实例。 + */ + destroy(): void; + /** + * @en Initialize bake data for the Spine animation. + * @param obj Bake data object. + * @zh 初始化 Spine 动画的烘焙数据。 + * @param obj 烘焙数据对象。 + */ + initBake(obj: TSpineBakeData): void; + /** + * @en Initialize render for a specific spine render type. + * @param type The spine render type to initialize. + * @zh 为特定的 spine 渲染类型初始化渲染。 + * @param type 要初始化的 spine 渲染类型。 + */ + initRender(type: ESpineRenderType): TGeo; + /** + * @en Change the current skeleton. + * @param skeleton The new spine skeleton to use. + * @zh 更改当前骨骼。 + * @param skeleton 要使用的新 spine 骨骼。 + */ + changeSkeleton(skeleton: spine.Skeleton): void; + /** + * @en Initialize the SpineOptimizeRender with necessary components. + * @param skeleton The spine skeleton. + * @param templet The spine templet. + * @param renderNode The Spine2DRenderNode. + * @param state The spine animation state. + * @zh 使用必要的组件初始化 SpineOptimizeRender。 + * @param skeleton Spine 骨骼。 + * @param templet Spine 模板。 + * @param renderNode Spine2DRenderNode。 + * @param state Spine 动画状态。 + */ + init(skeleton: spine.Skeleton, templet: SpineTemplet, renderNode: Spine2DRenderNode, state: spine.AnimationState): void; + /** + * @en The current render proxy type. + * @zh 当前渲染代理类型。 + */ + get renderProxytype(): ERenderProxyType; + set renderProxytype(value: ERenderProxyType); + /** + * @en Begin caching the animation. + * @zh 开始缓存动画。 + */ + beginCache(): void; + /** + * @en End caching the animation. + * @zh 结束缓存动画。 + */ + endCache(): void; + /** + * @en Set the skin index for rendering. + * @param index The index of the skin to set. + * @zh 设置用于渲染的皮肤索引。 + * @param index 要设置的皮肤索引。 + */ + setSkinIndex(index: number): void; + private _clear; + /** + * @en Play a specific animation. + * @param animationName The name of the animation to play. + * @zh 播放特定的动画。 + * @param animationName 要播放的动画名称。 + */ + play(animationName: string): void; + /** + * @en Render the current animation at a specific time. + * @param time The time to render the animation at. + * @zh 在特定时间渲染当前动画。 + * @param time 要渲染动画的时间。 + */ + render(time: number): void; + } + enum ERenderProxyType { + RenderNormal = 0, + RenderOptimize = 1, + RenderBake = 2 + } + interface IRender { + change(skinRender: SkinRender, currentAnimation: AnimationRenderProxy): void; + leave(): void; + render(curTime: number, boneMat: Float32Array): void; + } + /** + * @en SkinRender used for rendering Spine skins. + * @zh SkinRender 类用于渲染 Spine 皮肤。 + */ + class SkinRender implements IVBIBUpdate { + /** + * @en The owner of this SkinRender. + * @zh 此 SkinRender 的所有者。 + */ + owner: SpineOptimizeRender; + /** + * @en The name of the skin. + * @zh 皮肤的名称。 + */ + name: string; + /** + * @en The geometry for rendering. + * @zh 用于渲染的几何体。 + */ + geo: IRenderGeometryElement; + protected vb: IVertexBuffer; + protected ib: IIndexBuffer; + /** + * @en Array of rendering elements. + * @zh 渲染元素数组。 + */ + elements: [ + Material, + number, + number + ][]; + private hasNormalRender; + /** + * @en Map of element creators. + * @zh 元素创建器的映射。 + */ + elementsMap: Map; + /** + * @en The Spine template. + * @zh Spine 模板。 + */ + templet: SpineTemplet; + /** + * @en The type of skin attachment. + * @zh 皮肤附件的类型。 + */ + skinAttachType: ESpineRenderType; + currentData: { + material?: Material; + textureName: string; + blendMode: number; + offset: number; + length: number; + }; + /** + * @en Array of current materials. + * @zh 当前材质数组。 + */ + currentMaterials: Material[]; + /** + * @en The number of bones that affect a vertex. + * @zh 影响一个顶点的最大骨骼数。 + */ + vertexBones: number; + /** + * @en Create a new instance of SkinRender. + * @param owner The SpineOptimizeRender that owns this SkinRender. + * @param skinAttach The SkinAttach data. + * @zh 创建 SkinRender 的新实例。 + * @param owner 拥有此 SkinRender 的 SpineOptimizeRender。 + * @param skinAttach SkinAttach 数据。 + */ + constructor(owner: SpineOptimizeRender, skinAttach: SkinAttach); + /** + * @en Get material by name and blend mode. + * @param name The name of the texture. + * @param blendMode The blend mode. + * @zh 通过名称和混合模式获取材质。 + * @param name 纹理的名称。 + * @param blendMode 混合模式。 + */ + getMaterialByName(name: string, blendMode: number): Material; + /** + * @en Update the vertex buffer. + * @param vertexArray The new vertex data. + * @param vbLength The length of the vertex data. + * @zh 更新顶点缓冲区。 + * @param vertexArray 新的顶点数据。 + * @param vbLength 顶点数据的长度。 + */ + updateVB(vertexArray: Float32Array, vbLength: number): void; + /** + * @en Update the index buffer. + * @param indexArray The new index data. + * @param ibLength The length of the index data. + * @param mutiRenderData Multi-render data. + * @param isMuti Indicates if it's multi-rendering. + * @zh 更新索引缓冲区。 + * @param indexArray 新的索引数据。 + * @param ibLength 索引数据的长度。 + * @param mutiRenderData 多重渲染数据。 + * @param isMuti 指示是否为多重渲染。 + */ + updateIB(indexArray: Uint16Array, ibLength: number, mutiRenderData: MultiRenderData, isMuti: boolean): void; + /** + * @en Initialize the SkinRender. + * @param skeleton The Spine skeleton. + * @param templet The Spine template. + * @param renderNode The Spine2D render node. + * @zh 初始化 SkinRender。 + * @param skeleton Spine 骨骼。 + * @param templet Spine 模板。 + * @param renderNode Spine2D 渲染节点。 + */ + init(skeleton: spine.Skeleton, templet: SpineTemplet, renderNode: Spine2DRenderNode): void; + /** + * @en Render the skin at a specific time. + * @param time The time to render at. + * @zh 在特定时间渲染皮肤。 + * @param time 要渲染的时间。 + */ + render(time: number): void; + } + class ElementCreator { + /** + * @en Array of rendering elements. + * @zh 渲染元素数组。 + */ + elements: [ + Material, + number, + number + ][]; + /** + * @en Array of current materials. + * @zh 当前材质数组。 + */ + currentMaterials: Material[]; + /** + * @en Create a new instance of ElementCreator. + * @param mutiRenderData Multi-render data. + * @param skinData The SkinRender data. + * @zh 创建 ElementCreator 的新实例。 + * @param mutiRenderData 多重渲染数据。 + * @param skinData SkinRender 数据。 + */ + constructor(mutiRenderData: MultiRenderData, skinData: SkinRender); + /** + * @en Clone the elements to a source array. + * @param source The source array to clone to. + * @zh 将元素克隆到源数组。 + * @param source 要克隆到的源数组。 + */ + cloneTo(source: [ + Material, + number, + number + ][]): void; + } + type TGeo = { + geo: IRenderGeometryElement; + vb: IVertexBuffer; + ib: IIndexBuffer; + }; + /** + * @en Abstract class for creating vertex buffers in a spine skeleton animation system. + * @zh 用于在spine骨骼动画系统中创建顶点缓冲区的抽象类。 + */ + abstract class VBCreator implements IGetBone { + /** + * @en Map of bone index to bone ID. + * @zh 骨骼索引到骨骼ID的映射。 + */ + mapIndex: Map; + /** + * @en Array of bone IDs and indices. + * @zh 骨骼ID和索引的数组。 + */ + boneArray: number[]; + /** + * @en Vertex buffer data. + * @zh 顶点缓冲区数据。 + */ + vb: Float32Array; + /** + * @en Length of the vertex buffer. + * @zh 顶点缓冲区的长度。 + */ + vbLength: number; + /** + * @en Map of slot ID to attachment position data. + * @zh 插槽ID到附件位置数据的映射。 + */ + slotVBMap: Map>; + /** + * @en Bone matrix data. + * @zh 骨骼矩阵数据。 + */ + boneMat: Float32Array; + private boneMaxId; + /** + * @en Create a new instance of the VBCreator. + * @param autoNew Whether to automatically create a new vertex buffer. Default is true. + * @zh 创建 VBCreator 的新实例。 + * @param autoNew 是否自动创建新的顶点缓冲区。默认为true。 + */ + constructor(autoNew?: boolean); + /** + * @en Initialize the VBCreator. + * @param autoNew Whether to automatically create a new vertex buffer. + * @zh 初始化VBCreator。 + * @param autoNew 是否自动创建新的顶点缓冲区。 + */ + init(autoNew: boolean): void; + /** + * @en The size of each vertex in the vertex buffer. + * @zh 顶点缓冲区中每个顶点的大小。 + */ + abstract get vertexSize(): number; + /** + * @en Append vertex data to the vertex buffer. + * @param attachmentParse Attachment parse data. + * @param vertexArray Vertex array to append. + * @param offset Offset in the vertex buffer. + * @param boneGet Interface for getting bone data. + * @zh 将顶点数据追加到顶点缓冲区。 + * @param attachmentParse 附件解析数据。 + * @param vertexArray 要追加的顶点数组。 + * @param offset 顶点缓冲区中的偏移量。 + * @param boneGet 获取骨骼数据的接口。 + */ + abstract appendVertexArray(attachmentParse: AttachmentParse, vertexArray: Float32Array, offset: number, boneGet: IGetBone): number; + /** + * @en Append deform data to the output array. + * @param attachmentParse Attachment parse data. + * @param deform Deform data array. + * @param offset Offset in the output array. + * @param out Output array. + * @zh 将变形数据追加到输出数组。 + * @param attachmentParse 附件解析数据。 + * @param deform 变形数据数组。 + * @param offset 输出数组中的偏移量。 + * @param out 输出数组。 + */ + abstract appendDeform(attachmentParse: AttachmentParse, deform: Array, offset: number, out: Float32Array): void; + /** + * @en Append vertex buffer and create index buffer for an attachment. + * @param attach Attachment parse data. + * @zh 为附件追加顶点缓冲区并创建索引缓冲区。 + * @param attach 附件解析数据。 + */ + appendAndCreateIB(attach: AttachmentParse): void; + /** + * @en Get the bone ID for a given bone index. + * @param boneIndex Bone index. + * @returns Bone ID. + * @zh 获取给定骨骼索引的骨骼ID。 + * @param boneIndex 骨骼索引。 + * @returns 骨骼ID。 + */ + getBoneId(boneIndex: number): number; + /** + * @en Initialize the bone matrix. + * @zh 初始化骨骼矩阵。 + */ + initBoneMat(): void; + /** + * @en Append vertex buffer data for an attachment. + * @param attach Attachment parse data. + * @returns Offset in the vertex buffer. + * @zh 为附件追加顶点缓冲区数据。 + * @param attach 附件解析数据。 + * @returns 顶点缓冲区中的偏移量。 + */ + appendVB(attach: AttachmentParse): number | TAttamentPos; + /** + * @en Create index buffer for attachments. + * @param attachs Array of attachment parse data. + * @param ibCreator Index buffer creator. + * @param order Optional draw order array. + * @zh 为附件创建索引缓冲区。 + * @param attachs 附件解析数据数组。 + * @param ibCreator 索引缓冲区创建器。 + * @param order 可选的绘制顺序数组。 + */ + createIB(attachs: AttachmentParse[], ibCreator: IBCreator, order?: number[]): void; + /** + * @en Update bone matrices. + * @param bones Array of bones. + * @param boneMat Bone matrix array. + * @zh 更新骨骼矩阵。 + * @param bones 骨骼数组。 + * @param boneMat 骨骼矩阵数组。 + */ + updateBone(bones: spine.Bone[], boneMat: Float32Array): void; + /** + * @en Update bone cache. + * @param boneFrames Array of bone frame data. + * @param frames Frame number. + * @param boneMat Bone matrix array. + * @zh 更新骨骼缓存。 + * @param boneFrames 骨骼帧数据数组。 + * @param frames 帧数。 + * @param boneMat 骨骼矩阵数组。 + */ + updateBoneCache(boneFrames: Float32Array[][], frames: number, boneMat: Float32Array): void; + _cloneTo(target: VBCreator): void; + abstract _create(): VBCreator; + /** + * @en Clone this VBCreator. + * @zh 克隆此VBCreator。 + */ + clone(): VBCreator; + } + /** + * @en VBBoneCreator class used to handle bone-specific vertex buffer creation. + * @zh VBBoneCreator 类用于处理骨骼特定的顶点缓冲区创建。 + */ + class VBBoneCreator extends VBCreator { + _create(): VBCreator; + /** + * @en The size of each vertex in the vertex buffer. + * @zh 顶点缓冲区中每个顶点的大小。 + */ + get vertexSize(): number; + /** + * @en Appends vertex array data for an attachment. + * @param attachmentParse The attachment parse data. + * @param vertexArray The vertex array to append to. + * @param offset The current offset in the vertex array. + * @param boneGet The interface for getting bone IDs. + * @zh 为附件追加顶点数组数据。 + * @param attachmentParse 附件解析数据。 + * @param vertexArray 要追加到的顶点数组。 + * @param offset 顶点数组中的当前偏移量。 + * @param boneGet 获取骨骼ID的接口。 + */ + appendVertexArray(attachmentParse: AttachmentParse, vertexArray: Float32Array, offset: number, boneGet: IGetBone): number; + /** + * @en Appends deform data to the output array. + * @param attachmentParse The attachment parse data. + * @param deform The deform data array. + * @param offset The current offset in the output array. + * @param out The output array to append to. + * @zh 将变形数据追加到输出数组。 + * @param attachmentParse 附件解析数据。 + * @param deform 变形数据数组。 + * @param offset 输出数组中的当前偏移量。 + * @param out 要追加到的输出数组。 + */ + appendDeform(attachmentParse: AttachmentParse, deform: Array, offset: number, out: Float32Array): void; + } + /** + * @en VBRigBodyCreator class used to handle rigid body specific vertex buffer creation. + * @zh VBRigBodyCreator 类用于处理刚体特定的顶点缓冲区创建。 + */ + class VBRigBodyCreator extends VBCreator { + /** + * @en Gets the size of each vertex in the vertex buffer. + * @returns The size of each vertex. + * @zh 获取顶点缓冲区中每个顶点的大小。 + * @returns 每个顶点的大小。 + */ + get vertexSize(): number; + /** + * @en Appends vertex array data for an attachment. + * @param attachmentParse The attachment parse data. + * @param vertexArray The vertex array to append to. + * @param offset The current offset in the vertex array. + * @param boneGet The interface for getting bone IDs. + * @zh 为附件追加顶点数组数据。 + * @param attachmentParse 附件解析数据。 + * @param vertexArray 要追加到的顶点数组。 + * @param offset 顶点数组中的当前偏移量。 + * @param boneGet 获取骨骼ID的接口。 + */ + appendVertexArray(attachmentParse: AttachmentParse, vertexArray: Float32Array, offset: number, boneGet: IGetBone): number; + /** + * @en Appends deform data to the output array. + * @param attachmentParse The attachment parse data. + * @param deform The deform data array. + * @param offset The current offset in the output array. + * @param out The output array to append to. + * @zh 将变形数据追加到输出数组。 + * @param attachmentParse 附件解析数据。 + * @param deform 变形数据数组。 + * @param offset 输出数组中的当前偏移量。 + * @param out 要追加到的输出数组。 + */ + appendDeform(attachmentParse: AttachmentParse, deform: Array, offset: number, out: Float32Array): void; + } + type TAttamentPos = { + offset: number; + attachment: AttachmentParse; + }; + /** + * @en The spine animation consists of three parts: `SpineTemplet`, `SpineSkeletonRender`, and `SpineSkeleton`. + * - Event.PLAYED Used for animation start playing dispatch + * - Event.STOPPED Used for animation stop playing dispatch + * - Event.PAUSED Used for animation pause playing dispatch + * - Event.LABEL Custom events. + * @zh spine动画由`SpineTemplet`、`SpineSkeletonRender`和`SpineSkeleton`三部分组成。 + * - Event.PLAYED 用于动画开始播放调度 + * - Event.STOPPED 用于动画停止播放调度 + * - Event.PAUSED 用于动画暂停播放调度 + * - Event.LABEL 用于自定义事件 + */ + class Spine2DRenderNode extends BaseRenderNode2D implements ISpineSkeleton { + static _pool: IRenderElement2D[]; + /** + * @en Create a 2D render element. + * @zh 创建2D渲染元素。 + */ + static createRenderElement2D(): IRenderElement2D; + /** + * @en Recover a 2D render element. + * @param value The 2D render element to be recovered. + * @zh 回收2D渲染元素。 + * @param value 要回收的2D渲染元素。 + */ + static recoverRenderElement2D(value: IRenderElement2D): void; + /** + * @en Status - Stopped + * @zh 状态 - 停止 + */ + static readonly STOPPED: number; + /** + * @en Status - Paused + * @zh 状态 - 暂停 + */ + static readonly PAUSED: number; + /** + * @en Status - Playing + * @zh 状态 - 播放中 + */ + static readonly PLAYING: number; + private _pause; + /** 动画播放的起始时间位置*/ + private _playStart; + /** 动画播放的结束时间位置*/ + private _playEnd; + /** 动画的总时间*/ + private _duration; + /** 播放速率*/ + private _playbackRate; + private _playAudio; + private _soundChannelArr; + private trackIndex; + private _skinName; + private _animationName; + private _loop; + private _externalSkins; + private _skin; + private _matBuffer; + /** @ignore */ + constructor(); + /** + * @en External skins + * @zh 外部皮肤 + */ + get externalSkins(): ExternalSkin[]; + set externalSkins(value: ExternalSkin[]); + /** + * @en Add command call + * @param context The rendering context + * @param px X coordinate + * @param py Y coordinate + * @zh 添加命令调用 + * @param context 渲染上下文 + * @param px X坐标 + * @param py Y坐标 + */ + addCMDCall(context: Context, px: number, py: number): void; + /** + * @en Reset the style of externally loaded skins + * @zh 重置外部加载的皮肤的样式 + */ + resetExternalSkin(): void; + /** + * @en Animation source + * @zh 动画源 + */ + get source(): string; + set source(value: string); + /** + * @en Skin name + * @zh 皮肤名 + */ + get skinName(): string; + set skinName(value: string); + /** + * 最大播放间隔 + */ + get maxDetlaTime(): number; + set maxDetlaTime(value: number); + /** + * @en Animation name + * @zh 动画名 + */ + get animationName(): string; + set animationName(value: string); + /** + * @en Whether to loop + * @zh 是否循环 + */ + get loop(): boolean; + set loop(value: boolean); + /** + * @en Set the URL of the spine animation + * @zh 设置spine动画的URL + */ + set url(value: string); + get url(): string; + /** + * @en The reference to the animation template. + * @returns The animation template. + * @zh 动画模板的引用。 + * @returns 动画模板。 + */ + get templet(): SpineTemplet; + set templet(value: SpineTemplet); + /** + * @en Set the current playback position. + * @param value Current time in milliseconds. + * @zh 设置当前播放位置。 + * @param value 当前时间。 + */ + set currentTime(value: number); + /** + * @en Get the current playback state. + * @returns The current playback state. + * @zh 获取当前播放状态。 + * @returns 当前播放状态。 + */ + get playState(): number; + private _useFastRender; + /** + * @en Whether to use fast rendering. It is enabled by default. When some complex spines are enabled, this value will render errors. For example, the number of bone controls of a vertex in the spine resource is greater than 4 + * @returns Whether to use the state of fast rendering currently. + * @zh 是否使用快速渲染,默认开启,某些复杂的Spine开启此值会渲染错误,比如spine资源中某个顶点的骨骼控制数大于4 + * @returns 当前是否使用快速渲染的状态。 + */ + set useFastRender(value: boolean); + get useFastRender(): boolean; + spineItem: ISpineOptimizeRender; + /** @ignore */ + onAwake(): void; + /** + * @en Initialize the Spine animation + * @param templet The Spine template to initialize with + * @zh 初始化Spine动画 + * @param templet 用于初始化的Spine模板 + */ + protected init(templet: SpineTemplet): void; + /** + * @en Play the animation. + * @param nameOrIndex Animation name or index. + * @param loop Whether to loop the animation. + * @param force If false, the animation won't play if it's the same as the previous one; if true, it will force play. + * @param start Start time. + * @param end End time. + * @param freshSkin Whether to refresh skin data. + * @param playAudio Whether to play audio. + * @zh 播放动画。 + * @param nameOrIndex 动画名字或者索引。 + * @param loop 是否循环播放。 + * @param force 如果为false,要播的动画跟上一个相同就不生效;如果为true,强制生效。 + * @param start 起始时间。 + * @param end 结束时间。 + * @param freshSkin 是否刷新皮肤数据。 + * @param playAudio 是否播放音频。 + */ + play(nameOrIndex: string | number, loop: boolean, force?: boolean, start?: number, end?: number, freshSkin?: boolean, playAudio?: boolean): void; + private _update; + private _flushExtSkin; + /** + * @en Get the number of current animations + * @zh 获取当前动画的数量 + */ + getAnimNum(): number; + /** + * @en Get the name of the specified animation + * @param index The index of the animation + * @zh 获取指定动画的名字 + * @param index 动画的索引 + */ + getAniNameByIndex(index: number): string; + /** + + * @en Get the reference of a slot by its name + * @param slotName The name of the slot + * @zh 通过名字获取插槽的引用 + * @param slotName 插槽的名字 + */ + getSlotByName(slotName: string): spine.Slot; + /** + * @en Set the animation playback rate + * @param value 1 is the standard rate + * @zh 设置动画播放速率 + * @param value 1为标准速率 + */ + playbackRate(value: number): void; + /** + * @en Show a skin by its name + * @param name The name of the skin + * @zh 通过名字显示一套皮肤 + * @param name 皮肤的名字 + */ + showSkinByName(name: string): void; + /** + * @en Show a skin by its index + * @param skinIndex The index of the skin + * @zh 通过索引显示一套皮肤 + * @param skinIndex 皮肤索引 + */ + showSkinByIndex(skinIndex: number): void; + /** + * @en Trigger an event + * @param type The type of the event + * @param data The data associated with the event + * @zh 触发事件 + * @param type 事件类型 + * @param data 与事件关联的数据 + */ + event(type: string, data?: any): void; + /** + * @en Stop the animation + * @zh 停止动画 + */ + stop(): void; + private _clearUpdate; + private _beginUpdate; + private _needUpdate; + /** + * @ignore + * @en Update method called every frame + * @zh 每帧调用的更新方法 + */ + onUpdate(): void; + /** + * @en Pause the animation playback + * @zh 暂停动画的播放 + */ + paused(): void; + /** + * @en Resume the animation playback + * @zh 恢复动画的播放 + */ + resume(): void; + /** + * 清掉播放完成的音频 + * @param force 是否强制删掉所有的声音channel + */ + private _onAniSoundStoped; + /** + * @en Reset the Spine animation component + * @zh 重置Spine动画组件 + */ + reset(): void; + /** + * @en Add an animation to the queue + * @param nameOrIndex Animation name or index + * @param loop Whether to loop the animation + * @param delay Delay before playing the animation (in seconds, can be negative) + * @zh 添加一个动画到队列 + * @param nameOrIndex 动画名字或者索引 + * @param loop 是否循环播放 + * @param delay 延迟调用时间 + */ + addAnimation(nameOrIndex: string | number, loop?: boolean, delay?: number): void; + /** + * @en Set the duration of the mix between two animations + * @param fromNameOrIndex Name or index of the source animation + * @param toNameOrIndex Name or index of the target animation + * @param duration Mix duration in seconds + * @zh 设置当动画被改变时,存储混合(交叉淡出)的持续时间 + * @param fromNameOrIndex 源动画的名称或索引 + * @param toNameOrIndex 目标动画的名称或索引 + * @param duration 混合持续时间 + */ + setMix(fromNameOrIndex: any, toNameOrIndex: any, duration: number): void; + /** + * @en Get bone information (spine.Bone) + * Note: The returned bone information is from Spine runtime (spine.Bone) and is not compatible with engine methods + * @param boneName Name of the bone + * @returns Bone information + * @zh 获取骨骼信息(spine.Bone) + * 注意: 获取到的是spine运行时的骨骼信息(spine.Bone),不适用于引擎的方法 + * @param boneName 骨骼名称 + * @returns 骨骼信息 + */ + getBoneByName(boneName: string): spine.Bone; + /** + * @en Get the Skeleton (spine.Skeleton) + * @returns Spine Skeleton + * @zh 获取Skeleton(spine.Skeleton) + * @returns Spine骨架 + */ + getSkeleton(): spine.Skeleton; + /** + * @en Replace slot attachment + * @param slotName Name of the slot + * @param attachmentName Name of the attachment + * @zh 替换插槽皮肤 + * @param slotName 插槽名称 + * @param attachmentName 附件名称 + */ + setSlotAttachment(slotName: string, attachmentName: string): void; + /** + * @en Clear render elements + * @zh 清除渲染元素 + */ + clear(): void; + /** + * @en Change to normal render mode + * @zh 切换到普通渲染模式 + */ + changeNormal(): void; + /** + * @ignore + * @en Called when the component is being destroyed + * @zh 当组件被销毁时调用 + */ + onDestroy(): void; + /** + * @en Draw geometries + * @param geo Render geometry element + * @param elements Array of [Material, startIndex, indexCount] + * @zh 绘制几何体 + * @param geo 渲染几何元素 + * @param elements [材质, 起始索引, 索引数量] 数组 + */ + drawGeos(geo: IRenderGeometryElement, elements: [ + Material, + number, + number + ][]): void; + /** + * @en Update render elements + * @param geo Render geometry element + * @param elements Array of [Material, startIndex, indexCount] + * @zh 更新渲染元素 + * @param geo 渲染几何元素 + * @param elements [材质, 起始索引, 索引数量] 数组 + */ + updateElements(geo: IRenderGeometryElement, elements: [ + Material, + number, + number + ][]): void; + /** + * @en Draw a single geometry + * @param geo Render geometry element + * @param material Material to use for rendering + * @param count indexCount + * @param offset startIndex + * @zh 绘制单个几何体 + * @param geo 渲染几何元素 + * @param material 用于渲染的材质 + * @param count 索引数量 + * @param offset 起始索引 + */ + drawGeo(geo: IRenderGeometryElement, material: Material, count: number, offset: number): void; + /** + * @en Get material for rendering + * @param texture Texture to use + * @param blendMode Blend mode + * @returns Material for rendering + * @zh 获取用于渲染的材质 + * @param texture 要使用的纹理 + * @param blendMode 混合模式 + * @returns 用于渲染的材质 + */ + getMaterial(texture: Texture2D, blendMode: number): Material; + } + enum ERenderType { + normal = 0, + boneGPU = 1, + rigidBody = 2 + } + /** + * @en SpineAdapter is an adapter class for integrating the Spine animation system. + * @zh SpineAdapter 是一个适配器类,用于集成 Spine 动画系统。 + */ + class SpineAdapter { + static _vbArray: Float32Array; + static _ibArray: Uint16Array; + static _spine: any; + /** + * @en Indicates whether the Spine system is using WebAssembly. + * @zh 指示 Spine 系统是否使用 WebAssembly。 + */ + static isWasm: boolean; + /** + * @en Map of state values to their corresponding string representations. + * @zh 状态值到其对应字符串表示的映射。 + */ + static stateMap: any; + /** + * @en Create a normal render object for Spine animation. + * @param templet The Spine template. + * @param twoColorTint Whether to use two-color tinting. + * @zh 为 Spine 动画创建一个普通渲染对象。 + * @param templet Spine 模板。 + * @param twoColorTint 是否使用两色染色。 + */ + static createNormalRender(templet: SpineTemplet, twoColorTint: boolean): SpineWasmRender | SpineSkeletonRenderer; + /** + * @en Perform all necessary adaptations for Spine integration. + * @zh 执行所有必要的 Spine 集成适配。 + */ + static allAdpat(): void; + /** + * @en Adapt the JavaScript version of Spine. + * @zh 适配 JavaScript 版本的 Spine。 + */ + static adaptJS(): void; + /** + * @en Initialize and extend the Spine animation library's AnimationState prototype. + * @zh 初始化并扩展Spine动画库的AnimationState原型。 + */ + static initClass(): void; + /** + * @en Bind vertex and index buffers for Spine rendering. + * @param maxNumVertices Maximum number of vertices. + * @param maxNumIndices Maximum number of indices. + * @zh 为 Spine 渲染绑定顶点和索引缓冲区。 + * @param maxNumVertices 最大顶点数量。 + * @param maxNumIndices 最大索引数量。 + */ + static bindBuffer(maxNumVertices: number, maxNumIndices: number): void; + /** + * @en Draw a Spine skeleton. + * @param fun The drawing function. + * @param skeleton The Spine skeleton to draw. + * @param twoColorTint Whether to use two-color tinting. + * @param slotRangeStart The starting slot index. + * @param slotRangeEnd The ending slot index. + * @zh 绘制 Spine 骨骼。 + * @param fun 绘制函数。 + * @param skeleton 要绘制的 Spine 骨骼。 + * @param twoColorTint 是否使用两色混色。 + * @param slotRangeStart 起始插槽索引。 + * @param slotRangeEnd 结束插槽索引。 + */ + static drawSkeleton(fun: Function, skeleton: any, twoColorTint: boolean, slotRangeStart: number, slotRangeEnd: number): void; + } + /**动画开始播放调度 + * @eventType Event.PLAYED + * */ + /**动画停止播放调度 + * @eventType Event.STOPPED + * */ + /**动画暂停播放调度 + * @eventType Event.PAUSED + * */ + /**自定义事件。 + * @eventType Event.LABEL + */ + /** + * @deprecated 请使用Sprite+Spine2DRenderNode组件 + * spine动画由SpineTempletSpineSkeletonRenderSpineSkeleton三部分组成。 + */ + class SpineSkeleton extends Sprite { + private _spineComponent; + constructor(); + /** + * 外部皮肤 + */ + get externalSkins(): ExternalSkin[]; + set externalSkins(value: ExternalSkin[]); + /** + * 重置外部加载的皮肤的样式 + */ + resetExternalSkin(): void; + /** + * 动画源 + */ + get source(): string; + set source(value: string); + /** + * 皮肤名 + */ + get skinName(): string; + set skinName(value: string); + /** + * 动画名 + */ + get animationName(): string; + set animationName(value: string); + /** + * 是否循环 + */ + get loop(): boolean; + set loop(value: boolean); + /** + * 得到动画模板的引用 + * @return templet + */ + get templet(): SpineTemplet; + /** + * 设置动画模板的引用 + */ + set templet(value: SpineTemplet); + /** + * 设置当前播放位置 + * @param value 当前时间 + */ + set currentTime(value: number); + /** + * 获取当前播放状态 + * @return 当前播放状态 + */ + get playState(): number; + get spineItem(): ISpineOptimizeRender; + set spineItem(value: ISpineOptimizeRender); + /** + * 播放动画 + * + * @param nameOrIndex 动画名字或者索引 + * @param loop 是否循环播放 + * @param force false,如果要播的动画跟上一个相同就不生效,true,强制生效 + * @param start 起始时间 + * @param end 结束时间 + * @param freshSkin 是否刷新皮肤数据 + * @param playAudio 是否播放音频 + */ + play(nameOrIndex: any, loop: boolean, force?: boolean, start?: number, end?: number, freshSkin?: boolean, playAudio?: boolean): void; + /** + * 得到当前动画的数量 + * @return 当前动画的数量 + */ + getAnimNum(): number; + /** + * 得到指定动画的名字 + * @param index 动画的索引 + */ + getAniNameByIndex(index: number): string; + /** + * 通过名字得到插槽的引用 + * @param slotName + */ + getSlotByName(slotName: string): spine.Slot; + /** + * 设置动画播放速率 + * @param value 1为标准速率 + */ + playbackRate(value: number): void; + /** + * 通过名字显示一套皮肤 + * @param name 皮肤的名字 + */ + showSkinByName(name: string): void; + /** + * 通过索引显示一套皮肤 + * @param skinIndex 皮肤索引 + */ + showSkinByIndex(skinIndex: number): void; + /** + * 停止动画 + */ + stop(): void; + /** + * 暂停动画的播放 + */ + paused(): void; + /** + * 恢复动画的播放 + */ + resume(): void; + /** + * 销毁当前动画 + * @override + */ + destroy(destroyChild?: boolean): void; + /** + * 添加一个动画 + * @param nameOrIndex 动画名字或者索引 + * @param loop 是否循环播放 + * @param delay 延迟调用,可以为负数 + */ + addAnimation(nameOrIndex: any, loop?: boolean, delay?: number): void; + /** + * 设置当动画被改变时,存储混合(交叉淡出)的持续时间 + * @param fromNameOrIndex + * @param toNameOrIndex + * @param duration + */ + setMix(fromNameOrIndex: any, toNameOrIndex: any, duration: number): void; + /** + * 获取骨骼信息(spine.Bone) + * 注意: 获取到的是spine运行时的骨骼信息(spine.Bone),不适用引擎的方法 + * @param boneName + */ + getBoneByName(boneName: string): spine.Bone; + /** + * 获取Skeleton(spine.Skeleton) + */ + getSkeleton(): spine.Skeleton; + /** + * 替换插槽皮肤 + * @param slotName + * @param attachmentName + */ + setSlotAttachment(slotName: string, attachmentName: string): void; + } + enum ESpineRenderType { + boneGPU = 0, + normal = 1, + rigidBody = 2 + } + /** + * @en Base class for Spine animation template + * @zh Spine动画模板基类 + */ + class SpineTemplet extends Resource { + /** + * @en Runtime version of Spine + * @zh Spine运行时版本 + */ + static RuntimeVersion: string; + /** + * @en Skeleton data for the Spine animation + * @zh Spine动画的骨骼数据 + */ + skeletonData: spine.SkeletonData; + /** + * @en Map of materials used in the Spine animation + * @zh Spine动画中使用的材质映射 + */ + materialMap: Map; + private _textures; + private _basePath; + /** + * @en Base width of spine animation + * @zh spine 动画基础宽度 + */ + width: number; + /** + * @en Base height of spine animation + * @zh spine 动画基础高度 + */ + height: number; + /** + * @en X-axis offset of spine animation + * @zh spine 动画X轴偏移 + */ + offsetX: number; + /** + * @en Y-axis offset of spine animation + * @zh spine 动画Y轴偏移 + */ + offsetY: number; + /** + * @en Indicates if slot is needed + * @zh 是否需要插槽 + */ + needSlot: boolean; + /** + * @en Skeleton optimization object + * @zh 骨骼优化对象 + */ + sketonOptimise: SketonOptimise; + /** @ignore */ + constructor(); + /** + * @en The main texture of the Spine animation + * @zh Spine动画的主纹理 + */ + mainTexture: Texture2D; + /** + * @en The main blend mode of the Spine animation + * @zh Spine动画的主混合模式 + */ + mainBlendMode: number; + private _premultipliedAlpha; + /** + * @en Switch for premultipliedAlpha. + * @zh 透明预乘的开关。 + */ + get premultipliedAlpha(): boolean; + /** + * @en The base path of the Spine animation resources + * @zh Spine动画资源的基础路径 + */ + get basePath(): string; + /** + * @en Get or create a material for the given texture and blend mode + * @param texture The texture to use + * @param blendMode The blend mode to use + * @zh 获取或创建给定纹理和混合模式的材质 + * @param texture 要使用的纹理 + * @param blendMode 要使用的混合模式 + */ + getMaterial(texture: Texture2D, blendMode: number): Material; + /** + * @en Get a texture by its name + * @param name The name of the texture + * @zh 通过名称获取纹理 + * @param name 纹理的名称 + */ + getTexture(name: string): Texture2D; + /** + * @en Get the animation name by its index + * @param index The index of the animation + * @zh 通过索引获取动画名称 + * @param index 动画的索引 + */ + getAniNameByIndex(index: number): string; + /** + * @en Find the animation by its name + * @param name The name of the animation to find + * @returns The found animation index, or -1 if not found + * @zh 通过动画名称查找动画 + * @param name 要查找的动画名称 + * @returns 找到的动画索引,如果未找到则返回-1 + */ + findAnimation(name: string): spine.Animation; + /** + * @en Get the skin index by its name + * @param skinName The name of the skin + * @zh 通过皮肤名称获取皮肤索引 + * @param skinName 皮肤名称 + */ + getSkinIndexByName(skinName: string): number; + /** + * @en Release textures and materials + * @zh 释放纹理和材质 + */ + protected _disposeResource(): void; + } + /** + * @en Used for adaptation to version 3.8 + * @zh 用于3.8版本适配 + */ + class SpineTexture { + /** + * @en The actual Texture2D object + * @zh 实际的Texture2D对象 + */ + realTexture: Texture2D; + /** + * @en Creates a new SpineTexture instance. + * @param tex The Texture2D to be wrapped + * @zh 创建SpineTexture的新实例 + * @param tex 要被包装的Texture2D + */ + constructor(tex: Texture2D); + /** + * @en Get the image dimensions + * @zh 获取图像尺寸 + */ + getImage(): Object; + /** + * @en Set the texture filters + * @param minFilter The minification filter + * @param magFilter The magnification filter + * @zh 设置纹理过滤器 + * @param minFilter 缩小过滤器 + * @param magFilter 放大过滤器 + */ + setFilters(minFilter: spine.TextureFilter, magFilter: spine.TextureFilter): void; + /** + * @en Convert Spine texture wrap mode to LayaAir wrap mode + * @param mode The Spine texture wrap mode + * @zh 将Spine纹理包裹模式转换为LayaAir包裹模式 + * @param mode Spine纹理包裹模式 + */ + convertWrapMode(mode: spine.TextureWrap): WrapMode; + /** + * @en Set the texture wrap modes + * @param uWrap The horizontal wrap mode + * @param vWrap The vertical wrap mode + * @zh 设置纹理包裹模式 + * @param uWrap 水平包裹模式 + * @param vWrap 垂直包裹模式 + */ + setWraps(uWrap: spine.TextureWrap, vWrap: spine.TextureWrap): void; + } + /** + * @private + */ + class System { + /** + * 替换指定名称的定义。用来动态更改类的定义。 + * @param name 属性名。 + * @param classObj 属性值。 + */ + static changeDefinition(name: string, classObj: any): void; + } + function testSimple(): Promise; + class LayaTest { + static test(): void; + } + function usewebgl(): void; + class PerfTools { + static begin(block: string): void; + static end(block: string): void; + } + class PerformanceDefine { + static T_FPS: string; + static C_UniformBufferUploadCount: string; + static C_GeometryBufferUploadCount: string; + static C_overdraw: string; + static C_trangleCount: string; + static C_SetRenderPassCount: string; + static C_DrawCallCount: string; + static C_Instancing_DrawCallCount: string; + static C_TransDrawCall: string; + static C_OpaqueDrawCall: string; + static C_DepthCastDrawCall: string; + static C_ShadowDrawCall: string; + static C_ShaderCompile: string; + static T_ShaderCompile: string; + static M_GPUBuffer: string; + static M_VertexBuffer: string; + static M_IndexBuffer: string; + static M_UniformBlockBuffer: string; + static RC_GPUBuffer: string; + static RC_VertexBuffer: string; + static RC_IndexBuffer: string; + static RC_UniformBlockBuffer: string; + static M_ALLTexture: string; + static M_Texture2D: string; + static M_TextureCube: string; + static M_Texture3D: string; + static M_Texture2DArray: string; + static RC_ALLTexture: string; + static RC_Texture2D: string; + static RC_TextureCube: string; + static RC_Texture3D: string; + static RC_Texture2DArray: string; + static M_ALLRenderTexture: string; + static RC_ALLRenderTexture: string; + static T_CameraRender: string; + static T_Render_OpaqueRender: string; + static T_Render_TransparentRender: string; + static T_Render_PostProcess: string; + static T_Render_CameraEventCMD: string; + static T_Render_ShadowPassMode: string; + static T_Render_CameraOtherDest: string; + static T_RenderPreUpdate: string; + static T_CameraMainCull: string; + static T_ShadowMapCull: string; + static T_OnlyMeshRender: string; + static T_OnlySkinnedMeshRender: string; + static T_OnlyShurikenParticleRender: string; + static T_OtherRender: string; + static C_Sprite3DCount: string; + static C_BaseRenderCount: string; + static C_MeshRenderCount: string; + static C_SkinnedMeshRenderCount: string; + static C_ShurikenParticleRenderCount: string; + static T_AnimatorUpdate: string; + static T_SkinBoneUpdate: string; + static T_ShurikenUpdate: string; + static T_Physics_Simulation: string; + static T_Physics_UpdateNode: string; + static T_PhysicsEvent: string; + static C_PhysicsEventCount: string; + static T_PhysicsCollider: string; + static T_PhysicsTrigger: string; + static T_PhysicsColliderEnter: string; + static T_PhysicsColliderExit: string; + static T_PhysicsColliderStay: string; + static T_PhysicsTriggerEnter: string; + static T_PhysicsTriggerExit: string; + static T_PhysicsTriggerStay: string; + static C_PhysicaDynamicRigidBody: string; + static C_PhysicaStaticRigidBody: string; + static C_PhysicaKinematicRigidBody: string; + static C_PhysicaCharacterController: string; + static C_PhysicsJoint: string; + static T_LoadResourceTime: string; + static C_LoadResourceCount: string; + static C_LoadRequestCount: string; + static T_LoadRequestTime: string; + static T_UITime: string; + static C_UICount: string; + static C_DrawCount: string; + static T_UIRender: string; + } + /** + * 性能统计开始 + * @param block 统计标识(例如:PerformanceDefine.SCENE3D_RENDER) + */ + function PERF_BEGIN(block: string): void; + /** + * 性能统计结束 + * @param block 统计标识(例如:PerformanceDefine.SCENE3D_RENDER) + */ + function PERF_END(block: string): void; + function PERF_FRAMECLEAR(): void; + /** + * @en The `AutoBitmap` class is a display object that represents bitmap images or graphics. + * It encapsulates the handling of position, width, height, and nine-patch for UI components. + * @zh `AutoBitmap` 类是用于表示位图图像或绘制图形的显示对象。 + * 封装了位置,宽高及九宫格的处理,供UI组件使用。 + */ + class AutoBitmap extends Graphics { + /** 宽度*/ + private _width; + /** 高度*/ + private _height; + /** 源数据*/ + private _source; + /** 纹理的九宫格数据 */ + private _sizeGrid; + protected _isChanged: boolean; + protected _stateIndex: number; + protected _stateNum: number; + private _drawGridCmd; + uv: number[]; + /** + * @en The size grid of the texture. + * The size grid is a 3x3 division of the texture, allowing it to be scaled without distorting the corners and edges. + * The array contains five values representing the top, right, bottom, and left margins, and whether to repeat the fill (0: no repeat, 1: repeat). + * The values are separated by commas. For example: "6,6,6,6,1". + * @zh 纹理的九宫格数据。 + * 九宫格是一种将纹理分成3x3格的方式,使得纹理缩放时保持角和边缘不失真。 + * 数组包含五个值,分别代表上边距、右边距、下边距、左边距以及是否重复填充(0:不重复填充,1:重复填充)。 + * 值以逗号分隔。例如:"6,6,6,6,1"。 + */ + get sizeGrid(): number[]; + set sizeGrid(value: number[]); + /** + * @en The width of the display object, in pixels. + * @zh 表示显示对象的宽度,以像素为单位。 + */ + get width(): number; + set width(value: number); + /** + * @en The height of the display object, in pixels. + * @zh 表示显示对象的高度,以像素为单位。 + */ + get height(): number; + set height(value: number); + /** + * @en The texture resource of the object. + * @zh 对象的纹理资源。 + */ + get source(): Texture; + set source(value: Texture); + /** + * @en The color of the object. + * @zh 对象的颜色。 + */ + get color(): string; + set color(value: string); + /** + * @en Mark the object as changed. + * @zh 标记对象为已更改状态。 + */ + protected _setChanged(): void; + /** + * @en Change the texture resource. + * @zh 修改纹理资源。 + */ + protected changeSource(): void; + /** + * @en Due to the possibility of other graphic commands, the original method of directly using clear() cannot be used. + * @zh 由于可能有其他的graphic命令,因此不能用原来的直接clear()的方法 + */ + private _setDrawGridCmd; + /** + * @en Destroy the object. + * @zh 销毁对象。 + */ + destroy(): void; + } + /** + * @en The `Box` class is the base class for UI containers. + * Other container components will inherit from this class. + * @zh `Box` 类是 UI 容器的基类。 + * 其他的容器组件都会继承于该类。 + */ + class Box extends UIComponent { + /** + * @en The background color. + * @zh 背景颜色。 + */ + private _bgColor; + set_dataSource(value: any): void; + /** + * @en background color + * @zh 容器的背景颜色 + */ + get bgColor(): string; + set bgColor(value: string); + } + /** + * @en The Button component is used to represent a button with multiple states. The Button component can display a text label, an icon, or both. + * The states can be single-state, two-state (normal, pressed), or three-state (normal, hover, pressed). By default, it is three-state. + * @zh `Button` 组件用来表示多种状态的按钮。`Button` 组件可显示文本标签、图标或同时显示两者。 + * 多种状态,可以是单态,两态(移出、按下)和三态(移出、悬停、按下),默认是三态。 + */ + class Button extends UIComponent implements ISelect { + /** + * @en Controls whether the button can toggle its display state. When the value is true, the display state can be toggled by clicking, such as switching between selected and unselected states. + * @zh 用于控制按钮是否可切换显示状态;值为 true 时,才可以在运行后通过点击切换显示状态。例如选中状态和未选中状态。 + */ + toggle: boolean; + /** + * @en The text on the button. + * @zh 按钮上的文本。 + */ + protected _text: Text; + /** + * @en The color value of the button's text label. + * @zh 按钮文本标签的颜色值。 + */ + protected _labelColors: string[]; + /** + * @en The color value of the button's text label stroke. + * @zh 按钮文本标签描边的颜色值。 + */ + protected _strokeColors: string[]; + /** + * @en The state value of the button. + * @zh 按钮的状态值。 + */ + protected _state: number; + /** + * @en Indicates the selected state of the button. + * @zh 表示按钮的选中状态。 + */ + protected _selected: boolean; + /** + * @en The skin resource of the button. + * @zh 按钮的皮肤资源。 + */ + protected _skin: string; + /** + * @en Specifies whether the display object automatically calculates and changes size and other attributes. + * @zh 指定此显示对象是否自动计算并改变大小等属性。 + */ + protected _autoSize: boolean; + /** + * @en The number of states for the button. + * @zh 按钮的状态数。 + */ + protected _stateNum: number; + /** + * @en The click event handler of the button. + * @zh 按钮的点击事件函数。 + */ + protected _clickHandler: Handler; + protected _stateChanged: boolean; + /** + * @en The state value of the button. + * @zh 对象的状态值。 + */ + protected get state(): number; + protected set state(value: number); + /** + * @en The skin resource address of the object. + * Supports single state, two states and three states, set with the `stateNum` property. + * @zh 对象的皮肤资源地址。 + * 支持单态,两态和三态,用 `stateNum` 属性设置 + */ + get skin(): string; + set skin(value: string); + /** + * @en The state value of the object, expressed as a number. + * The default value is 3. This value determines how the skin resource image is sliced. + * Values: + * - 1: Single state. The image is not sliced, and the button has only one skin state. + * - 2: Two states. The image will be sliced equally in the vertical direction into 2 parts, from top to bottom, the up state skin and the down and over and selected state skin, respectively. + * - 3: Three states. The image will be sliced equally in the vertical direction into 3 parts, from top to bottom, the up state skin, the over state skin, and the down and selected state skin, respectively. + * @zh 指定对象的状态值,以数字表示。 + * 默认值为3。此值决定皮肤资源图片的切割方式。 + * 取值: + * - 1:单态。图片不做切割,按钮的皮肤状态只有一种。 + * - 2:两态。图片将以竖直方向被等比切割为2部分,从上向下,依次为弹起状态皮肤、按下和经过及选中状态皮肤。 + * - 3:三态。图片将以竖直方向被等比切割为3部分,从上向下,依次为弹起状态皮肤、经过状态皮肤、按下和选中状态皮肤 + */ + get stateNum(): number; + set stateNum(value: number); + /** + * @en The text content of the button. + * @zh 按钮的文本内容。 + */ + get label(): string; + set label(value: string); + /** + * @en Indicates the selected state of the button. + * If the value is true, it indicates that the object is in the selected state. Otherwise, it is not selected. + * @zh 表示按钮的选中状态。 + * 如果值为true,表示该对象处于选中状态。否则该对象处于未选中状态。 + */ + get selected(): boolean; + set selected(value: boolean); + /** + * @en The text color of the button in each state. + * Format: "upColor,overColor,downColor". + * @zh 表示按钮各个状态下的文本颜色。 + * 格式: "upColor,overColor,downColor"。 + */ + get labelColors(): string; + set labelColors(value: string); + /** + * @en The stroke color of the button in each state. + * Format: "upColor,overColor,downColor". + * @zh 表示按钮各个状态下的描边颜色。 + * 格式: "upColor,overColor,downColor"。 + */ + get strokeColors(): string; + set strokeColors(value: string); + /** + * @en The margins of the button's text label. + * Format: "top,right,bottom,left". + * @zh 表示按钮文本标签的边距。 + * 格式:"上边距,右边距,下边距,左边距"。 + */ + get labelPadding(): string; + set labelPadding(value: string); + /** + * @en The font size of the button's text label. + * @zh 表示按钮文本标签的字体大小。 + */ + get labelSize(): number; + set labelSize(value: number); + /** + * @en The stroke width, in pixels. + * Default value is 0, indicating no stroke. + * @zh 描边宽度(以像素为单位)。 + * 默认值0,表示不描边。 + */ + get labelStroke(): number; + set labelStroke(value: number); + /** + * @en The stroke color, represented by a string. + * The default value is "#000000" (black). + * @zh 描边颜色,以字符串表示。 + * 默认值为 "#000000"(黑色); + * @see laya.display.Text.strokeColor() + */ + get labelStrokeColor(): string; + set labelStrokeColor(value: string); + /** + * @en Indicates whether the button's text label is bold. + * @zh 表示按钮文本标签是否为粗体字。 + */ + get labelBold(): boolean; + set labelBold(value: boolean); + /** + * @en The font name of the button's text label, expressed as a string. + * @zh 表示按钮文本标签的字体名称,以字符串形式表示。 + */ + get labelFont(): string; + set labelFont(value: string); + /** + * @en The text alignment mode. + * @zh 标签水平对齐模式。 + */ + get labelAlign(): string; + set labelAlign(value: string); + /** + * @en The vertical alignment mode. + * @zh 标签垂直对齐模式。 + */ + get labelVAlign(): string; + set labelVAlign(value: string); + /** + * @en The click event handler of the object (without default parameters). + * @zh 对象的点击事件处理器函数(无默认参数)。 + */ + get clickHandler(): Handler; + set clickHandler(value: Handler); + /** + * @en The button's text label `Text` control. + * @zh 按钮文本标签 `Text` 控件。 + */ + get text(): Text; + set text(value: Text); + /** + * @en The size grid of the texture. + * The size grid is a 3x3 division of the texture, allowing it to be scaled without distorting the corners and edges. + * The array contains five values representing the top, right, bottom, and left margins, and whether to repeat the fill (0: no repeat, 1: repeat). + * The values are separated by commas. For example: "6,6,6,6,1". + * @zh 皮肤纹理的九宫格数据。 + * 九宫格是一种将纹理分成3x3格的方式,使得纹理缩放时保持角和边缘不失真。 + * 数组包含五个值,分别代表上边距、右边距、下边距、左边距以及是否重复填充(0:不重复填充,1:重复填充)。 + * 值以逗号分隔。例如:"6,6,6,6,1"。 + */ + get sizeGrid(): string; + set sizeGrid(value: string); + /** + * @en The x and y offset of the icon, format: 100,100 + * @zh 图标x,y偏移,格式:100,100 + */ + get iconOffset(): string; + set iconOffset(value: string); + /** + * @en Creates a new instance of the `Button` class. + * @param skin The address of the skin resource. + * @param label The text content of the button. + * @zh 创建一个新的 `Button` 类实例。 + * @param skin 皮肤资源地址。 + * @param label 按钮的文本内容。 + */ + constructor(skin?: string, label?: string); + protected measureWidth(): number; + protected measureHeight(): number; + /** + * @en Destroy the object and release resources. + * @zh 销毁 + * @param destroyChild 是否删除子节点 + */ + destroy(destroyChild?: boolean): void; + protected createChildren(): void; + protected createText(): void; + protected initialize(): void; + /** + * @en The event listener process function for the object's `Event.MOUSE_OVER`, `Event.MOUSE_OUT`, `Event.MOUSE_DOWN`, `Event.MOUSE_UP`, and `Event.CLICK` events. + * @param e The event object. + * @zh 对象的 `Event.MOUSE_OVER`、`Event.MOUSE_OUT`、`Event.MOUSE_DOWN`、`Event.MOUSE_UP`、`Event.CLICK` 事件侦听处理函数。 + * @param e 事件对象 + */ + protected onMouse(e: Event): void; + /** + * @en The skin resource is loaded. + * @param tex The texture resource. + * @zh 皮肤资源加载完成后的处理。 + * @param tex 纹理资源。 + */ + protected _skinLoaded(tex: any): void; + /** + * @en The resource slices of the object have changed. + * @zh 对象的资源切片发生改变。 + */ + protected changeClips(): void; + /** + * @en Change the state of the object. + * @zh 改变对象的状态。 + */ + protected changeState(): void; + protected _setStateChanged(): void; + /** + * @en Sets the data source. + * @zh 设置数据源。 + */ + set_dataSource(value: any): void; + } + /** + * @en The `CheckBox` component displays a small box that can have a check mark. + * - The `CheckBox` component can also display an optional text label, which is positioned to the right of the CheckBox by default. + * - When assigning a value to `CheckBox` using `dataSource`, the default property is `selected`. + * - `change` event, dispatched when the button's selected state (`selected` property) changes. + * @zh `CheckBox` 组件显示一个小方框,该方框内可以有选中标记。 + * - `CheckBox` 组件还可以显示可选的文本标签,默认该标签位于 CheckBox 右侧。 + * - 使用 `dataSource` 赋值时,`CheckBox` 的默认属性是 `selected`。 + * - `change`事件,当按钮的选中状态( `selected` 属性)发生改变时调度。 + */ + class CheckBox extends Button { + /** + * @en `CheckBox` component constructor. + * @param skin The skin resource address. + * @param label The content of the text label. + * @zh `CheckBox` 组件的构造函数。 + * @param skin 皮肤资源地址。 + * @param label 文本标签的内容。 + */ + constructor(skin?: string, label?: string); + /** + * @en Preinitialization method. Called before the object is initialized. + * @zh 预初始化方法。在对象初始化之前调用。 + */ + protected preinitialize(): void; + /** + * @en Initialization method. Called when the object is initialized. + * @zh 初始化方法。在对象初始化时调用。 + */ + protected initialize(): void; + /** + * @en Sets the data source of the component. + * @param value The data source. + * @zh 设置组件的数据源。 + * @param value 数据源。 + */ + set_dataSource(value: any): void; + } + /** + * @en The `Clip` class is a bitmap slice animation. + * `Clip` can split an image into a slice animation by horizontal split count `clipX`, vertical split count `clipY`, + * or horizontal split width `clipWidth`, vertical split height `clipHeight`, + * from left to right, from top to bottom. + * The Image and Clip components are the only two components that support asynchronous loading, such as clip.skin = "abc/xxx.png". Other UI components do not support asynchronous loading. + * @zh `Clip` 类是位图切片动画。 + * `Clip` 可将一张图片,按横向分割数量 `clipX` 、竖向分割数量 `clipY` , + * 或横向分割每个切片的宽度 `clipWidth` 、竖向分割每个切片的高度 `clipHeight` , + * 从左向右,从上到下,分割组合为一个切片动画。 + * Image和Clip组件是唯一支持异步加载的两个组件,比如clip.skin = "abc/xxx.png",其他UI组件均不支持异步加载。 + */ + class Clip extends UIComponent { + protected _sources: Texture[]; + protected _skin: string; + protected _clipX: number; + protected _clipY: number; + protected _clipWidth: number; + protected _clipHeight: number; + protected _autoPlay: boolean; + protected _interval: number; + protected _complete: Handler; + protected _isPlaying: boolean; + protected _index: number; + protected _clipChanged: boolean; + protected _group: string; + protected _toIndex: number; + /** + * @en The address of the skin resource. + * @zh 皮肤资源地址 + */ + get skin(): string; + set skin(value: string); + /** + * @en Number of slices on the X-axis (horizontal). + * @zh X轴(横向)切片数量。 + */ + get clipX(): number; + set clipX(value: number); + /** + * @en Number of slices on the Y-axis (vertical). + * @zh Y轴(竖向)切片数量。 + */ + get clipY(): number; + set clipY(value: number); + /** + * @en Width of each slice when dividing horizontally. Takes precedence over `clipX` when set together with `clipX`. + * @zh 横向分割时每个切片的宽度,与 `clipX` 同时设置时优先级高于 `clipX` 。 + */ + get clipWidth(): number; + set clipWidth(value: number); + /** + * @en Height of each slice when dividing vertically. Takes precedence over `clipY` when set together with `clipY`. + * @zh 竖向分割时每个切片的高度,与 `clipY` 同时设置时优先级高于 `clipY` 。 + */ + get clipHeight(): number; + set clipHeight(value: number); + /** + * @en Source data. + * @zh 源数据。 + */ + get sources(): Texture[]; + set sources(value: Texture[]); + /** + * @en Resource group. + * @zh 资源分组。 + */ + get group(): string; + set group(value: string); + /** + * @en The size grid of the texture. + * The size grid is a 3x3 division of the texture, allowing it to be scaled without distorting the corners and edges. + * The array contains five values representing the top, right, bottom, and left margins, and whether to repeat the fill (0: no repeat, 1: repeat). + * The values are separated by commas. For example: "6,6,6,6,1". + * @zh 纹理的九宫格数据。 + * 九宫格是一种将纹理分成3x3格的方式,使得纹理缩放时保持角和边缘不失真。 + * 数组包含五个值,分别代表上边距、右边距、下边距、左边距以及是否重复填充(0:不重复填充,1:重复填充)。 + * 值以逗号分隔。例如:"6,6,6,6,1"。 + */ + get sizeGrid(): string; + set sizeGrid(value: string); + /** + * @en Current frame index. + * @zh 当前帧索引。 + */ + get index(): number; + set index(value: number); + /** + * @en Total frames of the slice animation. + * @zh 切片动画的总帧数。 + */ + get total(): number; + /** + * @en Indicates whether the slice animation is automatically played. If true, the slice animation is automatically played; otherwise, it is not. + * It can control the playback and stop of the slice animation. + * @zh 是否自动播放切片动画,若自动播放值为true,否则值为false。 + * 可控制切片动画的播放、停止。 + */ + get autoPlay(): boolean; + set autoPlay(value: boolean); + /** + * @en Indicates the interval (in milliseconds) at which the slice animation is played. + * @zh 切片动画播放间隔时间(以毫秒为单位)。 + */ + get interval(): number; + set interval(value: number); + /** + * @en Indicates the current playback state of the slice animation. + * If the slice animation is playing, the value is true; otherwise, it is false. + * @zh 切片动画的当前播放状态。 + * 如果切片动画正在播放中,则为true,否则为false。 + */ + get isPlaying(): boolean; + set isPlaying(value: boolean); + /** + * @en 'Clip' constructor. + * @param url Resource address. + * @param clipX Number of divisions in the X direction. + * @param clipY Number of divisions in the Y direction. + * @zh `Clip` 构造函数。 + * @param url 资源地址。 + * @param clipX X方向分割数量。 + * @param clipY Y方向分割数量。 + */ + constructor(url?: string, clipX?: number, clipY?: number); + protected _onDisplay(e?: boolean): void; + protected _skinLoaded(): void; + protected _setClipChanged(): void; + protected _loop(): void; + protected createChildren(): void; + /** + * @en Changes the resources and size of the slices. + * @zh 改变切片的资源、切片的大小。 + */ + protected changeClip(): void; + /** + * @en Callback function when the sliced image resources are loaded. + * @param url Resource URL. + * @param img Texture. + * @zh 加载切片图片资源完成函数。 + * @param url 资源地址。 + * @param img 纹理。 + */ + protected loadComplete(url: string, img: Texture): void; + protected measureWidth(): number; + protected measureHeight(): number; + /** + * @en Plays the slice animation. + * @param from Start index. + * @param to End index, -1 is not limited. + * @zh 播放切片动画。 + * @param from 开始索引 + * @param to 结束索引,-1为不限制 + */ + play(from?: number, to?: number): void; + /** + * @en Stops the slice animation. + * @zh 停止切片动画。 + */ + stop(): void; + set_dataSource(value: any): void; + } + /** + * @en The `ColorPicker` component displays a color palette from which the user can select a color. + * @zh `ColorPicker` 组件将显示包含多个颜色样本的列表,用户可以从中选择颜色。 + */ + class ColorPicker extends UIComponent { + /** + * @en Specifies the width and height of each color cell (in pixels). + * @zh 指定每个正方形的颜色小格子的宽高(以像素为单位)。 + */ + protected _gridSize: number; + /** + * @en The background color value of the color palette panel. + * @zh 表示颜色样本列表面板的背景颜色值。 + */ + protected _bgColor: string; + /** + * @en The border color value of the color palette panel. + * @zh 表示颜色样本列表面板的边框颜色值。 + */ + protected _borderColor: string; + /** + * @en Represents the color value selected or input in the color sample list panel. + * @zh 表示颜色样本列表面板选择或输入的颜色值。 + */ + protected _inputColor: string; + /** + * @en The background color value of the color input box. + * @zh 表示颜色输入框的背景颜色值。 + */ + protected _inputBgColor: string; + /** + * @en Represents the color palette panel. + * @zh 表示颜色样本列表面板。 + */ + protected _colorPanel: Box; + /** + * @en Represents the color grid. + * @zh 表示颜色网格。 + */ + protected _colorTiles: Sprite; + /** + * @en Represents the color block display object. + * @zh 表示颜色块显示对象。 + */ + protected _colorBlock: Sprite; + /** + * @en Represents the color input box control `Input`. + * @zh 表示颜色输入框控件 `Input`。 + */ + protected _colorInput: Input; + /** + * @en Represents the button control `Button` that displays the color palette panel when clicked. + * @zh 表示点击后显示颜色样本列表面板的按钮控件 `Button`。 + */ + protected _colorButton: Button; + /** + * @en Represents the list of color values. + * @zh 表示颜色值列表。 + */ + protected _colors: any[]; + /** + * @en Represents the selected color value. + * @zh 表示选择的颜色值。 + */ + protected _selectedColor: string; + protected _panelChanged: boolean; + /** + * @en The function handler executed when the color changes. + * The default return parameter is `color`: the color value string. + * @zh 当颜色发生改变时执行的函数处理器。 + * 默认返回参数color:颜色值字符串。 + */ + changeHandler: Handler; + /** + * @en The selected color value. + * @zh 表示选择的颜色值。 + */ + get selectedColor(): string; + set selectedColor(value: string); + /** + * @en The skin URL of the color picker. + * @zh 颜色选择器的皮肤地址。 + */ + get skin(): string; + set skin(value: string); + /** + * @en The background color value of the color palette panel. + * @zh 表示颜色样本列表面板的背景颜色值。 + */ + get bgColor(): string; + set bgColor(value: string); + /** + * @en The border color value of the color palette panel. + * @zh 表示颜色样本列表面板的边框颜色值。 + */ + get borderColor(): string; + set borderColor(value: string); + /** + * @en The color value selected or entered in the color palette panel. + * @zh 表示颜色样本列表面板选择或输入的颜色值。 + */ + get inputColor(): string; + set inputColor(value: string); + /** + * @en The background color value of the color input box. + * @zh 表示颜色输入框的背景颜色值。 + */ + get inputBgColor(): string; + set inputBgColor(value: string); + constructor(createChildren?: boolean); + protected _setPanelChanged(): void; + protected createChildren(): void; + protected initialize(): void; + private onPanelMouseDown; + /** + * @en Changes the color palette panel. + * @zh 改变颜色样本列表面板。 + */ + protected changePanel(): void; + /** + * @en Handles the `Event.MOUSE_DOWN` event of the color button. + * @param e The event object. + * @zh 颜色样本列表面板显示按钮的 `Event.MOUSE_DOWN` 事件侦听处理函数。 + * @param e 事件对象。 + */ + private onColorButtonClick; + /** + * @en Handles the `Event.MOUSE_DOWN` event of the stage to close the color palette panel. + * @param e (Optional) The event object. + * @zh 处理舞台的 `Event.MOUSE_DOWN` 事件侦听处理函数,关闭颜色面板。 + * @param e (可选) 事件对象。 + */ + private removeColorBox; + /** + * @en Handles the `Event.KEY_DOWN` event of the color input field. + * @param e The event object. + * @zh 处理颜色输入框的 `Event.KEY_DOWN` 事件侦听处理函数。 + * @param e 事件对象。 + */ + private onColorFieldKeyDown; + /** + * @en Handles the `Event.CHANGE` event of the color input field. + * @param e (Optional) The event object. + * @zh 处理颜色输入框的 `Event.CHANGE` 事件侦听处理函数。 + * @param e (可选) 事件对象。 + */ + private onColorInputChange; + /** + * @en Handles the `Event.CLICK` event of the color tiles. + * @param e The event object. + * @zh 处理颜色格子的 `Event.CLICK` 事件侦听处理函数。 + * @param e 事件对象。 + */ + private onColorTilesClick; + /** + * @en Handles the `Event.MOUSE_MOVE` event of the color tiles. + * @param e The event object. + * @zh 处理颜色格子的 `Event.MOUSE_MOVE` 事件侦听处理函数。 + * @param e 事件对象。 + */ + private onColorTilesMouseMove; + /** + * @en Gets the color value of the corresponding color block based on the mouse position. + * @zh 通过鼠标位置取对应的颜色块的颜色值。 + */ + protected getColorByMouse(): string; + /** + * @en Draws the color block. + * @param color The color value to draw. + * @zh 绘制颜色块。 + * @param color 要绘制的颜色值。 + */ + private drawBlock; + /** + * @en Changes the color. + * @zh 改变颜色。 + */ + private changeColor; + /** + * @en Opens the color palette panel. + * @zh 打开颜色样本列表面板。 + */ + open(): void; + /** + * @en Closes the color palette panel. + * @zh 关闭颜色样本列表面板。 + */ + close(): void; + /** + * @en Destroys the color picker component. + * @param destroyChild Indicates whether to destroy the component's children as well. Default value is true. + * @zh 销毁颜色选择器组件。 + * @param destroyChild 是否同时销毁子项。默认为 true。 + */ + destroy(destroyChild?: boolean): void; + } + /** + * @en The `ComboBox` component contains a drop-down list from which the user can select a single value. + * - `change` event: Dispatched when the user changes the selected content in `ComboBox` component. + * @zh `ComboBox` 组件包含一个下拉列表,用户可以从该列表中选择单个值。 + * - `change`事件:当用户更改 `ComboBox` 组件中的选定内容时调度。 + */ + class ComboBox extends UIComponent { + protected _visibleNum: number; + protected _button: Button; + protected _list: List; + protected _isOpen: boolean; + protected _itemColors: string[]; + protected _itemPadding: number[]; + protected _itemSize: number; + protected _labels: string[]; + /** + * 下拉提示文本 + */ + protected _defaultLabel: string; + protected _selectedIndex: number; + protected _selectHandler: Handler; + protected _itemHeight: number; + protected _listHeight: number; + protected _listChanged: boolean; + protected _itemChanged: boolean; + protected _scrollBarSkin: string; + protected _scrollType: ScrollType; + protected _isCustomList: boolean; + /** + * @en Rendering item, used to display a dropdown list to display objects + * @zh 渲染项,用来显示下拉列表展示对象 + */ + itemRender: any; + /** + * @en The skin resource address of the object. Supports single state, two states and three states, set with the `stateNum` property. + * @zh 对象的皮肤纹理资源地址。 支持单态,两态和三态,用 `stateNum` 属性设置 + */ + get skin(): string; + set skin(value: string); + /** + * @en The padding of the drop-down list text. + * - The format is: top, right, bottom, left + * @zh 下拉列表文本的边距。 + * - 格式:上边距,右边距,下边距,左边距 + */ + get itemPadding(): string; + set itemPadding(value: string); + /** + * @en The string of label collection. + * @zh 标签集合字符串。 + */ + get labels(): string; + set labels(value: string); + /** + * @en Indicates the index of the selected drop-down list item. + * @zh 表示选择的下拉列表项的索引。 + */ + get selectedIndex(): number; + set selectedIndex(value: number); + /** + * @en The default drop-down prompt text. + * @zh 默认的下拉提示文本。 + */ + get defaultLabel(): string; + set defaultLabel(value: string); + /** + * @en The handler to be executed when changing the selection of the drop-down list (default returns parameter index:int). + * @zh 改变下拉列表的选择项时执行的处理器(默认返回参数index:int)。 + */ + get selectHandler(): Handler; + set selectHandler(value: Handler); + /** + * @en Indicates the label of the selected drop-down list item. + * @zh 表示选择的下拉列表项的的标签。 + */ + get selectedLabel(): string; + set selectedLabel(value: string); + /** + * @en Gets or sets the maximum number of rows that can be displayed in the drop-down list without a scrollbar. + * @zh 获取或设置没有滚动条的下拉列表中可显示的最大行数。 + */ + get visibleNum(): number; + set visibleNum(value: number); + /** + * @en The height of the drop-down list item. + * @zh 下拉列表项的高度。 + */ + get itemHeight(): number; + set itemHeight(value: number); + /** + * @en The color of drop-down list items. + * The format is: "background color when hovering or selected, label color when hovering or selected, label color, border color, background color" + * @zh 下拉列表项颜色。 + * 格式:悬停或被选中时背景颜色,悬停或被选中时标签颜色,标签颜色,边框颜色,背景颜色"。 + */ + get itemColors(): string; + set itemColors(value: string); + /** + * @en The font size of the drop-down list item label. + * @zh 下拉列表项标签的字体大小。 + */ + get itemSize(): number; + set itemSize(value: number); + /** + * @en Indicates the open state of the drop-down list. + * @zh 表示下拉列表的打开状态。 + */ + get isOpen(): boolean; + set isOpen(value: boolean); + /** + * @en The scroll type. + * @zh 滚动类型。 + */ + get scrollType(): ScrollType; + set scrollType(value: ScrollType); + /** + * @en The scrollbar skin. + * @zh 滚动条皮肤。 + */ + get scrollBarSkin(): string; + set scrollBarSkin(value: string); + /** + * @en The size grid of the texture. + * The size grid is a 3x3 division of the texture, allowing it to be scaled without distorting the corners and edges. + * The array contains five values representing the top, right, bottom, and left margins, and whether to repeat the fill (0: no repeat, 1: repeat). + * The values are separated by commas. For example: "6,6,6,6,1". + * @zh 纹理的九宫格数据。 + * 九宫格是一种将纹理分成3x3格的方式,使得纹理缩放时保持角和边缘不失真。 + * 数组包含五个值,分别代表上边距、右边距、下边距、左边距以及是否重复填充(0:不重复填充,1:重复填充)。 + * 值以逗号分隔。例如:"6,6,6,6,1"。 + */ + get sizeGrid(): string; + set sizeGrid(value: string); + /** + * @en a reference to the `VScrollBar` scrollbar component contained in the `ComboBox` component. + * @zh `ComboBox` 组件所包含的 `VScrollBar` 滚动条组件的引用。 + */ + get scrollBar(): VScrollBar; + /** + * @en a reference to the `Button` component contained in the `ComboBox` component. + * @zh `ComboBox` 组件所包含的 `Button` 组件的引用。 + */ + get button(): Button; + /** + * @en a reference to the `List` list component contained in the `ComboBox` component. + * @zh `ComboBox` 组件所包含的 `List` 列表组件的引用。 + */ + get list(): List; + set list(value: List); + /** + * @en the text label color of the `Button` component contained in the `ComboBox` component. + * The format is: upColor,overColor,downColor + * @zh `ComboBox` 组件所包含的 `Button` 组件的文本标签颜色。 + * 格式:upColor,overColor,downColor + */ + get labelColors(): string; + set labelColors(value: string); + /** + * @en the text margin of the `Button` component contained in the `ComboBox` component. + * The format is: top, right, bottom, left + * @zh `ComboBox` 组件所包含的 `Button` 组件的文本边距。 + * 格式:上边距,右边距,下边距,左边距 + */ + get labelPadding(): string; + set labelPadding(value: string); + /** + * @en the label font size of the `Button` component contained in the `ComboBox` component. + * @zh `ComboBox` 组件所包含的 `Button` 组件的标签字体大小。 + */ + get labelSize(): number; + set labelSize(value: number); + /** + * @en Indicates whether the button text label is bold. + * @zh 表示按钮文本标签是否为粗体字。 + */ + get labelBold(): boolean; + set labelBold(value: boolean); + /** + * @en Indicates the font name of the button text label, expressed as a string. + * @zh 表示按钮文本标签的字体名称,以字符串形式表示。 + */ + get labelFont(): string; + set labelFont(value: string); + /** + * @en Indicates the state value of the button. + * @zh 表示按钮的状态值。 + */ + get stateNum(): number; + set stateNum(value: number); + /** + * @en `ComboBox` constructor. + * @param skin The skin resource address. + * @param labels The string of the label collection in the drop-down list. Separated by commas, such as "item0,item1,item2,item3,item4,item5". + * @zh `ComboBox` UI组件的构造函数。 + * @param skin 皮肤资源地址。 + * @param labels 下拉列表的标签集字符串。以逗号做分割,如"item0,item1,item2,item3,item4,item5"。 + */ + constructor(skin?: string, labels?: string); + protected createChildren(): void; + private _createList; + private _setListEvent; + private _onStageMouseWheel; + /** + * @en Close the drop-down list of ComboBox. + * @zh 关闭下拉列表。 + */ + protected removeList(e: Event): void; + private onListDown; + private onScrollBarDown; + private onButtonMouseDown; + protected measureWidth(): number; + protected measureHeight(): number; + protected changeList(): void; + /** + * @en Handles mouse events on a list item. This method manages the visual state of the list item based on mouse interaction, such as hover and click. + * @param e The mouse event. + * @param index The index of the list item. + * @zh 处理列表项的鼠标事件。该方法根据鼠标交互(如悬停和点击)管理列表项的视觉状态。 + * @param e 鼠标事件。 + * @param index 列表项的索引。 + */ + protected onlistItemMouse(e: Event, index: number): void; + private switchTo; + /** + * @en Changing the open state of the drop-down list. + * @zh 更改下拉列表的打开状态。 + */ + protected changeOpen(): void; + /** + * @en Updates the items in the list and adjusts its visual representation. This method recalculates the list height, updates the background if it's not a custom list, and populates the list with new data. + * @zh 更新列表中的项目并调整其视觉表现。此方法重新计算列表高度,如果不是自定义列表,则更新背景,并使用新数据填充列表。 + */ + protected changeItem(): void; + private changeSelected; + /** + * @en Destroy the component and release the memory occupied by the component. Destroy the child objects of the component at the same time by default. + * @param destroyChild Whether to simultaneously destroy the child objects of the component. The default value is true. + * @zh 销毁组件并释放组件所占用的内存。默认会同时销毁组件的子对象。 + * @param destroyChild 是否同时销毁组件的子对象。默认值为true。 + */ + destroy(destroyChild?: boolean): void; + /** + * @en Set the data source of the ComboBox. + * @param value The new data source. + * @zh 设置下拉选项框的数据源。 + * @param value 新的数据源。 + */ + set_dataSource(value: any): void; + } + /** + * @en The `Dialog` component is a pop-up dialog box that implements the functionality of popping up, dragging, and modal windows. + * You can set the background transparency of the pop-up box through the `UIConfig`, and whether to close the window when clicking the edge in modal mode. + * By setting the `zOrder` property, you can change the popup hierarchy. + * By setting the `popupEffect` and `closeEffect`, you can set the popup and close effects. If you don't want any popup or close effects, you can set the aforementioned properties to empty. + * @zh `Dialog` 组件是一个弹出对话框,实现对话框弹出,拖动,模式窗口功能。 + * 可以通过 `UIConfig` 设置弹出框背景透明度,模式窗口点击边缘是否关闭等。 + * 通过设置 `zOrder` 属性,可以更改弹出的层次。 + * 通过设置 `popupEffect` 和 `closeEffect` 可以设置弹出效果和关闭效果,如果不想有任何弹出关闭效果,可以设置前述属性为空。 + */ + class Dialog extends View { + /** + * @en If a button in the dialog is named `close`, clicking it will close the dialog. + * @zh 对话框内的某个按钮命名为 `close`,点击此按钮则会关闭对话框。 + */ + static CLOSE: string; + /** + * @en If a button in the dialog is named `cancel`, clicking it will close the dialog. + * @zh 对话框内的某个按钮命名为 `cancel`,点击此按钮则会关闭对话框。 + */ + static CANCEL: string; + /** + * @en If a button in the dialog is named `sure`, clicking it will close the dialog. + * @zh 对话框内的某个按钮命名为 `sure`,点击此按钮则会关闭对话框。 + */ + static SURE: string; + /** + * @en If a button in the dialog is named `no`, clicking it will close the dialog. + * @zh 对话框内的某个按钮命名为 `no`,点击此按钮则会关闭对话框。 + */ + static NO: string; + /** + * @en If a button in the dialog is named `yes`, clicking it will close the dialog. + * @zh 对话框内的某个按钮命名为 `yes`,点击此按钮则会关闭对话框。 + */ + static YES: string; + /** + * @en If a button in the dialog is named `ok`, clicking it will close the dialog. + * @zh 对话框内的某个按钮命名为 `ok`,点击此按钮则会关闭对话框。 + */ + static OK: string; + /** 表示对话框管理器。*/ + private static _manager; + /** + * @en + * The dialog management container. All dialogs are inside this container and managed by the manager. + * You can customize your own manager to change the window management process. + * Any dialog opened or closed will trigger the `open` and `close` events of the management class. + * @zh + * 对话框管理容器,所有的对话框都在该容器内,并且受管理器管理,可以自定义自己的管理器,来更改窗口管理的流程。 + * 任意对话框打开和关闭,都会触发管理类的 `open` 和 `close` 事件。 + */ + static get manager(): DialogManager; + static set manager(value: DialogManager); + /** + * @en Set the lock view. Display the lock view before the interface is ready, and remove the lock layer after it is ready. + * If it is empty, nothing will be displayed. + * @param view The content of the lock view. + * @zh 设置锁定界面,在界面未准备好前显示锁定界面,准备完毕后则移除锁定层,如果为空则什么都不显示 + * @param view 锁定界面内容 + */ + static setLockView(view: UIComponent): void; + /** + * @en Lock all layers, display loading information, and prevent the content below from being clicked. + * @param value Whether to lock. + * @zh 锁定所有层,显示加载条信息,防止下面内容被点击。 + * @param value 是否锁定 + */ + static lock(value: boolean): void; + /** + * @en Close all dialogs. + * @zh 关闭所有对话框。 + */ + static closeAll(): void; + /** + * @en Get the dialog collection by group. + * @param group The group name. + * @returns The dialog array. + * @zh 根据组获取对话框集合。 + * @param group 组名称 + * @returns 对话框数组 + */ + static getDialogsByGroup(group: string): any[]; + /** + * @en Close all pop-up boxes by group. + * @param group The group name that needs to be closed. + * @returns The closed dialogs. + * @zh 根据组关闭所有弹出框。 + * @param group 需要关闭的组名称 + * @returns 关闭的对话框集合 + */ + static closeByGroup(group: string): any[]; + private _dragArea; + /** + * @en The handler function that will be triggered when the dialog is closed. + * The callback function parameter is the button name clicked by the user, of type `String`. + * @zh 对话框被关闭时会触发的回调函数处理器。 + * 回调函数参数为用户点击的按钮名字name:String。 + */ + closeHandler: Handler; + /** + * @en The popup effect of the dialog. You can set an effect to replace the default popup effect. + * If you don't want any effect, you can set it to `null`. + * The default global popup effect can be set via `manager.popupEffect`. + * @zh 弹出对话框效果,可以设置一个效果代替默认的弹出效果,如果不想有任何效果,可以赋值为null。 + * 全局默认弹出效果可以通过manager.popupEffect修改。 + */ + popupEffect: Handler; + /** + * @en The close effect of the dialog. You can set an effect to replace the default close effect. + * If you don't want any effect, you can set it to `null`. + * The default global close effect can be set via `manager.closeEffect`. + * @zh 关闭对话框效果,可以设置一个效果代替默认的关闭效果,如果不想有任何效果,可以赋值为null。 + * 全局默认关闭效果可以通过manager.closeEffect修改。 + */ + closeEffect: Handler; + /** + * @en The dialog group name. + * @zh 组名称。 + */ + group: string; + /** + * @en Indicates whether it is a modal dialog. + * @zh 是否是模式窗口。 + */ + isModal: boolean; + /** + * @en Indicates whether to show popup effect. + * @zh 是否显示弹出效果。 + */ + isShowEffect: boolean; + /** + * @en Specifies whether the dialog is popped up at the center. + * If the value is `true`, the dialog will be centered. Otherwise, it will be displayed based on the object coordinates. The default value is `true`. + * @zh 指定对话框是否居中弹出。 + * 如果值为true,则居中弹出,否则,则根据对象坐标显示,默认为true。 + */ + isPopupCenter: boolean; + /** + * @en The close type. Automatically records the name of the clicked button when its name is `"close"`, `"cancel"`, `"sure"`, `"no"`, `"yes"`, or `"no"`. + * @zh 关闭类型,点击name为`"close"`,`"cancel"`,`"sure"`,`"no"`,`"yes"`,`"no"`的按钮时,会自动记录点击按钮的名称。 + */ + closeType: string; + /** + * @en Used to specify the drag area of the dialog. The default value is `"0,0,0,0"`. + * The format is a string of `"x,y,width,height"` that represents a rectangle. For example, `"0,0,100,200"`. + * @zh 用来指定对话框的拖拽区域。默认值为 `"0,0,0,0"`。 + * 格式:构成一个矩形所需的 x,y,width,heith 值,用逗号连接为字符串。例如:"0,0,100,200"。 + */ + get dragArea(): string; + set dragArea(value: string); + /** + * @en The display status of the pop-up box. If the pop-up box is being displayed, it is `true`; otherwise, it is `false`. + * @zh 弹出框的显示状态。如果弹框处于显示中,则为 `true`,否则为 `false`。 + */ + get isPopup(): boolean; + /** + * @en The z-order of the dialog. + * @zh 对话框的层级。 + */ + get zOrder(): number; + set zOrder(value: number); + /** @ignore */ + constructor(); + /** 提取拖拽区域*/ + protected _dealDragArea(): void; + private _onMouseDown; + /** + * @en Handle the click event for the dialog box. Close the dialog box based on the button name. + * @zh 处理对话框的点击事件。根据按钮的名称关闭对话框。 + * @param e 鼠标事件。 + */ + protected _onClick(e: Event): void; + /** + * @en Open the dialog. + * @param closeOther Whether to close other dialogs. If the value is `true`, other dialogs will be closed. The default value is `true`. + * @param param The parameters to pass to the dialog. + * @zh 打开对话框。 + * @param closeOther 是否关闭其它的对话框。若值为true则关闭其它对话框。 + * @param param 传递给对话框的参数。 + */ + open(closeOther?: boolean, param?: any): void; + /** + * @en Close the dialog. + * @param type The reason for closing. It will be passed to the `onClosed` function. + * @zh 关闭对话框。 + * @param type 关闭的原因,会传递给onClosed函数 + * @override + */ + close(type?: string): void; + /** + * @en Destroy the dialog. + * @param destroyChild Whether to destroy the child objects as well. + * @zh 销毁对话框。 + * @param destroyChild 是否销毁子对象。 + */ + destroy(destroyChild?: boolean): void; + /** + * @en Display the dialog (non-modal). + * @param closeOther Whether to close other dialogs. If the value is `true`, other dialogs will be closed. + * @param showEffect Whether to show pop-up effect. + * @zh 显示对话框(以非模式窗口方式显示)。 + * @param closeOther 是否关闭其它的对话框。若值为true则关闭其它对话框。 + * @param showEffect 是否显示弹出效果 + */ + show(closeOther?: boolean, showEffect?: boolean): void; + /** + * @en Display the dialog (modal). + * @param closeOther Whether to close other dialogs. If the value is `true`, other dialogs will be closed. + * @param showEffect Whether to show pop-up effect. + * @zh 显示对话框(以模式窗口方式显示)。 + * @param closeOther 是否关闭其它的对话框。若值为true则关闭其它对话框。 + * @param showEffect 是否显示弹出效果 + */ + popup(closeOther?: boolean, showEffect?: boolean): void; + protected _open(modal: boolean, closeOther: boolean, showEffect: boolean): void; + } + /** + * @en The `DialogManager` is a container for managing all dialog boxes, which are managed by the manager. + * Opening and closing any dialog will trigger the manager's open and close events. + * open event is used for any window after dispatching, and close event is used to dispatch events when closing any dialog. + * The background transparency of the popup, whether the modal window closes when the edge is clicked, and whether the layer changes when the window is clicked can be set in UIConfig. + * The layer of the popup can be changed by setting the dialog's zOrder property. + * @zh DialogManager 对话框管理容器,所有的对话框都在该容器内,并且受管理器管理。 + * 任意对话框打开和关闭,都会触发管理类的 open 和 close 事件。 + * open事件用于任意窗口后调度,close事件用于关闭任意对话框时调度的事件。 + * 可以通过 UIConfig 设置弹出框背景透明度,模式窗口点击边缘是否关闭,点击窗口是否切换层次等。 + * 通过设置对话框的 zOrder 属性,可以更改弹出的层次。 + */ + class DialogManager extends Sprite { + /** + * @en Mask layer + * @zh 遮罩层。 + */ + maskLayer: Sprite; + /** + * @en Lock screen layer. + * @zh 锁屏层。 + */ + lockLayer: Sprite; + /** + * @en The global default popup effect for dialogs. You can set an effect to replace the default popup effect. + * If you do not want any effect, you can assign it to null. + * @zh 全局默认弹出对话框效果,可以设置一个效果代替默认的弹出效果,如果不想有任何效果,可以赋值为 null。 + */ + popupEffect: (dialog: Dialog) => void; + /** + * @en The global default close effect for dialogs. You can set an effect to replace the default close effect. + * If you do not want any effect, you can assign it to null. + * @zh 全局默认关闭对话框效果,可以设置一个效果代替默认的关闭效果,如果不想有任何效果,可以赋值为 null。 + */ + closeEffect: (dialog: Dialog) => void; + /** + * @en Sets the global default opening effect for the dialog. You can specify an effect to replace the default opening effect. + * If you do not want any effect, it can be set to null. + * @zh 设置全局默认的对话框打开效果。可以指定一个效果来替代默认的打开效果,如果不想有任何效果,可以设置为 null。 + */ + popupEffectHandler: Handler; + /** + * @en Sets the global default closing effect for the dialog. You can specify an effect to replace the default closing effect. + * If you do not want any effect, it can be set to null. + * @zh 设置全局默认的对话框关闭效果。可以指定一个效果来替代默认的关闭效果,如果不想有任何效果,可以设置为 null。 + */ + closeEffectHandler: Handler; + /** @ignore */ + constructor(); + private _closeOnSide; + private _onResize; + private _centerDialog; + private _clearDialogEffect; + private _closeAll; + /** + * @en Sets the lock view. If no value is provided, the lock layer will be empty and won't display anything. + * @param value The UIComponent to display on the lock layer, or null for an empty lock layer. + * @zh 设置锁定界面,如果参数为空则什么都不显示。 + * @param value 要在锁定层上显示的UI组件,空锁定层为null。 + */ + setLockView(value: UIComponent): void; + /** + * @en Opens a dialog. + * @param dialog The Dialog instance to be displayed. + * @param closeOther Whether to close other dialogs. If true, other dialogs will be closed. + * @param showEffect Whether to show the popup effect. + * @zh 打开对话框。 + * @param dialog 需要显示的对话框 Dialog 实例。 + * @param closeOther 是否关闭其他对话框。若为 true,则关闭其他对话框。 + * @param showEffect 是否显示弹出效果。 + */ + open(dialog: Dialog, closeOther?: boolean, showEffect?: boolean): void; + /** + * @en Executes the opening of a dialog. + * @param dialog The Dialog instance that needs to be opened. + * @zh 执行打开对话框操作。 + * @param dialog 需要打开的对话框 Dialog 实例。 + */ + doOpen(dialog: Dialog): void; + /** + * @en Locks all layers, displays loading information, and prevents double-clicking. + * @param value If true, the lock layer is shown, otherwise it is hidden. + * @zh 锁定所有层,显示加载信息,防止双击。 + * @param value 如果为true,则显示锁定层,否则隐藏锁定层。 + */ + lock(value: boolean): void; + /** + * @en Closes the dialog. + * @param dialog The Dialog instance that needs to be closed. + * @zh 关闭对话框。 + * @param dialog 需要关闭的对话框 Dialog 实例。 + */ + close(dialog: Dialog): void; + /** + * @en Executes the closing of a dialog. + * @param dialog The Dialog instance that needs to be closed. + * @zh 执行关闭对话框操作。 + * @param dialog 需要关闭的对话框 Dialog 实例。 + */ + doClose(dialog: Dialog): void; + /** + * @en Closes all dialogs. + * @zh 关闭所有对话框。 + */ + closeAll(): void; + /** + * @en Gets all dialogs by group name. + * @param group The name of the group. + * @returns An array of dialogs that belong to the specified group. + * @zh 根据组名获取所有对话框。 + * @param group 组名。 + * @returns 属于指定组的对话框数组。 + */ + getDialogsByGroup(group: string): any[]; + /** + * @en Closes all popups by group name. + * @param group The name of the group to close. + * @returns An array of dialogs that have been closed. + * @zh 根据组名关闭所有弹出框。 + * @param group 需要关闭的组名。 + * @returns 已关闭的对话框数组。 + */ + closeByGroup(group: string): any[]; + } + /** + * @en Font clipping for simplified bitmap fonts, which can be used by setting a slice image and text content, similar to bitmap fonts. + * Usage: Set the skin for the bitmap font and the corresponding font content sheet (if multiple lines are needed, use spaces for line breaks). + * @zh 字体切片,简化版的位图字体,只需设置一个切片图片和文字内容即可使用,效果同位图字体 + * 使用方式:设置位图字体皮肤skin,设置皮肤对应的字体内容sheet(如果多行,可以使用空格换行) + * 示例: + * fontClip.skin = "font1.png";//设置皮肤 + * fontClip.sheet = "abc123 456";//设置皮肤对应的内容,空格换行。此皮肤为2行5列(显示时skin会被等分为2行5列),第一行对应的文字为"abc123",第二行为"456" + * fontClip.value = "a1326";//显示"a1326"文字 + */ + class FontClip extends Clip { + /** + * @en Internal use. The array of values. + * @zh 内部使用,数值数组。 + */ + protected _valueArr: string; + /** + * @en Internal use. The array of text content. + * @zh 内部使用,文字内容数组。 + */ + protected _indexMap: Record; + /** + * @en Internal use. The content of the font clip. + * @zh 内部使用,字体切片内容。 + */ + protected _sheet: string; + /** + * @en Internal use. The direction. + * @zh 内部使用,方向。 + */ + protected _direction: string; + /** + * @en Internal use. The gap on the X-axis. + * @zh 内部使用,X轴方向间隙。 + */ + protected _spaceX: number; + /** + * @en Internal use. The gap on the Y-axis. + * @zh 内部使用,Y轴方向间隙。 + */ + protected _spaceY: number; + /** + * @en Internal use. The horizontal alignment method. + * @zh 内部使用,水平对齐方式。 + */ + private _align; + /** + * @en Internal use. The width of the displayed text. + * @zh 内部使用,显示文字的宽度。 + */ + private _wordsW; + /** + * @en Internal use. The height of the displayed text. + * @zh 内部使用,显示文字的高度。 + */ + private _wordsH; + /** + * @en Font clip index. + * @zh 字体切片索引。 + */ + get index(): number; + set index(value: number); + /** + * @en The content of the font clip, with spaces representing line breaks. + * @zh 字体切片的内容,空格表示换行符。 + */ + get sheet(): string; + set sheet(value: string); + /** + * @en Gets the display content of the font clip. + * @zh 字体切片的显示内容。 + */ + get value(): string; + set value(value: string); + /** + * @en Layout direction of the font clip characters. + * The default value is "horizontal". + * values: + * "horizontal": Indicates a horizontal layout. + * "vertical": Indicates a vertical layout. + * @zh 字体切片字符的布局方向。 + * 默认值为 "horizontal"。 + * 取值: + * "horizontal": 表示水平布局。 + * "vertical": 表示垂直布局。 + */ + get direction(): string; + set direction(value: string); + /** + * @en The X-axis spacing between characters in the font clip. + * @zh 字体切片中字符的X轴方向间隙。 + */ + get spaceX(): number; + set spaceX(value: number); + /** + * @en The Y-axis spacing between characters in the font clip. + * @zh 字体切片中字符的Y轴方向间隙。 + */ + get spaceY(): number; + set spaceY(value: number); + /** + * @en Horizontal alignment + * @zh 水平对齐方式。 + */ + get align(): string; + set align(v: string); + /** + * @en Creates an instance of the FontClip. + * @param skin The skin path for the font clip. + * @param sheet The content string for the font clip, with spaces representing line breaks. + * @zh 创建 FontClip 实例。 + * @param skin 字体切片的皮肤路径。 + * @param sheet 字体切片的内容字符串,空格代表换行。 + */ + constructor(skin?: string, sheet?: string); + /** + * @override + * @en Destroys the FontClip instance and optionally its children. + * @param destroyChild Whether to destroy the children of the FontClip. + * @zh 销毁字体切片实例及其子项(如果指定)。 + * @param destroyChild 是否销毁字体切片的子节点。 + */ + destroy(destroyChild?: boolean): void; + } + /** + * @en The `HBox` class is a horizontal layout container. + * @zh `HBox` 是一个水平布局容器类。 + */ + class HBox extends LayoutBox { + /** + * @en No alignment. + * @zh 无对齐。 + */ + static NONE: string; + /** + * @en Align to the top. + * @zh 居顶部对齐。 + */ + static TOP: string; + /** + * @en Align to the center. + * @zh 居中对齐。 + */ + static MIDDLE: string; + /** + * @en Align to the bottom. + * @zh 居底部对齐。 + */ + static BOTTOM: string; + protected sortItem(items: any[]): void; + protected changeItems(): void; + } + /** + * @en Use the `HScrollBar` (horizontal `ScrollBar`) control to control the displayed data portion when there is too much data to display completely in the display area. + * @zh 使用 `HScrollBar`(水平 `ScrollBar`)控件,可以在因数据太多而不能在显示区域完全显示时控制显示的数据部分。 + */ + class HScrollBar extends ScrollBar { + protected initialize(): void; + } + /** + * @en The HSlider control allows the user to select a value by moving a slider between the end points of the slider track. + * The HSlider control is displayed horizontally. The slider track stretches from left to right, and the labels are displayed at the top or bottom of the track. + * @zh 使用 HSlider 控件,用户可以通过在滑块轨道的终点之间移动滑块来选择值。 + * HSlider 控件采用水平方向。滑块轨道从左向右扩展,而标签位于轨道的顶部或底部。 + */ + class HSlider extends Slider { + /** + * @en Creates an instance of HSlider, and sets the direction to horizontal. + * @param skin The skin of the HSlider. + * @zh 创建Slider实例,设置滑动方向为水平, + * @param skin 皮肤纹理。 + */ + constructor(skin?: string); + } + /** + * @en The Image class represents a bitmap image or drawing graphics display object. + * Image and Clip are the only two components that support asynchronous loading. For example, `img.skin = "abc/xxx.png"`, other UI components do not support asynchronous loading. + * Event.LOADED: When the resource is loaded. + * @zh Image类是用于表示位图图像或绘制图形的显示对象。 + * Image和Clip组件是唯一支持异步加载的两个组件,比如`img.skin = "abc/xxx.png"`,其他UI组件均不支持异步加载。 + * Event.LOADED:资源加载完成后调度。 + */ + class Image extends UIComponent { + protected _skin: string; + protected _group: string; + protected _useSourceSize: boolean; + /** + * @en The skin address of the object, represented as a string. + * If the resource is not loaded, it will be loaded first and then applied to this object after loading is complete. + * Note: After the resource is loaded, it will be automatically cached in the resource library. + * @zh 图片对象的皮肤纹理资源地址,以字符串表示。 + * 如果资源未加载,则先自动加载资源,加载完成后应用于此对象。 + * 注意:资源加载完成后,会自动缓存至资源库中。 + */ + get skin(): string; + set skin(value: string); + /** + * @en The size grid of the texture. + * The size grid is a 3x3 division of the texture, allowing it to be scaled without distorting the corners and edges. + * The array contains five values representing the top, right, bottom, and left margins, and whether to repeat the fill (0: no repeat, 1: repeat). + * The values are separated by commas. For example: "6,6,6,6,1". + * @zh 纹理的九宫格数据。 + * 九宫格是一种将纹理分成3x3格的方式,使得纹理缩放时保持角和边缘不失真。 + * 数组包含五个值,分别代表上边距、右边距、下边距、左边距以及是否重复填充(0:不重复填充,1:重复填充)。 + * 值以逗号分隔。例如:"6,6,6,6,1"。 + */ + get sizeGrid(): string; + set sizeGrid(value: string); + /** + * @en The texture of the object. + * Note, this is not the image URL, but the image texture. It is recommended to use the skin property to avoid directly using the texture when the image resource has not finished loading. + * @zh 图片对象的纹理。 + * 注意,这里不是图片的地址,而是图片的纹理。建议使用skin属性,避免图片资源未加载完成时,直接使用texture。 + */ + get source(): Texture; + set source(value: Texture); + /** + * @en The color of the Image. + * @zh 图片的纹理颜色。 + */ + get color(): string; + set color(value: string); + /** + * @en The resource group. + * @zh 资源分组。 + */ + get group(): string; + set group(value: string); + /** + * @en Whether to use the original size of the resource. + * @zh 是否使用资源的原始大小。 + */ + get useSourceSize(): boolean; + set useSourceSize(value: boolean); + /** + * @en consruct method. + * @param skin The skin resource address. + * @zh 构造方法 + * @param skin 皮肤资源地址。 + */ + constructor(skin?: string | null); + protected measureWidth(): number; + protected measureHeight(): number; + protected createChildren(): void; + /** + * @en Set the data source of the object. + * @param value The data source. + * @zh 设置对象的数据源。 + * @param value 数据源。 + */ + set_dataSource(value: any): void; + /** + * @en Destroy the object and release the loaded skin resources. + * @zh 销毁对象并释放加载的皮肤资源。 + */ + dispose(): void; + } + /** + * @en The ISelect interface, which should be implemented by objects that have a selected property and a clickHandler for selection callback function processing. + * @zh ISelect 接口,实现对象的 selected属性和clickHandler 选择回调函数处理器。 + */ + interface ISelect extends UIComponent { + /** + * @en A boolean value indicating whether the object is selected. + * @zh 是否被选择。 + */ + selected: boolean; + /** + * @en The click event callback function processing handler of the object. + * @zh 对象的点击事件回调函数处理器。 + */ + clickHandler: Handler; + } + type LabelFitContent = "no" | "yes" | "height"; + /** + * @en The Label class is used to create display objects to display text + * `change` event is dispatched when the text content changes. + * @zh Label 类用于创建显示对象以显示文本。 + * `change`事件用于文本内容发生改变后调度。 + */ + class Label extends UIComponent { + /** + * @en Text instance. + * @zh 文本 Text 实例。 + */ + protected _tf: Text; + protected _fitContent: LabelFitContent; + private _fitFlag; + /** + * @en Current text content string. + * @zh 当前文本内容字符串。 + */ + get text(): string; + set text(value: string); + /** + * @en Whether the text automatically wraps when it reaches the maximum width. + * @zh 文本是否在达到最大宽度时自动换行。 + * 值为 true,则该文本字段自动换行;值为 false,则该文本字段不自动换行。 + */ + get wordWrap(): boolean; + set wordWrap(value: boolean); + /** + * @en Color of the text. + * @zh 文本颜色。 + */ + get color(): string; + set color(value: string); + /** + * @en Font of the text. + * @zh 文本字体。 + */ + get font(): string; + set font(value: string); + /** + * @en Horizontal alignment of the text within the label. + * @zh 文本的水平对齐方式。 + */ + get align(): string; + set align(value: string); + /** + * @en Vertical alignment of the text within the label. + * @zh 文本的垂直对齐方式。 + */ + get valign(): string; + set valign(value: string); + /** + * @en The alignment of images and text when mixed. The optional values are top, middle, and bottom. + * @zh 图文混排时图片和文字的对齐方式。可选值是top,middle,bottom。 + */ + get alignItems(): string; + set alignItems(value: string); + /** + * @en Whether the text is bold. + * @zh 文本是否加粗。 + */ + get bold(): boolean; + set bold(value: boolean); + /** + * @en Whether the text is italic. + * @zh 文本是否斜体。 + */ + get italic(): boolean; + set italic(value: boolean); + /** + * @en Space between lines of text. + * @zh 文本行之间的间距(以像素为单位) + */ + get leading(): number; + set leading(value: number); + /** + * @en Font size of the text. + * @zh 文本的字号大小。 + */ + get fontSize(): number; + set fontSize(value: number); + /** + * @en The margins of the text label. + * Format: "top,right,bottom,left". + * @zh 文本标签的边距。 + * 格式:"上边距,右边距,下边距,左边距"(以像素为单位)。 + */ + get padding(): string; + set padding(value: string); + /** + * @en Background color of the label. + * @zh 文本标签的背景颜色。 + */ + get bgColor(): string; + set bgColor(value: string); + /** + * @en Border color of the label. + * @zh 文本标签的边框颜色。 + */ + get borderColor(): string; + set borderColor(value: string); + /** + * @en Stroke width of the text stroke. + * @zh 文本描边的宽度(以像素为单位),默认值为0,表示不描边。 + */ + get stroke(): number; + set stroke(value: number); + /** + * @en Color of the text stroke. + * @zh 文本描边的颜色。 + */ + get strokeColor(): string; + set strokeColor(value: string); + /** + * @en Supporting html syntax. + * @zh 是否富文本,支持html语法 + */ + get html(): boolean; + set html(value: boolean); + /** + * @en Whether to use UBB syntax to parse text. + * @zh 是否使用UBB语法解析文本。 + */ + get ubb(): boolean; + set ubb(value: boolean); + /** + * @en The maximum width of the text box. If the text content exceeds this width, it will wrap automatically. Set to 0 to disable this limit. + * @zh 文本最大宽度,当文本达到最大宽度时,会自动换行,设置为0则此限制不生效。 + */ + get maxWidth(): number; + set maxWidth(value: number); + /** + * @en Sets whether the text content adapts to the container size. + * Possible values: "yes" (both text width and height adapt), "height" (only text height adapts), "no" (does not adapt). + * If a boolean value is provided, true corresponds to "yes" and false corresponds to "no". + * @zh 设置文本内容是否自适应容器大小 + * 可选值:"yes"(文本宽度和高度自适应)、"height"(仅文本高度自适应)、"no"(不自适应) + * 如果传入布尔值,则 true 对应 "yes",false 对应 "no" + */ + get fitContent(): LabelFitContent; + set fitContent(value: LabelFitContent); + /** + * @en An instance of the basic text object. + * @zh 基础文本对象(Text)的实例。 + */ + get textField(): Text; + /** + * @en The overflow property of the text, determining how overflow text is handled. + * Possible values: visible, hidden, scroll, shrink, ellipsis. + * visible: The text is not constrained by the text width and height, and all text is visible. + * hidden: Text beyond the width and height is cut off, providing the best performance. + * scroll: The part of the text that exceeds the width and height is hidden, and can be scrolled to view. + * shrink: The text automatically adjusts its size to fit within the width and height, always fully visible. + * ellipsis: When the text exceeds the width and height, the last few characters are replaced with an ellipsis, indicating that there is more content. + * @zh 文本的溢出属性,决定超出文本如何被处理。 + * 值为: 可见 visible、隐藏 hidden、滚动 scroll、自动收缩 shrink、显示省略号 ellipsis。 + * 作用: + * 可见,表示文本不受文本宽高约束全部可见; + * 隐藏,超过文本宽高就会被裁切掉,性能最好; + * 滚动,表示超出宽高的部分被隐藏,可以通过划动控制显示在宽高内区域; + * 自动收缩,表示文本会跟随宽高的大小而自动调整文本的大小,始终全部显示在文本宽高内; + * 显示省略号,表示当文本超出宽高后,未尾的几位字符会替换为省略号,表示当前文本还有未显示的内容。 + */ + get overflow(): string; + set overflow(value: string); + /** + * @en Text decoration style of the text, specifically whether it is underlined. + * @zh 文本是否显示下划线。 + */ + get underline(): boolean; + set underline(value: boolean); + /** + * @en Color of the text underline. + * @zh 文本下划线的颜色。 + */ + get underlineColor(): string; + set underlineColor(value: string); + /** + * @en Text decoration style of the text, specifically whether it is underlined. + * @zh 文本是否显示下划线。 + */ + get strikethrough(): boolean; + set strikethrough(value: boolean); + /** + * @en Color of the text underline. + * @zh 文本下划线的颜色。 + */ + get strikethroughColor(): string; + set strikethroughColor(value: string); + /** + * @en Whether the text ignores language localization. + * @zh 文本是否忽略语言本地化。 + */ + get ignoreLang(): boolean; + set ignoreLang(value: boolean); + /** + * @en Text template variables. + * When set to true, templateVars is set to an empty object; + * When set to false, templateVars is set to null; + * When set to a value of type Record, templateVars is set to the provided value. + * @zh 文本模板变量对象 + * 为 true 时,将 templateVars 设置为空对象; + * 为 false 时,将 templateVars 设置为 null; + * 为 Record 类型时,将 templateVars 设置为传入值(value); + */ + get templateVars(): Record; + set templateVars(value: Record | boolean); + /** + * @en Sets a template variable in the text field, used for dynamic text replacement. + * @param name The key name of the template variable to set. + * @param value The value corresponding to the key name of the template variable. + * @return This label instance. + * @zh 设置模板变量对象对应的键名与值,用于动态文本替换。 + * @param name 要设置的模板变量对象的键名。 + * @param value 模板变量对象键名对应的值。 + * @return 当前标签实例。 + */ + setVar(name: string, value: any): Label; + /** @ignore */ + constructor(text?: string); + protected _onPostLayout(): void; + protected createChildren(): void; + protected measureWidth(): number; + protected measureHeight(): number; + get_width(): number; + /** + * @en Sets the width of the label. + * @param value The new width value. + * @zh 设置文本标签的宽度。 + * @param value 新的宽度值。 + */ + set_width(value: number): void; + get_height(): number; + /** + * @en Sets the height of the label. + * @param value The new height value. + * @zh 设置文本标签的高度。 + * @param value 新的高度值。 + */ + set_height(value: number): void; + set_dataSource(value: any): void; + } + /** + * @en LayoutBox is a layout container class. + * @zh LayoutBox 是一个布局容器类。 + */ + class LayoutBox extends Box { + protected _space: number; + protected _align: string; + protected _itemChanged: boolean; + /** + * @en The space between child objects. + * @zh 子对象的间隔。 + */ + get space(): number; + set space(value: number); + /** + * @en The alignment of child objects. + * @zh 子对象对齐方式。 + */ + get align(): string; + set align(value: string); + protected _setItemChanged(): void; + /** + * @en Change the layout of child objects. + * @zh 改变子对象的布局。 + */ + protected changeItems(): void; + /** + * @en Sort the item list. Default sorting rules can be changed by overriding. + * @param items The item list. + * @zh 排序项目列表。可通过重写改变默认排序规则。 + * @param items 项目列表。 + */ + protected sortItem(items: any[]): void; + private onResize; + /** + * @en Adds a child object. + * @param child The child object to add. + * @returns The added child object. + * @zh 添加子节点对象。 + * @param child 要添加的子节点对象。 + * @returns 添加的子节点对象。 + */ + addChild(child: T): T; + /** + * @en Adds a child object at a specified index position. + * @param child The child object to add. + * @param index The index position to add the child object. + * @returns The added child object. + * @zh 在指定的索引位置添加子节点对象。 + * @param child 要添加的子节点对象。 + * @param index 用于添加子节点对象的索引位置。 + * @returns 添加的子节点对象。 + */ + addChildAt(child: Node, index: number): Node; + /** + * @en Removes a child object at a specified index position. + * @param index The index position of the child object. + * @returns The removed child object. + * @zh 删除指定索引位置的子节点对象。 + * @param index 子节点对象的索引位置。 + * @returns 删除的子节点对象。 + */ + removeChildAt(index: number): Node; + /** + * @en Refresh + * @zh 刷新 + */ + refresh(): void; + } + /** + * @en The List control can display a list of items. The default is a vertical list. The list can be customized through the UI editor. + * - Event.RENDER: When rendering the unit item object of a list, it is dispatched. + * - change event: When the selectedIndex property of an object changes, it is dispatched. + * @zh List 控件可显示项目列表。默认为垂直方向列表。可通过UI编辑器自定义列表。 + * - Event.RENDER事件: 渲染列表的单元项对象时调度。 + * - change事件: 当对象的 selectedIndex 属性发生变化时调度。 + */ + class List extends Box { + /** + * @en The processor executed when changing the selection of a List. (Default return parameters: Item index(index:int)) + * @zh 改变 List 的选择项时执行的处理器。(默认返回参数: 项索引(index:int))。 + */ + selectHandler: Handler | null; + /** + * @en Cell rendering processor(Default return parameters cell:UIComponent,index:int) + * @zh 单元格渲染处理器(默认返回参数cell:UIComponent,index:int)。 + */ + renderHandler: Handler | null; + /** + * @en Cell Mouse Event Processor(Default return parameters e:Event,index:int) + * @zh 单元格鼠标事件处理器(默认返回参数e:Event,index:int)。 + */ + mouseHandler: Handler | null; + /** + * @en Specify whether it is selectable. If the value is true, you can choose; Otherwise, you cannot choose. + * @zh 指定是否可以选择。若值为 true,则可以选择;否则不可以选择。 + * @default false + */ + selectEnable: boolean; + /** + * @en The maximum number of pages for pagination. + * @zh 最大分页数。 + */ + totalPage: number; + /** + * @en Disable scrollbar stop. + * @zh 禁用滚动条停止。 + */ + disableStopScroll: boolean; + protected _content: Box; + protected _scrollBar: ScrollBar | null; + protected _itemRender: any; + protected _repeatX: number; + protected _repeatY: number; + protected _repeatX2: number; + protected _repeatY2: number; + protected _spaceX: number; + protected _spaceY: number; + protected _cells: UIComponent[]; + protected _array: any[] | null; + protected _startIndex: number; + protected _selectedIndex: number; + protected _page: number; + protected _isVertical: boolean; + protected _cellSize: number; + protected _cellOffset: number; + protected _isMoved: boolean; + protected _createdLine: number; + protected _cellChanged: boolean; + protected _offset: Point; + protected _usedCache: string | null; + protected _elasticEnabled: boolean; + protected _scrollType: ScrollType; + protected _vScrollBarSkin: string; + protected _hScrollBarSkin: string; + private _preLen; + /** + * @en Determines whether the content is cached for performance optimization. + * Setting this property to true can greatly improve performance if the data source is small and there are no animations within the list. + * @zh 是否缓存内容。如果数据源较少,并且列表内无动画,设置此属性为 true 能大大提高性能。 + */ + cacheContent: boolean; + /** + * @en The current page number of the list. + * @zh 列表的当前页码。 + */ + get page(): number; + set page(value: number); + /** + * @en The total number of items in the list. + * @zh 列表的数据总个数。 + */ + get length(): number; + /** + * @en The collection of cells in the list. + * @zh 单元格集合。 + */ + get cells(): UIComponent[]; + /** + * @en If the elastic effect is enabled. + * @zh 是否开启橡皮筋效果。 + */ + get elasticEnabled(): boolean; + set elasticEnabled(value: boolean); + /** + * @en The caching mode for the list. + * @zh 列表的缓存模式。 + */ + set cacheAs(value: string); + /** + * @en The caching mode of the list. + * @zh 列表的缓存模式。 + */ + get cacheAs(): string; + /** + * @en Reference to the content container Box component of the List component. + * @zh List 组件所包含的内容容器 Box 组件的引用。 + */ + get content(): Box; + /** + * @en Scrollbar type. Options include: + - ScrollType.None (0): No scrollbar + - ScrollType.Horizontal (1): Horizontal scrollbar. + - Others: such as ScrollType.Vertical (2) indicates a vertical scrollbar + * @zh 滚动条类型。可选值包括: + * - ScrollType.None(0):无滚动条 + * - ScrollType.Horizontal(1):水平方向滚动条。 + * - 其它:如 ScrollType.Vertical(2) 表示垂直方向滚动条 + */ + get scrollType(): ScrollType; + set scrollType(value: ScrollType); + /** + * @en The skin of the vertical scroll bar. + * @zh 垂直方向滚动条皮肤。 + */ + get vScrollBarSkin(): string; + set vScrollBarSkin(value: string); + /** + * @en The skin of the horizontal scroll bar. + * @zh 水平方向滚动条皮肤。 + */ + get hScrollBarSkin(): string; + set hScrollBarSkin(value: string); + /** + * @en The reference to the ScrollBar component contained within the List component. + * @zh List 组件所包含的 ScrollBar 组件的引用。 + */ + get scrollBar(): ScrollBar | null; + set scrollBar(value: ScrollBar | null); + /** + * @en The cell renderer for the List component. + * value: The value can be a cell class object or a UI JSON description. + * @zh 单元格渲染器。 + * 取值:单元格类对象 或 UI的JSON描述。 + */ + get itemRender(): any; + set itemRender(value: any); + /** + * @en The number of cells displayed horizontally. + * @zh 水平方向显示的单元格数量。 + */ + get repeatX(): number; + set repeatX(value: number); + /** + * @en The number of cells displayed vertically. + * @zh 垂直方向显示的单元格数量。 + */ + get repeatY(): number; + set repeatY(value: number); + /** + * @en The horizontal spacing between cells in pixels. + * @zh 水平方向显示的单元格之间的间距(以像素为单位)。 + */ + get spaceX(): number; + set spaceX(value: number); + /** + * @en The vertical spacing between cells in pixels. + * @zh 垂直方向显示的单元格之间的间距(以像素为单位)。 + */ + get spaceY(): number; + set spaceY(value: number); + /** + * @en Represents the index of the currently selected item. Changing the selectedIndex value will cause the list to re-render. + * @zh 表示当前选择的项索引。selectedIndex值更改会引起列表重新渲染。 + */ + get selectedIndex(): number; + set selectedIndex(value: number); + /** + * @en List data source + * @zh 列表数据源。 + */ + get array(): any[]; + set array(value: any[]); + /** + * @en The data source of the currently selected cell. + * @zh 当前选中的单元格数据源。 + */ + get selectedItem(): any; + set selectedItem(value: any); + /** + * @en The currently selected cell object. + * @zh 当前选择的单元格对象。 + */ + get selection(): UIComponent; + set selection(value: UIComponent); + /** + * @en The start index of the currently displayed list of cells. + * @zh 当前显示的单元格列表的开始索引。 + */ + get startIndex(): number; + set startIndex(value: number); + protected createChildren(): void; + private _getOneCell; + private _createItems; + private _bindData; + protected _sizeChanged(): void; + protected _setCellChanged(): void; + private onScrollStart; + private onScrollEnd; + protected createItem(): UIComponent; + /** + * @en Adds a cell to the list. + * @param cell The cell object to be added. + * @zh 添加单元格。 + * @param cell 需要添加的单元格对象。 + */ + protected addCell(cell: UIComponent): void; + /** + * @en Handles mouse events for cells. + * @param e The event object. + * @zh 单元格的鼠标事件侦听处理函数。 + * @param e 事件对象。 + */ + protected onCellMouse(e: Event): void; + /** + * @en Changes the visual state of a cell. + * @param cell The cell object. + * @param visible Indicates whether the cell should be visible. + * @param index The cell's property index value. + * @zh 改变单元格的可视状态。 + * @param cell 单元格对象 + * @param visible 是否显示。 + * @param index 单元格的属性 index 值。 + */ + protected changeCellState(cell: UIComponent, visible: boolean, index: number): void; + /** + * @en Event handler for the scrollbar's Event.CHANGE event. + * @zh 滚动条的 Event.CHANGE 事件侦听处理函数。 + */ + protected onScrollBarChange(e?: Event | null): void; + private posCell; + /** + * @en Changes the selection state of the cells. + * @zh 改变单元格的选择状态。 + */ + protected changeSelectStatus(): void; + /** + * @en Renders the list of cells. + * @param from The start index to begin rendering from. + * @param to The end index to stop rendering. If not provided, it renders to the end of the list. + * @zh 渲染单元格列表。 + * @param from 渲染开始的索引。 + * @param to 停止渲染的结束索引。如果没有提供,它将渲染到列表末尾。 + */ + protected renderItems(from?: number, to?: number): void; + /** + * @en Renders a single cell. + * @param cell The cell object that needs to be rendered. + * @param index The index of the cell. + * @zh 渲染一个单元格。 + * @param cell 需要渲染的单元格对象。 + * @param index 单元格索引。 + */ + protected renderItem(cell: UIComponent, index: number): void; + protected commitMeasure(): void; + /** + * @en Updates the data source without refreshing the entire list, only increasing the scroll length. + * @param array The data source to update. + * @zh 更新数据源,不刷新list,只增加滚动长度。 + * @param array 数据源。 + */ + updateArray(array: any[]): void; + /** + * @en Called after deserialization to perform additional setup. + * @zh 反序列化后调用以执行额外的设置。 + */ + onAfterDeserialize(): void; + /** + * @en Initializes cell information. + * @zh 初始化单元格信息。 + */ + initItems(): void; + /** + * @en Sets the size of the viewable area. + * The viewable area is defined by a rectangle with the top-left corner at (0,0) and the specified width and height. + * @param width The width of the viewable area. + * @param height The height of the viewable area. + * @zh 设置可视区域大小。 + * 以(0,0,width参数,height参数)组成的矩形区域为可视区域。 + * @param width 可视区域宽度。 + * @param height 可视区域高度。 + */ + setContentSize(width: number, height: number): void; + /** + * @en Sets the data source for the component, overriding the base class's method to handle different data types. + * @param value The new data source. + * @zh 设置数据源,覆盖基类方法以处理不同类型的数据。 + * @param value 新的数据源。 + */ + set_dataSource(value: any): void; + /** + * @en Refreshes the list data source. + * @zh 刷新列表数据源。 + */ + refresh(): void; + /** + * @en Get the cell data source. + * @param index The index of the cell. + * @zh 获取单元格数据源。 + * @param index 单元格索引。 + */ + getItem(index: number): any; + /** + * @en Changes the data source of a cell at a specified index. + * @param index The index of the cell. + * @param source The data source for the cell. + * @zh 修改单元格数据源。 + * @param index 单元格索引。 + * @param source 单元格数据源。 + */ + changeItem(index: number, source: any): void; + /** + * @en Sets the data source for a cell at a specified index. + * @param index The cell index. + * @param source The data source for the cell. + * @zh 设置单元格数据源。 + * @param index 单元格索引。 + * @param source 单元格数据源。 + */ + setItem(index: number, source: any): void; + /** + * @en Adds a new data source to the cell list. + * @param source The data source to add. + * @zh 添加单元格数据源。 + * @param source 数据源。 + */ + addItem(source: any): void; + /** + * @en Adds a new data source to the cell list at a specified index. + * @param source The data source to add. + * @param index The index at which to insert the data source. + * @zh 添加单元格数据源到对应的数据索引处。 + * @param source 单元格数据源。 + * @param index 索引。 + */ + addItemAt(source: any, index: number): void; + /** + * @en Deletes a data source from the cell list by its index. + * @param index The index of the data source to delete. + * @zh 通过数据源索引删除单元格数据源。 + * @param index 需要删除的数据源索引值。 + */ + deleteItem(index: number): void; + /** + * @en Gets the cell object by its visible index. + * @param index The visible index of the cell. + * @return The cell object. + * @zh 通过可视单元格索引,获取单元格。 + * @param index 可视单元格索引。 + * @return 单元格对象。 + */ + getCell(index: number): UIComponent | null; + /** + * @en Scrolls the list so that the cell corresponding to the specified data index becomes the first visible item in the list. + * @param index The index of the cell in the data list. + * @zh 滚动列表,以设定的数据索引对应的单元格为当前可视列表的第一项。 + * @param index 单元格在数据列表中的索引。 + */ + scrollTo(index: number): void; + /** + * @en Scrolls the list with tweening to make the cell corresponding to the specified data index the first visible item in the list. + * @param index The index of the cell in the data list. + * @param time The duration of the tweening effect in milliseconds. + * @param complete An optional callback function to call when the tweening completes. + * @zh 缓动滚动列表,以设定的数据索引对应的单元格为当前可视列表的第一项。 + * @param index 单元格在数据列表中的索引。 + * @param time 缓动时间。 + * @param complete 缓动结束回调. + */ + tweenTo(index: number, time?: number, complete?: Handler | null): void; + /** + * @en Destroys the instance and its child elements. + * @param destroyChild Specifies whether to destroy child elements. + * @zh 销毁实例及其子元素。 + * @param destroyChild 指定是否销毁子元素。 + */ + destroy(destroyChild?: boolean): void; + } + /** + * @en OpenDataContext component for displaying OpenData in WeChat mini-games. Instantiate this component directly to optimally display OpenData based on the component's width, height, and position. + * @zh 微信小游戏开放数据域显示组件,直接实例化本组件,即可根据组件宽高和位置,以最优的方式显示开放数据域数据。 + */ + class OpenDataContextView extends UIComponent { + private _fps; + /** @ignore */ + constructor(); + /** + * @en The frame rate. + * @zh 帧率。 + */ + get fps(): number; + set fps(value: number); + /** + * @ignore + */ + _onActive(): void; + /** + * @ignore + */ + _onInActive(): void; + private _onLoop; + /** + * @ignore + */ + _setWidth(value: number): void; + /** + * @ignore + */ + _setHeight(value: number): void; + /** + * @en The x-coordinate of the component. + * @zh 组件的 x 坐标。 + */ + get x(): number; + set x(value: number); + /** + * @en The y-coordinate of the component. + * @zh 组件的 y 坐标。 + */ + get y(): number; + set y(value: number); + private updateViewPort; + /** + * @en Send a message to the OpenData context. + * @param msg Message to send. + * @zh 向开放数据域发送消息。 + * @param msg 要发送的消息。 + */ + postMsg(msg: any): void; + } + /** + * @en Panel is a panel container class. + * @zh Panel 是一个面板容器类。 + */ + class Panel extends Box { + protected _content: Box; + protected _vScrollBar: VScrollBar; + protected _hScrollBar: HScrollBar; + protected _scrollChanged: boolean; + protected _usedCache: string; + protected _elasticEnabled: boolean; + protected _scrollType: ScrollType; + protected _vScrollBarSkin: string; + protected _hScrollBarSkin: string; + /** + * @en Creates an instance of Panel, and sets the width and height of it. + * @zh 创建一个`Panel`实例,属性 `width` 和 `height` 的默认值均为 100。 + */ + constructor(); + /** + * @en Destroy this object. + * @param destroyChild Whether to destroy the child objects as well. + * @zh 销毁此对象。 + * @param destroyChild 是否同时销毁子对象。 + */ + destroy(destroyChild?: boolean): void; + /** + * @en Destroy all child objects. + * @zh 销毁所有的子对象。 + */ + destroyChildren(): void; + protected createChildren(): void; + /** + * @en Add a child object. + * @param child The child object to add. + * @returns The added child object. + * @zh 添加一个节点子对象。 + * @param child 要添加的子节点对象。 + * @returns 添加的子节点对象。 + */ + addChild(child: T): T; + /** + * @en Event handler for the child object's Event.RESIZE event. + * @zh 子对象的 Event.RESIZE 事件侦听处理函数。 + */ + private onResize; + /** + * @en Add a child object at a specific index position. + * @param child The child object to add. + * @param index The index position to place the child at. + * @returns The child object that was added. + * @zh 在指定的索引位置添加一个子节点对象。 + * @param child 要添加的子节点对象。 + * @param index 子节点对象的索引位置。 + * @returns 添加的子节点对象。 + */ + addChildAt(child: Node, index: number): Node; + /** + * @en Remove a child object. + * @param child The child object to remove. + * @returns The removed child object. + * @zh 移除一个子节点对象。 + * @param child 要移除的子节点对象。 + * @returns 移除的子节点对象。 + */ + removeChild(child: Node): Node; + /** + * @en Remove a child object at a specific index position. + * @param index The index position of the child object. + * @returns The removed child object. + * @zh 移除指定索引位置的子节点对象。 + * @param index 子节点对象的索引位置。 + * @returns 移除的子节点对象。 + */ + removeChildAt(index: number): Node; + /** + * @en Remove a range of children from the object. + * @param beginIndex The beginning position. + * @param endIndex The ending position. The default value is 0x7fffffff. + * @returns The Panel object itself. + * @zh 移除指定范围的子节点对象。 + * @param beginIndex 开始位置。 + * @param endIndex 结束位置。默认值为 0x7fffffff。 + * @returns 返回对象本身。 + */ + removeChildren(beginIndex?: number, endIndex?: number): Node; + /** + * @en Returns the child object at a specific index position. + * @param index The index position of the child object. + * @returns The child object at the specified index position. + * @zh 返回指定索引位置的子节点对象。 + * @param index 子节点对象的索引位置。 + * @returns 指定索引位置处的子节点对象。 + */ + getChildAt(index: number): Node; + /** + * @en Returns a child object with a specific name. + * @param name The name of the child object. + * @returns The child object with the specified name. + * @zh 返回具有指定名称的子节点对象。 + * @param name 子节点对象的名称。 + * @returns 具有指定名称的子节点对象。 + */ + getChildByName(name: string): Node; + /** + * @en Returns the index position of a specific child object. + * @param child The child object. + * @returns The index position of the child object. + * @zh 返回指定子节点对象的索引位置。 + * @param child 子节点对象。 + * @returns 子节点对象的索引位置。 + */ + getChildIndex(child: Node): number; + /** + * @en The number of child objects. + * @zh 子节点对象数量。 + */ + get numChildren(): number; + private changeScroll; + protected _sizeChanged(): void; + /** + * @en Get the width of the content area in pixels. + * @zh 获取内容区域宽度(以像素为单位)。 + */ + get contentWidth(): number; + /** + * @en Get the height of the content area in pixels. + * @zh 获取内容区域高度(以像素为单位)。 + */ + get contentHeight(): number; + /** + * @en Sets the width and height of the content (in pixels). + * @param width The width. + * @param height The height. + * @zh 设置内容的宽度、高度(以像素为单位)。 + * @param width 宽度。 + * @param height 高度。 + */ + private setContentSize; + /**@ignore */ + _setWidth(value: number): void; + /**@ignore */ + _setHeight(value: number): void; + /** + * @en Scroll bar type. The range of values is 0-3. + * ScrollType.None(0): Does not display any scrollbars + * ScrollType.Horizontal(1):Displays only the horizontal scrollbar + * ScrollType.Vertical(2): Displays only the vertical scrollbar + * ScrollType.Both(3): Displays both horizontal and vertical scrollbars + * @zh 滚动条类型。取值范围0-3。 + * ScrollType.None(0): 不显示任何滚动条 + * ScrollType.Horizontal(1): 仅显示水平滚动条 + * ScrollType.Vertical(2): 仅显示垂直滚动条 + * ScrollType.Both(3): 同时显示水平和垂直滚动条 + */ + get scrollType(): ScrollType; + set scrollType(value: ScrollType); + private createHScrollBar; + private createVScrollBar; + /** + * @en The skin of the vertical scrollbar. + * @zh 垂直方向滚动条皮肤。 + */ + get vScrollBarSkin(): string; + set vScrollBarSkin(value: string); + /** + * @en The skin of the horizontal scrollbar. + * @zh 水平方向滚动条皮肤。 + */ + get hScrollBarSkin(): string; + set hScrollBarSkin(value: string); + /** + * @en The vertical scrollbar object. + * @zh 垂直方向滚动条对象。 + */ + get vScrollBar(): ScrollBar; + /** + * @en The horizontal scrollbar object. + * @zh 水平方向滚动条对象。 + */ + get hScrollBar(): ScrollBar; + /** + * @en Get the content container object. + * @zh 获取内容容器对象。 + */ + get content(): Sprite; + /** + * @en Event.MOUSE_DOWN event handler for the scrollbar. + * @param scrollBar The scrollbar object. + * @zh 滚动条的 Event.MOUSE_DOWN 事件侦听处理函数。 + * @param scrollBar 滚动条对象。 + */ + protected onScrollBarChange(scrollBar: ScrollBar): void; + /** + * @en Scroll the content container to the specified position of the vertical and horizontal scrollbars. + * @param x The value of the `value` property of the horizontal scrollbar. + * @param y The value of the `value` property of the vertical scrollbar. + * @zh 滚动内容容器至设定的垂直、水平方向滚动条位置。 + * @param x 水平方向滚动条属性value值。滚动条位置数字。 + * @param y 垂直方向滚动条属性value值。滚动条位置数字。 + */ + scrollTo(x?: number, y?: number): void; + /** + * @en Refresh the scroll content. + * @zh 刷新滚动内容。 + */ + refresh(): void; + get cacheAs(): string; + set cacheAs(value: string); + /** + * @en Whether to enable the elastic effect. + * @zh 是否开启橡皮筋效果。 + */ + get elasticEnabled(): boolean; + set elasticEnabled(value: boolean); + private onScrollStart; + private onScrollEnd; + protected _setScrollChanged(): void; + } + /** + * @en The `ProgressBar` component displays the loading progress of content. + * change event is dispatched when the value changes. + * @zh `ProgressBar` 组件用于显示内容的加载进度。 + * change事件用于值发生改变后调度。 + */ + class ProgressBar extends UIComponent { + protected _bg: Image; + protected _bar: Image; + protected _skin: string; + protected _value: number; + /** + * @en The handler function that is called when the value of the `ProgressBar` instance's `value` property changes.The progress value. Default to return the `value` property. + * @zh 当 `ProgressBar` 实例的 `value` 属性发生变化时的函数处理器。默认返回参数 `value` 属性(进度值)。 + */ + changeHandler: Handler; + /** + * @en The skin of the progress bar. + * @zh 进度条的皮肤资源路径。 + */ + get skin(): string; + set skin(value: string); + /** + * @en The current progress value, range from 0 to 1. + * @zh 当前的进度量,取值范围为 0 到 1 之间。 + */ + get value(): number; + set value(num: number); + /** + * @en The progress bar object. + * @zh 进度条对象。 + */ + get bar(): Image; + /** + * @en The background bar object. + * @zh 进度背景条对象。 + */ + get bg(): Image; + /** + * @en The size grid of the texture. + * The size grid is a 3x3 division of the texture, allowing it to be scaled without distorting the corners and edges. + * The array contains five values representing the top, right, bottom, and left margins, and whether to repeat the fill (0: no repeat, 1: repeat). + * The values are separated by commas. For example: "6,6,6,6,1". + * @zh 纹理的九宫格数据。 + * 九宫格是一种将纹理分成3x3格的方式,使得纹理缩放时保持角和边缘不失真。 + * 数组包含五个值,分别代表上边距、右边距、下边距、左边距以及是否重复填充(0:不重复填充,1:重复填充)。 + * 值以逗号分隔。例如:"6,6,6,6,1"。 + */ + get sizeGrid(): string; + set sizeGrid(value: string); + /** + * @ignore + * @en creates an instance of ProgressBar. + * @param skin The skin URL. + * @zh 创建一个 ProgresBar 的实例。 + * @param skin 皮肤地址。 + */ + constructor(skin?: string); + protected createChildren(): void; + protected _skinLoaded(): void; + protected measureWidth(): number; + protected measureHeight(): number; + /** + * @en Changes the progress value. + * @zh 更改进度值的显示。 + */ + protected changeValue(): void; + /** + * @en Sets the width of the component. + * @param value The width value to set. + * @zh 设置组件的宽度。 + * @param value 要设置的宽度值。 + */ + set_width(value: number): void; + /** + * @en Sets the data source for the component. + * @param value The data source to set. If it's a number or string, it will be converted to a number and set as the component's value. + * @zh 设置组件的数据源。 + * @param value 要设置的数据源。如果是数字或字符串,将被转换为数字并设置为组件的值。 + */ + set_dataSource(value: any): void; + /** + * @en Destroys the component and its child elements. + * @param destroyChild Whether to destroy child elements. Default is true. + * @zh 销毁组件及其子元素。 + * @param destroyChild 是否销毁子元素。默认为 true。 + */ + destroy(destroyChild?: boolean): void; + } + /** + * @en The Radio control allows users to select one option from a mutually exclusive set of choices. + * Choosing an unselected member of a Radio group will unselect the currently selected `Radio` control within that group. + * @zh Radio 控件使用户可在一组互相排斥的选择中做出一种选择。 + * 用户一次只能选择 Radio 组中的一个成员。选择未选中的组成员将取消选择该组中当前所选的 Radio 控件。 + */ + class Radio extends Button { + protected _value: any; + /** + * @en The optional user-defined value associated with the Radio. + * @zh Radio 关联的可选用户定义值。 + */ + get value(): any; + set value(obj: any); + /** + * @en creates an instance of Radio. + * @param skin The path of the skin to be used for the Radio. + * @param label The text label to be displayed next to the Radio. + * @zh 创建一个 Radio 实例。 + * @param skin Radio 的皮肤路径。 + * @param label 显示在 Radio 旁边的文本标签。 + */ + constructor(skin?: string, label?: string); + /** + * @en Preinitializes the Radio component by setting properties before initialization. + * @zh 在初始化前对 Radio 组件进行预初始化,设置相关属性。 + */ + protected preinitialize(): void; + /** + * @en Initializes the Radio component, creating text and setting text properties. + * @zh 初始化 Radio 组件,创建文本并设置文本属性。 + */ + protected initialize(): void; + /** + * @en The click event handler for the Radio object. + * @param e The event object. + * @zh 对象的Event.CLICK事件侦听处理函数。 + * @param e 事件对象。 + */ + protected onClick(e: Event): void; + protected changeClips(): void; + } + /** + * @en The RadioGroup control defines a group of mutually exclusive Radio controls, such that only one Radio control can be selected at a time by the user. + * `change` event is dispatched when the selectedIndex property of a Group instance changes. + * @zh RadioGroup 控件定义一组 Radio 控件,这些控件相互排斥;因此,用户每次只能选择一个 Radio 控件。 + * `change`事件用于当Group的selectedIndex属性发生变化时调度。 + */ + class RadioGroup extends UIGroup { + protected createItem(skin: string, label: string): Sprite; + } + /** + * @en The `ScaleBox` is a container that automatically scales its content to fit the stage size while maintaining the original aspect ratio. + * @zh `ScaleBox` 是一个自适应缩放容器,容器设置大小后,容器大小始终保持舞台大小,子内容按照原始最小宽高比缩放。 + */ + class ScaleBox extends Box { + private _oldW; + private _oldH; + private onResize; + /** + * @ignore + * @en Called when the container is enabled. Adds a resize event listener to the stage. + * @zh 容器启用时调用。为舞台添加调整大小事件监听器。 + */ + onEnable(): void; + /** + * @ignore + * @en Called when the container is disabled. Removes the resize event listener from the stage. + * @zh 容器禁用时调用。从舞台移除调整大小事件监听器。 + */ + onDisable(): void; + /** + * @en Sets the width of the container and updates the original width. + * @param value The new width value. + * @zh 设置容器的宽度并更新原始宽度。 + * @param value 新的宽度值。 + */ + set_width(value: number): void; + /** + * @en Sets the height of the container and updates the original height. + * @param value The new height value. + * @zh 设置容器的高度并更新原始高度。 + * @param value 新的高度值。 + */ + set_height(value: number): void; + } + /** + * @en The `ScrollBar` component is a scrollbar component. + * When there is too much data to fit in the display area, the end user can use the `ScrollBar` component to control the portion of data being displayed. + * A scrollbar consists of four parts: two arrow buttons, a track, and a thumb (slider). + * - `start` event dispatched when the scrollbar starts to slide. + * - `end` event dispatched when the scrollbar stops sliding. + * - `change` event dispatched when the scrollbar thumb position changes. + * @zh ScrollBar 组件是一个滚动条组件。 + * 当数据太多以至于显示区域无法容纳时,最终用户可以使用 ScrollBar 组件控制所显示的数据部分。 + * 滚动条由四部分组成:两个箭头按钮、一个轨道和一个滑块。 + * - `start` 事件在滚动条开始滑动时调度。 + * - `end` 事件在滚动条滑动结束时调度。 + * - `change` 事件在滚动条滑块位置发生变化时调度。 + */ + class ScrollBar extends UIComponent { + /** + * @en Sets the global easing function for scrolling speed changes. + * @zh 设置全局的滚动速度变化曲线函数 + */ + static easeFunction: typeof Ease.sineOut; + /** + * @en The ratio of scroll decay. + * @zh 滚动衰减系数 + */ + rollRatio: number; + /** + * @en Callback when scrolling changes, return value parameter. + * @zh 滚动变化时回调,回传value参数。 + */ + changeHandler: Handler; + /** + * @en Indicates whether to scale the size of the scrollbar, default is true. + * @zh 是否缩放滑动条的大小,默认值为true。 + */ + scaleBar: boolean; + /** + * @en A boolean value that specifies whether to automatically hide the scrollbar when it is not in use, default is false. + * @zh 一个布尔值,指定是否在无需滚动时自动隐藏滚动条,默认值为false。 + */ + autoHide: boolean; + /** + * @en The limit distance for the rubber band effect, 0 means no rubber band effect. + * @zh 橡皮筋效果极限距离,0表示没有橡皮筋效果。 + */ + elasticDistance: number; + /** + * @en The time in milliseconds for the rubber band effect to rebound. + * @zh 橡皮筋回弹时间,单位为毫秒。 + */ + elasticBackTime: number; + /** + * @en The up button. + * @zh 上按钮。 + */ + upButton: Button; + /** + * @en The down button. + * @zh 下按钮。 + */ + downButton: Button; + /** + * @en slider. + * @zh 滑动条。 + */ + slider: Slider; + /** + * @en The top movement limit for the scrollbar. When this limit is reached, the 'dragTopLimit' event is dispatched. + * This can be used in conjunction with the `stopMoveLimit()` method to allow developers to perform dynamic data updates and other operations. + * @zh 顶部移动限制。当达到此限制时,会触发 'dragTopLimit' 事件。 + * 它可以与 `stopMoveLimit()` 方法结合使用,以便开发者执行动态数据更新和其他操作。 + */ + topMoveLimit: number; + /** + * @en The bottom movement limit for the scrollbar. When this limit is reached, the 'dragBottomLimit' event is dispatched. + * This can be used in conjunction with the `stopMoveLimit()` method to allow developers to perform dynamic data updates and other operations. + * @zh 底部移动限制。当达到此限制时,会触发 'dragBottomLimit' 事件。 + * 它可以与 `stopMoveLimit()` 方法结合使用,以便开发者执行动态数据更新和其他操作。 + */ + bottomMoveLimit: number; + /** + * @en Determines whether dragging of the content is disabled when the 'stopMoveLimit' method is called. + * @zh 确定在调用 'stopMoveLimit' 方法时是否禁止内容的拖拽。 + */ + disableDrag: boolean; + protected _showButtons: boolean; + protected _scrollSize: number; + protected _skin: string; + protected _thumbPercent: number; + protected _target: Sprite; + protected _lastPoint: Point; + protected _lastOffset: number; + protected _checkElastic: boolean; + protected _isElastic: boolean; + protected _value: number; + protected _hide: boolean; + protected _clickOnly: boolean; + protected _offsets: any[]; + protected _touchScrollEnable: boolean; + protected _mouseWheelEnable: boolean; + /** + * @en creates an instance of ScrollBar. + * @param skin The address of the skin resource. + * @zh 创建一个 ScrollBar 实例。 + * @param skin 皮肤资源地址。 + */ + constructor(skin?: string); + destroy(destroyChild?: boolean): void; + /** + * @en Creates the child elements of the ScrollBar, such as the slider and buttons. + * @zh 创建 ScrollBar 的子元素,例如滑块和按钮。 + */ + protected createChildren(): void; + /** + * @en Initializes the ScrollBar, setting up the slider and buttons with appropriate event listeners. + * @zh 初始化 ScrollBar,为滑块和按钮设置适当的事件监听器。 + */ + protected initialize(): void; + /** + * @en The change event handler for the slider when its value changes. + * @zh 滑块值改变时的事件处理函数。 + */ + protected onSliderChange(): void; + /** + * @en The mouse down event handler for the up and down buttons. + * @zh 向上和向下按钮的 Event.MOUSE_DOWN 事件侦听处理函数。 + */ + protected onButtonMouseDown(e: Event): void; + protected startLoop(isUp: boolean): void; + protected slide(isUp: boolean): void; + /** + * @en The mouse up event handler for the stage. + * @param e The event object. + * @zh 舞台的 Event.MOUSE_DOWN 事件侦听处理函数。 + * @param e 事件对象。 + */ + protected onStageMouseUp(e: Event): void; + /** + * @en the skin of the scrollbar. + * @zh 滚动条的皮肤纹理路径。 + */ + get skin(): string; + set skin(value: string); + /** + * @en Asynchronously sets the skin for the scrollbar and its components. + * @param url The URL of the skin to be set. + * @zh 异步设置滚动条及其组件的皮肤。 + * @param url 要设置的皮肤的 URL。 + */ + _setSkin(url: string): Promise; + /** + * @en Called when the skin is loaded. + * @zh 皮肤加载完成时调用。 + */ + protected _skinLoaded(): void; + /** + * @en Adjust the scroll bar's display state, including the visibility of the buttons and the position of the slider + * @zh 更改滚动条的显示状态,包括按钮的可见性和滑动条的位置 + */ + protected changeScrollBar(): void; + protected _sizeChanged(): void; + private resetPositions; + protected resetButtonPosition(): void; + protected measureWidth(): number; + protected measureHeight(): number; + /** + * @en Sets the information for the scrollbar. + * @param min The minimum position value of the scrollbar. + * @param max The maximum position value of the scrollbar. + * @param value The current position value of the scrollbar. + * @zh 设置滚动条信息。 + * @param min 滚动条最小位置值。 + * @param max 滚动条最大位置值。 + * @param value 滚动条当前位置值。 + */ + setScroll(min: number, max: number, value?: number): void; + /** + * @en the numeric value representing the maximum scroll position. + * @zh 最高滚动位置的数字。 + */ + get max(): number; + set max(value: number); + /** + * @en the numeric value representing the minimum scroll position. + * @zh 最低滚动位置的数字。 + */ + get min(): number; + set min(value: number); + /** + * @en the numeric value representing the current scroll position. + * @zh 当前滚动位置的数字。 + */ + get value(): number; + set value(v: number); + /** + * @en Indicates whether the scrollbar is vertical. If true, the scrollbar is vertical; otherwise, it is horizontal. + * Default value: true. + * @zh 滚动条是否为垂直滚动。如果值为true,则为垂直滚动,否则为水平滚动。 + * 默认值为:true。 + */ + get isVertical(): boolean; + set isVertical(value: boolean); + /** + * @en The size grid of the texture. + * The size grid is a 3x3 division of the texture, allowing it to be scaled without distorting the corners and edges. + * The array contains five values representing the top, right, bottom, and left margins, and whether to repeat the fill (0: no repeat, 1: repeat). + * The values are separated by commas. For example: "6,6,6,6,1". + * @zh 纹理的九宫格数据。 + * 九宫格是一种将纹理分成3x3格的方式,使得纹理缩放时保持角和边缘不失真。 + * 数组包含五个值,分别代表上边距、右边距、下边距、左边距以及是否重复填充(0:不重复填充,1:重复填充)。 + * 值以逗号分隔。例如:"6,6,6,6,1"。 + */ + get sizeGrid(): string; + set sizeGrid(value: string); + /** + * @en The minimum unit for page scrolling when the scrollbar track is pressed. + * @zh 按下滚动条轨道时页面滚动的最小单位 + */ + get scrollSize(): number; + set scrollSize(value: number); + set_dataSource(value: any): void; + /** + * @en Slider length ratio, with a value between 0 and 1. + * @zh 滑条长度比例,值为:(0-1)。 + */ + get thumbPercent(): number; + set thumbPercent(value: number); + /** + * @en the target object of the scrollbar. + * @zh 滚动的对象。 + */ + get target(): Sprite; + set target(value: Sprite); + /** + * @en Determines whether the scrollbar is hidden. If true, the scrollbar is not displayed, but scrolling functions remain active. Default is false. + * @zh 是否隐藏滚动条,设置为 true 时,不显示滚动条,但可以正常滚动,默认为 false。 + */ + get hide(): boolean; + set hide(value: boolean); + /** + * @en Specifies whether the up and down buttons are displayed. Default is true. + * @zh 是否显示向上和向下的按钮,默认值为 true,表示显示。 + */ + get showButtons(): boolean; + set showButtons(value: boolean); + /** + * @en Specifies whether touch scrolling is enabled. Default is true. + * @zh 是否启用触摸滚动,默认值为 true,表示启用。 + */ + get touchScrollEnable(): boolean; + set touchScrollEnable(value: boolean); + /** + * @en Specifies whether mouse wheel scrolling is enabled. Default is true. + * @zh 是否启用鼠标滚轮滚动,默认值为 true,表示启用。 + */ + get mouseWheelEnable(): boolean; + set mouseWheelEnable(value: boolean); + protected onTargetMouseWheel(e: Event): void; + isLockedFun: Function; + protected onTargetMouseDown(e: Event): void; + /** + * @en Forces a drag action on the scrollbar. + * Normally, dragging can only be done by holding the scrollbar itself. If you need to force drag outside the scrollbar object, you can achieve this by calling this method. + * For example, if the mouse is continuously held on a button object outside the scrollbar and this method is called, then sliding the mouse will have the same effect as dragging the scrollbar. + * @zh 强制拖拽滚动条; + * 常规情况下只能是按住滚动条本身才可以拖拽,如果需要在滚动条对象之外进行强制拖拽,则可以通过调用此方法来实现。 + * 例如,当鼠标持续按住滚动条之外的某个按钮对象时,调用了该方法,然后进行滑动,也可以实现按住滚动条对象滑动的效果。 + */ + startDragForce(): void; + private cancelDragOp; + /** + * @en Function to be called when the scrollbar is dragged down past its limit. + * @zh 当滚动条向下拖拽超过其限制时调用的函数。 + */ + triggerDownDragLimit: Function; + /** + * @en Function to be called when the scrollbar is dragged up past its limit. + * @zh 当滚动条向上拖拽超过其限制时调用的函数。 + */ + triggerUpDragLimit: Function; + /** + * @en Overloading method for pausing scrolling + * @zh 暂停滚动的重载方法 + */ + stopMoveLimit: Function; + private checkTriggers; + /** + * @en Gets the last offset value used during the scrollbar's movement. + * @zh 获取滚动条在移动过程中使用的最后偏移量。 + */ + get lastOffset(): number; + /** + * @en Starts a forced tweening (animated) movement for the scrollbar. + * @param lastOffset The offset to start the tweening movement from. + * @zh 滚动条的强制缓动移动。 + * @param lastOffset 从该偏移量位置开始缓动移动。 + */ + startTweenMoveForce(lastOffset: number): void; + protected loop(): void; + protected onStageMouseUp2(e: Event): void; + private elasticOver; + protected tweenMove(maxDistance: number): void; + /** + * @en Stops the scrolling action. + * @zh 停止滑动。 + */ + stopScroll(): void; + /** + * @en The minimum increment unit for the slider tick value, with a default value of 1. + * @zh 滑动条刻度值的最小变动单位,默认值为1。 + */ + get tick(): number; + set tick(value: number); + /** + * @en Restores the scrollbar to its normal elastic bounce-back motion. + * @zh 恢复到正常的弹性缓动效果。 + */ + backToNormal(): void; + private _backToNormal; + } + /** + * @en The Slider control allows users to select a value by moving a slider between the end points of the track. + * The current value of the slider is determined by the relative position of the slider between the end points of the slider (corresponding to the minimum and maximum values of the slider). + * The slider allows values at specific intervals between the minimum and maximum values. The slider can also display its current value using a data tip. + * - `changed` event is dispatched when the movement of the slider is completed (when the user releases the mouse). + * - `change` event is dispatched when the movement of the slider. + * @zh 使用 Slider 控件,用户可以通过在滑块轨道的终点之间移动滑块来选择值。 + * 滑块的当前值由滑块端点(对应于滑块的最小值和最大值)之间滑块的相对位置确定。 + * 滑块允许最小值和最大值之间特定间隔内的值。滑块还可以使用数据提示显示其当前值。 + * - `changed`事件用于移动滑块位置完成(用户鼠标抬起)后调度。 + * - `change`事件用于移动滑块位置时调度。 + */ + class Slider extends UIComponent { + /** + * @en Get a reference to the Label component contained within the Slider component. + * @zh 获取 Slider 组件所包含的 Label 组件的引用。 + */ + static label: Label; + /** + * @en Data change handler. + * The default callback parameter is the slider position property value: Number. + * @zh 数据变化处理器。 + * 默认回调参数为滑块位置属性 value 的属性值:Number。 + */ + changeHandler: Handler; + /** + * @en Whether it is vertical sliding. The default value is true, indicating vertical direction; false indicates horizontal direction. + * @zh 是否为垂直滑动。默认值为true,表示垂直方向,false为水平方向。 + */ + isVertical: boolean; + /** + * @en A Boolean value that indicates whether to display labels.defalut value is true. + * @zh 是否显示标签。默认值为true。 + */ + showLabel: boolean; + /** + * @en A Boolean value that indicates whether to display the progress bar. + * @zh 是否显示进度条。 + */ + protected _showProgress: boolean; + protected _allowClickBack: boolean; + protected _max: number; + protected _min: number; + protected _tick: number; + protected _value: number; + protected _skin: string; + protected _bg: Image; + protected _progress: Image; + protected _bar: Button; + protected _tx: number; + protected _ty: number; + protected _maxMove: number; + protected _globalSacle: Point; + /** + * @en Creates an instance of Slider. + * @param skin The skin. + * @zh 创建一个Silder实例。 + * @param skin 皮肤纹理。 + */ + constructor(skin?: string); + destroy(destroyChild?: boolean): void; + protected createChildren(): void; + protected initialize(): void; + protected onBarMouseDown(e: Event): void; + protected showValueText(): void; + protected hideValueText(): void; + private mouseUp; + private mouseMove; + protected sendChangeEvent(type?: string): void; + /** + * @en The skin of the slider. + * @zh 滑块的皮肤纹理。 + */ + get skin(): string; + set skin(value: string); + /** + * @en A Boolean value that indicates whether to display the progress bar. + * @zh 是否显示进度条。 + */ + get showProgress(): boolean; + set showProgress(value: boolean); + /** @ignore */ + _setSkin(url: string): Promise; + protected _skinLoaded(): void; + /** + * @en Set the position information of the slider. + * @zh 设置滑块的位置信息。 + */ + protected setBarPoint(): void; + protected measureWidth(): number; + protected measureHeight(): number; + protected _sizeChanged(): void; + /** + * @en The size grid of the texture. + * The size grid is a 3x3 division of the texture, allowing it to be scaled without distorting the corners and edges. + * The array contains five values representing the top, right, bottom, and left margins, and whether to repeat the fill (0: no repeat, 1: repeat). + * The values are separated by commas. For example: "6,6,6,6,1". + * @zh 纹理的九宫格数据。 + * 九宫格是一种将纹理分成3x3格的方式,使得纹理缩放时保持角和边缘不失真。 + * 数组包含五个值,分别代表上边距、右边距、下边距、左边距以及是否重复填充(0:不重复填充,1:重复填充)。 + * 值以逗号分隔。例如:"6,6,6,6,1"。 + */ + get sizeGrid(): string; + set sizeGrid(value: string); + /** + * @en Set the information of the slider. + * @param min The minimum value of the slider. + * @param max The maximum value of the slider. + * @param value The current value of the slider. + * @zh 设置滑动条的信息。 + * @param min 滑块的最小值。 + * @param max 滑块的最大值。 + * @param value 滑块的当前值。 + */ + setSlider(min: number, max: number, value?: number): void; + /** + * @en The minimum increment unit for each change in the slider tick value. The default value is 1. + * @zh 滑滑动条刻度值每次最小变动的单位。默认值为1 + */ + get tick(): number; + set tick(value: number); + /** + * @en Change the position value of the slider. + * @zh 改变滑块的位置值。 + */ + changeValue(): void; + /** + * @en The number indicating the highest position of slider. The default value is 100. + * @zh 滑动条最高位置的数字。默认值为 100。 + */ + get max(): number; + set max(value: number); + /** + * @en The number indicating the lowest position of slider. The default value is 0. + * @zh 滑动条最低位置的数字。默认值为 0。 + */ + get min(): number; + set min(value: number); + /** + * @en The number indicating the current slider position. + * @zh 滑动条当前滑块位置的数字。 + */ + get value(): number; + set value(num: number); + /** + * @en A Boolean value that specifies whether to allow changing the value property of the Slider by clicking the slider. + * @zh 是否允许通过点击滑动条改变 Slider 的 value 属性值。 + */ + get allowClickBack(): boolean; + set allowClickBack(value: boolean); + /** + * @en The Event.MOUSE_DOWN event handler of the slider. + * @zh 滑动条的 Event.MOUSE_DOWN 事件侦听处理函数。 + */ + protected onBgMouseDown(e: Event): void; + set_dataSource(value: any): void; + /** + * @en The reference of the slider button. + * @zh 滑块按钮的引用。 + */ + get bar(): Button; + } + class StatUI implements IStatUI { + private _txt; + private _sp; + private _view; + private _toggleView; + private _toggleSprite; + private _checkBoxArray; + private _show; + private _showToggle; + private createUI; + private createToggleUI; + /** + * @en Display the performance statistics. + * @param x The X-axis display position. + * @param y The Y-axis display position. + * @param views The UI parameter array for displaying statistics. + * @zh 显示性能统计信息。 + * @param x X轴显示位置。 + * @param y Y轴显示位置。 + * @param views 用于显示统计信息的UI参数数组。 + */ + show(x?: number, y?: number, views?: Array): void; + /** + * @en Display the toggle UI for performance statistics. + * @param x The X-axis display position. + * @param y The Y-axis display position. + * @param views The toggle UI parameter array for displaying statistics. + * @zh 显示性能统计的切换UI。 + * @param x X轴显示位置。 + * @param y Y轴显示位置。 + * @param views 用于显示统计信息的切换UI参数数组。 + */ + showToggle(x?: number, y?: number, views?: Array): void; + /** + * @en Hides performance statistics. + * @zh 隐藏性能统计信息。 + */ + hide(): void; + /** + * @en Update the performance statistics. + * @zh 更新性能统计信息。 + */ + update(): void; + /** + * @en Render the performance statistics. + * @param ctx The rendering context. + * @param x The X-axis render position. + * @param y The Y-axis render position. + * @zh 渲染性能统计信息。 + * @param ctx 渲染上下文。 + * @param x X轴显示位置。 + * @param y Y轴显示位置。 + */ + render(ctx: any, x: number, y: number): void; + } + /** + * @en The `Styles` class defines common style properties used by components. + * @zh Styles 定义了组件常用的样式属性。 + */ + class Styles { + /** + * @en Default nine-slice grid information. + * @zh 默认九宫格信息。 + */ + static defaultSizeGrid: any[]; + /** + * @en The color of the label text. + * @zh 标签颜色。 + */ + static labelColor: string; + /** + * @en The padding of the label, in pixels. Defined as [top, right, bottom, left]. + * @zh 标签的边距,格式为 [上边距,右边距,下边距,左边距]。 + */ + static labelPadding: any[]; + /** + * @en The padding of the input label, in pixels. Defined as [top, right, bottom, left]. + * @zh 输入框标签的边距,格式为 [上边距,右边距,下边距,左边距]。 + */ + static inputLabelPadding: any[]; + /** + * @en The number of state skins for a button, which supports 1, 2, or 3 states values. + * @zh 按钮皮肤的状态数,支持1,2,3三种状态值。 + */ + static buttonStateNum: number; + /** + * @en The colors of the button label. Defined as [upColor, overColor, downColor]. + * @zh 按钮标签颜色,格式为 [upColor, overColor, downColor]。 + */ + static buttonLabelColors: any[]; + /** + * @en The colors of the combo box. Defined as [overBgColor, overLabelColor, outLabelColor, borderColor, bgColor]. + * @zh 下拉框项颜色,格式为 [overBgColor, overLabelColor, outLabelColor, borderColor, bgColor]。 + */ + static comboBoxItemColors: any[]; + /** + * @en The minimum size of the scrollbar thumb, in pixels. + * @zh 滚动条的最小值。 + */ + static scrollBarMinNum: number; + /** + * @en The delay time before initiating continuous scrolling when a button is held down. + * @zh 长按按钮后,等待时间使其可激活连续滚动。 + */ + static scrollBarDelayTime: number; + } + enum ScrollType { + None = 0, + Horizontal = 1, + Vertical = 2, + Both = 3 + } + /** + * @en The Tab component is used to define tab button groups. + * The default value of ths property selectedIndex is -1. + * @zh Tab 组件用来定义选项卡按钮组。 + * 属性selectedIndex 的默认值为-1。 + */ + class Tab extends UIGroup { + constructor(); + protected createItem(skin: string, label: string): Sprite; + } + /** + * @en The TextArea class is used to create a multi-line text area display object for displaying and inputting text. + * @zh TextArea 类用于创建多行的文本域显示对象,以显示和输入文本。 + */ + class TextArea extends TextInput { + protected _scrollType: ScrollType; + protected _vScrollBarSkin: string; + protected _hScrollBarSkin: string; + protected _vScrollBar: VScrollBar; + protected _hScrollBar: HScrollBar; + /** + * @en Scroll bar type. The range of values is 0-3. + * - ScrollType.None(0): Does not display any scrollbars + * - ScrollType.Horizontal(1):Displays only the horizontal scrollbar + * - ScrollType.Vertical(2): Displays only the vertical scrollbar + * - ScrollType.Both(3): Displays both horizontal and vertical scrollbars + * @zh 滚动条类型。取值范围0-3。 + * - ScrollType.None(0): 不显示任何滚动条 + * - ScrollType.Horizontal(1): 仅显示水平滚动条 + * - ScrollType.Vertical(2): 仅显示垂直滚动条 + * - ScrollType.Both(3): 同时显示水平和垂直滚动条 + */ + get scrollType(): ScrollType; + set scrollType(value: ScrollType); + /** + * @en The vertical scrollbar instance. + * @zh 垂直滚动条实例。 + */ + get vScrollBar(): VScrollBar; + /** + * @en The horizontal scrollbar instance. + * @zh 水平滚动条实例。 + */ + get hScrollBar(): HScrollBar; + /** + * @en The maximum vertical scroll value. + * @zh 最大垂直滚动值。 + */ + get maxScrollY(): number; + /** + * @en The vertical scroll position. + * @zh 垂直滚动位置。 + */ + get scrollY(): number; + /** + * @en The maximum horizontal scroll value. + * @zh 最大水平滚动值。 + */ + get maxScrollX(): number; + /** + * @en The horizontal scroll position. + * @zh 当前的水平滚动位置。 + */ + get scrollX(): number; + /** + * @en The skin for the vertical scrollbar. + * @zh 垂直方向滚动条的皮肤 。 + */ + get vScrollBarSkin(): string; + set vScrollBarSkin(value: string); + /** + * @en The skin for the horizontal scrollbar. + * @zh 水平方向滚动条的皮肤。 + */ + get hScrollBarSkin(): string; + set hScrollBarSkin(value: string); + /** + * @en Creates an instance of TextArea. + * @param text Text content string. + * @zh 创建一个TextArea实例。 + * @param text 文本内容字符串。 + */ + constructor(text?: string); + protected _onPostLayout(): void; + protected initialize(): void; + private createHScrollBar; + private createVScrollBar; + protected onVBarChanged(e: Event): void; + protected onHBarChanged(e: Event): void; + private changeScroll; + /** + * @en Scroll to a certain position + * @zh 滚动到某个位置。 + */ + scrollTo(y: number): void; + /** + * @en Destroys the instance. + * @param destroyChild Whether to destroy child elements as well. Defaults to true. + * @zh 销毁实例。 + * @param destroyChild 是否同时销毁子元素,默认为 true。 + */ + destroy(destroyChild?: boolean): void; + } + /** + * @en The TextInput class is used to create an input text display object. + * - Event.INPUT event: When the input text after dispatching. + * - Event.ENTER event: When the input box presses enter key after dispatching. + * - Event.FOCUS event: When the input box gets focus. + * - Event.BLUR event: When the input box loses focus. + * @zh TextInput类用于创建输入文本显示对象。 + * - Event.INPUT事件:当输入文本后调度。 + * - Event.ENTER事件:当输入框内敲回车键后调度。 + * - Event.FOCUS事件:当输入框获得焦点时调度。 + * - Event.BLUR事件:当输入框失去焦点时调度。 + */ + class TextInput extends Label { + protected _skin: string; + /** + * @en The URL of the skin for the TextInput UIComponent. + * @zh TextInput组件的皮肤地址。 + */ + get skin(): string; + set skin(value: string); + /** + * @en The size grid of the texture. + * The size grid is a 3x3 division of the texture, allowing it to be scaled without distorting the corners and edges. + * The array contains five values representing the top, right, bottom, and left margins, and whether to repeat the fill (0: no repeat, 1: repeat). + * The values are separated by commas. For example: "6,6,6,6,1". + * @zh 纹理的九宫格数据。 + * 九宫格是一种将纹理分成3x3格的方式,使得纹理缩放时保持角和边缘不失真。 + * 数组包含五个值,分别代表上边距、右边距、下边距、左边距以及是否重复填充(0:不重复填充,1:重复填充)。 + * 值以逗号分隔。例如:"6,6,6,6,1"。 + */ + get sizeGrid(): string; + set sizeGrid(value: string); + /** + * @en Whether it is a text area. + * True means it is a text area, otherwise it is not. + * @zh 是否是文本域。 + * 值为true表示当前是文本域,否则不是文本域。 + */ + get multiline(): boolean; + set multiline(value: boolean); + /** + * @en whether it is editable. + * @zh 是否可编辑。 + */ + get editable(): boolean; + set editable(value: boolean); + /** + * @en The pattern that restricts the input. + * @zh 限制输入的字符。 + */ + get restrict(): string; + set restrict(pattern: string); + /** + * @en The prompt text of the input. + * @zh 输入框的提示文本。 + */ + get prompt(): string; + set prompt(value: string); + /** + * @en The prompt color of the input. + * @zh 输入框的提示文字颜色。 + */ + get promptColor(): string; + set promptColor(value: string); + /** + * @en The maximum number of characters allowed in the input. + * @zh 输入框允许的最大字符数。 + */ + get maxChars(): number; + set maxChars(value: number); + /** + * @en The focus state of the input. + * @zh 输入框的焦点状态。 + */ + get focus(): boolean; + set focus(value: boolean); + /** + * @en The type of the input box. Refer to the HTML5 input tag for types. + * Common types include: + * - text + * - password + * - email + * - number + * - date + * - time + * @zh 输入框的类型。可参照HTML5的input标签。 + * 常用标签例如: + * - text + * - password + * - email + * - number + * - date + * - time + */ + get type(): string; + set type(value: string); + /** + * @en Constructor method + * @param text Text content. + * @zh 构造方法 + * @param text 文本内容。 + */ + constructor(text?: string); + protected _skinLoaded(source: any): void; + protected preinitialize(): void; + protected createChildren(): void; + protected initialize(): void; + /** + * @en Select the text in the input box + * @zh 选中输入框内的文本。 + */ + select(): void; + /** + * @en Sets the start and end index of the selected text within the input field. + * @param startIndex The index of the first selected character. + * @param endIndex The index of the character following the last selected character. + * @zh 在输入字段内设置选中文本的起始和结束索引。 + * @param startIndex 选中文本的光标起始位置。 + * @param endIndex 选中文本的光标结束位置。 + */ + setSelection(startIndex: number, endIndex: number): void; + } + /** + * @en Mouse Tip Management Class + * @zh 鼠标提示管理类 + */ + class TipManager extends UIComponent { + /** + * @en X-axis offset of the tooltip + * @zh 提示框X轴偏移量 + */ + static offsetX: number; + /** + * @en Y-axis offset of the tooltip + * @zh 提示框Y轴偏移量 + */ + static offsetY: number; + /** + * @en Text color of the tooltip + * @zh 提示文本颜色 + */ + static tipTextColor: string; + /** + * @en Background color of the tooltip + * @zh 提示框背景颜色 + */ + static tipBackColor: string; + /** + * @en Delay before showing the tooltip + * @zh 显示提示框前的延迟时间 + */ + static tipDelay: number; + private _tipBox; + private _tipText; + private _defaultTipHandler; + /** + * @en Default mouse prompt function + * @zh 默认鼠标提示函数 + */ + get defaultTipHandler(): Function; + set defaultTipHandler(value: Function); + /** @ignore */ + constructor(); + private _onStageHideTip; + private _onStageShowTip; + private _showTip; + private _onStageMouseDown; + private _onStageMouseMove; + private _showToStage; + private _showDefaultTip; + /** + * @en Closes all tooltips and removes event listeners related to mouse actions. + * @zh 关闭所有鼠标提示并移除与鼠标动作相关的事件监听器。 + */ + closeAll(): void; + /** + * @en Displays a tooltip Sprite on the stage. + * @param tip The Sprite object to be displayed as a tooltip. + * @zh 显示对象提示条的显示。 + * @param tip 要显示的提示条精灵对象。 + */ + showDislayTip(tip: Sprite): void; + } + /** + * @en The `Tree` UI component allows users to view hierarchical data arranged in an expandable tree format. + * @zh `Tree` UI组件使用户可以查看排列为可扩展树的层次结构数据。 + */ + class Tree extends Box { + protected _list: List; + protected _source: any[]; + protected _renderHandler: Handler; + protected _spaceLeft: number; + protected _spaceBottom: number; + protected _keepStatus: boolean; + /** + * @en Determines whether to maintain the previous open state after the data source changes. The default value is true. + * - true: Maintain the previous open state. + * - false: Do not maintain the previous open state. + * @zh 数据源发生变化后,是否保持之前打开状态,默认为true。 + * - true:保持之前打开状态。 + * - false:不保持之前打开状态。 + */ + get keepStatus(): boolean; + set keepStatus(value: boolean); + /** + * @en The list data source, including only the data of currently visible nodes. + * @zh 列表数据源,只包含当前可视节点数据。 + */ + get array(): any[]; + set array(value: any[]); + /** + * @en The data source containing all node data. + * @zh 数据源,全部节点数据。 + */ + get source(): any[]; + /** + * @en The `List` instance contained within this object. + * @zh 此对象包含的 `List` 实例对象。 + */ + get list(): List; + /** + * @en The cell renderer for the List instance contained in this object. + * Possible values: + * Cell class object. + * JSON description of the UI. + * @zh 此对象包含的List实例的单元格渲染器。 + * 取值: + * 单元格类对象。 + * UI 的 JSON 描述。 + */ + get itemRender(): any; + set itemRender(value: any); + /** + * @en The skin of the scroll bar. + * @zh 滚动条皮肤。 + */ + get scrollBarSkin(): string; + set scrollBarSkin(value: string); + /** + * @en The scroll bar. + * @zh 滚动条。 + */ + get scrollBar(): ScrollBar; + /** + * @en Handler for cell mouse events. Default returns parameters (e:Event,index:int). + * @zh 单元格鼠标事件处理器。默认返回参数(e:Event,index:int)。 + */ + get mouseHandler(): Handler; + set mouseHandler(value: Handler); + /** + * @en The render handler for the `Tree` instance. + * @zh `Tree` 实例的渲染处理器。 + */ + get renderHandler(): Handler; + set renderHandler(value: Handler); + /** + * @en The left indentation distance in pixels. + * @zh 左侧缩进距离(以像素为单位)。 + */ + get spaceLeft(): number; + set spaceLeft(value: number); + /** + * @en The space between each item in pixels. + * @zh 每一项之间的间隔距离(以像素为单位)。 + */ + get spaceBottom(): number; + set spaceBottom(value: number); + /** + * @en The index of the currently selected item. + * @zh 表示当前选择的项索引。 + */ + get selectedIndex(): number; + set selectedIndex(value: number); + /** + * @en The data source of the currently selected item. + * @zh 当前选中的项对象的数据源。 + */ + get selectedItem(): any; + set selectedItem(value: any); + /** + * @en The data source in XML structure. + * @zh XML 结构的数据源。 + */ + set xml(value: XML); + /** + * @en The value of the `path` property of the selected tree node item. + * @zh 表示选择的树节点项的 `path` 属性值。 + */ + get selectedPath(): string; + /** + * @en Creats an instance of `Tree`. + * The `width` and `height` properties are both set to 200 in the `Tree` constructor. + * @zh 创建一个 `Tree` 实例。 + * 在`Tree`构造函数中设置属性width、height的值默认都为200。 + */ + constructor(); + protected createChildren(): void; + /** + * @en this object contains the List instance's Event.CHANGE event listener function. + * @zh 此对象包含的List实例的Event.CHANGE事件侦听处理函数。 + */ + protected onListChange(e?: Event): void; + /** + * @en Get the data source collection. + * @zh 获取数据源集合。 + */ + protected getArray(): any[]; + /** + * @en Get item object's depth. + * @zh 获取项对象的深度。 + */ + protected getDepth(item: any, num?: number): number; + /** + * @en Get item object's parent open status. + * @zh 获取项对象的上一级的打开状态。 + */ + protected getParentOpenStatus(item: any): boolean; + /** + * @en Renders a item object. + * @param cell a item object. + * @param index item's index. + * @zh 渲染一个项对象。 + * @param cell 一个项对象。 + * @param index 项的索引。 + */ + protected renderItem(cell: Box, index: number): void; + private onArrowClick; + /** + * @en parse data source of XML type. + * @zh 解析并处理XML类型的数据源。 + */ + protected parseXml(xml: XML, source: any[], nodeParent: any, isRoot: boolean): void; + /** + * @en Handle the open state of the data items. + * @zh 处理数据项的打开状态。 + */ + protected parseOpenStatus(oldSource: any[], newSource: any[]): void; + /** + * @en Determine whether the two item objects have the same parent node in the tree structure. + * @param item1 Item object. + * @param item2 Item object. + * @returns If the parent node is the same, the value of true. Otherwise, false. + * @zh 判断两个项对象在树结构中的父节点是否相同。 + * @param item1 项对象。 + * @param item2 项对象。 + * @returns 如果父节点相同值为true,否则值为false。 + */ + protected isSameParent(item1: any, item2: any): boolean; + /** + * @en Retrieve the value of a specified key from the data source. + * @zh 获取数据源中指定键名的值。 + */ + private getFilterSource; + /** + * @en Set the open state of an item object by index. + * @param index The item index. + * @param isOpen Whether the item is open. + * @zh 设置指定项索引的项对象的打开状态。 + * @param index 项索引。 + * @param isOpen 是否处于打开状态。 + */ + setItemState(index: number, isOpen: boolean): void; + /** + * @en Refresh the list. + * @zh 刷新项列表。 + */ + fresh(): void; + /** + * @en Set the data source. + * @param value The data source. + * @zh 设置数据源。 + * @param value The data source. + */ + set_dataSource(value: any): void; + /** + * @en Update the list to show items with the specified key name. + * @param key The key name. + * @zh 更新项列表,显示指定键名的数据项。 + * @param key 键名。 + */ + filter(key: string): void; + /** + * @en Destroy the object. + * @param destroyChild Whether to destroy the child objects as well. + * @zh 销毁对象。 + * @param destroyChild 是否销毁子对象。 + */ + destroy(destroyChild?: boolean): void; + } + /** + * @en UIComponent is the base class of UI Component. + * Life cycle: preinitialize > createChildren > initialize > constructor of component + * @zh UIComponent 是UI组件类的基类。 + * 生命周期:preinitialize > createChildren > initialize > 组件构造函数 + */ + class UIComponent extends Sprite { + /** + * @en The data source of the UIComponent. + * @zh UI组件的数据源。 + */ + protected _dataSource: any; + /** + * @en Mouse hover prompt + * @zh 鼠标悬停提示 + */ + protected _toolTip: any; + /** + * @en Disabled + * @zh 禁用 + */ + protected _disabled: boolean; + /** + * @en Grayed out + * @zh 变灰 + */ + protected _gray: boolean; + /** + * @en Relative layout component + * @zh 相对布局组件 + */ + protected _widget: Widget; + /** + * @en The vertical distance in pixels from the top edge of the component to the top edge of its parent. + * This property is used for relative layout, which means the component's position is always relative to its parent's top edge. + * @zh 组件顶边距离父节点顶边的垂直距离(以像素为单位)。 + * 此属性用于相对布局,意味着组件的位置始终相对于父节点的顶部边缘。 + */ + get top(): number; + set top(value: number); + /** + * @en The vertical distance in pixels from the bottom edge of the component to the bottom edge of its parent. + * This property is used for relative layout, which means the component's position is always relative to its parent's bottom edge. + * @zh 组件底边距离父节点底边的垂直距离(以像素为单位)。 + * 此属性用于相对布局,意味着组件的位置始终相对于父节点的底部边缘。 + */ + get bottom(): number; + set bottom(value: number); + /** + * @en The horizontal distance in pixels from the left edge of the component to the left edge of its parent. + * This property is used for relative layout, which means the component's position is always relative to its parent's left edge. + * @zh 组件左边距离父节点左边的水平距离(以像素为单位)。 + * 此属性用于相对布局,意味着组件的位置始终相对于父节点的左侧边缘。 + */ + get left(): number; + set left(value: number); + /** + * @en The horizontal distance in pixels from the right edge of the component to the right edge of its parent. + * This property is used for relative layout, which means the component's position is always relative to its parent's right edge. + * @zh 组件右边距离父节点右边的水平距离(以像素为单位)。 + * 此属性用于相对布局,意味着组件的位置始终相对于父节点的右侧边缘。 + */ + get right(): number; + set right(value: number); + /** + * @en The distance in pixels from the center axis of this object in the horizontal direction to the center line of the parent container in the horizontal direction. + * @zh 在父容器中,此对象的水平方向中轴线与父容器的水平方向中心线的距离(以像素为单位)。 + */ + get centerX(): number; + set centerX(value: number); + /** + * @en The distance in pixels from the center axis of this object in the vertical direction to the center line of the parent container in the vertical direction. + * @zh 在父容器中,此对象的垂直方向中轴线与父容器的垂直方向中心线的距离(以像素为单位)。 + */ + get centerY(): number; + set centerY(value: number); + /** + * @en Data assignment, control UI display logic by assigning UI. + * Simple assignment will change the default properties of the component, and curly braces can be used to assign any property of the component. + * @zh 数据源赋值,通过对UI赋值来控制UI显示逻辑。 + * 简单赋值会更改组件的默认属性,使用大括号可以指定组件的任意属性进行赋值。 + * @example + //Default property assignment + dataSource = {label1: "Label changed", checkbox1: true};//(Change the text property value of label1, change the selected property of checkbox1). + //Any property assignment + dataSource = {label2: {text:"Label changed",size:14}, checkbox2: {selected:true,x:10}}; + */ + get dataSource(): any; + set dataSource(value: any); + /** + * @en Mouse hover prompt. + * It can be assigned as text `String` or function `Handler` to implement custom style mouse prompts and parameter carrying, etc. + * @zh 鼠标悬停提示。 + * 可以赋值为文本`String`或函数`Handler`,用来实现自定义样式的鼠标提示和参数携带等。 + * @example + * private var _testTips:TestTipsUI = new TestTipsUI(); + * private function testTips():void { + //Simple mouse prompt + * btn2.toolTip = "This is a mouse tip<b>Bold</b><br>New line"; + //Custom mouse prompt + * btn1.toolTip = showTips1; + //Custom mouse prompt with parameters + * clip.toolTip = new Handler(this,showTips2, ["clip"]); + * } + * private function showTips1():void { + * _testTips.label.text = "This is button[" + btn1.label + "]"; + * tip.addChild(_testTips); + * } + * private function showTips2(name:String):void { + * _testTips.label.text = "This is " + name; + * tip.addChild(_testTips); + * } + */ + get toolTip(): any; + set toolTip(value: any); + /** + * @en Whether it is grayed out. + * @zh 是否变灰。 + */ + get gray(): boolean; + set gray(value: boolean); + /** + * @en Whether the page is disabled, it will turn gray and disable the mouse when set to true. + * @zh 是否禁用页面,设置为true后,会变灰并且禁用鼠标。 + */ + get disabled(): boolean; + set disabled(value: boolean); + /** + * @en The constructor function that is called when creating a new instance of the UIComponent. + * It calls a series of initialization methods in sequence. Subclasses inheriting from this class can override these methods directly to implement their own initialization logic. + * If these initialization methods are not needed, `createChildren` can be set to `false` to skip them and reduce unnecessary overhead. + * @param createChildren Whether to execute the initialization methods, default is true. + * @zh 创建UI组件新实例时调用的构造函数。 + * 它将依次调用一系列初始化方法。继承该类的子类可以直接重写这些方法,实现自己的初始化逻辑。 + * 如果不需要这些初始化方法,可以将 `createChildren` 设置为 `false`,以跳过它们并减少不必要的开销。 + * @param createChildren 是否执行子对象初始化方法,默认为 true。 + */ + constructor(createChildren?: boolean); + /** + * @en Called when the layout should be refreshed. + * This method will call the `_sizeChanged` method later to perform the actual layout refresh. + * @zh 当需要刷新布局时调用。 + * 这个方法会在稍后调用 `_sizeChanged` 方法来执行实际的布局刷新。 + */ + protected _shouldRefreshLayout(): void; + /** + * @en Callback function when the component size changes. + * @zh 组件尺寸变化时的回调函数。 + */ + protected _sizeChanged(): void; + /** + * @en Callback when a child node changes. + * @param child The child node that has changed. + * @zh 子节点发生变化时的回调。 + * @param child 发生变化的子节点。 + */ + protected _childChanged(child?: Node): void; + /** + * @en Get the layout style of the object. Please do not modify this object directly. + * @zh 获取对象的布局样式。请不要直接修改此对象。 + */ + private _getWidget; + /** + * @en Pre-initialization. + * Subclasses can set and modify default property values in this function. + * @zh 预初始化。 + * 子类可在此函数内设置、修改属性默认值。 + */ + protected preinitialize(): void; + /** + * @en Create and add UIComponent child nodes. + * Subclasses can create and add child nodes in this function. + * @zh 创建并添加UI组件的子节点。 + * 子类可在此函数内创建并添加子节点。 + */ + protected createChildren(): void; + /** + * @en UIComponent initialization. + * Child objects have been created at this point and can be modified. + * @zh UI组件初始化。 + * 在此子对象已被创建,可以对子对象进行修改。 + */ + protected initialize(): void; + /** + * @en The actual display area width of the object (in pixels). + * @zh 显示对象的实际显示区域宽度(以像素为单位)。 + */ + protected measureWidth(): number; + /** + * @en Immediately execute the delayed call function that affects the width and height measurement. + * Use the 'runCallLater' function to immediately execute the delayed running function that affects the width and height measurement (set using 'callLater'). + * @zh 立即执行影响宽高度量的延迟调用函数。 + * 使用 'runCallLater' 函数,立即执行影响宽高度量的延迟运行函数(使用 'callLater' 设置延迟执行函数)。 + */ + protected commitMeasure(): void; + /** + * @en The actual display area height of the object (in pixels). + * @zh 显示对象的实际显示区域高度(以像素为单位)。 + */ + protected measureHeight(): number; + /** + * @en The event handler for the 'Event.MOUSE_OVER' event, triggered when the mouse enters the component (the node object to which the component belongs). + * When the 'toolTip' property is set, this method is invoked to dispatch the 'UIEvent.SHOW_TIP' event with the '_toolTip' property as the parameter. + * @param e The event object. + * @zh 'Event.MOUSE_OVER' 事件的事件处理程序,在鼠标进入组件(组件所属的节点对象)时触发。 + * 当 'toolTip' 属性被设置时,该方法会被调用以派发 'UIEvent.SHOW_TIP' 事件,并将 '_toolTip' 属性作为参数传递。 + * @param e 事件对象。 + */ + private onMouseOver; + /** + * @en The event handler for the 'Event.MOUSE_OUT' event, triggered when the mouse leaves the component (the node object to which the component belongs). + * When the 'toolTip' property is set, this method is invoked to dispatch the 'UIEvent.HIDE_TIP' event with the '_toolTip' property as the parameter. + * @param e The event object. + * @zh 'Event.MOUSE_OUT' 事件的事件处理程序,在鼠标离开组件(组件所属的节点对象)时触发。 + * 当 'toolTip' 属性被设置时,该方法会被调用以派发 'UIEvent.HIDE_TIP' 事件,并将 '_toolTip' 属性作为参数传递。 + * @param e 事件对象。 + */ + private onMouseOut; + /** + * @en The method to be invoked when the component is resized. + * It handles the logic for when the component's size changes. + * @zh 组件大小调整时调用的方法。 + * 它处理组件大小发生变化时的逻辑。 + */ + protected onCompResize(): void; + /** + * @en Get the width of the object. + * @zh 获取对象的宽度。 + */ + get_width(): number; + /** + * @en Get the height of the object. + * @zh 获取对象的高度。 + */ + get_height(): number; + /** + * @en Get the top margin of the object. + * @zh 获取对象的上边距。 + */ + get_top(): number; + /** + * @en Set the top margin of the object. + * @param value The top margin value. + * @zh 设置对象的上边距。 + * @param value 上边距的值。 + */ + set_top(value: number): void; + /** + * @en Get the bottom margin of the object. + * @zh 获取对象的下边距。 + */ + get_bottom(): number; + /** + * @en Set the bottom margin of the object. + * @param value The bottom margin value. + * @zh 设置对象的下边距。 + * @param value 下边距的值。 + */ + set_bottom(value: number): void; + /** + * @en Get the data source of the object. + * @zh 获取对象的数据源。 + */ + get_dataSource(): any; + /** + * @en Set the data source of the object. + * @param value The data source. + * @zh 设置对象的数据源。 + * @param value 数据源。 + */ + set_dataSource(value: any): void; + /** + * @en Recalculate and update the layout of the object. + * This method will reset the horizontal and vertical layout of the object based on the `_widget` property. + * It will calculate the position and size of the object according to the layout rules specified by the `_widget` property, + * such as `left`, `right`, `top`, `bottom`, `centerX`, and `centerY`. + * @zh 重新计算并更新对象的布局。 + * 这个方法将根据 `_widget` 属性重置对象的水平和垂直布局。 + * 它会根据 `_widget` 属性指定的布局规则,如 `left`、`right`、`top`、`bottom`、`centerX` 和 `centerY`,计算对象的位置和大小。 + */ + freshLayout(): void; + /** + * @en Destroy the object. + * @param destroyChild Whether to destroy child nodes, default is true. + * @zh 销毁对象。 + * @param destroyChild 是否销毁子节点,默认为 true。 + */ + destroy(destroyChild?: boolean): void; + } + /** + * @en The UIEvent class is used to define the event types of UI component classes. + * @zh UIEvent 类用来定义UI组件类的事件类型。 + */ + class UIEvent { + /** + * @en Display prompt information. + * @zh 显示提示信息。 + */ + static SHOW_TIP: string; + /** + * @en Hide prompt information. + * @zh 隐藏提示信息。 + */ + static HIDE_TIP: string; + } + /** + * @en UIGroup is an item collection control that can be automatically laid out. + * The default item object for UIGroup is a Button class instance. + * UIGroup is the base class for Tab and RadioGroup. + * @zh UIGroup 是一个可以自动布局的项集合控件。 + * UIGroup 的默认项对象为 Button 类实例。 + * UIGroup是 Tab 和 RadioGroup 的基类。 + */ + class UIGroup extends Box { + protected _items: ISelect[]; + protected _selectedIndex: number; + protected _skin: string; + protected _direction: string; + protected _space: number; + protected _labels: string; + protected _labelColors: string; + private _labelFont; + protected _labelStrokeColor: string; + protected _strokeColors: string; + protected _labelStroke: number; + protected _labelSize: number; + protected _labelBold: boolean; + protected _labelPadding: string; + protected _labelAlign: string; + protected _stateNum: number; + protected _labelChanged: boolean; + /** + * @en The processor executed when changing the selection of the Group, (Default return parameter: item index (index: int)). + * @zh 改变 Group 的选择项时执行的处理器,(默认返回参数: 项索引(index:int))。 + */ + selectHandler: Handler; + /** + * @en Indicates the index of the currently selected item. The default value is -1. + * @zh 表示当前选择的项索引。默认值为-1。 + */ + get selectedIndex(): number; + set selectedIndex(value: number); + /** + * @en The URL of the skin for the component. + * @zh 组件的皮肤URL。 + */ + get skin(): string; + set skin(value: string); + /** + * @en The labels string, separated by commas, such as "item0,item1,item2,item3,item4,item5". + * @zh 标签集合字符串。以逗号做分割,如"item0,item1,item2,item3,item4,item5"。 + */ + get labels(): string; + set labels(value: string); + /** + * @en The label colors string for the component. + * @zh 组件的标签颜色字符串。 + */ + get labelColors(): string; + set labelColors(value: string); + /** + * @en The stroke width (in pixels) for the label. + * The default value is 0, indicating no stroke. + * @zh 描边宽度(以像素为单位)。 + * 默认值0,表示不描边。 + */ + get labelStroke(): number; + set labelStroke(value: number); + /** + * @en The stroke color for the label, represented as a string. + * The default color is "#000000" (black). + * @zh 描边颜色,以字符串表示。 + * 默认值为 "#000000"(黑色); + */ + get labelStrokeColor(): string; + set labelStrokeColor(value: string); + /** + * @en The stroke colors in various states. + * @zh 各个状态下的描边颜色 + */ + get strokeColors(): string; + set strokeColors(value: string); + /** + * @en The font size of the button's text label. + * @zh 按钮文本标签的字体大小。 + */ + get labelSize(): number; + set labelSize(value: number); + /** + * @en The number of states the button has, represented as a number. The default is 3 states. + * @zh 按钮的状态值,以数字表示,默认为3态。 + */ + get stateNum(): number; + set stateNum(value: number); + /** + * @en Whether the button's text label is bold. + * @zh 按钮文本标签是否为粗体字。 + */ + get labelBold(): boolean; + set labelBold(value: boolean); + /** + * @en The font name of the button's text label, represented as a string. + * @zh 按钮文本标签的字体名称,以字符串形式表示。 + */ + get labelFont(): string; + set labelFont(value: string); + /** + * @en The padding of the button's text label. + * Format: "Top,Right,Bottom,Left". + * @zh 按钮文本标签的边距。 + * 格式:"上边距,右边距,下边距,左边距"。 + */ + get labelPadding(): string; + set labelPadding(value: string); + /** + * @en The layout direction. The default value is "horizontal". + * Possible values: + * "horizontal": Indicates a horizontal layout. + * "vertical": Indicates a vertical layout. + * @zh 布局方向。 默认值为"horizontal"。 + * 取值: + * "horizontal":表示水平布局。 + * "vertical":表示垂直布局。 + */ + get direction(): string; + set direction(value: string); + /** + * @en The space between items in pixels. + * @zh 项对象们之间的间隔(以像素为单位)。 + */ + get space(): number; + set space(value: number); + /** + * @en The array where the item objects are stored. + * @zh 项对象们的存放数组。 + */ + get items(): ISelect[]; + /** + * @en The currently selected item object. + * @zh 当前选择的项对象。 + */ + get selection(): ISelect; + set selection(value: ISelect); + /** + * @en Creates an instance of UIGroup. + * @param labels A string of labels separated by commas, e.g., "item0,item1,item2,item3,item4,item5". + * @param skin The skin. + * @zh 创建一个 UIGroup 的实例。 + * @param labels 标签集字符串,以逗号分隔,例如 "item0,item1,item2,item3,item4,item5"。 + * @param skin 皮肤。 + */ + constructor(labels?: string, skin?: string); + protected _skinLoaded(): void; + protected _setLabelChanged(): void; + /** + * @en The item object's click event listener function, used to set the current selected item index. + * @param index The item index. + * @zh 项对象的点击事件侦听处理函数,用于设置当前选择的项索引 + * @param index 项索引。 + */ + protected itemClick(index: number): void; + /** + * @en Creates an item display object. + * @param skin The skin path for the item object. + * @param label The text label for the item object. + * @zh 创建一个项显示对象。 + * @param skin 项对象的皮肤路径。 + * @param label 项对象的文本标签。 + */ + protected createItem(skin: string, label: string): Sprite; + /** + * @en Change the property value of an item object. + * @zh 更改项对象的属性值。 + */ + protected changeLabels(): void; + protected commitMeasure(): void; + /** + * @en Sets the `selected`property value of an item object by its index. + * @param index The index of the item object to be set. + * @param selected Indicates the selected state of the item object. + * @zh 通过对象的索引设置项对象的 `selected`属性值。 + * @param index 需要设置的项对象的索引。 + * @param selected 表示项对象的选中状态。 + */ + protected setSelect(index: number, selected: boolean): void; + protected preinitialize(): void; + /** + * @en Destroys this instance. + * @param destroyChild Whether to destroy the child components. + * @zh 销毁此实例。 + * @param destroyChild 是否销毁子组件。 + */ + destroy(destroyChild?: boolean): void; + /** + * @en Adds an item object. + * @param item The item object to be added. + * @param autoLayout Whether to automatically layout the item. If true, the position of the item will be calculated based on the direction and space properties. + * @returns returns the index ID of this item object. + * @zh 添加一个项对象。 + * @param item 需要添加的项对象。 + * @param autoLayout 是否自动布局,如果为true,会根据 direction 和 space 属性计算item的位置。 + * @returns 返回添加的项对象的索引ID。 + */ + addItem(item: ISelect, autoLayout?: boolean): number; + /** + * @en Removes an item object. + * @param item The item object to be added. + * @param autoLayout Whether to automatically layout the item. If true, the position of the item will be calculated based on the direction and space properties. Default is true. + * @zh 删除一个项对象。 + * @param item 需要删除的项对象。 + * @param autoLayout 是否自动布局,如果为true,会根据 direction 和 space 属性计算item的位置。 + */ + delItem(item: ISelect, autoLayout?: boolean): void; + /** + * @en This method is called after deserialization of this instance. + * @zh 反序列化后调用此方法。 + */ + onAfterDeserialize(): void; + /** + * @en Initializes the item objects. + * @zh 初始化项对象们。 + */ + initItems(): void; + /** + * @en Sets the data source for this component. + * @zh 设置此组件的数据源。 + */ + set_dataSource(value: any): void; + } + /** + * @en The `UIUtils` class is a collection of text utility functions. + * @zh `UIUtils` 是文本工具集。 + */ + class UIUtils { + private static grayFilter; + private static _funMap; + /** + * @en Fill an array with a string and return a copy of the array. + * @param arr The source array. + * @param str A string of comma-separated values, such as "p1,p2,p3,p4". + * @param type If the value is not null, it indicates the type of the newly added value. + * @returns The filled array. + * @zh 用字符串填充数组,并返回数组副本。 + * @param arr 源数组对象。 + * @param str 用逗号连接的字符串。如"p1,p2,p3,p4"。 + * @param type 如果值不为null,则填充的是新增值得类型。 + * @returns 填充后的数组。 + */ + static fillArray(arr: any[], str: string, type?: typeof Number | typeof String): any[]; + /** + * @en Convert a uint color value to a string color value. + * @param color The uint color value. + * @returns The string color value. + * @zh 转换 uint 类型颜色值为字符型颜色值。 + * @param color uint颜色值。 + * @returns 字符型颜色值。 + */ + static toColor(color: number): string; + /** + * @en Add or remove a grayscale filter to the specified target display object. + * @param target The target display object. + * @param isGray If true, add a grayscale filter, otherwise remove the grayscale filter. + * @zh 给指定的目标显示对象添加或移除灰度滤镜。 + * @param target 目标显示对象。 + * @param isGray 如果值true,则添加灰度滤镜,否则移除灰度滤镜。 + */ + static gray(target: Sprite, isGray?: boolean): void; + /** + * @en Get the function expression based on the string. + * @param value The string value. + * @returns The function expression. + * @zh 根据字符串,返回函数表达式。 + * @param value 字符串值。 + * @return 函数表达式。 + */ + static getBindFun(value: string): Function; + } + /** + * @en VBox is a vertical layout container class. + * @zh VBox 是一个垂直布局容器类。 + */ + class VBox extends LayoutBox { + /** + * @en No alignment. + * @zh 无对齐。 + */ + static NONE: string; + /** + * @en Left aligned. + * @zh 左对齐。 + */ + static LEFT: string; + /** + * @en Center alignment. + * @zh 居中对齐。 + */ + static CENTER: string; + /** + * @en Right aligned. + * @zh 右对齐。 + */ + static RIGHT: string; + /** + * @en Compatible with previous changeItems logic, whether to use sortItem to sort all items when changes occur. + * @zh 兼容以前的changeItems逻辑,是否在发生变动时,使用 sortItem 排序所有item。 + */ + isSortItem: boolean; + protected changeItems(): void; + } + /** + * @en The View class represents a view component. + * - In LayaAir 2.x, View inherited from the Scene class. However, in 3.x, Scene represents a broader concept encompassing both 2D and 3D. Therefore, in 3.x, understanding Scene as just a 2D scene view node is not appropriate. Scene has been retained for compatibility purposes, but the concept of a scene should be understood as encompassing both 2D and 3D scene data files. + * @zh View 是一个视图类。 + * - 在 LayaAir 2.x 里,View 继承自 Scene 类,但在 3.x 里,Scene 是一个 2D+3D 的场景概念,所以在 3.x 里,把 Scene 类理解为场景是不合理的。Scene 是为了兼容而保留的 2D 场景视图节点,请忽略引擎中的 Scene 概念,场景概念统一理解为包含了 2D 与 3D 的场景数据文件。 + */ + class View extends Scene { + /** + * @en Compatible with older versions. + * @zh 兼容老版本 + */ + static uiMap: any; + /** + * @en Compatible with older versions.Registers UI configuration information. For example, it registers a page with the path "test/TestPage", where the UI content is a JSON generated by the IDE. + * @param url The path to the UI. + * @param json The UI content in JSON format. + * @zh 兼容老版本,注册UI配置信息。比如注册一个路径为"test/TestPage"的页面,UI内容是IDE生成的json + * @param url UI的路径 + * @param json UI内容 + */ + static regUI(url: string, json: any): void; + /** + * @en The data source. + * @zh 数据源。 + */ + protected _dataSource: any; + /** @ignore */ + constructor(); + changeData(key: string): void; + /** + * @en Sets the data source for the control and updates the child components accordingly. + * @param value The new data source to be set. + * @zh 设置控件的数据源,并相应地更新子组件。 + * @param value 要设置的新数据源。 + */ + set_dataSource(value: any): void; + } + /** + * @en The ViewStack class is used for the View Stack class, which is used for setting and processing the display of views. + * @zh ViewStack 类用于视图堆栈类,用于视图的显示等设置处理。 + */ + class ViewStack extends Box { + /** + * @en The index of the current view. + * @zh 当前视图的索引。 + */ + get selectedIndex(): number; + set selectedIndex(value: number); + /** + * @en The currently selected item object. + * @zh 当前选中的项对象。 + */ + get selection(): Node; + set selection(value: Node); + /** + * @en Index setting processor. + * Default callback parameters: index:int + * @zh 索引设置处理器。 + * 默认回调参数:index:int + */ + get setIndexHandler(): Handler; + set setIndexHandler(value: Handler); + /** + * @en The array of view items. + * @zh 视图集合数组。 + */ + get items(): any[]; + /** @ignore */ + constructor(); + /** + * @en Sets the `selected` property value of an item object by its index. + * @param index The index of the object to be set. + * @param selected Indicates the selected state of the object. + * @zh 通过对象的索引设置项对象的 `selected` 属性值。 + * @param index 需要设置的对象的索引。 + * @param selected 表示对象的选中状态。 + */ + protected setSelect(index: number, selected: boolean): void; + /** + * 设置属性selectedIndex的值。 + * @param index 选中项索引值。 + */ + protected setIndex(index: number): void; + /** + * @en Sets the view items in batch. + * @param views An array of view objects to be set. + * @zh 批量设置视图对象。 + * @param views 视图对象数组。 + */ + setItems(views: any[]): void; + /** + * @en Adds a view to the ViewStack.Sets the name property of the view object to facilitate identification. + * @param view The view object to be added. + * @zh 添加视图对象到 ViewStack,并设置此视图对象的 `name` 属性。 + * @param view 需要添加的视图对象。 + */ + addItem(view: Node): void; + /** + * @en This method is called after the object has been deserialized, and it initializes the view items. + * @zh 反序列化后调用此方法,用以初始化视图项。 + */ + onAfterDeserialize(): void; + _afterInited(): void; + /** + * @en Initialize the collection of view objects. + * @zh 初始化视图对象集合。 + */ + initItems(): void; + /** + * @en Sets the data source for the ViewStack, updating the selectedIndex or properties accordingly. + * @zh 为 ViewStack 设置数据源,相应地更新 selectedIndex 或属性。 + */ + set_dataSource(value: any): void; + } + /** + * @en The vertical scrollbar (VScrollBar) is used to scroll and view all content in the vertical direction when there is too much data to fit in the display area. + * @zh 垂直滚动条(VScrollBar)用于垂直方向因数据过多而超出显示区域时滚动查看全部内容。 + */ + class VScrollBar extends ScrollBar { + } + /** + * @en A VSlider control allows the user to select a value by moving the slider thumb between the endpoints of the slider track. The VSlider control is oriented vertically. The slider track extends from bottom to top, and the label is positioned on the left and right sides of the track. + * @zh 使用 VSlider 控件,用户可以通过在滑块轨道的终点之间移动滑块来选择值。VSlider 控件采用垂直方向。滑块轨道从下往上扩展,而标签位于轨道的左右两侧。 + */ + class VSlider extends Slider { + } + /** + * @en A utility class for Base64 encoding and decoding operations. + * @zh Base64 编码和解码操作的实用工具类。 + */ + class Base64Tool { + /** + * @en The character set used for Base64 encoding. + * @zh 用于 Base64 编码的字符集。 + */ + static chars: string; + /** + * @en Regular expression for validating Base64 encoded strings, including data URIs. + * @zh 用于验证 Base64 编码字符串(包括数据 URI)的正则表达式。 + */ + static reg: RegExp; + /** + * @en Regular expression for matching the header of a data URI. + * @zh 用于匹配数据 URI 头部的正则表达式。 + */ + static reghead: RegExp; + /** + * @en Use a lookup table to find the index. + * @zh 使用查找表查找索引。 + */ + static lookup: Uint8Array; + /** + * @en Initializes the lookup table for Base64 decoding. + * @zh 初始化用于 Base64 解码的查找表。 + */ + static init(): void; + /** + * @en Determines if a string is a base64 encoded string. + * @param str The string to check. + * @zh 判断字符串是否是 base64 编码的字符串。 + * @param str 需要检查的字符串。 + */ + static isBase64String(str: string): boolean; + /** + * @en Encodes an ArrayBuffer to a base64 string. + * @param arraybuffer The ArrayBuffer to encode. + * @zh 对 ArrayBuffer 进行编码,返回 base64 字符串。 + * @param arraybuffer 需要编码的 ArrayBuffer。 + */ + static encode(arraybuffer: ArrayBuffer): string; + /** + * @en Decodes a base64 string to an ArrayBuffer. + * @param base64 The base64 string to decode. + * @zh 对 base64 字符串进行解码,返回 ArrayBuffer。 + * @param base64 需要解码的 base64 字符串。 + */ + static decode(base64: string): ArrayBuffer; + } + /** + * @en Browser is a browser proxy class. Encapsulate some of the features provided by the browser and native JavaScript. + * @zh Browser 是浏览器代理类。封装浏览器及原生 js 提供的一些功能。 + */ + class Browser { + /** + * @en Browser proxy information. + * @zh 浏览器代理信息。 + */ + static userAgent: string; + /** + * @en Indicates whether the current environment is a mobile device, including iOS and Android devices. + * @zh 表示当前环境是否为移动设备,包括 iOS 和 Android 设备。 + */ + static onMobile: boolean; + /** + * @en Indicates whether the current environment is within an iOS device. + * @zh 表示当前环境是否在 IOS 设备内。 + */ + static onIOS: boolean; + /** + * @en Indicates whether the current environment is a Mac device. + * @zh 表示当前环境是否为 Mac 设备。 + */ + static onMac: boolean; + /** + * @en Indicates whether the current environment is within an iPhone. + * @zh 表示当前环境是否在 iPhone 内。 + */ + static onIPhone: boolean; + /** + * @en Indicates whether the current environment is within an iPad. + * @zh 表示当前环境是否在 iPad 内。 + */ + static onIPad: boolean; + /** + * @en Indicates whether the current environment is within an Android device. + * @zh 表示当前环境是否在 Android 设备内。 + */ + static onAndroid: boolean; + /** + * @en Indicates whether the current environment is within an OpenHarmonyOS device. + * @zh 表示当前环境是否在 OpenHarmonyOS 设备内。 + */ + static onOpenHarmonyOS: boolean; + /** + * @en Indicates whether the current environment is within a Windows Phone device. + * @zh 表示当前环境是否在 Windows Phone 设备内。 + */ + static onWP: boolean; + /** + * @en Indicates whether the current environment is within the QQ browser. + * @zh 表示当前环境是否在 QQ 浏览器内。 + */ + static onQQBrowser: boolean; + /** + * @en Indicates whether the current environment is within the mobile QQ or QQ browser. + * @zh 表示当前环境是否在移动 QQ 或 QQ 浏览器内。 + */ + static onMQQBrowser: boolean; + /** + * @en Indicates whether the current environment is within Safari. + * @zh 表示当前环境是否在 Safari 内。 + */ + static onSafari: boolean; + /** + * @en Indicates whether the current environment is within Chrome. + * @zh 表示当前环境是否在 Chrome 内。 + */ + static onChrome: boolean; + /** + * @en Indicates whether the current environment is within the Internet Explorer browser. + * @zh 表示当前环境是否在 Internet Explorer 浏览器内。 + */ + static onIE: boolean; + /** + * @en Indicates whether the current environment is within WeChat. + * @zh 表示当前环境是否在微信内。 + */ + static onWeiXin: boolean; + /** + * @en Indicates whether the current environment is a PC. + * @zh 表示当前环境是否为 PC。 + */ + static onPC: boolean; + /** + * @en Indicates whether the current environment is a WeChat mini-game. + * @zh 表示当前环境是否是微信小游戏。 + */ + static onMiniGame: boolean; + /** + * @en Indicates whether the current environment is a Baidu mini-game. + * @zh 表示当前环境是否是百度小游戏。 + */ + static onBDMiniGame: boolean; + /** + * @en Indicates whether the current environment is a Xiaomi mini-game. + * @zh 表示当前环境是否是小米小游戏。 + */ + static onKGMiniGame: boolean; + /** + * @en Indicates whether the current environment is an OPPO mini-game. + * @zh 表示当前环境是否是 OPPO 小游戏。 + */ + static onQGMiniGame: boolean; + /** + * @en Indicates whether the current environment is a VIVO mini-game. + * @zh 表示当前环境是否是 vivo 小游戏。 + */ + static onVVMiniGame: boolean; + /** + * @en Indicates whether the current environment is an Alipay mini-game. + * @zh 表示当前环境是否是支付宝小游戏。 + */ + static onAlipayMiniGame: boolean; + /** + * @en Indicates whether the current environment is a QQ mini-game on mobile. + * @zh 表示当前环境是否是手机 QQ 小游戏。 + */ + static onQQMiniGame: boolean; + /** + * @en Indicates whether the current environment is a BILIBILI mini-game. + * @zh 表示当前环境是否是 BILIBILI 小游戏。 + */ + static onBLMiniGame: boolean; + /** + * @en Indicates whether the current environment is a TikTok (Douyin) mini-game. + * @zh 表示当前环境是否是抖音小游戏。 + */ + static onTTMiniGame: boolean; + /** + * @en Indicates whether the current environment is a Huawei mini-game. + * @zh 表示当前环境是否是华为快游戏。 + */ + static onHWMiniGame: boolean; + /** + * @en Indicates whether the current environment is a Taobao mini-game. + * @zh 表示当前环境是否是淘宝小游戏。 + */ + static onTBMiniGame: boolean; + /** + * @private + * @en Indicates whether the current environment is the Firefox browser. + * @zh 表示当前环境是否是 Firefox 浏览器。 + */ + static onFirefox: boolean; + /** + * @en Indicates whether the current environment is the Edge browser. + * @zh 表示当前环境是否是 Edge 浏览器。 + */ + static onEdge: boolean; + /** + * @private + * @en Indicates whether the current environment is running on LayaAir Native Runtime. + * @zh 表示当前环境是否运行在 LayaAir Native Runtime。 + */ + static onLayaRuntime: boolean; + /** + * @en The actual platform type, OnMobile and others are determined through UserAgent, which may be faked. + * @zh 真实平台类型,onMobile等是通过UserAgent判断,可能具有欺骗性 + */ + static platform: number; + static PLATFORM_PC: number; + static PLATFORM_ANDROID: number; + static PLATFORM_IOS: number; + /** + * @en Indicates whether the environment supports WebAudio. + * @zh 表示环境是否支持 WebAudio。 + */ + static supportWebAudio: boolean; + /** + * @en Indicates whether the environment supports LocalStorage. + * @zh 表示环境是否支持 LocalStorage。 + */ + static supportLocalStorage: boolean; + /** + * @en The global offline canvas (not the main canvas), used primarily for measuring text and obtaining image data. + * @zh 全局离线画布(非主画布),主要用来测量文本和获取图像数据。 + */ + static canvas: any; + /** + * @en The rendering context of the global offline canvas (not the main canvas). + * @zh 全局离线画布上绘图的环境(非主画布)。 + */ + static context: CanvasRenderingContext2D; + /** + * @en The service object for mini-game platform services. + * @zh 小游戏平台服务对象。 + */ + static miniGameContext: any; + /** + * @en The loaded bundles. + * @zh 已载入的脚本集。 + */ + static bundles: Map; + /** @private */ + private static _window; + /** @private */ + private static _document; + /** @private */ + private static _container; + /** @private */ + private static _pixelRatio; + /** @private */ + private static _clientWidth; + /** @private */ + private static _clientHeight; + /** @private */ + static mainCanvas: any; + /**@private */ + private static hanzi; + /**@private */ + private static fontMap; + /**@private */ + static measureText: Function; + /** + * @en Gets whether it is a mini game environment + * @returns onMiniGame || onBDMiniGame || onQGMiniGame || onKGMiniGame || onVVMiniGame || onAlipayMiniGame || onQQMiniGame || onBLMiniGame || onTTMiniGame || onHWMiniGame || onTBMiniGame + * @zh 获取是否为小游戏环境 + * @returns onMiniGame || onBDMiniGame || onQGMiniGame || onKGMiniGame || onVVMiniGame || onAlipayMiniGame || onQQMiniGame || onBLMiniGame || onTTMiniGame || onHWMiniGame || onTBMiniGame + */ + static get _isMiniGame(): boolean; + /** + * @en Creates a native browser element of the specified type. + * @param type The type of node to create. + * @return A reference to the created node object. + * @zh 创建指定类型的浏览器原生节点。 + * @param type 要创建的节点类型。 + * @return 创建的节点对象的引用。 + */ + static createElement(type: string): any; + /** + * @en Returns a reference to the first object in the Document object with the specified id. + * @param id The id of the node. + * @return The node object. + * @zh 返回 Document 对象中拥有指定 id 的第一个对象的引用。 + * @param id 节点的 id。 + * @return 节点对象。 + */ + static getElementById(id: string): any; + /** + * @en Removes the specified native browser node object from the DOM. + * @param ele The node object to be removed. + * @zh 移除指定的浏览器原生节点对象。 + * @param ele 要移除的节点对象。 + */ + static removeElement(ele: any): void; + /** + * @en Gets the current timestamp in milliseconds since the epoch. + * @zh 获取浏览器当前时间戳,单位为毫秒。 + */ + static now(): number; + /** + * @en The viewport width of the browser window. + * The method analyzes the browser information to determine the width, with a priority given to `window.innerWidth` (includes scrollbar width) > `document.body.clientWidth` (does not include scrollbar width). + * If the former is 0 or undefined, the latter is chosen. + * @zh 浏览器窗口的可视宽度。 + * 通过分析浏览器信息获得。浏览器多个属性值优先级为:window.innerWidth(包含滚动条宽度) > document.body.clientWidth(不包含滚动条宽度), + * 如果前者为 0 或未定义,则选择后者。 + */ + static get clientWidth(): number; + static set clientWidth(value: number); + /** + * @en The viewport height of the browser window. + * The method analyzes the browser information to determine the height, with a priority given to `window.innerHeight` (includes scrollbar height) > `document.body.clientHeight` (excluding scrollbar height) > `document.documentElement.clientHeight` (both do not include scrollbar height). + * If the former is 0 or undefined, it falls back to the latter. + * @zh 浏览器窗口的可视高度。 + * 通过分析浏览器信息获得。浏览器多个属性值优先级为:window.innerHeight(包含滚动条高度) > document.body.clientHeight(不包含滚动条高度) > document.documentElement.clientHeight, + * 如果前者为 0 或未定义,则选择后者。 + */ + static get clientHeight(): number; + static set clientHeight(value: number); + /** + * @en The physical width of the browser window, taking into account the device pixel ratio. + * @zh 浏览器窗口的物理宽度,考虑了设备像素比。 + */ + static get width(): number; + /** + * @en The physical height of the browser window, taking into account the device pixel ratio. + * @zh 浏览器窗口的物理高度,考虑了设备像素比。 + */ + static get height(): number; + /** + * @en The device pixel ratio of the current environment. + * @zh 当前环境的设备像素比。 + */ + static get pixelRatio(): number; + /** + * @en The canvas container that holds the canvas element, facilitating control over the canvas. + * @zh 用来存放画布元素的容器,方便对画布进行控制。 + */ + static get container(): any; + static set container(value: any); + /** + * @en Reference to the browser native window object. + * @zh 浏览器原生 window 对象的引用。 + */ + static get window(): any; + /** + * @en Reference to the browser native document object. + * @zh 浏览器原生 document 对象的引用。 + */ + static get document(): any; + /** + * @en Gets the value of a URL parameter. + * @param name The name of the parameter. + * @return The value of the parameter. + * @zh 获取 URL 参数的值。 + * @param name 参数的名称。 + * @return 参数的值。 + */ + static getQueryString(name: string): string; + /** + * @en Safari landscape toolbar offset + * @zh Safari横屏工具栏偏移 + */ + static getSafariToolbarOffset(): number; + /** + * @en Dynamically loads a JavaScript library from the specified source. + * @zh 从指定源动态加载 JavaScript 库。 + */ + static loadLib(src: string): Promise; + } + function arrayBufferSlice(this: ArrayBuffer, start: number, end: number): ArrayBuffer; + function uint8ArraySlice(this: Uint8Array): Uint8Array; + function float32ArraySlice(this: Float32Array): Float32Array; + function uint16ArraySlice(this: Uint16Array, ...arg: any[]): Uint16Array; + /** + * @en The Byte class provides methods and properties for optimizing the reading, writing, and handling of binary data. The Byte class is suitable for advanced developers who need to access data at the byte level. + * @zh Byte 类提供用于优化读取、写入以及处理二进制数据的方法和属性。Byte 类适用于需要在字节层访问数据的高级开发人员。 + */ + class Byte { + /** + * @en Host byte order, which represents the two different sequences in which a CPU can store data: little-endian and big-endian. Use getSystemEndian to obtain the byte order of the current system. + * BIG_ENDIAN byte order: The lower address stores, the higher bits of the value, and the higher address stores the lower bits. It is sometimes referred to as network byte order. + * LITTLE_ENDIAN byte order: The lower address stores, the lower bits of the value, and the higher address stores the higher bits. + * @zh 主机字节序,是 CPU 存放数据的两种不同顺序:小端字节序和大端字节序。使用 getSystemEndian 获取当前系统的字节序。 + * BIG_ENDIAN:大端字节序,地址低位存储值的高位,地址高位存储值的低位。有时也称之为网络字节序。 + * LITTLE_ENDIAN: 小端字节序,地址低位存储值的低位,地址高位存储值的高位。 + */ + static BIG_ENDIAN: string; + /** + * @en Host byte order, which represents the two different sequences in which a CPU can store data: little-endian and big-endian. Use getSystemEndian to obtain the byte order of the current system. + * LITTLE_ENDIAN byte order: The lower address stores the lower bits of the value, and the higher address stores the higher bits. + * BIG_ENDIAN byte order: The lower address stores the higher bits of the value, and the higher address stores the lower bits. It is sometimes referred to as network byte order. + * @zh 主机字节序,是 CPU 存放数据的两种不同顺序:小端字节序和大端字节序。使用 getSystemEndian 获取当前系统的字节序。 + * LITTLE_ENDIAN :小端字节序,地址低位存储值的低位,地址高位存储值的高位。 + * BIG_ENDIAN:大端字节序,地址低位存储值的高位,地址高位存储值的低位。有时也称之为网络字节序。 + */ + static LITTLE_ENDIAN: string; + /**@private */ + private static _sysEndian; + /**@private 是否为小端数据。*/ + protected _xd_: boolean; + /**@private */ + private _allocated_; + /**@private 原始数据。*/ + protected _d_: any; + /**@private DataView*/ + protected _u8d_: any; + /**@private */ + protected _pos_: number; + /**@private */ + protected _length: number; + /** + * @en Get the byte order of the current host. + * The host byte order refers to the two different sequences in which a CPU stores data, which includes little-endian and big-endian. + * BIG_ENDIAN: Big-endian byte order, where the lower address stores the higher bits of the value, and the higher address stores the lower bits. It is sometimes also called network byte order. + * LITTLE_ENDIAN: Little-endian byte order, where the lower address stores the lower bits of the value, and the higher address stores the higher bits. + * @returns The byte order of the current system. + * @zh 获取当前主机的字节序。 + * 主机字节序,是 CPU 存放数据的两种不同顺序,包括小端字节序和大端字节序。 + * BIG_ENDIAN:大端字节序,地址低位存储值的高位,地址高位存储值的低位。有时也称之为网络字节序。 + * LITTLE_ENDIAN:小端字节序,地址低位存储值的低位,地址高位存储值的高位。 + * @return 当前系统的字节序。 + */ + static getSystemEndian(): string; + /** + * @en Constructor method. + * @param data Specifies the number of elements for initialization, or a TypedArray object or ArrayBuffer object for initialization. If null, allocate a certain amount of memory in advance. When available space is not enough, use this part of the memory first, and reallocate the required memory if it is still not enough. + * @zh 构造方法 + * @param data 用于指定初始化的元素数目,或者用于初始化的TypedArray对象、ArrayBuffer对象。如果为 null ,则预分配一定的内存空间,当可用空间不足时,优先使用这部分内存,如果还不够,则重新分配所需内存。 + */ + constructor(data?: any); + /** + * @en The ArrayBuffer data of this object, which contains only the valid data part. + * @zh 此对象的 ArrayBuffer 数据,数据只包含有效数据部分。 + */ + get buffer(): ArrayBuffer; + /** + * @en The byte order of the `Byte` instance. Possible values are `BIG_ENDIAN` or `LITTLE_ENDIAN`. + * The host byte order is one of two sequences used by the CPU to store data, which includes little-endian and big-endian byte orders.The current system's byte order can be obtained using `getSystemEndian`. + * `BIG_ENDIAN`: Big-endian byte order, where the lower memory address stores the higher-order bits of a number, and is sometimes referred to as network byte order. + * `LITTLE_ENDIAN`: Little-endian byte order, where the lower memory address stores the lower-order bits of a number. + * @zh `Byte` 实例的字节序。取值为 `BIG_ENDIAN` 或 `LITTLE_ENDIAN`。 + * 主机字节序是 CPU 存放数据的两种不同顺序,包括小端字节序和大端字节序。可以通过 `getSystemEndian` 获取当前系统的字节序。 + * BIG_ENDIAN :大端字节序,地址低位存储值的高位,地址高位存储值的低位。有时也称之为网络字节序。 + * LITTLE_ENDIAN :小端字节序,地址低位存储值的低位,地址高位存储值的高位。 + */ + get endian(): string; + set endian(value: string); + /** + * @private + * @en The length of the `Byte` object, measured in bytes. + * When setting the length to a value greater than the current length, the byte array is right-padded with zeros. If the length is set to a value less than the current length, the byte array is truncated. + * If the length to be set exceeds the current allocated memory space, the memory is reallocated to the larger of either the new length or twice the current allocated length, and the original data is copied to the new memory space. If the length to be set is less than the current allocated memory space, the memory is reallocated to the new length, and the original data is truncated from the beginning to fit the new length. + * @zh `Byte` 对象的长度(以字节为单位)。 + * 如果将长度设置为大于当前长度的值,则用零填充字节数组的右侧;如果将长度设置为小于当前长度的值,将会截断该字节数组。 + * 如果要设置的长度大于当前已分配的内存空间的字节长度,则重新分配内存空间,大小为以下两者较大者:要设置的长度、当前已分配的长度的2倍,并将原有数据拷贝到新的内存空间中;如果要设置的长度小于当前已分配的内存空间的字节长度,也会重新分配内存空间,大小为要设置的长度,并将原有数据从头截断为要设置的长度存入新的内存空间中。 + */ + set length(value: number); + get length(): number; + /**@private */ + private _resizeBuffer; + /** + * @private + * @en Commonly used to parse a byte stream in a fixed format. + * First, read a `Uint16` value from the current byte offset of the byte stream, and then read a string of this length. + * @returns The read string. + * @zh 常用于解析固定格式的字节流。 + * 先从字节流的当前字节偏移位置处读取一个 `Uint16` 值,然后以此值为长度,读取此长度的字符串。 + * @return 读取的字符串。 + */ + getString(): string; + /** + * @en Commonly used to parse a byte stream in a fixed format. + * First, read a `Uint16` value from the current byte offset of the byte stream, and then read a string of this length. + * @returns The read string. + * @zh 常用于解析固定格式的字节流。 + * 先从字节流的当前字节偏移位置处读取一个 `Uint16` 值,然后以此值为长度,读取此长度的字符串。 + * @return 读取的字符串 + */ + readString(): string; + /** + * @private + * @en Reads a number of bytes specified by the `len` parameter from the byte stream starting at the position indicated by the `start` parameter, and creates a `Float32Array` object from the data. + * Note: The returned `Float32Array` object is a native HTML5 `Float32Array` object in the JavaScript environment. Reading operations on this object are based on the current host byte order of the machine running the program. This order may differ from the actual byte order of the data. If you use this object for reading, you need to be aware of the actual data's byte order and the current host byte order. If they are the same, you can read normally; otherwise, you need to wrap the actual data (`Float32Array.buffer`) with a `DataView` object to read according to the specified byte order. + * @param start The starting position. + * @param len The number of bytes to read. If the length to be read exceeds the readable range, only the values within the readable range are returned. + * @returns The read `Float32Array` object. + * @zh 从字节流中 `start` 参数指定的位置开始,读取 `len` 参数指定的字节数的数据,用于创建一个 `Float32Array` 对象并返回此对象。 + * 注意:返回的 Float32Array 对象,在 JavaScript 环境下,是原生的 HTML5 Float32Array 对象,对此对象的读取操作都是基于运行此程序的当前主机字节序,此顺序可能与实际数据的字节序不同,如果使用此对象进行读取,需要用户知晓实际数据的字节序和当前主机字节序,如果相同,可正常读取,否则需要用户对实际数据(Float32Array.buffer)包装一层 DataView ,使用 DataView 对象可按照指定的字节序进行读取。 + * @param start 开始位置。 + * @param len 需要读取的字节长度。如果要读取的长度超过可读取范围,则只返回可读范围内的值。 + * @return 读取的 Float32Array 对象。 + */ + getFloat32Array(start: number, len: number): any; + /** + * @en Reads a number of bytes specified by the `len` parameter from the byte stream starting at the position indicated by the `start` parameter, and creates a `Float32Array` object from the data. + * @param start The starting position. + * @param len The number of bytes to read. If the length to be read exceeds the readable range, only the values within the readable range are returned. + * @returns The read `Float32Array` object. + * @zh 从字节流中 `start` 参数指定的位置开始,读取 `len` 参数指定的字节数的数据,用于创建一个 `Float32Array` 对象并返回此对象。 + * @param start 开始位置。 + * @param len 需要读取的字节长度。如果要读取的长度超过可读取范围,则只返回可读范围内的值。 + * @return 读取的 Float32Array 对象。 + */ + readFloat32Array(start: number, len: number): any; + /** + * @private + * @en Reads a number of bytes specified by the `len` parameter from the byte stream starting at the position indicated by the `start` parameter, and creates a `Uint8Array` object from the data. + * @param start The starting position. + * @param len The number of bytes to read. If the length to be read exceeds the readable range, only the values within the readable range are returned. + * @returns The read `Uint8Array` object. + * @zh 从字节流中 `start` 参数指定的位置开始,读取 `len` 参数指定的字节数的数据,用于创建一个 `Uint8Array` 对象并返回此对象。 + * @param start 开始位置。 + * @param len 需要读取的字节长度。如果要读取的长度超过可读取范围,则只返回可读范围内的值。 + * @return 读取的 Uint8Array 对象。 + */ + getUint8Array(start: number, len: number): Uint8Array; + /** + * @en Reads a number of bytes specified by the `len` parameter from the byte stream starting at the position indicated by the `start` parameter, and creates a `Uint8Array` object from the data. + * @param start The starting position. + * @param len The number of bytes to read. If the length to be read exceeds the readable range, only the values within the readable range are returned. + * @returns The read `Uint8Array` object. + * @zh 从字节流中 `start` 参数指定的位置开始,读取 `len` 参数指定的字节数的数据,用于创建一个 `Uint8Array` 对象并返回此对象。 + * @param start 开始位置。 + * @param len 需要读取的字节长度。如果要读取的长度超过可读取范围,则只返回可读范围内的值。 + * @return 读取的 Uint8Array 对象。 + */ + readUint8Array(start: number, len: number): Uint8Array; + /** + * @private + * @en Reads a number of bytes specified by the `len` parameter from the byte stream starting at the position indicated by the `start` parameter, and creates an `Int16Array` object from the data. + * Note: The returned `Int16Array` object is a native HTML5 `Int16Array` object in the JavaScript environment. Reading operations on this object are based on the current host byte order. This order may differ from the actual byte order of the data. If you use this object for reading, you must be aware of the actual data's byte order and the current host byte order. If they match, you can read normally; otherwise, you need to wrap the actual data (`Int16Array.buffer`) with a `DataView` object to read according to the specified byte order. + * @param start The byte offset from the start of the stream to begin reading. + * @param len The number of bytes to read. Only values within the readable range are returned if the length exceeds the range. + * @returns The created `Int16Array` object. + * @zh 从字节流中 `start` 参数指定的位置开始,读取 `len` 参数指定的字节数的数据,用于创建一个 `Int16Array` 对象并返回此对象。 + * 注意:返回的 `Int16Array` 对象是 JavaScript 环境下原生的 HTML5 `Int16Array` 对象,对此对象的读取操作都是基于运行此程序的当前主机字节序。此顺序可能与实际数据的字节序不同,如果使用此对象进行读取,需要用户知晓实际数据的字节序和当前主机字节序,如果相同,可正常读取,否则需要用户对实际数据 (`Int16Array.buffer`) 包装一层 `DataView` 对象,使用 `DataView` 对象可按照指定的字节序进行读取。 + * @param start 开始读取的字节偏移量位置。 + * @param len 需要读取的字节长度。如果要读取的长度超过可读取范围,则只返回可读范围内的值。 + * @return 读取的 Int16Array 对象。 + */ + getInt16Array(start: number, len: number): any; + /** + * @en Reads a number of bytes specified by the `len` parameter from the byte stream starting at the position indicated by the `start` parameter, and creates an `Int16Array` object from the data. + * @param start The byte offset from the start of the stream to begin reading. + * @param len The number of bytes to read. Only values within the readable range are returned if the length exceeds the range. + * @returns The created `Int16Array` object. + * @zh 从字节流中 `start` 参数指定的位置开始,读取 `len` 参数指定的字节数的数据,用于创建一个 `Int16Array` 对象并返回此对象。 + * @param start 开始读取的字节偏移量位置。 + * @param len 需要读取的字节长度。如果要读取的长度超过可读取范围,则只返回可读范围内的值。 + * @return 读取的 Uint8Array 对象。 + */ + readInt16Array(start: number, len: number): any; + /** + * @private + * @en Reads a 32-bit floating-point number from the current position in the byte stream using IEEE 754 format. + * @returns The 32-bit floating-point number. + * @zh 从字节流的当前字节偏移位置处读取一个 IEEE 754 单精度(32 位)浮点数。 + * @return 单精度(32 位)浮点数。 + */ + getFloat32(): number; + /** + * @en Reads a 32-bit floating-point number from the current position in the byte stream using IEEE 754 format. + * @returns The 32-bit floating-point number. + * @zh 从字节流的当前字节偏移位置处读取一个 IEEE 754 单精度(32 位)浮点数。 + * @return 单精度(32 位)浮点数。 + */ + readFloat32(): number; + /** + * @private + * @en Reads a 64-bit floating-point number from the current position in the byte stream using IEEE 754 format. + * @returns The 64-bit floating-point number. + * @zh 从字节流的当前字节偏移量位置处读取一个 IEEE 754 双精度(64 位)浮点数。 + * @return 双精度(64 位)浮点数。 + */ + getFloat64(): number; + /** + * @en Reads a 64-bit floating-point number from the current position in the byte stream using IEEE 754 format. + * @returns The 64-bit floating-point number. + * @zh 从字节流的当前字节偏移量位置处读取一个 IEEE 754 双精度(64 位)浮点数。 + * @return 双精度(64 位)浮点数。 + */ + readFloat64(): number; + /** + * @en Writes an IEEE 754 single-precision (32-bit) floating point number to the byte stream at the current position. + * @param value The single-precision (32-bit) floating point number to be written. + * @zh 在字节流的当前字节偏移量位置处写入一个 IEEE 754 单精度(32 位)浮点数。 + * @param value 需要写入的单精度(32 位)浮点数。 + */ + writeFloat32(value: number): void; + /** + * @en Writes an IEEE 754 double-precision (64-bit) floating point number to the byte stream at the current position. + * @param value The double-precision (64-bit) floating point number to be written. + * @zh 在字节流的当前字节偏移量位置处写入一个 IEEE 754 双精度(64 位)浮点数。 + * @param value 需要写入的双精度(64 位)浮点数。 + */ + writeFloat64(value: number): void; + /** + * @private + * @en Reads an Int32 value from the current position in the byte stream. + * @returns The Int32 value that was read. + * @zh 从字节流的当前字节偏移量位置处读取一个 Int32 值。 + * @returns 读取的 Int32 值。 + */ + getInt32(): number; + /** + * @en Reads an Int32 value from the current position in the byte stream. + * @returns The Int32 value that was read. + * @zh 从字节流的当前字节偏移量位置处读取一个 Int32 值。 + * @returns 读取的 Int32 值。 + */ + readInt32(): number; + /** + * @private + * @en Reads a Uint32 value from the current position in the byte stream. + * @returns The Uint32 value that was read. + * @zh 从字节流的当前字节偏移量位置处读取一个 Uint32 值。 + * @returns 读取的 Uint32 值。 + */ + getUint32(): number; + /** + * @en Reads a Uint32 value from the current position in the byte stream. + * @returns The Uint32 value that was read. + * @zh 从字节流的当前字节偏移量位置处读取一个 Uint32 值。 + * @returns 读取的 Uint32 值。 + */ + readUint32(): number; + /** + * @en Writes the specified Int32 value to the byte stream at the current position. + * @param value The Int32 value to be written. + * @zh 在字节流的当前字节偏移量位置处写入指定的 Int32 值。 + * @param value 需要写入的 Int32 值。 + */ + writeInt32(value: number): void; + /** + * @en Writes the specified Uint32 value to the byte stream at the current position. + * @param value The Uint32 value to be written. + * @zh 在字节流的当前字节偏移量位置处写入 Uint32 值。 + * @param value 需要写入的 Uint32 值。 + */ + writeUint32(value: number): void; + /** + * @private + * @en Reads an Int16 value from the current byte offset in the byte stream. + * @returns The Int16 value that was read. + * @zh 从字节流的当前字节偏移量位置处读取一个 Int16 值。 + * @returns 读取的 Int16 值。 + */ + getInt16(): number; + /** + * @en Reads an Int16 value from the current byte offset in the byte stream. + * @returns The Int16 value that was read. + * @zh 从字节流的当前字节偏移量位置处读取一个 Int16 值。 + * @returns 读取的 Int16 值。 + */ + readInt16(): number; + /** + * @private + * @en Reads a Uint16 value from the current byte offset in the byte stream. + * @returns The Uint16 value that was read. + * @zh 从字节流的当前字节偏移量位置处读取一个 Uint16 值。 + * @returns 读取的 Uint16 值。 + */ + getUint16(): number; + /** + * @en Reads a Uint16 value from the current byte offset in the byte stream. + * @returns The Uint16 value that was read. + * @zh 从字节流的当前字节偏移量位置处读取一个 Uint16 值。 + * @returns 读取的 Uint16 值。 + */ + readUint16(): number; + /** + * @en Writes the specified Uint16 value to the byte stream at the current byte offset. + * @param value The Uint16 value to be written. + * @zh 在字节流的当前字节偏移量位置处写入指定的 Uint16 值。 + * @param value 需要写入的 Uint16 值。 + */ + writeUint16(value: number): void; + /** + * @en Writes the specified Int16 value to the byte stream at the current byte offset. + * @param value The Int16 value to be written. + * @zh 在字节流的当前字节偏移量位置处写入指定的 Int16 值。 + * @param value 需要写入的 Int16 值。 + */ + writeInt16(value: number): void; + /** + * @private + * @en Reads a Uint8 value from the current byte offset in the byte stream. + * @returns The Uint8 value that was read. + * @zh 从字节流的当前字节偏移量位置处读取一个 Uint8 值。 + * @returns 读取的 Uint8 值。 + */ + getUint8(): number; + /** + * @en Reads a Uint8 value from the current byte offset in the byte stream. + * @returns The Uint8 value that was read. + * @zh 从字节流的当前字节偏移量位置处读取一个 Uint8 值。 + * @returns 读取的 Uint8 值。 + */ + readUint8(): number; + /** + * @en Writes the specified Uint8 value to the byte stream at the current byte offset. + * @param value The Uint8 value to be written. + * @zh 在字节流的当前字节偏移量位置处写入指定的 Uint8 值。 + * @param value 需要写入的 Uint8 值。 + */ + writeUint8(value: number): void; + /** + * @private + * 读取指定长度的 UTF 型字符串。 + * @param len 需要读取的长度。 + * @return 读取的字符串。 + */ + private _rUTF; + /** + * @private + * @en Reads a string of the specified length. + * @param len The length of the string to read. + * @returns The string of the specified length. + * @zh 读取指定长度的字符串。 + * @param len 要读取的字符串的长度。 + * @returns 指定长度的字符串。 + */ + getCustomString(len: number): string; + /** + * @private + * @en Reads a string of the specified length. + * @param len The length of the string to read. + * @returns The string of the specified length. + * @zh 读取指定长度的字符串。 + * @param len 要读取的字符串的长度。 + * @returns 指定长度的字符串。 + */ + readCustomString(len: number): string; + /** + * @en The current position of the Byte object's read/write pointer (in bytes). + * When reading, the next read operation will start at this position. When writing, the next write operation will start at this position. + * @zh Byte对象的读写指针的当前位置(以字节为单位)。 + * 下一次调用读取方法时将在此位置开始读取,或者下一次调用写入方法时将在此位置开始写入。 + */ + get pos(): number; + set pos(value: number); + /** + * @en The number of bytes available to read from the current position to the end of the byte stream. + * @zh 从当前位置到字节流末尾可读取的数据的字节数。 + */ + get bytesAvailable(): number; + /** + * @en Clears the content of the byte array and resets the length and pos properties to 0. Calling this method will release the memory occupied by the Byte instance. + * @zh 清除字节数组的内容,并将 length 和 pos 属性重置为 0。调用此方法将释放 Byte 实例占用的内存。 + */ + clear(): void; + /** + * @en Writes a UTF-8 string to the byte stream. Similar to the writeUTF() method, but writeUTFBytes() does not prefix the string with a 16-bit length word. + * The corresponding reading method is getUTFBytes. + * @param value The string to write. + * @zh 将 UTF-8 字符串写入字节流。类似于 writeUTF() 方法,但 writeUTFBytes() 不使用 16 位长度的字节为字符串添加前缀。 + * 对应的读取方法为: getUTFBytes 。 + * @param value 要写入的字符串。 + */ + writeUTFBytes(value: string): void; + /** + * @en Writes a UTF-8 string to the byte stream. First, the length of the UTF-8 string in bytes is written (as a 16-bit integer), followed by the bytes representing the string characters. + * The corresponding reading method is getUTFString. + * @param value The string value to write. + * @zh 将 UTF-8 字符串写入字节流。先写入以字节表示的 UTF-8 字符串长度(作为 16 位整数),然后写入表示字符串字符的字节。 + * 对应的读取方法为: getUTFString 。 + * @param value 要写入的字符串值。 + */ + writeUTFString(value: string): void; + /** + * @en Writes a UTF-8 string to the byte stream. First, the length of the UTF-8 string in bytes is written (as a 32-bit integer), followed by the bytes representing the string characters. + * @param value The string value to write. + * @zh 将 UTF-8 字符串写入字节流。先写入以字节表示的 UTF-8 字符串长度(作为 32 位整数),然后写入表示字符串字符的字节。 + * @param value 要写入的字符串值。 + */ + writeUTFString32(value: string): void; + /** + * @private + * @en Reads a UTF-8 string. + * @returns The read string. + * @zh 读取 UTF-8 字符串。 + * @returns 读取的字符串。 + */ + readUTFString(): string; + /** + * @private + * @en Reads a UTF-8 string that was written with the writeUTFString32() method. + * @zh 读取由 writeUTFString32() 方法写入的 UTF-8 字符串。 + */ + readUTFString32(): string; + /** + * @en Reads a UTF-8 string from the byte stream, assuming the string is prefixed with an unsigned short indicating the length to read. + * The corresponding writing method is writeUTFString. + * @returns The read string. + * @zh 从字节流中读取一个 UTF-8 字符串,假定字符串的前缀是一个无符号的短整型(以此字节表示要读取的长度)。 + * 对应的写入方法为:writeUTFString。 + * @returns 读取的字符串。 + */ + getUTFString(): string; + /** + * @private + * @en Reads a string that must have been written with the writeUTFBytes method. + * @param len The length of the buffer to read. If set to -1, all data in the buffer will be read. + * @returns The read string. + * @zh 读字符串,必须是 writeUTFBytes 方法写入的字符串。 + * @param len 要读的buffer长度,默认将读取缓冲区全部数据。 + * @returns 读取的字符串。 + */ + readUTFBytes(len?: number): string; + /** + * @en Reads a UTF-8 byte sequence of a specified length from the byte stream and returns a string. + * Typically used to read strings written with the writeUTFBytes method. + * @param len The length of the buffer to read. If set to -1, all data in the buffer will be read. + * @returns The read string. + * @zh 从字节流中读取一个由 length 参数指定的长度的 UTF-8 字节序列,并返回一个字符串。 + * 一般读取的是由 writeUTFBytes 方法写入的字符串。 + * @param len 要读的buffer长度,默认将读取缓冲区全部数据。 + * @returns 读取的字符串。 + */ + getUTFBytes(len?: number): string; + /** + * @en Writes a byte to the byte stream. Only the lower 8 bits of the parameter are used. The higher 24 bits are ignored. + * @param value The byte to write (0-255). + * @zh 在字节流中写入一个字节。只使用参数的低 8 位。忽略高 24 位。 + * @param value 要写入的字节(0-255)。 + */ + writeByte(value: number): void; + /** + * @en Reads a signed byte from the byte stream. The return value is in the range of -128 to 127. + * @returns An integer between -128 and 127. + * @zh 从字节流中读取带符号的字节。返回值的范围是从 -128 到 127。 + * @returns 介于 -128 和 127 之间的整数。 + */ + readByte(): number; + /** + * @private + * @en Reads a signed byte from the byte stream. + * @zh 从字节流中读取带符号的字节。 + */ + getByte(): number; + /** + * @en Writes a byte sequence from the specified arraybuffer object into the byte stream, starting at the offset and with the specified length. + * If the length parameter is omitted, the default length of 0 is used, and the method writes the entire buffer from the offset, if the offset is also omitted, the entire buffer is written. + * The function will throw an exception if the offset or length is less than 0. + * @param arraybuffer The ArrayBuffer object to write from. + * @param offset The offset index of the ArrayBuffer object (in bytes). + * @param length The length to write from the ArrayBuffer object into the Byte object (in bytes). + * @zh 将指定 arraybuffer 对象中的以 offset 为起始偏移量,length 为长度的字节序列写入字节流。 + * 如果省略 length 参数,则使用默认长度 0,该方法将从 offset 开始写入整个缓冲区;如果还省略了 offset 参数,则写入整个缓冲区。 + * 如果 offset 或 length 小于0,本函数将抛出异常。 + * @param arraybuffer 需要写入的 Arraybuffer 对象。 + * @param offset Arraybuffer 对象的索引的偏移量(以字节为单位)。 + * @param length 从 Arraybuffer 对象写入到 Byte 对象的长度(以字节为单位)。 + */ + writeArrayBuffer(arraybuffer: any, offset?: number, length?: number): void; + /** + * @en Reads an ArrayBuffer of the specified length from the byte stream. + * @param length The length of the ArrayBuffer to read. + * @zh 读取ArrayBuffer数据,长度由参数指定。 + * @param length 要读取的ArrayBuffer的长度。 + */ + readArrayBuffer(length: number): ArrayBuffer; + } + /** + * @private + * @en The Cache Manager is a centralized management class for object caching. + * @zh 对象缓存统一管理类。 + */ + class CacheManger { + /** + * @en The maximum allowable execution time for a single cleanup check, in milliseconds. + * @zh 单次清理检测允许执行的时间,单位ms。 + */ + static loopTimeLimit: number; + /** + * @private + */ + private static _cacheList; + /** + * @private + * 当前检测的索引 + */ + private static _index; + constructor(); + /** + * @en Register a cache management function. + * @param disposeFunction The function used to dispose of the cache, with the signature fun(force:Boolean). + * @param getCacheListFunction The function used to retrieve the cache list, with the signature fun():Array. + * @zh 注册cache管理函数。 + * @param disposeFunction 释放函数, fun(force:Boolean)。 + * @param getCacheListFunction 获取cache列表函数, fun():Array。 + */ + static regCacheByFunction(disposeFunction: Function, getCacheListFunction: Function): void; + /** + * @en Unregister a cache management function. + * @param disposeFunction Release function fun(force:Boolean) + * @param getCacheListFunction Get cache list function fun():Array + * @zh 移除cache管理函数。 + * @param disposeFunction 释放函数 fun(force:Boolean) + * @param getCacheListFunction 获取cache列表函数fun():Array + */ + static unRegCacheByFunction(disposeFunction: Function, getCacheListFunction: Function): void; + /** + * @en Force the disposal of all managed caches. + * @zh 强制清理所有管理器。 + */ + static forceDispose(): void; + /** + * @en Start the check loop with a specified interval time. + * @param waitTime The interval time between checks, in milliseconds. + * @zh 开始检测循环。 + * @param waitTime 检测间隔时间,单位毫秒。 + */ + static beginCheck(waitTime?: number): void; + /** + * @en Stop the check loop. + * @zh 停止检测循环。 + */ + static stopCheck(): void; + /** + * @private + * 检测函数 + */ + private static _checkLoop; + } + /** + * @private + * @en The CallLater class is responsible for managing delayed function calls. + * @zh CallLater 类用于管理延迟执行的函数调用。 + */ + class CallLater { + /** + * @en Instance of CallLater. + * @zh CallLater的实例。 + */ + static I: CallLater; + /**@private */ + private _pool; + /**@private */ + private _map; + /**@private */ + private _laters; + /** @private */ + private _getHandler; + /** + * @en Delay execution + * @param caller The execution context (this). + * @param method Timer callback function. + * @param args The arguments to be passed to the callback function. + * @zh 延迟执行。 + * @param caller 执行域(this)。 + * @param method 定时器回调函数。 + * @param args 要传递给回调函数的参数。 + */ + callLater(caller: any, method: Function, args?: any[]): void; + /** + * @en Immediately execute a scheduled callLater. + * @param caller The execution context (this). + * @param method The callback function to be executed. + * @zh 立即执行 callLater。 + * @param caller 执行域(this)。 + * @param method 要执行的回调函数。 + */ + runCallLater(caller: any, method: Function): void; + /** + * @en Clear the specified callLater. + * @param caller The execution context (this). + * @param method The callback function to be cleared. + * @zh 清除指定的 callLater。 + * @param caller 执行域(this)。 + * @param method 要清除的回调函数。 + */ + clear(caller: any, method: Function): boolean; + /** + * @en Clear all scheduled callLater for a specific caller. + * @param caller The caller object to clear all scheduled calls for. + * @zh 清除指定执行域中的所有callLater。 + * @param caller 执行域(this)。 + */ + clearAll(caller: any): void; + } + /** + * @en The ClassUtils is a utility class for class operations. + * @zh ClassUtils 是一个类工具的类。 + */ + class ClassUtils { + static _classMap: Record; + /** + * @en Registers a class mapping for easy retrieval during class reflection. + * @param className The name or alias for the class mapping. + * @param classDef The full name of the class or a reference to the class. + * @zh 注册 Class 映射,方便在类反射时获取。 + * @param className 映射的名字或者别名。 + * @param classDef 类的全名或者类的引用,全名比如:"laya.Sprite"。 + */ + static regClass(className: string, classDef: any): void; + /** + * @en Returns the class object based on the class name. + * @param className The class name (e.g., "laya.display.Sprite") or a registered alias (e.g., "Sprite"). + * @return The class object. + * @zh 根据类名返回类对象。 + * @param className 类名(比如 "laya.display.Sprite")或者注册的别名(比如 "Sprite")。 + * @return 类对象。 + */ + static getClass(className: string): any; + /** + * @en Creates an instance of a class based on the class name. + * @param className The class name (e.g., "laya.display.Sprite") or a registered alias (e.g., "Sprite"). + * @return An instance of the class. + * @zh 根据名称创建 Class 实例。 + * @param className 类名(比如 "laya.display.Sprite")或者注册的别名(比如 "Sprite")。 + * @return 返回类的实例。 + */ + static getInstance(className: string): any; + } + /** + * @private + * @en The ColorUtils is a class for color value processing. + * @zh ColorUtils 是一个用于处理颜色值的类。 + */ + class ColorUtils { + /**@private */ + static _SAVE: any; + /**@private */ + static _SAVE_SIZE: number; + /**@private */ + /**@private */ + private static _DEFAULT; + /** + * @en An array representing the color in RGBA format, Value range 0-1 + * @zh 以 RGBA 格式表示颜色的数组,取值范围0-1 + */ + arrColor: any[]; + /** + * @en The string representation of the color value. + * @zh 字符串型颜色值。 + */ + strColor: string; + /** + * @en The uint representation of the color value. + * @zh uint 型颜色值。 + */ + numColor: number; + /** + * @en Constructor method. + * @param value The color value, which can be a string (e.g., "#ff0000") or a hexadecimal color (e.g., 0xff0000). + * @zh 构造方法 + * @param value 颜色值,可以是字符串(例如 "#ff0000")或16进制颜色值(例如 0xff0000)。 + */ + constructor(value: any); + /**@private */ + static _initDefault(): any; + /** + * @private + * @en Clears the cache if it gets too large. + * @zh 如果缓存太大,则清理缓存。 + */ + static _initSaveMap(): void; + /** + * @en Creates and returns an instance of the Color class based on the specified color value. + * @param value The color value, which can be a string (e.g., "#ff0000") or a hexadecimal color (e.g., 0xff0000). + * @returns An instance of the Color class. + * @zh 根据指定的颜色值创建并返回一个 Color 类的实例,可以是字符串(例如 "#ff0000")或16进制颜色值(例如 0xff0000)。 + * @param value 颜色值,可以是字符串:"#ff0000"或者16进制颜色 0xff0000。 + * @returns Color 类的一个实例。 + */ + static create(value: any): ColorUtils; + } + /** + * @en Delegate class for managing and invoking callbacks + * This class provides functionality to add, remove, and invoke callback functions. + * It supports one-time callbacks and can manage callbacks with different targets and arguments. + * @zh Delegate类,用于管理和调用回调函数 + * 这个类提供了添加、移除和调用回调函数的功能。 + * 它支持一次性回调,并且可以管理具有不同目标对象和参数的回调函数。 + */ + class Delegate { + private _flag; + private _items; + constructor(); + /** + * @en Add a callback function + * @param callback The callback function + * @param target The target object of the callback + * @param args Arguments for the callback + * @zh 添加回调函数 + * @param callback 回调函数 + * @param target 回调函数的目标对象 + * @param args 回调函数的参数 + */ + add(callback: Function, target?: any, args?: any[]): void; + /** + * @en Add a callback function that will only be executed once + * @param callback The callback function + * @param target The target object of the callback + * @param args Arguments for the callback + * @zh 添加只执行一次的回调函数 + * @param callback 回调函数 + * @param target 回调函数的目标对象 + * @param args 回调函数的参数 + */ + once(callback: Function, target?: any, args?: any[]): void; + /** + * @en Remove a callback function + * @param callback The callback function to remove + * @param target The target object of the callback + * @zh 移除回调函数 + * @param callback 要移除的回调函数 + * @param target 回调函数的目标对象 + */ + remove(callback: Function, target?: any): void; + /** + * @en Clear all callback functions + * @zh 清除所有回调函数 + */ + clear(): void; + /** + * @en Clear all callback functions for a specific target + * @param target The target object + * @zh 清除指定目标对象的所有回调函数 + * @param target 目标对象 + */ + clearForTarget(target: any): void; + /** + * @en Get the number of callback functions + * @zh 获取回调函数的数量 + */ + get count(): number; + /** + * @en Invoke all callback functions + * @param args Arguments for the invocation + * @zh 调用所有回调函数 + * @param args 调用参数 + */ + invoke(...args: any[]): void; + } + /** + * @private + * @en The `Dragging` class is a touch sliding control. + * @zh `Dragging` 类是触摸滑动控件。 + */ + class Dragging { + /** + * @en The object being dragged. + * @zh 被拖动的对象。 + */ + target: Sprite; + /** + * @en The damping ratio for easing. + * @zh 缓动衰减系数。 + */ + ratio: number; + /** + * @en The maximum offset per frame. + * @zh 单帧最大偏移量。 + */ + maxOffset: number; + /** + * @en The sliding area. + * @zh 滑动范围。 + */ + area: Rectangle; + /** + * @en Indicates whether the dragging has inertia. + * @zh 表示拖动是否有惯性。 + */ + hasInertia: boolean; + /** + * @en The maximum elastic distance. + * @zh 橡皮筋最大值。 + */ + elasticDistance: number; + /** + * @en The time for elastic back in milliseconds. + * @zh 橡皮筋回弹时间,单位为毫秒。 + */ + elasticBackTime: number; + /** + * @en The event data carried along. + * @zh 事件携带数据。 + */ + data: any; + private _dragging; + private _clickOnly; + private _elasticRateX; + private _elasticRateY; + private _lastX; + private _lastY; + private _offsetX; + private _offsetY; + private _offsets; + private _tween; + private _parent; + /** + * @en Start dragging. + * @param target The Sprite object to be dragged. + * @param area The area within which the object can be dragged. + * @param hasInertia Indicates whether the dragging has inertia. + * @param elasticDistance The maximum elastic distance allowed for the drag. + * @param elasticBackTime The time in milliseconds for the elastic back effect. + * @param data Any data to be carried with the event. + * @param ratio The damping ratio for inertia. + * @zh 开始拖拽。 + * @param target 待拖拽的 Sprite 对象。 + * @param area 滑动范围。 + * @param hasInertia 拖动是否有惯性。 + * @param elasticDistance 橡皮筋最大值。 + * @param elasticBackTime 橡皮筋回弹时间,单位为毫秒。 + * @param data 事件携带数据。 + * @param ratio 惯性阻尼系数。 + */ + start(target: Sprite, area: Rectangle, hasInertia: boolean, elasticDistance: number, elasticBackTime: number, data: any, ratio?: number): void; + /** + * 清除计时器。 + */ + private clearTimer; + /** + * @en Stop dragging + * @zh 停止拖拽。 + */ + stop(): void; + /** + * 拖拽的循环处理函数。 + */ + private loop; + /** + * 拖拽区域检测。 + */ + private checkArea; + /** + * 移动至设定的拖拽区域。 + */ + private backToArea; + /** + * 舞台的抬起事件侦听函数。 + * @param e Event 对象。 + */ + private onStageMouseUp; + /** + * 橡皮筋效果检测。 + */ + private checkElastic; + /** + * 移动。 + */ + private tweenMove; + /** + * 结束拖拽。 + */ + private clear; + } + /** + * @en The `Ease` class defines easing functions for Tween animations to achieve various transition effects. + * @zh `Ease` 类定义了缓动函数,用于实现 Tween 动画的缓动效果,以便于创建各种转换效果。 + */ + class Ease { + /** + * @en Define continuous motion without acceleration. + * @param t Current time between 0 and the duration (inclusive). + * @param b The initial value of the animated property. + * @param c The total change in the animated property. + * @param d The duration of the motion. + * @returns The value of the interpolated property at the specified time. + * @zh 定义无加速持续运动。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @return 指定时间的插补属性的值。 + */ + static linearNone(t: number, b: number, c: number, d: number): number; + /** + * @en Define continuous motion without acceleration. + * @param t Current time between 0 and the duration (inclusive). + * @param b The initial value of the animated property. + * @param c The total change in the animated property. + * @param d The duration of the motion. + * @returns The value of the interpolated property at the specified time. + * @zh 定义无加速持续运动。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @return 指定时间的插补属性的值。 + */ + static linearIn(t: number, b: number, c: number, d: number): number; + /** + * @en Define continuous motion without acceleration. + * @param t Current time between 0 and the duration (inclusive). + * @param b The initial value of the animated property. + * @param c The total change in the animated property. + * @param d The duration of the motion. + * @returns The value of the interpolated property at the specified time. + * @zh 定义无加速持续运动。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @return 指定时间的插补属性的值。 + */ + static linearInOut(t: number, b: number, c: number, d: number): number; + /** + * @en Define continuous motion without acceleration. + * @param t Current time between 0 and the duration (inclusive). + * @param b The initial value of the animated property. + * @param c The total change in the animated property. + * @param d The duration of the motion. + * @returns The value of the interpolated property at the specified time. + * @zh 定义无加速持续运动。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @return 指定时间的插补属性的值。 + */ + static linearOut(t: number, b: number, c: number, d: number): number; + /** + * @en Starts the motion with zero velocity, then accelerates the motion. + * The motion is similar to a ball falling towards the floor and bouncing back with decreasing rebounds. + * @param t Current time between 0 and the duration (inclusive). + * @param b The initial value of the animated property. + * @param c The total change in the property's value. + * @param d The duration of the motion. + * @returns The value of the interpolated property at the specified time. + * @zh 方法以零速率开始运动,然后在执行时加快运动速度。 + * 它的运动是类似一个球落向地板又弹起后,几次逐渐减小的回弹运动。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @return 指定时间的插补属性的值。 + */ + static bounceIn(t: number, b: number, c: number, d: number): number; + /** + * @en Starts the motion with zero velocity, accelerates, and then decelerates to zero velocity. + * The motion is similar to a ball falling towards the floor and bouncing back with decreasing rebounds. + * @param t Current time between 0 and the duration (inclusive). + * @param b The initial value of the animated property. + * @param c The total change in the property's value. + * @param d The duration of the motion. + * @returns The value of the interpolated property at the specified time. + * @zh 开始运动时速率为零,先对运动进行加速,再减速直到速率为零。 + * 它的运动是类似一个球落向地板又弹起后,几次逐渐减小的回弹运动。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @return 指定时间的插补属性的值。 + */ + static bounceInOut(t: number, b: number, c: number, d: number): number; + /** + * @en Begins the motion at a faster velocity, then decelerates until the velocity is zero. + * The motion is similar to a ball falling towards the floor and bouncing back with decreasing rebounds. + * @param t Current time between 0 and the duration (inclusive). + * @param b The initial value of the animated property. + * @param c The total change in the property's value. + * @param d The duration of the motion. + * @returns The value of the interpolated property at the specified time. + * @zh 以较快速度开始运动,然后在执行时减慢运动速度,直至速率为零。 + * 它的运动是类似一个球落向地板又弹起后,几次逐渐减小的回弹运动。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @return 指定时间的插补属性的值。 + */ + static bounceOut(t: number, b: number, c: number, d: number): number; + /** + * @en Starts the motion with a backward movement, then moves towards the target in the opposite direction, overshoots, and then returns. + * @param t Current time between 0 and the duration, inclusive. + * @param b The initial value of the animation property at the start. + * @param c The total change in the property's value that occurs during the animation. + * @param d The total duration of the motion. + * @param s The overshoot amount. The larger the value, the greater the overshoot. + * @returns The value of the interpolation attribute for the specified time. + * @zh 开始时往后运动,然后反向朝目标移动。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @param s 指定过冲量,此处数值越大,过冲越大。 + * @return 指定时间的插补属性的值。 + */ + static backIn(t: number, b: number, c: number, d: number, s?: number): number; + /** + * @en Starts the motion with a backward movement, then moves towards the target, overshoots slightly, reverses direction again, and finally moves towards the target. + * @param t Current time between 0 and the duration, inclusive. + * @param b The initial value of the animation property at the start. + * @param c The total change in the property's value that occurs during the animation. + * @param d The total duration of the motion. + * @param s The overshoot amount. The larger the value, the greater the overshoot. + * @returns The value of the interpolation attribute for the specified time. + * @zh 开始运动时是向后跟踪,再倒转方向并朝目标移动,稍微过冲目标,然后再次倒转方向,回来朝目标移动。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @param s 指定过冲量,此处数值越大,过冲越大。 + * @return 指定时间的插补属性的值。 + */ + static backInOut(t: number, b: number, c: number, d: number, s?: number): number; + /** + * @en Starts the motion towards the target, overshoots slightly, then reverses direction and moves back towards the target. + * @param t Current time between 0 and the duration, inclusive. + * @param b The initial value of the animation property at the start. + * @param c The total change in the property's value that occurs during the animation. + * @param d The total duration of the motion. + * @param s The overshoot amount. The larger the value, the greater the overshoot. + * @returns The value of the interpolation attribute for the specified time. + * @zh 开始运动时是朝目标移动,稍微过冲,再倒转方向回来朝着目标。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @param s 指定过冲量,此处数值越大,过冲越大。 + * @return 指定时间的插补属性的值。 + */ + static backOut(t: number, b: number, c: number, d: number, s?: number): number; + /** + * @en Starts the motion from zero velocity, then accelerates. + * The motion is defined by a sine wave that elastically decays in an exponential manner. + * @param t Current time between 0 and the duration, inclusive. + * @param b The initial value of the animated property. + * @param c The total change in the property's value. + * @param d The duration of the motion. + * @param a The amplitude of the sine wave. + * @param p The period of the sine wave in milliseconds. + * @return The value of the interpolation attribute for the specified time. + * @zh 方法以零速率开始运动,然后在执行时加快运动速度。 + * 其中的运动由按照指数方式衰减的正弦波来定义。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @param a 指定正弦波的幅度。 + * @param p 指定正弦波的周期。 + * @return 指定时间的插补属性的值。 + */ + static elasticIn(t: number, b: number, c: number, d: number, a?: number, p?: number): number; + /** + * @en Starts the motion with zero velocity, accelerates, and then decelerates to zero velocity. + * The motion is defined by a sine wave that elastically decays in an exponential manner. + * @param t Current time between 0 and the duration, inclusive. + * @param b The initial value of the animated property. + * @param c The total change in the property's value. + * @param d The duration of the motion. + * @param a The amplitude of the sine wave. + * @param p The period of the sine wave in milliseconds. + * @return The value of the interpolation attribute for the specified time. + * @zh 开始运动时速率为零,先对运动进行加速,再减速直到速率为零。 + * 其中的运动由按照指数方式衰减的正弦波来定义。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @param a 指定正弦波的幅度。 + * @param p 指定正弦波的周期。 + * @return 指定时间的插补属性的值。 + */ + static elasticInOut(t: number, b: number, c: number, d: number, a?: number, p?: number): number; + /** + * @en Starts the motion at a faster velocity, then decelerates until the velocity reaches zero. + * The motion is defined by a sine wave that decays in an exponential manner. + * @param t Current time between 0 and the duration, inclusive. + * @param b The initial value of the animated property. + * @param c The total change in the property's value. + * @param d The duration of the motion. + * @param a The amplitude of the sine wave. + * @param p The period of the sine wave in milliseconds. + * @return The value of the interpolation attribute for the specified time. + * @zh 以较快速度开始运动,然后在执行时减慢运动速度,直至速率为零。 + * 其中的运动由按照指数方式衰减的正弦波来定义。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @param a 指定正弦波的幅度。 + * @param p 指定正弦波的周期。 + * @return 指定时间的插补属性的值。 + */ + static elasticOut(t: number, b: number, c: number, d: number, a?: number, p?: number): number; + /** + * @en Starts the motion from zero velocity and then accelerates rapidly. + * @param t Current time between 0 and the duration, inclusive. + * @param b The initial value of the animated property. + * @param c The total change in the property's value. + * @param d The duration of the motion. + * @return The value of the interpolation attribute for the specified time. + * @zh 以零速率开始运动,然后在执行时加快运动速度。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @return 指定时间的插补属性的值。 + */ + static strongIn(t: number, b: number, c: number, d: number): number; + /** + * @en At the beginning of the motion, the velocity is zero. Accelerate the motion first, then decelerate until the velocity is zero. + * @param t Current time between 0 and the duration, inclusive. + * @param b The initial value of the animated property. + * @param c The total change in the property's value. + * @param d The duration of the motion. + * @return The value of the interpolation attribute for the specified time. + * @zh 开始运动时速率为零,先对运动进行加速,再减速直到速率为零。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @return 指定时间的插补属性的值。 + */ + static strongInOut(t: number, b: number, c: number, d: number): number; + /** + * @en Start moving at a faster speed, then slow down the motion speed during execution until the speed reaches zero. + * @param t Current time between 0 and the duration, inclusive. + * @param b The initial value of the animated property. + * @param c The total change in the property's value. + * @param d The duration of the motion. + * @return The value of the interpolation attribute for the specified time. + * @zh 以较快速度开始运动,然后在执行时减慢运动速度,直至速率为零。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @return 指定时间的插补属性的值。 + */ + static strongOut(t: number, b: number, c: number, d: number): number; + /** + * @en Starts the motion with zero velocity, accelerates the motion, and then decelerates to zero velocity. + * The motion acceleration in the Sine slow motion equation is smaller than that in the Quad equation. + * @param t Current time between 0 and the duration, inclusive. + * @param b The initial value of the animated property. + * @param c The total change in the property's value. + * @param d The duration of the motion. + * @return The value of the interpolation attribute for the specified time. + * @zh 开始运动时速率为零,先对运动进行加速,再减速直到速率为零。 + * Sine 缓动方程中的运动加速度小于 Quad 方程中的运动加速度。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @return 指定时间的插补属性的值。 + */ + static sineInOut(t: number, b: number, c: number, d: number): number; + /** + * @en Starts the motion from zero velocity, then accelerates the motion. + * The motion acceleration in the Sine slow motion equation is smaller than that in the Quad equation. + * @param t Current time between 0 and the duration, inclusive. + * @param b The initial value of the animated property. + * @param c The total change in the property's value. + * @param d The duration of the motion. + * @return The value of the interpolation attribute for the specified time. + * @zh 以零速率开始运动,然后在执行时加快运动速度。 + * Sine 缓动方程中的运动加速度小于 Quad 方程中的运动加速度。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @return 指定时间的插补属性的值。 + */ + static sineIn(t: number, b: number, c: number, d: number): number; + /** + * @en Starts the motion at a faster pace, then decelerates until the velocity reaches zero. + * The motion acceleration in the Sine slow motion equation is smaller than that in the Quad equation. + * @param t Current time between 0 and the duration, inclusive. + * @param b The initial value of the animated property. + * @param c The total change in the property's value. + * @param d The duration of the motion. + * @return The value of the interpolation attribute for the specified time. + * @zh 以较快速度开始运动,然后在执行时减慢运动速度,直至速率为零。 + * Sine 缓动方程中的运动加速度小于 Quad 方程中的运动加速度。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @return 指定时间的插补属性的值。 + */ + static sineOut(t: number, b: number, c: number, d: number): number; + /** + * @en Start moving at zero speed and then accelerate the motion speed during execution. + * The motion acceleration of the Quint slow motion equation is greater than that of the Quart slow motion equation. + * @param t Current time between 0 and the duration, inclusive. + * @param b The initial value of the animated property. + * @param c The total change in the property's value. + * @param d The duration of the motion. + * @return The value of the interpolation attribute for the specified time. + * @zh 以零速率开始运动,然后在执行时加快运动速度。 + * Quint 缓动方程的运动加速大于 Quart 缓动方程。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @return 指定时间的插补属性的值。 + */ + static quintIn(t: number, b: number, c: number, d: number): number; + /** + * @en At the beginning of the motion, the velocity is zero. Accelerate the motion first, then decelerate until the velocity is zero. + * The motion acceleration of the Quint slow motion equation is greater than that of the Quart slow motion equation. + * @param t Current time between 0 and the duration, inclusive. + * @param b The initial value of the animated property. + * @param c The total change in the property's value. + * @param d The duration of the motion. + * @return The value of the interpolation attribute for the specified time. + * @zh 开始运动时速率为零,先对运动进行加速,再减速直到速率为零。 + * Quint 缓动方程的运动加速大于 Quart 缓动方程。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @return 指定时间的插补属性的值。 + */ + static quintInOut(t: number, b: number, c: number, d: number): number; + /** + * @en Start moving at a faster speed, then slow down the motion speed during execution until the speed reaches zero. + * The motion acceleration of the Quint slow motion equation is greater than that of the Quart slow motion equation. + * @param t Current time between 0 and the duration, inclusive. + * @param b The initial value of the animated property. + * @param c The total change in the property's value. + * @param d The duration of the motion. + * @return The value of the interpolation attribute for the specified time. + * @zh 以较快速度开始运动,然后在执行时减慢运动速度,直至速率为零。 + * Quint 缓动方程的运动加速大于 Quart 缓动方程。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @return 指定时间的插补属性的值。 + */ + static quintOut(t: number, b: number, c: number, d: number): number; + /** + * @en The method starts at zero speed and then accelerates the motion speed during execution. + * The motion acceleration of the Quart slow motion equation is greater than that of the Cubic slow motion equation. + * @param t Current time between 0 and the duration, inclusive. + * @param b The initial value of the animated property. + * @param c The total change in the property's value. + * @param d The duration of the motion. + * @return The value of the interpolation attribute for the specified time. + * @zh 方法以零速率开始运动,然后在执行时加快运动速度。 + * Quart 缓动方程的运动加速大于 Cubic 缓动方程。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @return 指定时间的插补属性的值。 + */ + static quartIn(t: number, b: number, c: number, d: number): number; + /** + * @en At the beginning of the motion, the velocity is zero. Accelerate the motion first, then decelerate until the velocity is zero. + * The motion acceleration of the Quart slow motion equation is greater than that of the Cubic slow motion equation. + * @param t Current time between 0 and the duration, inclusive. + * @param b The initial value of the animated property. + * @param c The total change in the property's value. + * @param d The duration of the motion. + * @return The value of the interpolation attribute for the specified time. + * @zh 开始运动时速率为零,先对运动进行加速,再减速直到速率为零。 + * Quart 缓动方程的运动加速大于 Cubic 缓动方程。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @return 指定时间的插补属性的值。 + */ + static quartInOut(t: number, b: number, c: number, d: number): number; + /** + * @en Start moving at a faster speed, then slow down the motion speed during execution until the speed reaches zero. + * The motion acceleration of the Quart slow motion equation is greater than that of the Cubic slow motion equation. + * @param t Current time between 0 and the duration, inclusive. + * @param b The initial value of the animated property. + * @param c The total change in the property's value. + * @param d The duration of the motion. + * @return The value of the interpolation attribute for the specified time. + * @zh 以较快速度开始运动,然后在执行时减慢运动速度,直至速率为零。 + * Quart 缓动方程的运动加速大于 Cubic 缓动方程。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @return 指定时间的插补属性的值。 + */ + static quartOut(t: number, b: number, c: number, d: number): number; + /** + * @en The method starts at zero speed and then accelerates the motion speed during execution. + * The motion acceleration of the Quart slow motion equation is greater than that of the Cubic slow motion equation. + * @param t Current time between 0 and the duration, inclusive. + * @param b The initial value of the animated property. + * @param c The total change in the property's value. + * @param d The duration of the motion. + * @return The value of the interpolation attribute for the specified time. + * @zh 方法以零速率开始运动,然后在执行时加快运动速度。 + * Cubic 缓动方程的运动加速大于 Quad 缓动方程。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @return 指定时间的插补属性的值。 + */ + static cubicIn(t: number, b: number, c: number, d: number): number; + /** + * @en At the beginning of the motion, the velocity is zero. Accelerate the motion first, then decelerate until the velocity is zero. + * The motion acceleration of the Quart slow motion equation is greater than that of the Cubic slow motion equation. + * @param t Current time between 0 and the duration, inclusive. + * @param b The initial value of the animated property. + * @param c The total change in the property's value. + * @param d The duration of the motion. + * @return The value of the interpolation attribute for the specified time. + * @zh 开始运动时速率为零,先对运动进行加速,再减速直到速率为零。 + * Cubic 缓动方程的运动加速大于 Quad 缓动方程。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @return 指定时间的插补属性的值。 + */ + static cubicInOut(t: number, b: number, c: number, d: number): number; + /** + * @en Start moving at a faster speed, then slow down the motion speed during execution until the speed reaches zero. + * The motion acceleration of the Quart slow motion equation is greater than that of the Cubic slow motion equation. + * @param t Current time between 0 and the duration, inclusive. + * @param b The initial value of the animated property. + * @param c The total change in the property's value. + * @param d The duration of the motion. + * @return The value of the interpolation attribute for the specified time. + * @zh 以较快速度开始运动,然后在执行时减慢运动速度,直至速率为零。 + * Cubic 缓动方程的运动加速大于 Quad 缓动方程。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @return 指定时间的插补属性的值。 + */ + static cubicOut(t: number, b: number, c: number, d: number): number; + /** + * @en The method starts at zero speed and then accelerates the motion speed during execution. + * The motion acceleration in the Quad deceleration equation is equal to the motion acceleration between the 100% deceleration time axis and is significantly smaller than the motion acceleration in the Cubic deceleration equation. + * @param t Current time between 0 and the duration, inclusive. + * @param b The initial value of the animated property. + * @param c The total change in the property's value. + * @param d The duration of the motion. + * @return The value of the interpolation attribute for the specified time. + * @zh 方法以零速率开始运动,然后在执行时加快运动速度。 + * Quad 缓动方程中的运动加速度等于 100% 缓动的时间轴补间的运动加速度,并且显著小于 Cubic 缓动方程中的运动加速度。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @return 指定时间的插补属性的值。 + */ + static quadIn(t: number, b: number, c: number, d: number): number; + /** + * @en Starts the motion with zero velocity, accelerates the motion, and then decelerates to zero velocity. + * The motion acceleration in the Quad deceleration equation is equal to the motion acceleration between the 100% deceleration time axis and is significantly smaller than the motion acceleration in the Cubic deceleration equation. + * @param t Current time between 0 and the duration, inclusive. + * @param b The initial value of the animated property. + * @param c The total change in the property's value. + * @param d The duration of the motion. + * @return The value of the interpolation attribute for the specified time. + * @zh 开始运动时速率为零,先对运动进行加速,再减速直到速率为零。 + * Quad 缓动方程中的运动加速度等于 100% 缓动的时间轴补间的运动加速度,并且显著小于 Cubic 缓动方程中的运动加速度。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @return 指定时间的插补属性的值。 + */ + static quadInOut(t: number, b: number, c: number, d: number): number; + /** + * @en Start moving at a faster speed, then slow down the motion speed during execution until the speed reaches zero. + * The motion acceleration in the Quad deceleration equation is equal to the motion acceleration between the 100% deceleration time axis and is significantly smaller than the motion acceleration in the Cubic deceleration equation. + * @param t Current time between 0 and the duration, inclusive. + * @param b The initial value of the animated property. + * @param c The total change in the property's value. + * @param d The duration of the motion. + * @return The value of the interpolation attribute for the specified time. + * @zh 以较快速度开始运动,然后在执行时减慢运动速度,直至速率为零。 + * Quad 缓动方程中的运动加速度等于 100% 缓动的时间轴补间的运动加速度,并且显著小于 Cubic 缓动方程中的运动加速度。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @return 指定时间的插补属性的值。 + */ + static quadOut(t: number, b: number, c: number, d: number): number; + /** + * @en Starts the motion with zero velocity, then accelerates the motion. + * Each time interval is the remaining distance minus a fixed proportion. + * @param t Current time between 0 and the duration, inclusive. + * @param b The initial value of the animated property. + * @param c The total change in the property's value. + * @param d The duration of the motion. + * @return The value of the interpolation attribute for the specified time. + * @zh 方法以零速率开始运动,然后在执行时加快运动速度。 + * 其中每个时间间隔是剩余距离减去一个固定比例部分。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @return 指定时间的插补属性的值。 + */ + static expoIn(t: number, b: number, c: number, d: number): number; + /** + * @en At the beginning of the motion, the velocity is zero. Accelerate the motion first, then decelerate until the velocity is zero. + * Each time interval is the remaining distance minus a fixed proportion. + * @param t Current time between 0 and the duration, inclusive. + * @param b The initial value of the animated property. + * @param c The total change in the property's value. + * @param d The duration of the motion. + * @return The value of the interpolation attribute for the specified time. + * @zh 开始运动时速率为零,先对运动进行加速,再减速直到速率为零。 + * 其中每个时间间隔是剩余距离减去一个固定比例部分。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @return 指定时间的插补属性的值。 + */ + static expoInOut(t: number, b: number, c: number, d: number): number; + /** + * @en Start moving at a faster speed, then slow down the motion speed during execution until the speed reaches zero. + * Each time interval is the remaining distance minus a fixed proportion. + * @param t Current time between 0 and the duration, inclusive. + * @param b The initial value of the animated property. + * @param c The total change in the property's value. + * @param d The duration of the motion. + * @return The value of the interpolation attribute for the specified time. + * @zh 以较快速度开始运动,然后在执行时减慢运动速度,直至速率为零。 + * 其中每个时间间隔是剩余距离减去一个固定比例部分。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @return 指定时间的插补属性的值。 + */ + static expoOut(t: number, b: number, c: number, d: number): number; + /** + * @en The method starts at zero speed and then accelerates the motion speed during execution. + * The acceleration of the slow motion equation will result in a sudden change in velocity. + * @param t Current time between 0 and the duration, inclusive. + * @param b The initial value of the animated property. + * @param c The total change in the property's value. + * @param d The duration of the motion. + * @return The value of the interpolation attribute for the specified time. + * @zh 方法以零速率开始运动,然后在执行时加快运动速度。 + * 缓动方程的运动加速会产生突然的速率变化。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @return 指定时间的插补属性的值。 + */ + static circIn(t: number, b: number, c: number, d: number): number; + /** + * @en At the beginning of the motion, the velocity is zero. Accelerate the motion first, then decelerate until the velocity is zero. + * The acceleration of the slow motion equation will result in a sudden change in velocity. + * @param t Current time between 0 and the duration, inclusive. + * @param b The initial value of the animated property. + * @param c The total change in the property's value. + * @param d The duration of the motion. + * @return The value of the interpolation attribute for the specified time. + * @zh 开始运动时速率为零,先对运动进行加速,再减速直到速率为零。 + * 缓动方程的运动加速会产生突然的速率变化。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @return 指定时间的插补属性的值。 + */ + static circInOut(t: number, b: number, c: number, d: number): number; + /** + * @en Start moving at a faster speed, then slow down the motion speed during execution until the speed reaches zero. + * The acceleration of the slow motion equation will result in a sudden change in velocity. + * @param t Current time between 0 and the duration, inclusive. + * @param b The initial value of the animated property. + * @param c The total change in the property's value. + * @param d The duration of the motion. + * @return The value of the interpolation attribute for the specified time. + * @zh 以较快速度开始运动,然后在执行时减慢运动速度,直至速率为零。 + * 缓动方程的运动加速会产生突然的速率变化。 + * @param t 指定当前时间,介于 0 和持续时间之间(包括二者)。 + * @param b 指定动画属性的初始值。 + * @param c 指定动画属性的更改总计。 + * @param d 指定运动的持续时间。 + * @return 指定时间的插补属性的值。 + */ + static circOut(t: number, b: number, c: number, d: number): number; + } + class NotImplementedError extends Error { + constructor(); + } + class OutOfRangeError extends Error { + constructor(index: number); + } + class NotReadableError extends Error { + constructor(); + } + /** + * @en Set the font format and parse the fontInfo. + * @zh 设置字体格式与解析字体模型。 + */ + class FontInfo { + private static _cache; + /** + * @en Parses a font string into a FontInfo object. + * @param font The font string to parse. + * @zh 解析字体字符串为 FontInfo 对象。 + * @param font 要解析的字体字符串 + */ + static parse(font: string): FontInfo; + constructor(font: string | null); + /** + * @en Sets the font format based on the given value string. + * @param value The font value string to set. + * @zh 根据给定的值字符串设置字体格式。 + * @param value 要设置的字体值字符串。 + */ + setFont(value: string): void; + } + /** + * @en The HalfFloatUtils class is used to create the HalfFloat tool. + * @zh HalfFloatUtils 类用于创建HalfFloat工具。 + */ + class HalfFloatUtils { + /** + * @en round a number to a half float number bits. + * @param num The number to round. + * @zh 将数字四舍五入到最接近的半浮点数。 + * @param num 要舍入的数字。 + */ + static roundToFloat16Bits(num: number): number; + /** + * @en Converts a half-precision floating-point number in bits to a JavaScript number. + * @param float16bits half float number bits + * @zh 将半精度浮点数的位转换为 JavaScript 数字。 + * @param float16bits 半精度浮点数 + */ + static convertToNumber(float16bits: number): number; + } + /** + * @en The `Handler` class is an event handler class. + * It is recommended to create a `Handler` object from the object pool using the `Handler.create()` method to reduce the overhead of object creation. When a `Handler` object is no longer needed, it can be recovered to the object pool using `Handler.recover()`. Do not use this object after recovery, as doing so may lead to unpredictable errors. + * Note: Since mouse events also use this object pool, improper recovery and invocation may affect the execution of mouse events. + * @zh Handler 是事件处理器类。 + * 推荐使用 Handler.create() 方法从对象池创建,减少对象创建消耗。创建的 Handler 对象不再使用后,可以使用 Handler.recover() 将其回收到对象池,回收后不要再使用此对象,否则会导致不可预料的错误。 + * 注意:由于鼠标事件也用本对象池,不正确的回收及调用,可能会影响鼠标事件的执行。 + */ + class Handler { + /**@private handler对象池*/ + protected static _pool: Handler[]; + /**@private */ + private static _gid; + /** + * @en The scope of the object (this). + * @zh 执行域(this)。 + */ + caller: Object | null; + /** + * @en The handling method. + * @zh 处理方法。 + */ + method: Function | null; + /** + * @en Arguments passed to the handler method. + * @zh 参数。 + */ + args: any[] | null; + /** + * @en Indicates whether the handler should be executed only once. If true, the handler will be recovered after execution.After recycling, it will be reused, default to false. + * @zh 表示是否只执行一次。如果为true,回调后执行recover()进行回收。回收后会被再利用,默认为false + */ + once: boolean; + /**@private */ + protected _id: number; + /** + * @en Constructor method. + * @param caller The execution context. + * @param method The handling function. + * @param args Function arguments. + * @param once Whether it should be executed only once. + * @zh 构造方法 + * @param caller 执行域。 + * @param method 处理函数。 + * @param args 函数参数。 + * @param once 是否只执行一次。 + */ + constructor(caller?: Object | null, method?: Function | null, args?: any[] | null, once?: boolean); + /** + * @en Sets the specified property values for this object. + * @param caller The scope of the object (this). + * @param method The callback method. + * @param args The arguments to be passed to the method. + * @param once Whether the handler should be executed only once. If true, the handler will be recovered after execution. + * @returns Returns the handler itself. + * @zh 设置此对象的指定属性值。 + * @param caller 执行域(this)。 + * @param method 回调方法。 + * @param args 携带的参数。 + * @param once 是否只执行一次,如果为true,执行后执行recover()进行回收。 + * @returns 返回 handler 本身。 + */ + setTo(caller: any, method: Function | null, args: any[] | null, once?: boolean): Handler; + /** + * @en Executes the handler. + * @zh 执行处理器。 + */ + run(): any; + /** + * @en Executes the handler with additional data. + * @param data Additional callback data, can be a single data or an Array (as multiple arguments). + * @zh 执行处理器,并携带额外数据。 + * @param data 附加的回调数据,可以是单个数据或者数组(作为多参)。 + */ + runWith(data: any): any; + /** + * @en Clears the references of the object. + * @zh 清理对象引用。 + */ + clear(): Handler; + /** + * @en Clears the handler and recovers it to the Handler object pool. + * @zh 清理并回收到 Handler 对象池内。 + */ + recover(): void; + /** + * @en Creates a Handler from the object pool. By default, the handler will execute once and then be recovered immediately. If automatic recovery is not desired, set the `once` parameter to false. + * @param caller The scope of the object (this). + * @param method The callback method. + * @param args The arguments to be passed to the callback method. + * @param once Whether the handler should be executed only once. If true, the handler will be recovered after execution. + * @returns Return the created handler instance. + * @zh 从对象池内创建一个 Handler,默认会执行一次并立即回收。如果不需要自动回收,设置 `once` 参数为 false。 + * @param caller 执行域(this)。 + * @param method 回调方法。 + * @param args 回调方法的参数。 + * @param once 是否只执行一次,如果为true,回调后执行 recover() 进行回收,默认为true。 + * @return 返回创建的handler实例。 + */ + static create(caller: any, method: Function | null, args?: any[] | null, once?: boolean): Handler; + } + /** + * @en The `HitArea` class represents a mouse click area that can be defined by a series of vector shapes for clickable and non-clickable regions (currently only supports circles, rectangles, and polygons). + * @zh `HitArea` 类表示一个鼠标点击区域,可以通过一系列矢量图形定义为可点击和非可点击区域(目前仅支持圆形、矩形和多边形)。 + */ + class HitArea implements IHitArea { + /** + * @en Checks whether the object contains a specified point. + * @param x The x-coordinate of the point (horizontal position). + * @param y The y-coordinate of the point (vertical position). + * @param sp The Sprite object that contains the point. + * @returns true if the object contains the specified point; otherwise false. + * @zh 检测对象是否包含指定的点。 + * @param x 点的 X 轴坐标值(水平位置)。 + * @param y 点的 Y 轴坐标值(垂直位置)。 + * @param sp 包含该点的 Sprite 对象。 + * @returns 如果包含指定的点,则值为 true;否则为 false。 + */ + contains(x: number, y: number, sp: Sprite): boolean; + /** + * @en The Graphics object that defines the clickable area.(currently only supports circles, rectangles, and polygons). + * @zh 定义可点击区域的 Graphics 对象。(目前只支持圆形,矩形,多边形) + */ + get hit(): Graphics; + set hit(value: Graphics); + /** + * @en The Graphics object that defines the non-clickable area,(currently only supports circles, rectangles, and polygons). + * @zh 定义不可点击区域的 Graphics 对象。(目前只支持圆形,矩形,多边形) + */ + get unHit(): Graphics; + set unHit(value: Graphics); + /** + * @en Called after deserialization. + * @zh 序列化后调用。 + */ + onAfterDeserialize(): void; + } + /** + * @private + * @en IClone resource cloning interface. + * @zh IClone 资源克隆接口。 + */ + interface IClone { + clone(): any; + cloneTo(destObject: any): void; + } + interface IHitArea { + contains(x: number, y: number, sp?: Sprite): boolean; + } + /** + * @en Image binary processing class + * @zh 图片二进制处理类 + */ + class ImgUtils { + /** + * @en Storage data pool + * @zh 存储数据池 + */ + static data: any; + /** + * @en Whether to save the used data + * @zh 是否保存使用的数据 + */ + static isSavaData: boolean; + /** + * 比较版本内容 + * @param curVersion 当前版本 + * @param needVersion 要求的版本 + * @returns + */ + private static compareVersion; + /** + * @en Checks if data preprocessing is supported. + * @zh 检查是否支持数据预处理。 + */ + static get isSupport(): boolean; + /** + * @en Gets a URL object from an ArrayBuffer. + * @param url The base URL string. + * @param arrayBuffer The ArrayBuffer to convert. + * @returns A new URL string representing the binary data. + * @zh 从 ArrayBuffer 获取 URL 对象。 + * @param url 基础 URL 字符串。 + * @param arrayBuffer 要转换的 ArrayBuffer。 + * @returns 表示二进制数据的新 URL 字符串。 + */ + static arrayBufferToURL(url: string, arrayBuffer: ArrayBuffer): any; + static _arrayBufferToURL(arrayBuffer: ArrayBuffer): string; + /** + * @en Destroys the binary memory data associated with a specified URL. + * @param url The URL to destroy the binary data for. + * @zh 销毁与指定 URL 相关联的二进制内存数据。 + * @param url 要销毁二进制数据的 URL。 + */ + static destroy(url: string): void; + } + type StatUnit = "M" | "K" | "int"; + type StatColor = "yellow" | "white" | "red"; + type StatMode = "summit" | "average"; + interface StatUIParams { + title: string; + value: string; + color: StatColor; + units: StatUnit; + mode: StatMode; + } + interface StatToggleUIParams { + title: string; + value: string; + color: StatColor; + } + /** + * @en Interface for displaying and managing performance statistics. + * @zh 用于显示和管理性能统计信息的接口。 + */ + interface IStatUI { + /** + * @en Displays performance statistics. + * @param x The X-axis display position. + * @param y The Y-axis display position. + * @param views The array of views to be displayed. + * @zh 显示性能统计信息。 + * @param x X轴显示位置。 + * @param y Y轴显示位置。 + * @param views 显示的视图数组。 + */ + show(x?: number, y?: number, views?: Array): void; + /** + * @en Toggles the display of performance statistics. + * @param x The X-axis display position. + * @param y The Y-axis display position. + * @param views The array of views to be toggled. + * @zh 切换性能统计信息的显示。 + * @param x X轴显示位置。 + * @param y Y轴显示位置。 + * @param views 切换的视图数组。 + */ + showToggle(x?: number, y?: number, views?: Array): void; + /** + * @en Hides performance statistics. + * @zh 隐藏性能统计信息。 + */ + hide(): void; + /** + * @en Interface for updating each frame. + * @zh 每帧更新的调用接口。 + */ + update(): void; + /** + * @en Rendering interface. + * @param ctx The rendering context. + * @param x The X-axis position. + * @param y The Y-axis position. + * @zh 渲染接口。 + * @param ctx 渲染上下文。 + * @param x X轴位置。 + * @param y Y轴位置。 + */ + render(ctx: any, x: number, y: number): void; + } + /** + * @en The `Log` class is used to display log information in the interface. + * Note: This cannot be used in the LayaAir Native Runtime. + * @zh `Log` 类用于在界面内显示日志记录信息。 + * 注意:在LayaAir Native Runtime内不可使用 + */ + class Log { + /**@private */ + private static _logdiv; + /**@private */ + private static _btn; + /**@private */ + private static _count; + /** + * @en Maximum number of log messages to display before auto-cleaning. + * @zh 最大打印数量,超过这个数量则自动清理一次,默认为50次。 + */ + static maxCount: number; + /** + * @en Whether to automatically scroll to the bottom of the log. + * @zh 是否自动滚动到日志底部,默认为true。 + */ + static autoScrollToBottom: boolean; + /** + * @en Enables the Log system. + * @zh 启用Log系统 + */ + static enable(): void; + /** + * @en Hides or shows the log panel. + * @zh 隐藏或显示日志面板。 + */ + static toggle(): void; + /** + * @en Adds log content. + * @param value The log content to add. + * @zh 增加日志内容。 + * @param value 需要增加的日志内容。 + */ + static print(value: string): void; + /** + * @en Clears the log. + * @zh 清理日志。 + */ + static clear(): void; + } + /** + * @en The `Mouse` class is used to control the style of the mouse cursor. + * @zh `Mouse` 类用于控制鼠标光标的样式。 + */ + class Mouse { + /**@private */ + private static _style; + /**@private */ + private static _preCursor; + /** + * @en Sets the style of the mouse cursor. + * @param cursorStr The cursor style string. + * For example: auto | move | no-drop | col-resize | all-scroll | pointer | not-allowed | row-resize | crosshair | progress | e-resize | ne-resize | default | text | n-resize | nw-resize | help | vertical-text | s-resize | se-resize | inherit | wait | w-resize | sw-resize + * @zh 设置鼠标样式 + * @param cursorStr 光标样式字符串。 + * 例如:auto | move | no-drop | col-resize | all-scroll | pointer | not-allowed | row-resize | crosshair | progress | e-resize | ne-resize | default | text | n-resize | nw-resize | help | vertical-text | s-resize | se-resize | inherit | wait | w-resize | sw-resize + */ + static set cursor(cursorStr: string); + /** + * @en The current style of the mouse cursor. + * @zh 当前鼠标光标的样式。 + */ + static get cursor(): string; + /** + * @en Hides the mouse cursor. + * @zh 隐藏鼠标光标。 + */ + static hide(): void; + /** + * @en Shows the mouse cursor. + * @zh 显示鼠标光标。 + */ + static show(): void; + } + /** + * @en A utility class for parsing JSON strings. + * @zh 用于解析 JSON 字符串的实用工具类。 + */ + class ParseJSON { + static parse(str: string): any; + private static findIndex; + private static finCurrObj; + private static formatVal; + private static len; + private static ret; + private static currStr; + private static currArr; + private static cobj; + /**type为0代表没有找到任何状态,1为当前在寻找key,2为当前在寻找val */ + private static type; + private static finCurrStr; + private static parseStart; + } + /** + * @en The `Pool` class is an object pooling class used for storing and reusing objects. + * Reasonable use of the object pool can effectively reduce the overhead of object creation, avoid frequent garbage collection, and thus optimize the smoothness of the game. + * @zh `Pool` 是对象池类,用于对象的存储和复用。 + * 合理使用对象池可以有效减少对象创建的开销,避免频繁的垃圾回收,从而优化游戏流畅度。 + */ + class Pool { + /**@private */ + private static _CLSID; + /**@private */ + private static POOLSIGN; + /**@private 对象存放池。*/ + private static _poolDic; + /** + * @en Get the object pool based on the object type signature. + * @param sign The object type signature. + * @returns The object pool. + * @zh 根据对象类型标识字符获取对象池。 + * @param sign 对象类型标识字符。 + * @returns 对象池。 + */ + static getPoolBySign(sign: string): any[]; + /** + * @en Clear the objects in the object pool. + * @param sign The object type signature. + * @zh 清除对象池中的对象。 + * @param sign 对象类型标识字符。 + */ + static clearBySign(sign: string): void; + /** + * @en Put the object into the object pool of the corresponding type signature. + * @param sign The object type signature. + * @param item The object. + * @zh 将对象放到对应类型标识的对象池中。 + * @param sign 对象类型标识字符。 + * @param item 对象。 + */ + static recover(sign: string, item: any): void; + /** + * @en Recover by class name if the class has one, if not, do not recover. + * @param instance The instance of the class. + * @zh 根据类名进行回收,如果类有类名才进行回收,没有则不回收。 + * @param instance 类的具体实例。 + */ + static recoverByClass(instance: any): void; + /** + * 返回类的唯一标识 + */ + private static _getClassSign; + /** + * @en Create an object by class. + * @param cls The class for creating the object. + * @zh 根据类创建对象。 + * @param cls 用于创建对象的类。 + */ + static createByClass(cls: new () => T): T; + /** + * @en Get an object instance of a certain type from the object pool. + * If there is no object of this type in the pool, a new object will be created and returned. + * @param sign The object type signature. + * @param cls The class used to create the object of this type. + * @returns An object of the specified type. + * @zh 根据传入的对象类型标识字符,获取对象池中此类型标识的一个对象实例。 + * 如果对象池中无此类型标识的对象时,则根据传入的类型,创建一个新的对象返回。 + * @param sign 对象类型标识字符。 + * @param cls 用于创建该类型对象的类。 + * @returns 此类型标识的一个对象。 + */ + static getItemByClass(sign: string, cls: new () => T): T; + /** + * @en Get an object instance of a certain type from the object pool using a creation function. + * If there is no object of this type in the pool, a new object will be created using the function and returned. + * @param sign The object type signature. + * @param createFun The function used to create the object of this type. + * @param caller The `this` context for the creation function. + * @returns An object of the specified type. + * @zh 根据传入的对象类型标识字符和创建函数,获取对象池中此类型标识的一个对象实例。 + * 如果对象池中无此类型标识的对象时,则使用传入的创建此类型对象的函数,新建一个对象返回。 + * @param sign 对象类型标识字符。 + * @param createFun 用于创建该类型对象的方法。 + * @param caller this对象。 + * @returns 此类型标识的一个对象。 + */ + static getItemByCreateFun(sign: string, createFun: Function, caller?: any): any; + /** + * @en Get an object from the object pool by the object type signature. If there is no object of this type in the pool, return null. + * @param sign The object type signature. + * @returns An object of the specified type or null if none is available. + * @zh 根据传入的对象类型标识字符,获取对象池中已存储的此类型的一个对象,如果对象池中无此类型的对象,则返回 null。 + * @param sign 对象类型标识字符。 + * @returns 对象池中此类型的一个对象,如果对象池中无此类型的对象,则返回 null。 + */ + static getItem(sign: string): any; + } + /** + * @private + * @en A manager for object caching based on a count limit. + * @zh 基于个数的对象缓存管理器 + */ + class PoolCache { + /** + * @en The identifier for objects within the Pool. + * @zh 对象在Pool中的标识。 + */ + sign: string; + /** + * @en The maximum number of objects allowed in the cache. + * @zh 允许缓存的最大数量。 + */ + maxCount: number; + /** + * @en Get the list of cached objects. + * @zh 获取缓存的对象列表。 + */ + getCacheList(): any[]; + /** + * @en Attempt to clear the cache. + * @param force If true, force the cache to be cleared. + * @zh 尝试清理缓存。 + * @param force 如果为 true,则强制清理缓存。 + */ + tryDispose(force: boolean): void; + /** + * @en Add a manager for object caching to the pool. + * @param sign The identifier for objects within the Pool. + * @param maxCount The maximum number of objects allowed in the cache. Defaults to 100 if not provided. + * @zh 向池中添加对象缓存管理器。 + * @param sign 对象在Pool中的标识 + * @param maxCount 允许缓存的最大数量,默认为100 + */ + static addPoolCacheManager(sign: string, maxCount?: number): void; + } + /** + * @private + */ + class RunDriver { + /** + * @en Static method to change the width and height of the WebGL context. + * @zh 用于改变 WebGL宽高信息。 + */ + static changeWebGLSize: Function; + } + /** + * @en The `SingletonList` class is designed to implement a singleton queue. + * @zh SingletonList 类用于实现单例队列。 + */ + class SingletonList { + constructor(); + /** + * @en Finds the index of an element in the list. + * @param element The element to find. + * @zh 在列表中查找元素的索引。 + * @param element 要查找的元素。 + */ + indexof(element: T): number; + /** + * @en Destroys the list by nullifying the elements array. + * @zh 通过将元素数组置为 null 来销毁列表。 + */ + destroy(): void; + } + class FastSinglelist extends SingletonList { + } + class SpriteUtils { + /** + * @private + * @en Returns the smallest rectangular area object composed of two points on the stage coordinate system for the given display object Sprite. + * @param sprite The display object Sprite. + * @param x0 The X-axis coordinate of the first point. + * @param y0 The Y-axis coordinate of the first point. + * @param x1 The X-axis coordinate of the second point. + * @param y1 The Y-axis coordinate of the second point. + * @return The rectangle object Rectangle composed of the two points on the stage coordinate system. + * @zh 根据传入的显示对象 Sprite 和此显示对象上的两个点,返回这两点在舞台坐标系上组成的最小矩形区域对象。 + * @param sprite 显示对象 Sprite。 + * @param x0 点一的 X 轴坐标。 + * @param y0 点一的 Y 轴坐标。 + * @param x1 点二的 X 轴坐标。 + * @param y1 点二的 Y 轴坐标。 + * @return 两个点在舞台坐标系组成的矩形对象 Rectangle。 + */ + static getGlobalRecByPoints(sprite: Sprite, x0: number, y0: number, x1: number, y1: number): Rectangle; + /** + * @en Calculates the global coordinates and scaling values of the specified Sprite display object, and returns a Rectangle object containing the calculated X and Y coordinates as well as the scaleX and scaleY values. + * @param sprite The Sprite object to calculate. + * @returns The Rectangle object with the calculated values. + * @zh 计算传入的显示对象 Sprite 在全局坐标系中的坐标和缩放值,返回一个 Rectangle 对象,存放计算出的坐标 X 值、Y 值、ScaleX 值和 ScaleY 值。 + * @param sprite Sprite 对象。 + * @return 矩形对象 Rectangle。 + */ + static getGlobalPosAndScale(sprite: Sprite): Rectangle; + /** + * @en Retrieves the transform of a specified area relative to the top-left corner of the window. + * @param coordinateSpace The coordinate space, must not be a Stage reference. + * @param x The x coordinate relative to the `coordinateSpace`. + * @param y The y coordinate relative to the `coordinateSpace`. + * @returns An object containing the transformed x, y coordinates, and scale factor. + * @zh 获取指定区域内相对于窗口左上角的transform。 + * @param coordinateSpace 坐标空间,不能是Stage引用 + * @param x 相对于coordinateSpace的x坐标 + * @param y 相对于coordinateSpace的y坐标 + * @returns 包含转换后的x、y坐标以及缩放因子的对象 + */ + static getTransformRelativeToWindow(coordinateSpace: Sprite, x: number, y: number): any; + /** + * @en Make a DOM element fit within a specific area of the stage. + * @param dom The reference to the DOM element. + * @param coordinateSpace The coordinate space. It should not be a reference to Stage. + * @param x The x coordinate relative to the coordinateSpace. + * @param y The y coordinate relative to the coordinateSpace. + * @param width The width of the area. + * @param height The height of the area. + * @zh 使DOM元素适应舞台内指定区域。 + * @param dom DOM元素引用 + * @param coordinateSpace 坐标空间,不能是Stage引用 + * @param x 相对于coordinateSpace的x坐标 + * @param y 相对于coordinateSpace的y坐标 + * @param width 宽度 + * @param height 高度 + */ + static fitDOMElementInArea(dom: any, coordinateSpace: Sprite, x: number, y: number, width: number, height: number): void; + /** + * @private + * @en Reorders the passed array of items based on the Z property of the child items. + * Returns a Boolean value indicating whether the array has been reordered. + * @param array The array of child objects. + * @return A Boolean value indicating if the array has been reordered. + * @zh 根据子项的 Z 属性值对传入的数组列表进行重新排序。 + * 返回一个 Boolean 值,表示是否已重新排序。 + * @param array 子对象数组。 + * @return Boolean 值,表示是否已重新排序。 + */ + static updateOrder(array: any[]): boolean; + } + /** + * @en The Stat class is a performance statistics panel that provides real-time updates on various performance metrics. + * The performance metrics included in the statistics are updated approximately every 1 second and are as follows: + * - FPS: Frames per second (FPS). The higher and more stable the value, the smoother the display. + * - Sprite: The count of all rendering nodes (including containers). Its size affects the efficiency of the engine's node traversal, data organization, and rendering. The smaller the value, the higher the game's operational efficiency. + * - DrawCall: This value is a crucial indicator of performance; the smaller the number, the higher the game's operational efficiency. It represents the approximate number of rendering batches submitted per second. Each preparation of data and notification to the GPU for rendering is called one DrawCall. Besides the time-consuming process of notifying the GPU to render, switching materials and shaders are also very time-consuming operations during each DrawCall. + * - CurMem: Represents memory and video memory usage; the smaller the value, the better. + * - Shader: indicating the number of Shader submissions per second. The smaller the value, the better. + * - Canvas: Composed of three values, which are only present after setting CacheAs, with a default of 0/0/0. From left to right, the meanings of the values are: the number of canvases redrawn per frame / the number of canvases with "normal" cache type / the number of canvases with "bitmap" cache type. + * @zh Stat是一个性能统计面板,可以实时更新相关的性能参数。参与统计的性能参数如下(所有参数都是每大约1秒进行更新): + * - FPS(WebGL):每秒显示的帧数。值越高且越稳定,画面越流畅。 + * - Sprite:统计所有渲染节点(包括容器)的数量。这个数值的大小会影响引擎在节点遍历、数据组织和渲染方面的效率。数值越小,游戏运行效率越高。 + * - DrawCall:此值是决定性能的重要指标,数值越小,游戏运行效率越高。表示大约每1秒的渲染提交批次。每次准备数据并通知 GPU 进行渲染的过程称为1次 DrawCall。在每次 DrawCall 中,除了通知 GPU 渲染比较耗时外,切换材质与 shader 也是非常耗时的操作。 + * - CurMem:表示内存与显存的占用,数值越小越好。 + * - Shader:表示每大约1秒 Shader 提交次数。数值越小越好。 + * - Canvas:由三个数值组成,仅在设置了 CacheAs 之后才会有数值,默认为0/0/0。从左到右数值的意义分别为:每帧重绘的画布数量 / 缓存类型为"normal"的画布数量 / 缓存类型为"bitmap"的画布数量。 + */ + class Stat { + /** + * @en The current frame rate. + * @zh 当前帧率 + */ + static FPSStatUIParams: StatUIParams; + /** + * @en Node nums + * @zh 节点数量 + */ + static NodeStatUIParams: StatUIParams; + /** + * @en Sprite3D nums + * @zh 3D精灵数量 + */ + static Sprite3DStatUIParams: StatUIParams; + /** + * @en DrawCall + * @zh 渲染提交批次 + */ + static DrawCall: StatUIParams; + /** + * @en triangleFace + * @zh 三角形面数量 + */ + static TriangleFace: StatUIParams; + /** + * @en RenderNoe + * @zh 渲染节点数量 + */ + static RenderNode: StatUIParams; + /** + * @en SkinRenderNode + * @zh 蒙皮(骨骼动画)渲染节点数量 + */ + static SkinRenderNode: StatUIParams; + /** + * @en ParticleRenderNode + * @zh 粒子渲染节点数量 + */ + static ParticleRenderNode: StatUIParams; + /** + * @en FrustumCulling + * @zh 视锥体剔除 + */ + static FrustumCulling: StatUIParams; + /** + * @en uniformUpload + * @zh uniform上传 + */ + static UniformUpload: StatUIParams; + /** + * @en OpaqueDrawCall + * @zh 不透明物体渲染提交批次 + */ + static OpaqueDrawCall: StatUIParams; + /** + * @en TransformDrawCall + * @zh 透明物体渲染提交批次 + */ + static TransDrawCall: StatUIParams; + /** + * @en DepthCastDrawCall + * @zh 深度投射渲染提交批次 + */ + static DepthCastDrawCall: StatUIParams; + /** + * @en TransformDrawCall + * @zh 透明物体渲染提交批次 + */ + static ShadowDrawCall: StatUIParams; + /** + * @en InstanceDrawCall + * @zh 实例绘制渲染提交批次 + */ + static InstanceDrawCall: StatUIParams; + /** + * @en CMDDrawCall + * @zh CMD渲染提交批次 + */ + static CMDDrawCall: StatUIParams; + /** + * @en BlitDrawCall + * @zh 位块渲染提交批次 + */ + static BlitDrawCall: StatUIParams; + /** + * @en GPU memory + * @zh GPU 显存 + */ + static GPUMemory: StatUIParams; + /** + * @en Texture2D memory + * @zh 2D纹理内存 + */ + static TextureMemeory: StatUIParams; + /** + * @en RenderTexture memory + * @zh 渲染纹理内存 + */ + static RenderTextureMemory: StatUIParams; + /** + * @en BufferMemory + * @zh Buffer内存 + */ + static BufferMemory: StatUIParams; + /** + * @en upload Uniform + * @zh Uniform上传数量 + */ + static uploadUniformNum: StatUIParams; + /** + * @en All Show + * @zh 所有显示 + */ + static AllShow: Array; + /** + * @en Memory Show + * @zh 内存显示 + */ + static memoryShow: Array; + /** + * @en Rendering Show + * @zh 渲染显示 + */ + static renderShow: Array; + /** + * @en AllToggle + * @zh 所有开关 + */ + static AllToggle: Array; + /** + * @en Render Mode Toggle + * @zh 渲染开关 + */ + static RenderModeToggle: Array; + /** + * @en Render Func Toggle + * @zh 功能开关 + */ + static RenderFuncToggle: Array; + /** + * @en Current frames per second (FPS). + * @zh 当前每秒帧数(FPS)。 + */ + static FPS: number; + /** + * @en Count of rendering loops of the main stage Stage. + * @zh 主舞台 Stage 的渲染次数计数。 + */ + static loopCount: number; + /** + * @en Number of Sprites that use cache for rendering. + * @zh 精灵渲染使用缓存 Sprite 的数量。 + */ + static spriteRenderUseCacheCount: number; + /** + * @en Number of times the canvas has used standard rendering. + * @zh 画布 canvas 使用标准渲染的次数。 + */ + static canvasNormal: number; + /** + * @en Number of times the canvas has used bitmap rendering. + * @zh 画布 canvas 使用位图渲染的次数。 + */ + static canvasBitmap: number; + /** + * @en Number of times the canvas buffer has been repainted. + * @zh 画布 canvas 缓冲区重绘次数。 + */ + static canvasReCache: number; + /** + * @en Indicates whether the current rendering mode is slow. + * @zh 表示当前使用的是否为慢渲染模式。 + */ + static renderSlow: boolean; + /** + * @en Accumulated memory managed by the resource manager, in bytes. + * @zh 资源管理器所管理资源的累计内存,以字节为单位。 + */ + static cpuMemory: number; + static draw2D: number; + static blitDrawCall: number; + static renderPassStatArray: number[]; + static enableRenderPassStatArray: boolean; + /** + * @en The cumulative memory of the resources managed by the resource manager, in bytes. + * @zh 资源管理器所管理资源的累计内存,以字节为单位。 + */ + static gpuMemory: number; + /** + * @en The count of dynamic rigid bodies in the physics system. + * @zh 物理系统中动态刚体的数量。 + */ + static physics_dynamicRigidBodyCount: number; + /** + * @en The count of static rigid bodies in the physics system. + * @zh 物理系统中静态刚体的数量。 + */ + static physics_staticRigidBodyCount: number; + /** + * @en The count of kinematic rigid bodies in the physics system. + * @zh 物理系统中运动学刚体的数量。 + */ + static phyiscs_KinematicRigidBodyCount: number; + /** + * @en The count of character controllers in the physics system. + * @zh 物理系统中角色控制器的数量。 + */ + static physics_CharacterControllerCount: number; + /** + * @en The count of joints in the physics system. + * @zh 物理系统中关节的数量。 + */ + static physics_jointCount: number; + /** + * @en The count of physics events. + * @zh 物理事件的数量。 + */ + static phyiscs_EventCount: number; + /** + * @en Enables or disables shadows. + * @zh 开启或关闭阴影效果。 + */ + static enableShadow: boolean; + /** + * @en Enables or disables multiple light sources. + * @zh 开启或关闭多光源效果。 + */ + static enableMulLight: boolean; + /** + * @en Enables or disables light sources. + * @zh 开启或关闭光源效果。 + */ + static enableLight: boolean; + /** + * @en Enables or disables CMD. + * @zh 开启或关闭CMD。 + */ + static enableCameraCMD: boolean; + /** + * @en Enables or disables post-processing effects. + * @zh 开启或关闭后期处理效果。 + */ + static enablePostprocess: boolean; + /** + * @en Enables or disables skin rendering. + * @zh 开启或关闭skin渲染。 + */ + static enableSkin: boolean; + /** + * @en Enables or disables transparent rendering. + * @zh 开启或关闭透明渲染。 + */ + static enableTransparent: boolean; + /** + * @en Enables or disables particle rendering. + * @zh 开启或关闭粒子渲染。 + */ + static enableParticle: boolean; + /** + * @en Enables or disables animation updates. + * @zh 开启或关闭动画更新。 + */ + static enableAnimatorUpdate: boolean; + /** + * @en Enables or disables physics updates. + * @zh 开启或关闭物理更新。 + */ + static enablePhysicsUpdate: boolean; + /** + * @en Enables or disables MSAA. + * @zh 开启或关闭 MSAA。 + */ + static enablemsaa: boolean; + /** + * @en Enables or disables rendering of opaque objects. + * @zh 开启或关闭不透明物体渲染。 + */ + static enableOpaque: boolean; + static _statUI: IStatUI; + /** + * @en Displays performance statistics information on the screen. + * To be effective, it should be called at the very beginning of the application. + * @param x The X-coordinate position where the statistics should be displayed. + * @param y The Y-coordinate position where the statistics should be displayed. + * @param views An optional array of StatUIParams that defines which statistics to display. + * @zh 在屏幕上显示性能统计信息。 + * 为了有效,它应该在应用程序最开始时调用。 + * @param x 统计信息显示的 X 轴坐标位置。 + * @param y 统计信息显示的 Y 轴坐标位置。 + * @param views 可选的 StatUIParams 数组,定义要显示哪些统计信息。 + */ + static show(x?: number, y?: number, views?: Array): void; + /** + * @en Shows the performance statistics information with toggle functionality. + * @param x The x-coordinate of the display position. Optional. + * @param y The y-coordinate of the display position. Optional. + * @param views An array of StatToggleUIParams objects defining the toggle views to display. Optional. + * @zh 显示带有切换功能的性能统计信息。 + * @param x 显示位置的 x 坐标。可选。 + * @param y 显示位置的 y 坐标。可选。 + * @param views 定义要显示的切换视图的 StatToggleUIParams 对象数组。可选。 + */ + static showToggle(x?: number, y?: number, views?: Array): void; + private static checkUI; + /** + * @en Hides the performance statistics information from the screen. + * @zh 从屏幕上隐藏性能统计信息。 + */ + static hide(): void; + /** + * @private + * @en Performance statistics parameter calculation loop processing function. + * @zh 性能统计参数计算循环处理函数。 + */ + static loop(): void; + /** + * @en Updates the engine data for statistics such as triangle count, draw call count, and memory usage. + * @zh 更新引擎数据,包括三角形数量、绘制调用计数和内存使用情况等统计信息。 + */ + static updateEngineData(): void; + /** + * @private + * @en Resets the performance statistics calculation related data to zero. + * @zh 清零性能统计计算相关的数据。 + */ + static clear(): void; + static render(ctx: any, x: number, y: number): void; + } + /** + * @private + * @en The StringKey class is used to access the number corresponding to a string. + * @zh StringKey 类用于存取字符串对应的数字。 + */ + class StringKey { + private _strsToID; + private _idToStrs; + private _length; + /** + * @en Adds a string. + * @param str The string to be added as a key which will be associated with a generated number. + * @returns The numerical identifier associated with the string. + * @zh 添加一个字符。 + * @param str 字符,将作为key 存储相应生成的数字。 + * @returns 返回与此字符串对应的数字。 + */ + add(str: string): number; + /** + * @en Retrieves the identifier for a specified string. + * @param str The string for which to get the identifier. + * @returns The identifier for the string, or -1 if the string does not exist. + * @zh 根据指定的字符串获取其标识符。 + * @param str 字符。 + * @return 返回此字符串对应的ID,如果字符串不存在则返回-1。 + */ + getID(str: string): number; + /** + * @en Retrieves a string based on its identifier. + * @zh 根据指定的ID获取对应的字符串。 + * @param id ID。 + * @returns The string associated with the identifier, or undefined if no string is associated. + * @zh 根据指定的ID获取对应的字符串。 + * @param id ID。 + * @returns 返回与此ID对应的字符串。 + */ + getName(id: number): string; + } + /** + * @en When the entire slow motion ends, it will be scheduled + * @zh 整个缓动结束的时候会调度 + * @eventType Event.COMPLETE + */ + /** + * @en When the slow motion reaches the label, it will be scheduled + * @zh 当缓动到达标签时会调度。 + * @eventType Event.LABEL + */ + /** + * @en TimeLine is a class used to create timeline animations. + * @zh TimeLine 是一个用来创建时间轴动画的类。 + */ + class TimeLine extends EventDispatcher { + private _labelDic; + private _tweenDic; + private _tweenDataList; + private _endTweenDataList; + private _currTime; + private _lastTime; + private _startTime; + /**当前动画数据播放到第几个了*/ + private _index; + /**为TWEEN创建属于自己的唯一标识,方便管理*/ + private _gidIndex; + /**保留所有对象第一次注册动画时的状态(根据时间跳转时,需要把对象的恢复,再计算接下来的状态)*/ + private _firstTweenDic; + /**是否需要排序*/ + private _startTimeSort; + private _endTimeSort; + /**是否循环*/ + private _loopKey; + /** + * @en Scaling the speed of animation playback. + * @zh 缩放动画播放的速度。 + */ + scale: number; + private _frameRate; + private _frameIndex; + private _total; + /** + * @en Controls an object to move to a target position. + * @param target The object to be controlled. + * @param props The properties of the object to be controlled. + * @param duration The duration of the TWEEN for the object. + * @param ease The type of easing. + * @param offset The time offset relative to the previous object (in milliseconds). + * @returns An instance of TimeLine. + * @zh 控制一个对象,从当前位置移动到目标位置。 + * @param target 要控制的对象。 + * @param props 要控制对象的属性。 + * @param duration 对象TWEEN的时间。 + * @param ease 缓动类型 + * @param offset 相对于上一个对象,偏移多长时间(单位:毫秒)。 + */ + static to(target: any, props: any, duration: number, ease?: Function, offset?: number): TimeLine; + /** + * @en From the props attribute, slow down to the current state. + * @param target The target object whose properties will be changed. + * @param props The properties to control the object. + * @param duration The duration of the TWEEN for the object. + * @param ease The type of easing function. + * @param offset The time offset relative to the previous object (in milliseconds). + * @zh 从 props 属性,缓动到当前状态。 + * @param target target 目标对象(即将更改属性值的对象) + * @param props 要控制对象的属性 + * @param duration 对象TWEEN的时间 + * @param ease 缓动类型 + * @param offset 相对于上一个对象,偏移多长时间(单位:毫秒) + */ + static from(target: any, props: any, duration: number, ease?: Function, offset?: number): TimeLine; + /** + * @en Controls an object to move to a target position. + * @param target The object to be controlled. + * @param props The properties to be changed during the TWEEN. + * @param duration The duration of the TWEEN for the object. + * @param ease The easing function to be used. + * @param offset The time offset from the start of the previous TWEEN (in milliseconds). + * @returns An instance of TimeLine. + * @zh 控制一个对象,从当前位置移动到目标位置。 + * @param target 要控制的对象。 + * @param props 要控制对象的属性。 + * @param duration 对象TWEEN的时间。 + * @param ease 缓动类型 + * @param offset 相对于上一个对象,偏移多长时间(单位:毫秒)。 + */ + to(target: any, props: any, duration: number, ease?: Function, offset?: number): TimeLine; + /** + * @en From the props attribute, slow down to the current state. + * @param target The target object whose properties are to be tweened. + * @param props The properties to be controlled and their target values. + * @param duration The duration of the tween for the target object. + * @param ease The type of easing function to be used for the tween. + * @param offset The time offset in milliseconds to delay the start of the tween relative to the previous tween. + * @zh 从 props 属性,缓动到当前状态。 + * @param target 目标对象,其属性将被缓动。 + * @param props 要控制的对象属性及其目标值。 + * @param duration 对象缓动的持续时间。 + * @param ease 缓动类型,用于指定缓动效果的函数。 + * @param offset 相对于上一个缓动,延迟启动当前缓动的时间偏移量(单位:毫秒)。。 + */ + from(target: any, props: any, duration: number, ease?: Function, offset?: number): TimeLine; + /** @private */ + private _create; + /** + * @en Adds a label to the timeline at a specified offset from the previous animation. + * @param label The name of the label to add. + * @param offset The offset time in milliseconds from the previous animation. + * @zh 在时间队列中加入一个标签,相对于上一个动画的偏移时间。 + * @param label 标签名称。 + * @param offset 标签相对于上个动画的偏移时间(单位:毫秒)。 + */ + addLabel(label: string, offset: number): TimeLine; + /** + * @en Removes a specified label from the timeline. + * @param label The label to remove + * @zh 移除指定的标签。 + * @param label 要删除的标签. + */ + removeLabel(label: string): void; + /** + * @en Jumps to a specific time in the animation. + * @param time The time in milliseconds to jump to within the animation. + * @zh 动画从整个动画的某一时间开始。 + * @param time 在动画中跳转到的时间(以毫秒为单位)。 + */ + gotoTime(time: number): void; + /** + * @en Jump to a specific label and start playing from there. + * @param Label The name of the label to jump to. + * @zh 跳转到指定的标签并从那里开始播放。 + * @param Label 要跳转的标签名。 + */ + gotoLabel(Label: string): void; + /** + * @en Pause the entire animation. + * @zh 暂停整个动画。 + */ + pause(): void; + /** + * @en Resume playing of a paused animation. + * @zh 恢复暂停的动画播放。 + */ + resume(): void; + /** + * @en Play the animation from a specified time point or label. + * @param timeOrLabel The time point or label name to start playing from. + * @param loop Whether to loop the playback. + * @zh 从指定的时间点或标签名播放动画。 + * @param timeOrLabel 开始播放的时间点或标签名。 + * @param loop 是否循环播放。 + */ + play(timeOrLabel?: any, loop?: boolean): void; + /** + * 更新当前动画。 + */ + private _update; + /** + * 指定的动画索引处的动画播放完成后,把此动画从列表中删除。 + * @param index + */ + private _animComplete; + /** @private */ + private _complete; + /** + * @private + * @en frame index + * @zh 帧索引 + */ + get index(): number; + set index(value: number); + /** + * @en The total number of frames + * @zh 总帧数。 + */ + get total(): number; + /** + * @en Resets all objects, used when reusing objects. + * @zh 重置所有对象,复用对象时使用。 + */ + reset(): void; + /** + * @en Completely destroys this object. + * @zh 彻底销毁此对象。 + */ + destroy(): void; + } + /** + * @en The `Timer` class is responsible for time management. It is a singleton and should not be instantiated manually. Access it via `Laya.timer` + * @zh Timer 是时钟管理类。它是一个单例,不要手动实例化此类,应该通过 Laya.timer 访问。 + */ + class Timer { + /**@private */ + static gSysTimer: Timer; + /**@private */ + private static _pool; + /**@private */ + static _mid: number; + /** + * @en Scale of the clock hand. + * @zh 时针的缩放比例。 + */ + scale: number; + /** + * @en The start time of the current frame. + * @zh 当前帧的开始时间。 + */ + currTimer: number; + /** + * @en The current frame count. + * @zh 当前的帧数。 + */ + currFrame: number; + /**@private */ + private _map; + /**@private */ + private _handlers; + /**@private */ + private _temp; + /**@private */ + private _count; + /** + * @en Constructor method + * @zh 构造方法 + */ + constructor(autoActive?: boolean); + /** + * @en The time interval between two frames, in milliseconds. + * @zh 两帧之间的时间间隔,单位毫秒。 + */ + get delta(): number; + /** @private */ + private _clearHandlers; + /** @private */ + private _recoverHandler; + /** + * @private + * @en get now time data. + * @returns reutrn time data. + * @zh 立即获取时间数据 + * @returns 返回时间数据 + */ + _getNowData(): number; + /** @private */ + private _indexHandler; + /** + * Executes once after a delay. + * @param delay The delay time in milliseconds. + * @param caller The scope of the object (this). + * @param method The callback function to be executed by the timer. + * @param args The arguments to pass to the callback function. + * @param coverBefore Whether to overwrite previous delayed execution, default is true. + * @zh 定时执行一次。 + * @param delay 延迟时间(单位为毫秒)。 + * @param caller 执行域(this)。 + * @param method 定时器回调函数。 + * @param args 回调参数。 + * @param coverBefore 是否覆盖之前的延迟执行,默认为 true 。 + */ + once(delay: number, caller: any, method: Function, args?: any[], coverBefore?: boolean): void; + /** + * Repeatedly executes at intervals. + * @param delay The interval time in milliseconds. + * @param caller The scope of the object (this). + * @param method The callback function to be executed by the timer. + * @param args The arguments to pass to the callback function. + * @param coverBefore Whether to overwrite previous delayed execution, default is true. + * @param jumpFrame Whether to jump frames. For time-based callbacks, if multiple callbacks can be executed within a given time interval, the engine defaults to executing once for performance reasons. Setting `jumpFrame` to true will allow multiple executions in quick succession. + * @zh 定时重复执行。 + * @param delay 间隔时间(单位毫秒)。 + * @param caller 执行域(this)。 + * @param method 定时器回调函数。 + * @param args 回调参数。 + * @param coverBefore 是否覆盖之前的延迟执行,默认为 true 。 + * @param jumpFrame 时钟是否跳帧。基于时间的循环回调,单位时间间隔内,如能执行多次回调,出于性能考虑,引擎默认只执行一次,设置jumpFrame=true后,则回调会连续执行多次。 + */ + loop(delay: number, caller: any, method: Function, args?: any[], coverBefore?: boolean, jumpFrame?: boolean): void; + /** + * Executes once after a delay in frames. + * @param delay The delay time in frames. + * @param caller The scope of the object (this). + * @param method The callback function to be executed by the timer. + * @param args The arguments to pass to the callback function. + * @param coverBefore Whether to overwrite previous delayed execution, default is true. + * @zh 定时执行一次(基于帧率)。 + * @param delay 延迟几帧(单位为帧)。 + * @param caller 执行域(this)。 + * @param method 定时器回调函数。 + * @param args 回调参数。 + * @param coverBefore 是否覆盖之前的延迟执行,默认为 true。 + */ + frameOnce(delay: number, caller: any, method: Function, args?: any[], coverBefore?: boolean): void; + /** + * Repeatedly executes at frame intervals. + * @param delay The interval time in frames. + * @param caller The scope of the object (this). + * @param method The callback function to be executed by the timer. + * @param args The arguments to pass to the callback function. + * @param coverBefore Whether to overwrite previous delayed execution, default is true. + * @zh 定时重复执行(基于帧率)。 + * @param delay 间隔几帧(单位为帧)。 + * @param caller 执行域(this)。 + * @param method 定时器回调函数。 + * @param args 回调参数。 + * @param coverBefore 是否覆盖之前的延迟执行,默认为 true。 + */ + frameLoop(delay: number, caller: any, method: Function, args?: any[], coverBefore?: boolean): void; + /** + * @en Return statistical information + * @zh 返回统计信息 + */ + toString(): string; + /** + * @en Cleaning the timer. + * @param caller The scope of the object (this). + * @param method Timer callback function. + * @zh 清理定时器。 + * @param caller 执行域(this)。 + * @param method 定时器回调函数。 + */ + clear(caller: any, method: Function): void; + /** + * @en Clears all timers associated with the object. + * @param caller The scope of the object (this). + * @zh 清理对象身上的所有定时器。 + * @param caller 执行域(this)。 + */ + clearAll(caller: any): void; + /** @private */ + private _getHandler; + /** + * @en Delays the execution. + * @param caller The scope of the object (this). + * @param method The timer callback function. + * @param args The callback arguments. Default is null. + * @zh 延迟执行。 + * @param caller 执行域(this)。 + * @param method 定时器回调函数。 + * @param args 回调参数。 + */ + callLater(caller: any, method: Function, args?: any[]): void; + /** + * @en Immediately executes the callLater. + * @param caller The scope of the object (this). + * @param method The callback function for the timer. + * @zh 立即执行 callLater。 + * @param caller 执行域(this)。 + * @param method 定时器回调函数。 + */ + runCallLater(caller: any, method: Function): void; + /** + * @en Cancels the execution of callLater. + * @param caller The scope of the object (this). + * @param method The callback function for the timer. + * @zh 取消执行 callLater。 + * @param caller 执行域(this)。 + * @param method 定时器回调函数。 + */ + clearCallLater(caller: any, method: Function): void; + /** + * @en Immediately advance the timer, execute it, and then remove it from the queue. + * @param caller The scope of the object (this). + * @param method Timer callback function. + * @zh 立即提前执行定时器,执行后从队列中删除。 + * @param caller 执行域(this)。 + * @param method 定时器回调函数。 + */ + runTimer(caller: any, method: Function): void; + /** + * @en Pause the clock. + * @zh 暂停时钟。 + */ + pause(): void; + /** + * @en Resume the clock. + * @zh 恢复时钟。 + */ + resume(): void; + /** + * @en Destroy the timer, and clear all events on the timer. + * @zh 删除定时器,同时清理定时器上的所有事件。 + */ + destroy(): void; + } + /** + * @en The `Tween` class is an easing class. It is used to implement the interpolation of properties of a target object. + * @zh `Tween` 类是一个缓动类。使用此类能够实现对目标对象属性的渐变。 + */ + class Tween { + /**@private */ + private static tweenMap; + /**@private */ + private _complete; + /**@private */ + private _target; + /**@private */ + private _ease; + /**@private */ + private _props; + /**@private */ + private _duration; + /**@private */ + private _delay; + /**@private */ + private _startTimer; + /**@private */ + private _usedTimer; + /**@private */ + private _usedPool; + /**@private */ + private _delayParam; + /** + * @private + * @en Unique identifier used by TimeLintLite. + * @zh 唯一标识,由 TimeLintLite 使用。 + */ + gid: number; + /** + * @en Update callback, when the buffering value changes, the value of the callback changes + * @zh 更新回调,缓动数值发生变化时,回调变化的值。 + */ + update: Handler; + /** + * @en The number of times to replay the tween. If set to 0, it indicates an infinite loop. + * @zh 重播次数,如果设置为 0,则表示无限循环播放。 + */ + repeat: number; + /**当前播放次数*/ + private _count; + /** + * @en Tweens the object's properties to the target values. + * @param target The target object whose properties will be tweened. + * @param props The list of properties to change, e.g., {x:100, y:20, ease:Ease.backOut, complete:Handler.create(this,onComplete), update:new Handler(this,onUpdate)}. + * @param duration The time taken for the tween in milliseconds. + * @param ease The type of easing, defaults to linear motion. + * @param complete The callback function when the tween completes. + * @param delay The delay before the tween starts. + * @param coverBefore Whether to override the previous tween. + * @param autoRecover Whether to automatically recover after the tween ends, defaults to true. + * @returns Returns the Tween object. + * @zh 缓动对象的props属性到目标值。 + * @param target 目标对象(即将更改属性值的对象)。 + * @param props 变化的属性列表,比如{x:100,y:20,ease:Ease.backOut,complete:Handler.create(this,onComplete),update:new Handler(this,onComplete)}。 + * @param duration 花费的时间,单位毫秒。 + * @param ease 缓动类型,默认为匀速运动。 + * @param complete 结束回调函数。 + * @param delay 延迟执行时间。 + * @param coverBefore 是否覆盖之前的缓动。 + * @param autoRecover 是否自动回收,默认为true,缓动结束之后自动回收到对象池。 + * @return 返回Tween对象。 + */ + static to(target: any, props: any, duration: number, ease?: Function | null, complete?: Handler | null, delay?: number, coverBefore?: boolean, autoRecover?: boolean): Tween; + /** + * @en From the props attribute, tween to the current state. + * @param target The target object whose properties will be tweened. + * @param props The list of properties to change, e.g., {x:100, y:20, ease:Ease.backOut, complete:Handler.create(this,onComplete), update:new Handler(this,onUpdate)}. + * @param duration The time taken for the tween in milliseconds. + * @param ease The type of easing, defaults to linear motion. + * @param complete The callback function when the tween completes. + * @param delay The delay before the tween starts. + * @param coverBefore Whether to override the previous tween. + * @param autoRecover Whether to automatically recover after the tween ends, defaults to true. + * @returns Returns the Tween object. + * @zh 从props属性,缓动到当前状态。 + * @param target 目标对象(即将更改属性值的对象)。 + * @param props 变化的属性列表,比如{x:100,y:20,ease:Ease.backOut,complete:Handler.create(this,onComplete),update:new Handler(this,onComplete)}。 + * @param duration 花费的时间,单位毫秒。 + * @param ease 缓动类型,默认为匀速运动。 + * @param complete 结束回调函数。 + * @param delay 延迟执行时间。 + * @param coverBefore 是否覆盖之前的缓动。 + * @param autoRecover 是否自动回收,默认为true,缓动结束之后自动回收到对象池。 + * @return 返回Tween对象。 + */ + static from(target: any, props: any, duration: number, ease?: Function, complete?: Handler, delay?: number, coverBefore?: boolean, autoRecover?: boolean): Tween; + /** + * @en Tweens the props attribute of the object to the target value. + * @param target The target object whose properties will be tweened. + * @param props The list of properties to change, e.g., {x:100, y:20, ease:Ease.backOut, complete:Handler.create(this,onComplete), update:new Handler(this,onUpdate)}. + * @param duration The time taken for the tween in milliseconds. + * @param ease The type of easing, defaults to linear motion. + * @param complete The callback function when the tween completes. + * @param delay The delay before the tween starts. + * @param coverBefore Whether to override the previous tween. + * @returns Returns the Tween object. + * @zh 缓动对象的props属性到目标值。 + * @param target 目标对象(即将更改属性值的对象)。 + * @param props 变化的属性列表,比如{x:100,y:20,ease:Ease.backOut,complete:Handler.create(this,onComplete),update:new Handler(this,onComplete)}。 + * @param duration 花费的时间,单位毫秒。 + * @param ease 缓动类型,默认为匀速运动。 + * @param complete 结束回调函数。 + * @param delay 延迟执行时间。 + * @param coverBefore 是否覆盖之前的缓动。 + * @return 返回Tween对象。 + */ + to(target: any, props: any, duration: number, ease?: Function, complete?: Handler, delay?: number, coverBefore?: boolean): Tween; + /** + * @en From the props attribute, slow down to the current state. + * @param target The target object (the object whose property values will be changed). + * @param props A list of changing properties, such as {x:100, y:20, ease:Ease.backOut, complete:Handler.create(this,onComplete), update:new Handler(this,onComplete)}. + * @param duration The time spent, in milliseconds. + * @param ease The easing type, default is uniform motion. Default value is null. + * @param complete The callback function at the end. Default value is null. + * @param delay The delay time before execution. Default value is 0. + * @param coverBefore Whether to cover the previous tween. Default value is false. + * @returns Returns a Tween object. + * @zh 从props属性,缓动到当前状态。 + * @param target 目标对象(即将更改属性值的对象)。 + * @param props 变化的属性列表,比如{x:100,y:20,ease:Ease.backOut,complete:Handler.create(this,onComplete),update:new Handler(this,onComplete)}。 + * @param duration 花费的时间,单位毫秒。 + * @param ease 缓动类型,默认为匀速运动。 + * @param complete 结束回调函数。 + * @param delay 延迟执行时间。 + * @param coverBefore 是否覆盖之前的缓动。 + * @return 返回Tween对象。 + */ + from(target: any, props: any, duration: number, ease?: Function | null, complete?: Handler | null, delay?: number, coverBefore?: boolean): Tween; + private firstStart; + private _initProps; + private _beginLoop; + /**执行缓动**/ + private _doEase; + /** + * @en Set the current execution progress ratio. + * @zh 设置当前执行进度比例。 + */ + set progress(v: number); + /** + * @en Immediately complete the tween and reach the end point. + * @zh 立即结束缓动并到达终点。 + */ + complete(): void; + /** + * @en Pause the tween. It can be resumed using resume() or restart(). + * @zh 暂停缓动。可以通过 resume() 或 restart() 重新开始。 + */ + pause(): void; + /** + * @en Set the start time of the tween. + * @param startTime The start time. + * @zh 设置缓动的开始时间。 + * @param startTime 开始时间。 + */ + setStartTime(startTime: number): void; + /** + * @en Clear all tweens on the specified target object. + * @param target The target object. + * @zh 清理指定目标对象上的所有缓动。 + * @param target 目标对象。 + */ + static clearAll(target: any): void; + /** + * @en Clear a specific tween. + * @param tween The tween object to clear. + * @zh 清理某个特定的缓动。 + * @param tween 要清理的缓动对象。 + */ + static clear(tween: Tween): void; + /**@private 同clearAll,废弃掉,尽量别用。*/ + static clearTween(target: any): void; + /** + * @en Stop and clear the current tween. + * @zh 停止并清理当前缓动。 + */ + clear(): void; + /** + * @en Recycle to the object pool. + * @zh 回收到对象池。 + */ + recover(): void; + private _remove; + /** + * @en Restart the paused tween. + * @zh 重新开始已暂停的缓动。 + */ + restart(): void; + /** + * @en Resume the paused tween. + * @zh 恢复已暂停的缓动。 + */ + resume(): void; + private static easeNone; + } + /** + * @en Utils is a utility class. + * @zh Utils 是工具类。 + */ + class Utils { + /** + * @en Converts an angle to radians. + * @param angle The angle value. + * @returns The radian value. + * @zh 将角度转换为弧度。 + * @param angle 角度值。 + * @return 返回弧度值。 + */ + static toRadian(angle: number): number; + /** + * @en Converts radians to an angle. + * @param radian The radian value. + * @returns The angle value in degrees. + * @zh 将弧度转换为角度。 + * @param radian 弧度值。 + * @return 返回角度值。 + */ + static toAngle(radian: number): number; + /** + * @en Converts an unsigned integer color value to a string representation. + * @param color The color value. + * @returns A string representation of the color value. + * @zh 将 uint 类型的颜色值转换为字符串型颜色值。 + * @param color 颜色值。 + * @return 字符串型颜色值。 + */ + static toHexColor(color: number): string; + /** + * @en Converts a string color value to a number color. + * @param value The string color value. + * @returns The color value as a number. + * @zh 将字符串型颜色值转换为数字型颜色值。 + * @param value 字符串颜色值 + * @returns 作为数字的颜色值 + */ + static fromStringColor(value: string): number; + /** + * @en Gets a globally unique ID. + * @zh 获取一个全局唯一ID。 + */ + static getGID(): number; + /** + * @private + * @en Clears the source array and copies the values from the array parameter. + * @param source The array to be assigned values. + * @param array The new values to be copied into the source array. + * @returns The copied source array. + * @zh 清空 source 数组,并复制 array 数组的值。 + * @param source 需要赋值的数组。 + * @param array 新的数组值。 + * @return 复制后的数据 source 。 + */ + static copyArray(source: any[], array: any[]): any[]; + /** + * @private + * @en Batch translates point coordinates by the specified offsets. + * @param points The list of point coordinates. + * @param x The offset to translate along the x-axis. + * @param y The offset to translate along the y-axis. + * @zh 批量移动点坐标,按照指定的偏移量。 + * @param points 坐标列表。 + * @param x x轴偏移量。 + * @param y y轴偏移量。 + */ + static transPointList(points: any[], x: number, y: number): void; + /** + * @en Parses a string and returns an integer. Unlike the native JavaScript parseInt, if the string is empty or not a number, this method returns 0 instead of NaN. + * @param str The string to be parsed. + * @param radix The radix for parsing the number (between 2 and 36). Defaults to 0, which means decimal. The other values range from 2 to 36. If it starts with "0xX" or "0X", it will be based on 16. If the parameter is not within the above range, this method returns 0. + * @returns The parsed number. + * @zh 解析字符串并返回一个整数。与 JavaScript 原生的 parseInt 不同,如果字符串为空或非数字,这里返回 0 而不是 NaN。 + * @param str 要被解析的字符串。 + * @param radix 表示要解析的数字的基数。默认值为0,表示10进制,其他值介于 2 ~ 36 之间。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。如果该参数不在上述范围内,则此方法返回 0。 + * @return 返回解析后的数字。 + */ + static parseInt(str: string, radix?: number): number; + /** + * @en Gets the base name of the file from the specified path, including the extension. + * @zh 从指定路径中获取文件名(包含扩展名)。 + */ + static getBaseName(path: string): string; + /** + * @en Gets the file extension from the specified path and converts it to lowercase. For example, "1. abc" will return abc. + * @zh 从指定路径获取文件扩展名,并转换为小写字母。例如"1.abc"将返回abc。 + */ + static getFileExtension(path: string): string; + /** + * @en Changes the file extension of the specified path. + * @param path The file path. + * @param newExt The new file extension. + * @param excludeDot Whether to exclude the dot prefix in the new extension. Default is false. + * @returns The path with the new file extension. + * @zh 更改指定路径的文件扩展名。 + * @param path 文件路径。 + * @param newExt 新的文件扩展名。 + * @param excludeDot 是否在新扩展中排除点前缀。默认值为false。 + * @returns 具有新文件扩展名的路径。 + */ + static replaceFileExtension(path: string, newExt: string, excludeDot?: boolean): string; + /** + * + * @param str 判断一个字符串是否UUID格式 + * @returns + */ + static isUUID(str: string): boolean; + /** + * @deprecated 请使用uint8ArrayToArrayBufferAsync函数代替 + * @en Converts a RenderTexture to a Base64 encoded string. + * @param rendertexture The RenderTexture to convert. + * @returns The converted Base64 string + * @zh 将RenderTexture转换为Base64 + * @param rendertexture 要转换的RenderTexture + * @returns 转换后的Base64字符串 + */ + static uint8ArrayToArrayBuffer(rendertexture: RenderTexture | RenderTexture2D): string; + /** + * @en Converts a RenderTexture to a Base64 encoded string. + * @param rendertexture The RenderTexture to convert. + * @returns A promise that resolves to a Base64 string representing the RenderTexture. + * @zh 将 RenderTexture 转换为 Base64 编码的字符串。 + * @param rendertexture 要转换的 RenderTexture。 + * @returns 一个 Promise,该 Promise 将解析为表示 RenderTexture 的 Base64 字符串。 + */ + static uint8ArrayToArrayBufferAsync(rendertexture: RenderTexture | RenderTexture2D): Promise; + } + /** + * @private + * @en VectorGraphManager class for managing vector graphics. + * @zh 用于管理矢量图形的 VectorGraphManager 类。 + */ + class VectorGraphManager { + /** + * @en Singleton instance of VectorGraphManager. + * @zh VectorGraphManager 的单例实例。 + */ + static instance: VectorGraphManager; + /** + * @en Dictionary to track the usage of shapes. + * @zh 用于跟踪形状使用情况的字典。 + */ + useDic: any; + /** + * @en Dictionary to store shapes. + * @zh 用于存储形状的字典。 + */ + shapeDic: any; + /** + * @en Dictionary to store shape lines. + * @zh 用于存储形状线条的字典。 + */ + shapeLineDic: any; + private _id; + private _checkKey; + private _freeIdArray; + constructor(); + /** + * @en Get the singleton instance of VectorGraphManager. + * @returns The singleton instance of VectorGraphManager. + * @zh 获取 VectorGraphManager 的单例实例。 + * @returns VectorGraphManager 的单例实例。 + */ + static getInstance(): VectorGraphManager; + /** + * @en Get an available ID. + * @returns An available ID. + * @zh 获取一个可用的 ID。 + * @returns 一个可用的 ID。 + */ + getId(): number; + /** + * @en Add a shape to the list. + * @param id The ID of the shape. + * @param shape The shape object. + * @zh 将一个形状添加到列表中。 + * @param id 形状的 ID。 + * @param shape 形状对象。 + */ + addShape(id: number, shape: any): void; + /** + * @en Add a line shape to the list. + * @param id The ID of the line shape. + * @param Line The line shape object. + * @zh 将一个线形状添加到列表中。 + * @param id 线形状的 ID。 + * @param Line 线形状对象。 + */ + addLine(id: number, Line: any): void; + /** + * @en Check if an object is in use. + * @param id The ID of the object to check. + * @zh 检查一个对象是否正在使用中。 + * @param id 要检查的对象的 ID。 + */ + getShape(id: number): void; + /** + * @en Delete a shape object. + * @param id The ID of the shape to delete. + * @zh 删除一个形状对象。 + * @param id 要删除的形状的 ID。 + */ + deleteShape(id: number): void; + /** + * @en Get the cache list. + * @returns An array of cached objects. + * @zh 获取缓存列表。 + * @returns 缓存对象的数组。 + */ + getCacheList(): any[]; + /** + * @en Start the disposal process, preparing for destruction. + * @zh 开始清理过程,准备销毁。 + */ + startDispose(key: boolean): void; + /** + * @en Confirm destruction. + * @zh 确认销毁。 + */ + endDispose(): void; + } + class WasmAdapter { + static instantiateWasm: (url: string, imports: any) => Promise; + static locateFile: (path: string, dir: string, webDir: string) => string; + static Memory: { + new (descriptor: WebAssembly.MemoryDescriptor): WebAssembly.Memory; + prototype: WebAssembly.Memory; + }; + static create(module: Function, wasmFile?: string): Function; + } + /** + * 封装弱引用WeakMap + * 如果支持WeakMap,则使用WeakMap,如果不支持,则用Object代替 + * 注意:如果采用Object,为了防止内存泄漏,则采用定时清理缓存策略 + * + * 这里的设计是错误的,为了兼容,先不删掉这个类,直接采用Object + */ + class WeakObject { + /**是否支持WeakMap*/ + static supportWeakMap: boolean; + /**如果不支持WeakMap,则多少时间清理一次缓存,默认10分钟清理一次*/ + static delInterval: number; + /**全局WeakObject单例*/ + static I: WeakObject; + /**@private */ + private static _maps; + /**清理缓存,回收内存*/ + static clearCache(): void; + constructor(); + /** + * 设置缓存 + * @param key kye对象,可被回收 + * @param value object对象,可被回收 + */ + set(key: any, value: any): void; + /** + * 获取缓存 + * @param key kye对象,可被回收 + */ + get(key: any): any; + /** + * 删除缓存 + */ + del(key: any): void; + /** + * 是否有缓存 + */ + has(key: any): boolean; + } + /** + * @private + * @en WordText class for managing text content and rendering. + * @zh WordText 类,用于管理文本内容和渲染。 + */ + class WordText { + /** + * @en The text content. + * @zh 文本内容。 + */ + text: string; + /** + * @en The width of the entire WordText. -1 indicates it hasn't been calculated yet. + * @zh 整个 WordText 的宽度。-1 表示还没有计算。 + */ + width: number; + /** + * @en The text information saved by grouping the characters of this object into texture groups. Inside is another array. The specific meaning can be found in the place of use. + * @zh 把本对象的字符按照texture分组保存的文字信息。里面又是一个数组。具体含义见使用的地方。 + */ + pageChars: any[]; + /** + * @en The ctx used for caching above. When crossing ctx (such as drawToTexture), it needs to be cleaned up, (because the settings for different ctx are different?). Set to any to indicate no concern for specific types, only for comparison purposes + * @zh 上面缓存的时候用的ctx。跨ctx的时候(例如drawToTexture)要清理,(因为不同的ctx的设置不同?)。设置为any表示不关心具体类型,只是用来比较的 + */ + pagecharsCtx: any; + /** + * @en Horizontal scale cached during rendering. + * @zh 渲染时缓存的水平缩放。 + */ + scalex: number; + /** + * @en Vertical scale cached during rendering. + * @zh 渲染时缓存的垂直缩放。 + */ + scaley: number; + _nativeObj: any; + _splitRender: boolean; + constructor(); + /** + * @en Set the text content. + * @param txt The text to set. + * @zh 设置文本内容。 + * @param txt 要设置的文本。 + */ + setText(txt: string): void; + /** + * @en Convert the WordText to a string. + * @returns The text content. + * @zh 将 WordText 转换为字符串。 + * @returns 文本内容。 + */ + toString(): string; + /** + * @en The length of the text. + * @zh 文本的长度。 + */ + get length(): number; + /** + * @en Clean the cache. This method will delete associated textures. + * It's okay not to do it, textrender will automatically clean up the unused ones + * @zh 清理缓存。此方法会删除关联的贴图。 + * 不做也可以,textrender会自动清理不用的 + * TODO 重用 + */ + cleanCache(): void; + /** + * @en The split render status. + * @zh 拆分渲染状态。 + */ + get splitRender(): boolean; + set splitRender(value: boolean); + } + class BlendMode { + static activeBlendFunction: Function; + static NORMAL: string; + static MASK: string; + static LIGHTER: string; + static fns: any[]; + static targetFns: any[]; + static BlendNormal(): void; + static BlendAdd(): void; + static BlendMultiply(): void; + static BlendScreen(): void; + static BlendOverlay(): void; + static BlendLight(): void; + static BlendNormalTarget(): void; + static BlendAddTarget(): void; + static BlendMultiplyTarget(): void; + static BlendScreenTarget(): void; + static BlendOverlayTarget(): void; + static BlendLightTarget(): void; + static BlendMask(): void; + static BlendDestinationOut(): void; + static BlendSourceAlpha(): void; + } + class DrawStyle { + static DEFAULT: DrawStyle; + static _Defaultinit(): void; + _color: ColorUtils; + static create(value: ColorUtils | string): DrawStyle; + constructor(value: any); + setValue(value: any): void; + reset(): void; + toInt(): number; + equal(value: any): boolean; + toColorStr(): string; + } + class Path { + paths: any[]; + private _curPath; + constructor(); + beginPath(convex: boolean): void; + closePath(): void; + newPath(): void; + addPoint(pointX: number, pointY: number): void; + push(points: any[], convex: boolean): void; + reset(): void; + } + interface ISaveData { + isSaveMark(): boolean; + restore(context: Context): void; + } + class SaveBase implements ISaveData { + static TYPE_ALPHA: number; + static TYPE_FILESTYLE: number; + static TYPE_FONT: number; + static TYPE_LINEWIDTH: number; + static TYPE_STROKESTYLE: number; + static TYPE_MARK: number; + static TYPE_TRANSFORM: number; + static TYPE_TRANSLATE: number; + static TYPE_ENABLEMERGE: number; + static TYPE_TEXTBASELINE: number; + static TYPE_TEXTALIGN: number; + static TYPE_GLOBALCOMPOSITEOPERATION: number; + static TYPE_CLIPRECT: number; + static TYPE_CLIPRECT_STENCIL: number; + static TYPE_IBVB: number; + static TYPE_SHADER: number; + static TYPE_FILTERS: number; + static TYPE_FILTERS_TYPE: number; + static TYPE_COLORFILTER: number; + private static POOL; + private static _namemap; + private _valueName; + private _value; + private _dataObj; + private _newSubmit; + constructor(); + isSaveMark(): boolean; + restore(context: Context): void; + static save(context: Context, type: number, dataObj: any, newSubmit: boolean): void; + } + class SaveClipRect implements ISaveData { + private static POOL; + _globalClipMatrix: Matrix; + _clipInfoID: number; + _clipRect: Rectangle; + isSaveMark(): boolean; + restore(context: Context): void; + static save(context: Context): void; + } + class SaveMark implements ISaveData { + private static POOL; + constructor(); + isSaveMark(): boolean; + restore(context: Context): void; + static Create(context: Context): SaveMark; + } + class SaveTransform implements ISaveData { + private static POOL; + constructor(); + isSaveMark(): boolean; + restore(context: Context): void; + static save(context: Context): void; + } + class SaveTranslate implements ISaveData { + private static POOL; + isSaveMark(): boolean; + restore(context: Context): void; + static save(context: Context): void; + } + /** + * 对象 cacheas normal的时候,本质上只是想把submit缓存起来,以后直接执行 + * 为了避免各种各样的麻烦,这里采用复制相应部分的submit的方法。执行环境还是在原来的context中 + * 否则包括clip等都非常难以处理 + */ + class WebGLCacheAsNormalCanvas { + submitStartPos: number; + submitEndPos: number; + context: Context; + touches: CharRenderInfo[]; + submits: any[]; + sprite: Sprite | null; + private _pathMesh; + private _triangleMesh; + meshlist: Sprite2DGeometry[]; + private _oldMesh; + private _oldPathMesh; + private _oldTriMesh; + private _oldMeshList; + private cachedClipInfo; + private oldTx; + private oldTy; + private static matI; + invMat: Matrix; + constructor(ctx: Context, sp: Sprite); + startRec(): void; + endRec(): void; + isTextNeedRestore(): boolean; + flushsubmit(): void; + releaseMem(): void; + } + class Shader2D { + /** + * primitive Mesh Descript + */ + static readonly primitiveAttribute: { + [name: string]: [ + number, + ShaderDataType + ]; + }; + /** + * TextureSV Mesh Descript + */ + static readonly textureAttribute: { + [name: string]: [ + number, + ShaderDataType + ]; + }; + /** + * init 2D internal Shader + */ + static __init__(): void; + } + class ShaderDefines2D { + static UNIFORM_CLIPMATDIR: number; + static UNIFORM_CLIPMATPOS: number; + static UNIFORM_MMAT2: number; + static UNIFORM_SIZE: number; + static UNIFORM_VERTALPHA: number; + static UNIFORM_MVPMatrix: number; + static UNIFORM_SPRITETEXTURE: number; + static UNIFORM_STRENGTH_SIG2_2SIG2_GAUSS1: number; + static UNIFORM_BLURINFO: number; + static UNIFORM_COLORALPHA: number; + static UNIFORM_COLORMAT: number; + static UNIFORM_COLOR: number; + static UNIFORM_BLURINFO1: number; + static UNIFORM_BLURINFO2: number; + static UNIFORM_COLORADD: number; + static UNIFORM_TEXRANGE: number; + static __init__(): void; + static initSprite2DCommandEncoder(): void; + } + class PrimitiveSV extends Value2D { + constructor(); + protected initialize(): void; + reinit(): void; + } + class TextureSV extends Value2D { + private _blurInfo; + private _u_blurInfo1; + private _u_blurInfo2; + private _u_TexRange; + private _colorMat; + private _colorAlpha; + private _strength_sig2_2sig2_gauss1; + constructor(); + protected initialize(): void; + reinit(): void; + get blurInfo(): Vector2; + set blurInfo(value: Vector2); + get u_blurInfo1(): Vector4; + set u_blurInfo1(value: Vector4); + get u_blurInfo2(): Vector4; + set u_blurInfo2(value: Vector4); + get u_TexRange(): Vector4; + set u_TexRange(value: Vector4); + get colorMat(): Matrix4x4; + set colorMat(value: Matrix4x4); + get colorAlpha(): Vector4; + set colorAlpha(value: Vector4); + get strength_sig2_2sig2_gauss1(): Vector4; + set strength_sig2_2sig2_gauss1(value: Vector4); + } + enum RenderSpriteData { + Zero = 0, + Texture2D = 1, + Primitive = 2 + } + class Value2D { + protected static _cache: any[]; + protected static _typeClass: any; + static _compileDefine: IDefineDatas; + _needRelease: boolean; + shaderData: ShaderData; + _defaultShader: Shader3D; + private mainID; + private ref; + private _cacheID; + filters: any[]; + private _textureHost; + constructor(mainID: RenderSpriteData); + protected initialize(): void; + reinit(): void; + static _initone(type: number, classT: any): void; + /** + * 对象池概念 + * @param mainType + * @returns + */ + static create(mainType: RenderSpriteData): Value2D; + get size(): Vector2; + set vertAlpha(value: number); + get vertAlpha(): number; + get u_MvpMatrix(): Matrix4x4; + get textureHost(): Texture | BaseTexture; + set textureHost(value: Texture | BaseTexture); + set color(value: Vector4); + get color(): Vector4; + set colorAdd(value: Vector4); + get colorAdd(): Vector4; + set clipMatDir(value: Vector4); + get clipMatDir(): Vector4; + set clipMatPos(value: Vector2); + get clipMatPos(): Vector2; + upload(material: Material | null, shaderData: ShaderData): void; + setFilter(value: ColorFilter): void; + clear(): void; + blendNormal(): void; + blendPremulAlpha(): void; + blendAdd(): void; + blendMask(): void; + release(): void; + } + class Value2DManager { + } + class BasePoly { + private static _checkMinAngle; + /** + * 构造线的三角形数据。根据一个位置数组生成vb和ib + * @param p + * @param indices + * @param lineWidth + * @param indexBase 顶点开始的值,ib中的索引会加上这个 + * @param outVertex + * @return + */ + static createLine2(p: any[], indices: any[], lineWidth: number, indexBase: number, outVertex: any[], loop: boolean): any[]; + private static _setMiddleVertexs; + static getNormal(x1: number, y1: number, x2: number, y2: number, w: number, out?: Vector2): Vector2; + /** + * 相邻的两段线,边界会相交,这些交点可以作为三角形的顶点。有两种可选,一种是采用左左,右右交点,一种是采用 左右,左右交点。当两段线夹角很小的时候,如果采用 + * 左左,右右会产生很长很长的交点,这时候就要采用左右左右交点,相当于把尖角截断。 + * 当采用左左右右交点的时候,直接用切线的垂线。采用左右左右的时候,用切线 + * 切线直接采用两个方向的平均值。不能用3-1的方式,那样垂线和下一段可能都在同一方向(例如都在右方) + * 注意把重合的点去掉 + * @param path + * @param color + * @param width + * @param loop + * @param outvb + * @param vbstride 顶点占用几个float,(bytelength/4) + * @param outib + * test: + * 横线 + * [100,100, 400,100] + * 竖线 + * [100,100, 100,400] + * 直角 + * [100,100, 400,100, 400,400] + * 重合点 + * [100,100,100,100,400,100] + * 同一直线上的点 + * [100,100,100,200,100,3000] + * 像老式电视的左边不封闭的图形 + * [98,176, 163,178, 95,66, 175,177, 198,178, 252,56, 209,178, 248,175, 248,266, 209,266, 227,277, 203,280, 188,271, 150,271, 140,283, 122,283, 131,268, 99,268] + * + */ + static createLineTriangle(path: any[], color: number, width: number, loop: boolean, outvb: Float32Array, vbstride: number, outib: Uint16Array): void; + } + class Earcut { + static earcut(data: any, holeIndices: any, dim: any): any; + static linkedList(data: any, start: any, end: any, dim: any, clockwise: any): any; + static filterPoints(start: any, end: any): any; + static earcutLinked(ear: any, triangles: any, dim: any, minX: any, minY: any, invSize: any, pass?: any): any; + static isEar(ear: any): any; + static isEarHashed(ear: any, minX: any, minY: any, invSize: any): boolean; + static cureLocalIntersections(start: any, triangles: any, dim: any): any; + static splitEarcut(start: any, triangles: any, dim: any, minX: any, minY: any, invSize: any): void; + static eliminateHoles(data: any, holeIndices: any, outerNode: any, dim: any): any; + static compareX(a: any, b: any): any; + static eliminateHole(hole: any, outerNode: any): void; + static findHoleBridge(hole: any, outerNode: any): any; + static indexCurve(start: any, minX: any, minY: any, invSize: any): void; + static sortLinked(list: any): any; + static zOrder(x: any, y: any, minX: any, minY: any, invSize: any): any; + static getLeftmost(start: any): any; + static pointInTriangle(ax: any, ay: any, bx: any, by: any, cx: any, cy: any, px: any, py: any): boolean; + static isValidDiagonal(a: any, b: any): boolean; + static area(p: any, q: any, r: any): any; + static equals(p1: any, p2: any): boolean; + static intersects(p1: any, q1: any, p2: any, q2: any): boolean; + static intersectsPolygon(a: any, b: any): boolean; + static locallyInside(a: any, b: any): boolean; + static middleInside(a: any, b: any): boolean; + static splitPolygon(a: any, b: any): any; + static insertNode(i: any, x: any, y: any, last: any): any; + static removeNode(p: any): void; + static signedArea(data: any, start: any, end: any, dim: any): any; + } + class EarcutNode { + i: any; + x: any; + y: any; + prev: any; + next: any; + z: any; + prevZ: any; + nextZ: any; + steiner: any; + constructor(i: any, x: any, y: any); + } + class SubmitBase { + static KEY_ONCE: number; + static KEY_FILLRECT: number; + static KEY_DRAWTEXTURE: number; + static KEY_VG: number; + static KEY_TRIANGLES: number; + static RENDERBASE: SubmitBase; + static ID: number; + clipInfoID: number; + blendType: number; + protected _id: number; + _mesh: Sprite2DGeometry; + material: Material; + _colorFiler: ColorFilter; + shaderValue: Value2D; + constructor(); + static create(context: Context, mesh: Sprite2DGeometry, sv: Value2D): SubmitBase; + } + /** + * ... + * @author xie + */ + class SubmitKey { + blendShader: number; + submitType: number; + other: number; + constructor(); + clear(): void; + } + /** + * 阿拉伯文的转码。把unicode的阿拉伯文字母编码转成他们的老的能描述不同写法的编码。 + * 这个是从GitHub上 Javascript-Arabic-Reshaper 项目转来的 + * https://github.com/louy/Javascript-Arabic-Reshaper/blob/master/src/index.js + */ + /** + * Javascript Arabic Reshaper by Louy Alakkad + * https://github.com/louy/Javascript-Arabic-Reshaper + * Based on (http://git.io/vsnAd) + */ + class ArabicReshaper { + characterMapContains(c: number): boolean; + getCharRep(c: number): boolean; + getCombCharRep(c1: number, c2: number): boolean; + isTransparent(c: number): boolean; + getOriginalCharsFromCode(code: number): string; + /** + * 转换函数。从normal转到presentB + * 这个返回的字符串可以直接按照从左到右的顺序渲染。 + * 例如 + * graphics.fillText(convertArabic('سلام'),....) + * + */ + convertArabic(normal: any): string; + convertArabicBack(apfb: any): string; + } + class AtlasGrid { + atlasID: number; + private _width; + private _height; + private _texCount; + private _rowInfo; + private _cells; + _used: number; + constructor(width?: number, height?: number, id?: number); + addRect(type: number, width: number, height: number, pt: Point): boolean; + private _release; + private _init; + private _get; + private _fill; + private _check; + private _clear; + } + class CharRender_Canvas extends ICharRender { + private static canvas; + private ctx; + private lastScaleX; + private lastScaleY; + private maxTexW; + private maxTexH; + private scaleFontSize; + private showDbgInfo; + private supportImageData; + constructor(maxw: number, maxh: number, scalefont?: boolean, useImageData?: boolean, showdbg?: boolean); + /** + * @override + */ + get canvasWidth(): number; + /** + * @override + */ + set canvasWidth(w: number); + /** + * + * @param font + * @param str + * @override + */ + getWidth(font: string, str: string): number; + /** + * + * @param sx + * @param sy + * @override + */ + scale(sx: number, sy: number): void; + /** + *TODO stroke + * @param char + * @param font + * @param cri 修改里面的width。 + * @return + * @override + */ + getCharBmp(char: string, font: string, lineWidth: number, colStr: string, strokeColStr: string, cri: CharRenderInfo, margin_left: number, margin_top: number, margin_right: number, margin_bottom: number, rect?: any[] | null): ImageData | null; + getCharCanvas(char: string, font: string, lineWidth: number, colStr: string, strokeColStr: string, cri: CharRenderInfo, margin_left: number, margin_top: number, margin_right: number, margin_bottom: number): ImageData; + } + /** + * TODO如果占用内存较大,这个结构有很多成员可以临时计算 + */ + class CharRenderInfo implements IAutoExpiringResource { + isRandomTouch: boolean; + char: string; + texture: TextTexture; + deleted: boolean; + uv: number[]; + pos: number; + width: number; + height: number; + bmpWidth: number; + bmpHeight: number; + orix: number; + oriy: number; + touchTick: number; + isSpace: boolean; + touch(): void; + } + /** + * ... + * @author laoxie + */ + class CharSubmitCache { + private static __posPool; + private static __nPosPool; + private _data; + private _ndata; + private _tex; + private _imgId; + private _clipid; + private _clipMatrix; + constructor(ctx: Context); + clear(): void; + destroy(): void; + add(ctx: Context, tex: Texture, imgid: number, pos: any[], uv: ArrayLike, color: number): void; + getPos(): any[]; + enable(value: boolean, ctx: Context): void; + submit(ctx: Context): void; + } + class ICharRender { + fontsz: number; + getWidth(font: string, str: string): number; + scale(sx: number, sy: number): void; + get canvasWidth(): number; + set canvasWidth(w: number); + /** + *TODO stroke + * @param char + * @param font + * @param size 返回宽高 + * @return + */ + getCharBmp(char: string, font: string, lineWidth: number, colStr: string, strokeColStr: string, size: CharRenderInfo, margin_left: number, margin_top: number, margin_right: number, margin_bottom: number, rect?: any[] | null): ImageData | null; + } + interface IFontMeasure { + getFontSizeInfo(font: string, size: number): number; + } + class MeasureFont implements IFontMeasure { + private bmpData32; + private charRender; + constructor(charRender: ICharRender); + getFontSizeInfo(font: string, size: number): number; + /** + * 检查当前线是否存在数据 + * @param data + * @param l + * @param sx + * @param ex + * @return + */ + private checkBmpLine; + /** + * 根据bmp数据和当前的包围盒,更新包围盒 + * 由于选择的文字是连续的,所以可以用二分法 + * @param data + * @param curbbx [l,t,r,b] + * @param onlyH 不检查左右 + */ + private updateBbx; + } + /** + * 文字贴图的大图集。 + */ + class TextAtlas { + texWidth: number; + texHeight: number; + private atlasgrid; + texture: TextTexture | null; + charMaps: { + [key: string]: CharRenderInfo; + }; + static atlasGridW: number; + constructor(); + setProtecteDist(d: number): void; + /** + * 如果返回null,则表示无法加入了 + * 分配的时候优先选择最接近自己高度的节点 + * @param w + * @param h + * @return + */ + getAEmpty(w: number, h: number, pt: Point): boolean; + /** + * 大图集格子单元的占用率,老的也算上了。只是表示这个大图集还能插入多少东西。 + */ + get usedRate(): number; + destroy(): void; + printDebugInfo(): void; + } + class TextRender extends EventDispatcher { + static useOldCharBook: boolean; + static atlasWidth: number; + static noAtlas: boolean; + static forceSplitRender: boolean; + static forceWholeRender: boolean; + static scaleFontWithCtx: boolean; + static maxFontScale: number; + static standardFontSize: number; + static destroyAtlasDt: number; + static checkCleanTextureDt: number; + static destroyUnusedTextureDt: number; + static cleanMem: number; + static isWan1Wan: boolean; + static showLog: boolean; + static debugUV: boolean; + /** + * fontSizeInfo + * 记录每种字体的像素的大小。标准是32px的字体。由4个byte组成,分别表示[xdist,ydist,w,h]。 + * xdist,ydist 是像素起点到排版原点的距离,都是正的,表示实际数据往左和上偏多少,如果实际往右和下偏,则算作0,毕竟这个只是一个大概 + * 例如 [Arial]=0x00002020, 表示宽高都是32 + */ + private fontSizeInfo; + charRender: ICharRender; + private mapFont; + private fontID; + private fontScaleX; + private fontScaleY; + private _curStrPos; + static textRenderInst: TextRender; + textAtlases: TextAtlas[]; + private isoTextures; + private static imgdtRect; + private lastFont; + private fontSizeW; + private fontSizeH; + private fontSizeOffX; + private fontSizeOffY; + private renderPerChar; + private fontStr; + static simClean: boolean; + private _fontMeasure; + constructor(); + set fontMeasure(m: IFontMeasure); + get fontMeasure(): IFontMeasure; + private _wan1wansz; + private getFontSizeInfo; + /** + * 设置当前字体,获得字体的大小信息。 + * @param font + */ + setFont(font: FontInfo): void; + /** + * 从string中取出一个完整的char,例如emoji的话要多个 + * 会修改 _curStrPos + * TODO 由于各种文字中的组合写法,这个需要能扩展,以便支持泰文等 + * @param str + * @param start 开始位置 + */ + getNextChar(str: string): string | null; + filltext(ctx: Context, data: string | WordText, x: number, y: number, fontStr: string, color: string, strokeColor: string, lineWidth: number, textAlign: string): void; + _fast_filltext(ctx: Context, data: string | WordText | null, x: number, y: number, font: FontInfo, color: string, strokeColor: string | null, lineWidth: number, textAlign: number): void; + /** + * 画出重新按照贴图顺序分组的文字。 + * @param samePagesData + * @param startx 保存的数据是相对位置,所以需要加上这个偏移。用相对位置更灵活一些。 + * @param y {int} 因为这个只能画在一行上所以没有必要保存y。所以这里再把y传进来 + */ + protected _drawResortedWords(ctx: Context, startx: number, starty: number, samePagesData: { + [key: number]: any; + }): void; + /** + * 检查 txts数组中有没有被释放的资源 + * @param txts {{ri:CharRenderInfo,...}[][]} + * @param startid + * @return + */ + hasFreedText(txts: any[]): boolean; + getCharRenderInfo(str: string, font: FontInfo, color: string, strokeColor: string | null, lineWidth: number, isoTexture?: boolean): CharRenderInfo; + /** + * 添加数据到大图集 + * @param w + * @param h + * @return + */ + addBmpData(data: ImageData, ri: CharRenderInfo): TextAtlas; + /** + * 清理利用率低的大图集 + */ + GC(): void; + /** + * 尝试清理大图集 + */ + cleanAtlases(): void; + printDbgInfo(): void; + showAtlas(n: number, bgcolor: string, x: number, y: number, w: number, h: number): Sprite; + } + /** + * 保存文字的贴图 + */ + class TextTexture extends Texture2D { + private static pool; + private static poolLen; + private static cleanTm; + static EVENT_REUSE: string; + genID: number; + curUsedCovRate: number; + curUsedCovRateAtlas: number; + lastTouchTm: number; + ri: CharRenderInfo; + constructor(textureW?: number, textureH?: number); + /** + * 添加一个文字位图 + * @param data + * @param x 拷贝位置。 + * @param y + * @param uv + * @return uv数组 如果uv不为空就返回传入的uv,否则new一个数组 + */ + addChar(data: ImageData, x: number, y: number, uv?: any[]): any[]; + /** + * 添加一个文字 + * 玩一玩不支持 getImageData,只能用canvas的方式 + * @param canv + * @param x + * @param y + */ + addCharCanvas(canv: any, x: number, y: number, uv?: any[]): any[]; + /** + * 填充白色。调试用。 + */ + fillWhite(): void; + discard(): void; + static getTextTexture(w: number, h: number): TextTexture; + /** + * 定期清理 + * 为了简单,只有发生 getAPage 或者 discardPage的时候才检测是否需要清理 + * + * 暂时先不用这个了。 + */ + static clean(): void; + /** + * 这个贴图被当前帧使用了。 + * 这个是基于贴图的,更简单,效率更高 + */ + touchTexture(): void; + touchRect(ri: CharRenderInfo, frame: number): void; + } + /** + * BufferState 类用于实现渲染所需的Buffer状态集合。 + */ + class BufferState { + private static vertexBufferArray; + /**@private [只读]*/ + _deviceBufferState: IBufferState; + /** + * 创建一个 BufferState 实例。 + */ + constructor(); + applyState(vertexBuffers: VertexBuffer3D[], indexBuffer: IndexBuffer3D | null): void; + /** + * @private + */ + destroy(): void; + } + class IncludeFile { + static splitToWords(str: string, block: ShaderNode): any[]; + script: string; + codes: any; + funs: any; + curUseID: number; + funnames: string; + constructor(txt: string); + getWith(name?: string | null): string; + getFunsScript(funsdef: string): string; + } + class MatirxArray { + /** + * 4*4矩阵数组相乘。 + * o=a*b; + * @param a 4*4矩阵数组。 + * @param b 4*4矩阵数组。 + * @param o 4*4矩阵数组。 + */ + static ArrayMul(a: any[], b: any[], o: any[]): void; + static copyArray(f: any[], t: any[]): void; + } + /** + * drawImage,fillRect等会用到的简单的mesh。每次添加必然是一个四边形。 + */ + class MeshQuadTexture extends Sprite2DGeometry { + static const_stride: number; + private static _fixib; + private static _maxIB; + static VertexDeclarition: VertexDeclaration; + private _vbFloat32Array; + private _curVBPos; + static __int__(): void; + constructor(vballoc?: number); + protected onVBRealloc(buff: ArrayBuffer): void; + protected onIBRealloc(buff: ArrayBuffer): void; + /** + * + * @param pos 顶点坐标 + * @param uv 纹理坐标 + * @param color 顶点颜色 + * @param useTex 是否使用贴图。false的话是给fillRect用的 + */ + addQuad(pos: ArrayLike, uv: ArrayLike, color: number, useTex: boolean): void; + clearMesh(): void; + get ibBuffer(): ArrayBuffer; + get vertexDeclarition(): VertexDeclaration; + } + /** + * 与MeshQuadTexture基本相同。不过index不是固定的 + */ + class MeshTexture extends Sprite2DGeometry { + static const_stride: number; + static VertexDeclarition: VertexDeclaration; + private _vbFloat32Array; + private _ibU16Array; + static __init__(): void; + constructor(); + protected onVBRealloc(buff: ArrayBuffer): void; + protected onIBRealloc(buff: ArrayBuffer): void; + /** + * 增加四个顶点 + * @param vertices + * @param uvs + * @param idx + * @param matrix + * @param rgba + */ + addData(vertices: Float32Array, uvs: Float32Array, idx: Uint16Array, matrix: Matrix, rgba: number, uvrect?: number[]): void; + get vertexDeclarition(): VertexDeclaration; + } + /** + * 用来画矢量的mesh。顶点格式固定为 x,y,rgba + */ + class MeshVG extends Sprite2DGeometry { + static const_stride: number; + static vertexDeclaration: VertexDeclaration; + private _vbFloat32Array; + static __init__(): void; + constructor(); + protected onVBRealloc(buff: ArrayBuffer): void; + protected onIBRealloc(buff: ArrayBuffer): void; + /** + * 往矢量mesh中添加顶点和index。会把rgba和points在mesh中合并。 + * @param points 顶点数组,只包含x,y。[x,y,x,y...] + * @param rgba rgba颜色 + * @param ib index数组。 + */ + addVertAndIBToMesh(points: number[], rgba: number, ib: any[]): void; + get vertexDeclarition(): VertexDeclaration; + } + class RenderState2D { + static worldMatrix4: number[]; + static worldMatrix: Matrix; + static matWVP: any; + static worldAlpha: number; + static worldScissorTest: boolean; + static worldShaderDefines: ShaderDefines2D; + static worldFilters: ColorFilter[]; + static width: number; + static height: number; + static InvertY: boolean; + static restoreTempArray(): void; + static clear(): void; + } + interface IShaderCompiledObj { + vsNode: ShaderNode; + psNode: ShaderNode; + includeNames: Set; + defs: Set; + } + /** + * @private + * ShaderCompile 类用于实现Shader编译。 + */ + class ShaderCompile { + static IFDEF_NO: number; + static IFDEF_YES: number; + static IFDEF_ELSE: number; + static IFDEF_PARENT: number; + static includes: Record; + static loadIncludeFileSync: (fileName: string) => void; + static addInclude(fileName: string, txt: string, allowReplace?: boolean): IncludeFile; + static compile(vs: string, ps: string, basePath?: string): IShaderCompiledObj; + static compileAsync(vs: string, ps: string, basePath: string): Promise; + private static _loadIncludesDeep; + /** + * @private + */ + private static _compileToTree; + static getRenderState(obj: Record, renderState: RenderState): void; + } + class ShaderProcessInfo { + defineString: string[]; + vs: ShaderNode; + ps: ShaderNode; + attributeMap: { + [name: string]: [ + number, + ShaderDataType + ]; + }; + uniformMap: UniformMapType; + is2D: boolean; + } + class ShaderCompileDefineBase { + constructor(owner: any, name: string, compiledObj: IShaderCompiledObj); + } + class ShaderNode { + private static __id; + private static __noCompileEnable; + childs: any[]; + text: string; + parent: ShaderNode; + name: string; + noCompile: boolean; + includefiles: any[]; + condition: any; + conditionType: number; + useFuns: string; + z: number; + src: string; + constructor(includefiles: any[]); + setParent(parent: ShaderNode): void; + setCondition(condition: string, type: number): void; + toscript(def: any, out: any[]): any[]; + private _toscript; + } + /** + * Mesh2d只是保存数据。描述attribute用的。本身没有webgl数据。 + */ + abstract class Sprite2DGeometry implements ISprite2DGeometry { + protected _stride: number; + protected _vertNum: number; + protected _indexNum: number; + protected _VBBuff: ArrayBuffer; + protected _IBBuff: ArrayBuffer; + /** + * @param stride + * @param vballoc vb预分配的大小。主要是用来提高效率。防止不断的resizebfufer + * @param iballoc + */ + constructor(stride: number, vballoc: number, iballoc: number); + get vbBuffer(): ArrayBuffer; + get ibBuffer(): ArrayBuffer; + get indexNum(): number; + get vertexNum(): number; + abstract get vertexDeclarition(): VertexDeclaration; + clearMesh(): void; + protected abstract onVBRealloc(buff: ArrayBuffer): void; + protected abstract onIBRealloc(buff: ArrayBuffer): void; + /** + * 在当前的基础上需要多大空间,单位是byte + * @param sz + */ + protected expVBSize(len: number): void; + protected expIBSize(len: number): void; + } + /** + * @private + */ + class WebGL { + static isNativeRender_enable: boolean; + static _nativeRender_enable(): void; + static enable(): boolean; + static onStageResize(width: number, height: number): void; + } + class LayaEnv { + /** + * @en The version of the engine. + * @zh 引擎的版本。 + */ + static version: string; + /** + * @en Whether the engine is running in the editor. If it is false, it indicates that the engine is running in the scene view of the IDE, otherwise it is true. + * @zh 区分引擎是在编辑模式还是播放模式,在IDE的场景视图编辑时,此值为 false,否则为 true。 + */ + static isPlaying: boolean; + /** + * @en Whether the engine is running in the preview mode or the product mode. If it is false, it indicates that the engine is running after the release, otherwise it is true. + * @zh 区分引擎是在预览模式还是产品模式。如果发布后运行,此值为 false,否则为 true。 + */ + static isPreview: boolean; + /** + * @en Whether the engine is running in the native platform. + * @zh 引擎是否正在运行在原生平台。 + */ + static isConch: boolean; + /** + * @en Whether the engine is running in the editor. The engine may have two states in the editor, one is running in the scene view of the editor, and the other is running in the game view of the editor. Please distinguish these two states through isPlaying. + * @zh 引擎是否正在运行在编辑器下。引擎在编辑器下可能有两种状态,一种是运行在编辑器的场景视图,一种是运行在编辑器的游戏视图,请通过isPlaying区别这两种情况。 + */ + static isEditor: boolean; + /** @deprecated Uses Laya.addBeforeInitCallback */ + static beforeInit: (stageConfig: IStageConfig) => void; + /** @deprecated Use Laya.addAfterInitCallback */ + static afterInit: () => void; + } + interface IStageConfig { + designWidth?: number; + designHeight?: number; + scaleMode?: string; + screenMode?: string; + alignV?: string; + alignH?: string; + backgroundColor?: string; + } + /** + * @en Global UI configuration settings. + * @zh 全局配置 + */ + class UIConfig { + /** + * @en Enable touch scrolling (for scroll bars). + * @zh 是否开启触摸滚动(针对滚动条) + */ + static touchScrollEnable: boolean; + /** + * @en Enable mouse wheel scrolling (for scroll bars). + * @zh 是否开启滑轮滚动(针对滚动条) + */ + static mouseWheelEnable: boolean; + /** + * @en Show scroll bar buttons. + * @zh 是否显示滚动条按钮 + */ + static showButtons: boolean; + /** + * @en Background color for pop-up dialogs. + * @zh 弹出框背景颜色 + */ + static popupBgColor: string; + /** + * @en Background transparency for pop-up dialogs. + * @zh 弹出框背景透明度 + */ + static popupBgAlpha: number; + /** + * @en Whether clicking on the edge of a modal window will close it. The default is to close the window. + * @zh 模式窗口点击边缘,是否关闭窗口,默认是关闭的 + */ + static closeDialogOnSide: boolean; + } +} diff --git a/shudu/engine/types/box2d.d.ts b/shudu/engine/types/box2d.d.ts new file mode 100644 index 0000000..8e0d0f3 --- /dev/null +++ b/shudu/engine/types/box2d.d.ts @@ -0,0 +1,2683 @@ +declare function b2Assert(condition: boolean, ...args: any[]): void /**asserts condition*/; +declare function b2Maybe(value: T | undefined, def: T): T; +declare const b2_maxFloat: number; +declare const b2_epsilon: number; +declare const b2_epsilon_sq: number; +declare const b2_pi: number; +declare const b2_lengthUnitsPerMeter: number; +declare const b2_maxPolygonVertices: number; +declare const b2_maxManifoldPoints: number; +declare const b2_aabbExtension: number; +declare const b2_aabbMultiplier: number; +declare const b2_linearSlop: number; +declare const b2_angularSlop: number; +declare const b2_polygonRadius: number; +declare const b2_maxSubSteps: number; +declare const b2_maxTOIContacts: number; +declare const b2_maxLinearCorrection: number; +declare const b2_maxAngularCorrection: number; +declare const b2_maxTranslation: number; +declare const b2_maxTranslationSquared: number; +declare const b2_maxRotation: number; +declare const b2_maxRotationSquared: number; +declare const b2_baumgarte: number; +declare const b2_toiBaumgarte: number; +declare const b2_timeToSleep: number; +declare const b2_linearSleepTolerance: number; +declare const b2_angularSleepTolerance: number; +declare class b2Version { + major: number; + minor: number; + revision: number; + constructor(major?: number, minor?: number, revision?: number); + toString(): string; +} +declare const b2_version: b2Version; +declare const b2_branch: string; +declare const b2_commit: string; +declare function b2ParseInt(v: string): number; +declare function b2ParseUInt(v: string): number; +declare function b2MakeArray(length: number, init: (i: number) => T): T[]; +declare function b2MakeNullArray(length: number): Array; +declare function b2MakeNumberArray(length: number, init?: number): number[]; + +declare function b2Alloc(size: number): any; +declare function b2Free(mem: any): void; +declare function b2Log(message: string, ...args: any[]): void; + +declare const b2_pi_over_180: number; +declare const b2_180_over_pi: number; +declare const b2_two_pi: number; +declare const b2Abs: (x: number) => number; +declare function b2Min(a: number, b: number): number; +declare function b2Max(a: number, b: number): number; +declare function b2Clamp(a: number, lo: number, hi: number): number; +declare function b2Swap(a: T[], b: T[]): void; +declare const b2IsValid: typeof isFinite; +declare function b2Sq(n: number): number; +declare function b2InvSqrt(n: number): number; +declare const b2Sqrt: (x: number) => number; +declare const b2Pow: (x: number, y: number) => number; +declare function b2DegToRad(degrees: number): number; +declare function b2RadToDeg(radians: number): number; +declare const b2Cos: (x: number) => number; +declare const b2Sin: (x: number) => number; +declare const b2Acos: (x: number) => number; +declare const b2Asin: (x: number) => number; +declare const b2Atan2: (y: number, x: number) => number; +declare function b2NextPowerOfTwo(x: number): number; +declare function b2IsPowerOfTwo(x: number): boolean; +declare function b2Random(): number; +declare function b2RandomRange(lo: number, hi: number): number; +interface XY { + x: number; + y: number; +} +declare class b2Vec2 implements XY { + x: number; + y: number; + static readonly ZERO: Readonly; + static readonly UNITX: Readonly; + static readonly UNITY: Readonly; + static readonly s_t0: b2Vec2; + static readonly s_t1: b2Vec2; + static readonly s_t2: b2Vec2; + static readonly s_t3: b2Vec2; + constructor(x?: number, y?: number); + Clone(): b2Vec2; + SetZero(): this; + Set(x: number, y: number): this; + Copy(other: XY): this; + SelfAdd(v: XY): this; + SelfAddXY(x: number, y: number): this; + SelfSub(v: XY): this; + SelfSubXY(x: number, y: number): this; + SelfMul(s: number): this; + SelfMulAdd(s: number, v: XY): this; + SelfMulSub(s: number, v: XY): this; + Dot(v: XY): number; + Cross(v: XY): number; + Length(): number; + LengthSquared(): number; + Normalize(): number; + SelfNormalize(): this; + SelfRotate(radians: number): this; + SelfRotateCosSin(c: number, s: number): this; + IsValid(): boolean; + SelfCrossVS(s: number): this; + SelfCrossSV(s: number): this; + SelfMinV(v: XY): this; + SelfMaxV(v: XY): this; + SelfAbs(): this; + SelfNeg(): this; + SelfSkew(): this; + static MakeArray(length: number): b2Vec2[]; + static AbsV(v: XY, out: T): T; + static MinV(a: XY, b: XY, out: T): T; + static MaxV(a: XY, b: XY, out: T): T; + static ClampV(v: XY, lo: XY, hi: XY, out: T): T; + static RotateV(v: XY, radians: number, out: T): T; + static DotVV(a: XY, b: XY): number; + static CrossVV(a: XY, b: XY): number; + static CrossVS(v: XY, s: number, out: T): T; + static CrossVOne(v: XY, out: T): T; + static CrossSV(s: number, v: XY, out: T): T; + static CrossOneV(v: XY, out: T): T; + static AddVV(a: XY, b: XY, out: T): T; + static SubVV(a: XY, b: XY, out: T): T; + static MulSV(s: number, v: XY, out: T): T; + static MulVS(v: XY, s: number, out: T): T; + static AddVMulSV(a: XY, s: number, b: XY, out: T): T; + static SubVMulSV(a: XY, s: number, b: XY, out: T): T; + static AddVCrossSV(a: XY, s: number, v: XY, out: T): T; + static MidVV(a: XY, b: XY, out: T): T; + static ExtVV(a: XY, b: XY, out: T): T; + static IsEqualToV(a: XY, b: XY): boolean; + static DistanceVV(a: XY, b: XY): number; + static DistanceSquaredVV(a: XY, b: XY): number; + static NegV(v: XY, out: T): T; +} +declare const b2Vec2_zero: Readonly; +declare class b2TypedVec2 implements b2Vec2 { + readonly data: Float32Array; + get x(): number; + set x(value: number); + get y(): number; + set y(value: number); + constructor(); + constructor(data: Float32Array); + constructor(x: number, y: number); + Clone(): b2TypedVec2; + SetZero(): this; + Set(x: number, y: number): this; + Copy(other: XY): this; + SelfAdd(v: XY): this; + SelfAddXY(x: number, y: number): this; + SelfSub(v: XY): this; + SelfSubXY(x: number, y: number): this; + SelfMul(s: number): this; + SelfMulAdd(s: number, v: XY): this; + SelfMulSub(s: number, v: XY): this; + Dot(v: XY): number; + Cross(v: XY): number; + Length(): number; + LengthSquared(): number; + Normalize(): number; + SelfNormalize(): this; + SelfRotate(radians: number): this; + SelfRotateCosSin(c: number, s: number): this; + IsValid(): boolean; + SelfCrossVS(s: number): this; + SelfCrossSV(s: number): this; + SelfMinV(v: XY): this; + SelfMaxV(v: XY): this; + SelfAbs(): this; + SelfNeg(): this; + SelfSkew(): this; +} +interface XYZ extends XY { + z: number; +} +declare class b2Vec3 implements XYZ { + static readonly ZERO: Readonly; + static readonly s_t0: b2Vec3; + readonly data: Float32Array; + get x(): number; + set x(value: number); + get y(): number; + set y(value: number); + get z(): number; + set z(value: number); + constructor(); + constructor(data: Float32Array); + constructor(x: number, y: number, z: number); + Clone(): b2Vec3; + SetZero(): this; + SetXYZ(x: number, y: number, z: number): this; + Copy(other: XYZ): this; + SelfNeg(): this; + SelfAdd(v: XYZ): this; + SelfAddXYZ(x: number, y: number, z: number): this; + SelfSub(v: XYZ): this; + SelfSubXYZ(x: number, y: number, z: number): this; + SelfMul(s: number): this; + static DotV3V3(a: XYZ, b: XYZ): number; + static CrossV3V3(a: XYZ, b: XYZ, out: T): T; +} +declare class b2Mat22 { + static readonly IDENTITY: Readonly; + readonly ex: b2Vec2; + readonly ey: b2Vec2; + Clone(): b2Mat22; + static FromVV(c1: XY, c2: XY): b2Mat22; + static FromSSSS(r1c1: number, r1c2: number, r2c1: number, r2c2: number): b2Mat22; + static FromAngle(radians: number): b2Mat22; + SetSSSS(r1c1: number, r1c2: number, r2c1: number, r2c2: number): this; + SetVV(c1: XY, c2: XY): this; + SetAngle(radians: number): this; + Copy(other: b2Mat22): this; + SetIdentity(): this; + SetZero(): this; + GetAngle(): number; + GetInverse(out: b2Mat22): b2Mat22; + Solve(b_x: number, b_y: number, out: T): T; + SelfAbs(): this; + SelfInv(): this; + SelfAddM(M: b2Mat22): this; + SelfSubM(M: b2Mat22): this; + static AbsM(M: b2Mat22, out: b2Mat22): b2Mat22; + static MulMV(M: b2Mat22, v: XY, out: T): T; + static MulTMV(M: b2Mat22, v: XY, out: T): T; + static AddMM(A: b2Mat22, B: b2Mat22, out: b2Mat22): b2Mat22; + static MulMM(A: b2Mat22, B: b2Mat22, out: b2Mat22): b2Mat22; + static MulTMM(A: b2Mat22, B: b2Mat22, out: b2Mat22): b2Mat22; +} +declare class b2Mat33 { + static readonly IDENTITY: Readonly; + readonly data: Float32Array; + readonly ex: b2Vec3; + readonly ey: b2Vec3; + readonly ez: b2Vec3; + Clone(): b2Mat33; + SetVVV(c1: XYZ, c2: XYZ, c3: XYZ): this; + Copy(other: b2Mat33): this; + SetIdentity(): this; + SetZero(): this; + SelfAddM(M: b2Mat33): this; + Solve33(b_x: number, b_y: number, b_z: number, out: T): T; + Solve22(b_x: number, b_y: number, out: T): T; + GetInverse22(M: b2Mat33): void; + GetSymInverse33(M: b2Mat33): void; + static MulM33V3(A: b2Mat33, v: XYZ, out: T): T; + static MulM33XYZ(A: b2Mat33, x: number, y: number, z: number, out: T): T; + static MulM33V2(A: b2Mat33, v: XY, out: T): T; + static MulM33XY(A: b2Mat33, x: number, y: number, out: T): T; +} +declare class b2Rot { + static readonly IDENTITY: Readonly; + s: number; + c: number; + constructor(angle?: number); + Clone(): b2Rot; + Copy(other: b2Rot): this; + SetAngle(angle: number): this; + SetIdentity(): this; + GetAngle(): number; + GetXAxis(out: T): T; + GetYAxis(out: T): T; + static MulRR(q: b2Rot, r: b2Rot, out: b2Rot): b2Rot; + static MulTRR(q: b2Rot, r: b2Rot, out: b2Rot): b2Rot; + static MulRV(q: b2Rot, v: XY, out: T): T; + static MulTRV(q: b2Rot, v: XY, out: T): T; +} +declare class b2Transform { + static readonly IDENTITY: Readonly; + readonly p: b2Vec2; + readonly q: b2Rot; + Clone(): b2Transform; + Copy(other: b2Transform): this; + SetIdentity(): this; + SetPositionRotation(position: XY, q: Readonly): this; + SetPositionAngle(pos: XY, a: number): this; + SetPosition(position: XY): this; + SetPositionXY(x: number, y: number): this; + SetRotation(rotation: Readonly): this; + SetRotationAngle(radians: number): this; + GetPosition(): Readonly; + GetRotation(): Readonly; + GetRotationAngle(): number; + GetAngle(): number; + static MulXV(T: b2Transform, v: XY, out: T): T; + static MulTXV(T: b2Transform, v: XY, out: T): T; + static MulXX(A: b2Transform, B: b2Transform, out: b2Transform): b2Transform; + static MulTXX(A: b2Transform, B: b2Transform, out: b2Transform): b2Transform; +} +declare class b2Sweep { + readonly localCenter: b2Vec2; + readonly c0: b2Vec2; + readonly c: b2Vec2; + a0: number; + a: number; + alpha0: number; + Clone(): b2Sweep; + Copy(other: b2Sweep): this; + GetTransform(xf: b2Transform, beta: number): b2Transform; + Advance(alpha: number): void; + Normalize(): void; +} + +interface RGB { + r: number; + g: number; + b: number; +} +interface RGBA extends RGB { + a: number; +} +declare class b2Color implements RGBA { + r: number; + g: number; + b: number; + a: number; + static readonly ZERO: Readonly; + static readonly RED: Readonly; + static readonly GREEN: Readonly; + static readonly BLUE: Readonly; + constructor(r?: number, g?: number, b?: number, a?: number); + Clone(): b2Color; + Copy(other: RGBA): this; + IsEqual(color: RGBA): boolean; + IsZero(): boolean; + Set(r: number, g: number, b: number, a?: number): void; + SetByteRGB(r: number, g: number, b: number): this; + SetByteRGBA(r: number, g: number, b: number, a: number): this; + SetRGB(rr: number, gg: number, bb: number): this; + SetRGBA(rr: number, gg: number, bb: number, aa: number): this; + SelfAdd(color: RGBA): this; + Add(color: RGBA, out: T): T; + SelfSub(color: RGBA): this; + Sub(color: RGBA, out: T): T; + SelfMul(s: number): this; + Mul(s: number, out: T): T; + Mix(mixColor: RGBA, strength: number): void; + static MixColors(colorA: RGBA, colorB: RGBA, strength: number): void; + MakeStyleString(alpha?: number): string; + static MakeStyleString(r: number, g: number, b: number, a?: number): string; +} +declare class b2TypedColor implements b2Color { + readonly data: Float32Array; + get r(): number; + set r(value: number); + get g(): number; + set g(value: number); + get b(): number; + set b(value: number); + get a(): number; + set a(value: number); + constructor(); + constructor(data: Float32Array); + constructor(rr: number, gg: number, bb: number); + constructor(rr: number, gg: number, bb: number, aa: number); + Clone(): b2TypedColor; + Copy(other: RGBA): this; + IsEqual(color: RGBA): boolean; + IsZero(): boolean; + Set(r: number, g: number, b: number, a?: number): void; + SetByteRGB(r: number, g: number, b: number): this; + SetByteRGBA(r: number, g: number, b: number, a: number): this; + SetRGB(rr: number, gg: number, bb: number): this; + SetRGBA(rr: number, gg: number, bb: number, aa: number): this; + SelfAdd(color: RGBA): this; + Add(color: RGBA, out: T): T; + SelfSub(color: RGBA): this; + Sub(color: RGBA, out: T): T; + SelfMul(s: number): this; + Mul(s: number, out: T): T; + Mix(mixColor: RGBA, strength: number): void; + MakeStyleString(alpha?: number): string; +} +declare enum b2DrawFlags { + e_none = 0, + e_shapeBit = 1, + e_jointBit = 2, + e_aabbBit = 4, + e_pairBit = 8, + e_centerOfMassBit = 16, + e_all = 63 +} +declare abstract class b2Draw { + m_drawFlags: b2DrawFlags; + SetFlags(flags: b2DrawFlags): void; + GetFlags(): b2DrawFlags; + AppendFlags(flags: b2DrawFlags): void; + ClearFlags(flags: b2DrawFlags): void; + abstract PushTransform(xf: b2Transform): void; + abstract PopTransform(xf: b2Transform): void; + abstract DrawPolygon(vertices: XY[], vertexCount: number, color: RGBA): void; + abstract DrawSolidPolygon(vertices: XY[], vertexCount: number, color: RGBA): void; + abstract DrawCircle(center: XY, radius: number, color: RGBA): void; + abstract DrawSolidCircle(center: XY, radius: number, axis: XY, color: RGBA): void; + abstract DrawSegment(p1: XY, p2: XY, color: RGBA): void; + abstract DrawTransform(xf: b2Transform): void; + abstract DrawPoint(p: XY, size: number, color: RGBA): void; +} + +declare class b2Timer { + m_start: number; + Reset(): b2Timer; + GetMilliseconds(): number; +} +declare class b2Counter { + m_count: number; + m_min_count: number; + m_max_count: number; + GetCount(): number; + GetMinCount(): number; + GetMaxCount(): number; + ResetCount(): number; + ResetMinCount(): void; + ResetMaxCount(): void; + Increment(): void; + Decrement(): void; +} + +declare class b2GrowableStack { + m_stack: Array; + m_count: number; + constructor(N: number); + Reset(): this; + Push(element: T): void; + Pop(): T | null; + GetCount(): number; +} + +declare class b2BlockAllocator { +} + +declare class b2StackAllocator { +} + +declare class b2DistanceProxy { + readonly m_buffer: b2Vec2[]; + m_vertices: b2Vec2[]; + m_count: number; + m_radius: number; + Copy(other: Readonly): this; + Reset(): b2DistanceProxy; + SetShape(shape: b2Shape, index: number): void; + SetVerticesRadius(vertices: b2Vec2[], count: number, radius: number): void; + Set(shape: b2Shape, index: number): void; + Set(vertices: b2Vec2[], count: number, radius: number): void; + GetSupport(d: b2Vec2): number; + GetSupportVertex(d: b2Vec2): b2Vec2; + GetVertexCount(): number; + GetVertex(index: number): b2Vec2; +} +declare class b2SimplexCache { + metric: number; + count: number; + readonly indexA: [number, number, number]; + readonly indexB: [number, number, number]; + Reset(): b2SimplexCache; +} +declare class b2DistanceInput { + readonly proxyA: b2DistanceProxy; + readonly proxyB: b2DistanceProxy; + readonly transformA: b2Transform; + readonly transformB: b2Transform; + useRadii: boolean; + Reset(): b2DistanceInput; +} +declare class b2DistanceOutput { + readonly pointA: b2Vec2; + readonly pointB: b2Vec2; + distance: number; + iterations: number; + Reset(): b2DistanceOutput; +} +declare class b2ShapeCastInput { + readonly proxyA: b2DistanceProxy; + readonly proxyB: b2DistanceProxy; + readonly transformA: b2Transform; + readonly transformB: b2Transform; + readonly translationB: b2Vec2; +} +declare class b2ShapeCastOutput { + readonly point: b2Vec2; + readonly normal: b2Vec2; + lambda: number; + iterations: number; +} +declare let b2_gjkCalls: number; +declare let b2_gjkIters: number; +declare let b2_gjkMaxIters: number; +declare function b2_gjk_reset(): void; +declare class b2SimplexVertex { + readonly wA: b2Vec2; + readonly wB: b2Vec2; + readonly w: b2Vec2; + a: number; + indexA: number; + indexB: number; + Copy(other: b2SimplexVertex): b2SimplexVertex; +} +declare class b2Simplex { + readonly m_v1: b2SimplexVertex; + readonly m_v2: b2SimplexVertex; + readonly m_v3: b2SimplexVertex; + readonly m_vertices: b2SimplexVertex[]; + m_count: number; + constructor(); + ReadCache(cache: b2SimplexCache, proxyA: b2DistanceProxy, transformA: b2Transform, proxyB: b2DistanceProxy, transformB: b2Transform): void; + WriteCache(cache: b2SimplexCache): void; + GetSearchDirection(out: b2Vec2): b2Vec2; + GetClosestPoint(out: b2Vec2): b2Vec2; + GetWitnessPoints(pA: b2Vec2, pB: b2Vec2): void; + GetMetric(): number; + Solve2(): void; + Solve3(): void; + private static s_e12; + private static s_e13; + private static s_e23; +} +declare function b2Distance(output: b2DistanceOutput, cache: b2SimplexCache, input: b2DistanceInput): void; +declare function b2ShapeCast(output: b2ShapeCastOutput, input: b2ShapeCastInput): boolean; + +declare class b2MassData { + mass: number; + readonly center: b2Vec2; + I: number; +} +declare enum b2ShapeType { + e_unknown = -1, + e_circleShape = 0, + e_edgeShape = 1, + e_polygonShape = 2, + e_chainShape = 3, + e_shapeTypeCount = 4 +} +declare abstract class b2Shape { + readonly m_type: b2ShapeType; + m_radius: number; + constructor(type: b2ShapeType, radius: number); + abstract Clone(): b2Shape; + Copy(other: b2Shape): b2Shape; + GetType(): b2ShapeType; + abstract GetChildCount(): number; + abstract TestPoint(xf: b2Transform, p: XY): boolean; + abstract RayCast(output: b2RayCastOutput, input: b2RayCastInput, transform: b2Transform, childIndex: number): boolean; + abstract ComputeAABB(aabb: b2AABB, xf: b2Transform, childIndex: number): void; + abstract ComputeMass(massData: b2MassData, density: number): void; + abstract SetupDistanceProxy(proxy: b2DistanceProxy, index: number): void; + abstract ComputeSubmergedArea(normal: b2Vec2, offset: number, xf: b2Transform, c: b2Vec2): number; + abstract Dump(log: (format: string, ...args: any[]) => void): void; +} + +declare enum b2ContactFeatureType { + e_vertex = 0, + e_face = 1 +} +declare class b2ContactFeature { + private _key; + private _key_invalid; + private _indexA; + private _indexB; + private _typeA; + private _typeB; + get key(): number; + set key(value: number); + get indexA(): number; + set indexA(value: number); + get indexB(): number; + set indexB(value: number); + get typeA(): number; + set typeA(value: number); + get typeB(): number; + set typeB(value: number); +} +declare class b2ContactID { + readonly cf: b2ContactFeature; + Copy(o: b2ContactID): b2ContactID; + Clone(): b2ContactID; + get key(): number; + set key(value: number); +} +declare class b2ManifoldPoint { + readonly localPoint: b2Vec2; + normalImpulse: number; + tangentImpulse: number; + readonly id: b2ContactID; + static MakeArray(length: number): b2ManifoldPoint[]; + Reset(): void; + Copy(o: b2ManifoldPoint): b2ManifoldPoint; +} +declare enum b2ManifoldType { + e_unknown = -1, + e_circles = 0, + e_faceA = 1, + e_faceB = 2 +} +declare class b2Manifold { + readonly points: b2ManifoldPoint[]; + readonly localNormal: b2Vec2; + readonly localPoint: b2Vec2; + type: b2ManifoldType; + pointCount: number; + Reset(): void; + Copy(o: b2Manifold): b2Manifold; + Clone(): b2Manifold; +} +declare class b2WorldManifold { + readonly normal: b2Vec2; + readonly points: b2Vec2[]; + readonly separations: number[]; + private static Initialize_s_pointA; + private static Initialize_s_pointB; + private static Initialize_s_cA; + private static Initialize_s_cB; + private static Initialize_s_planePoint; + private static Initialize_s_clipPoint; + Initialize(manifold: b2Manifold, xfA: b2Transform, radiusA: number, xfB: b2Transform, radiusB: number): void; +} +declare enum b2PointState { + b2_nullState = 0, + b2_addState = 1, + b2_persistState = 2, + b2_removeState = 3 +} +declare function b2GetPointStates(state1: b2PointState[], state2: b2PointState[], manifold1: b2Manifold, manifold2: b2Manifold): void; +declare class b2ClipVertex { + readonly v: b2Vec2; + readonly id: b2ContactID; + static MakeArray(length: number): b2ClipVertex[]; + Copy(other: b2ClipVertex): b2ClipVertex; +} +declare class b2RayCastInput { + readonly p1: b2Vec2; + readonly p2: b2Vec2; + maxFraction: number; + Copy(o: b2RayCastInput): b2RayCastInput; +} +declare class b2RayCastOutput { + readonly normal: b2Vec2; + fraction: number; + Copy(o: b2RayCastOutput): b2RayCastOutput; +} +declare class b2AABB { + readonly lowerBound: b2Vec2; + readonly upperBound: b2Vec2; + private readonly m_cache_center; + private readonly m_cache_extent; + Copy(o: b2AABB): b2AABB; + IsValid(): boolean; + GetCenter(): b2Vec2; + GetExtents(): b2Vec2; + GetPerimeter(): number; + Combine1(aabb: b2AABB): b2AABB; + Combine2(aabb1: b2AABB, aabb2: b2AABB): b2AABB; + static Combine(aabb1: b2AABB, aabb2: b2AABB, out: b2AABB): b2AABB; + Contains(aabb: b2AABB): boolean; + RayCast(output: b2RayCastOutput, input: b2RayCastInput): boolean; + TestContain(point: XY): boolean; + TestOverlap(other: b2AABB): boolean; +} +declare function b2TestOverlapAABB(a: b2AABB, b: b2AABB): boolean; +declare function b2ClipSegmentToLine(vOut: [b2ClipVertex, b2ClipVertex], vIn: [b2ClipVertex, b2ClipVertex], normal: b2Vec2, offset: number, vertexIndexA: number): number; +declare function b2TestOverlapShape(shapeA: b2Shape, indexA: number, shapeB: b2Shape, indexB: number, xfA: b2Transform, xfB: b2Transform): boolean; + +declare class b2TreeNode { + readonly m_id: number; + readonly aabb: b2AABB; + private _userData; + get userData(): T; + set userData(value: T); + parent: b2TreeNode | null; + child1: b2TreeNode | null; + child2: b2TreeNode | null; + height: number; + moved: boolean; + constructor(id?: number); + Reset(): void; + IsLeaf(): boolean; +} +declare class b2DynamicTree { + m_root: b2TreeNode | null; + m_freeList: b2TreeNode | null; + m_insertionCount: number; + readonly m_stack: b2GrowableStack | null>; + static readonly s_r: b2Vec2; + static readonly s_v: b2Vec2; + static readonly s_abs_v: b2Vec2; + static readonly s_segmentAABB: b2AABB; + static readonly s_subInput: b2RayCastInput; + static readonly s_combinedAABB: b2AABB; + static readonly s_aabb: b2AABB; + Query(callback: (node: b2TreeNode) => boolean, aabb: b2AABB): void; + Query(aabb: b2AABB, callback: (node: b2TreeNode) => boolean): void; + QueryPoint(point: XY, callback: (node: b2TreeNode) => boolean): void; + RayCast(callback: (input: b2RayCastInput, node: b2TreeNode) => number, input: b2RayCastInput): void; + RayCast(input: b2RayCastInput, callback: (input: b2RayCastInput, node: b2TreeNode) => number): void; + static s_node_id: number; + AllocateNode(): b2TreeNode; + FreeNode(node: b2TreeNode): void; + CreateProxy(aabb: b2AABB, userData: T): b2TreeNode; + DestroyProxy(node: b2TreeNode): void; + private static MoveProxy_s_fatAABB; + private static MoveProxy_s_hugeAABB; + MoveProxy(node: b2TreeNode, aabb: b2AABB, displacement: b2Vec2): boolean; + InsertLeaf(leaf: b2TreeNode): void; + RemoveLeaf(leaf: b2TreeNode): void; + Balance(A: b2TreeNode): b2TreeNode; + GetHeight(): number; + private static GetAreaNode; + GetAreaRatio(): number; + static ComputeHeightNode(node: b2TreeNode | null): number; + ComputeHeight(): number; + ValidateStructure(node: b2TreeNode | null): void; + ValidateMetrics(node: b2TreeNode | null): void; + Validate(): void; + private static GetMaxBalanceNode; + GetMaxBalance(): number; + RebuildBottomUp(): void; + private static ShiftOriginNode; + ShiftOrigin(newOrigin: XY): void; +} + +declare class b2Pair { + proxyA: b2TreeNode; + proxyB: b2TreeNode; + constructor(proxyA: b2TreeNode, proxyB: b2TreeNode); +} +declare class b2BroadPhase { + readonly m_tree: b2DynamicTree; + m_proxyCount: number; + m_moveCount: number; + readonly m_moveBuffer: Array | null>; + m_pairCount: number; + readonly m_pairBuffer: Array>; + CreateProxy(aabb: b2AABB, userData: T): b2TreeNode; + DestroyProxy(proxy: b2TreeNode): void; + MoveProxy(proxy: b2TreeNode, aabb: b2AABB, displacement: b2Vec2): void; + TouchProxy(proxy: b2TreeNode): void; + GetProxyCount(): number; + UpdatePairs(callback: (a: T, b: T) => void): void; + Query(callback: (node: b2TreeNode) => boolean, aabb: b2AABB): void; + Query(aabb: b2AABB, callback: (node: b2TreeNode) => boolean): void; + QueryPoint(point: XY, callback: (node: b2TreeNode) => boolean): void; + RayCast(input: b2RayCastInput, callback: (input: b2RayCastInput, node: b2TreeNode) => number): void; + GetTreeHeight(): number; + GetTreeBalance(): number; + GetTreeQuality(): number; + ShiftOrigin(newOrigin: XY): void; + BufferMove(proxy: b2TreeNode): void; + UnBufferMove(proxy: b2TreeNode): void; +} + +declare let b2_toiTime: number; +declare let b2_toiMaxTime: number; +declare let b2_toiCalls: number; +declare let b2_toiIters: number; +declare let b2_toiMaxIters: number; +declare let b2_toiRootIters: number; +declare let b2_toiMaxRootIters: number; +declare function b2_toi_reset(): void; +declare class b2TOIInput { + readonly proxyA: b2DistanceProxy; + readonly proxyB: b2DistanceProxy; + readonly sweepA: b2Sweep; + readonly sweepB: b2Sweep; + tMax: number; +} +declare enum b2TOIOutputState { + e_unknown = 0, + e_failed = 1, + e_overlapped = 2, + e_touching = 3, + e_separated = 4 +} +declare class b2TOIOutput { + state: b2TOIOutputState; + t: number; +} +declare enum b2SeparationFunctionType { + e_unknown = -1, + e_points = 0, + e_faceA = 1, + e_faceB = 2 +} +declare class b2SeparationFunction { + m_proxyA: b2DistanceProxy; + m_proxyB: b2DistanceProxy; + readonly m_sweepA: b2Sweep; + readonly m_sweepB: b2Sweep; + m_type: b2SeparationFunctionType; + readonly m_localPoint: b2Vec2; + readonly m_axis: b2Vec2; + Initialize(cache: b2SimplexCache, proxyA: b2DistanceProxy, sweepA: b2Sweep, proxyB: b2DistanceProxy, sweepB: b2Sweep, t1: number): number; + FindMinSeparation(indexA: [number], indexB: [number], t: number): number; + Evaluate(indexA: number, indexB: number, t: number): number; +} +declare function b2TimeOfImpact(output: b2TOIOutput, input: b2TOIInput): void; + +declare class b2CircleShape extends b2Shape { + readonly m_p: b2Vec2; + constructor(radius?: number); + Set(position: XY, radius?: number): this; + Clone(): b2CircleShape; + Copy(other: b2CircleShape): b2CircleShape; + GetChildCount(): number; + private static TestPoint_s_center; + private static TestPoint_s_d; + TestPoint(transform: b2Transform, p: XY): boolean; + private static RayCast_s_position; + private static RayCast_s_s; + private static RayCast_s_r; + RayCast(output: b2RayCastOutput, input: b2RayCastInput, transform: b2Transform, childIndex: number): boolean; + private static ComputeAABB_s_p; + ComputeAABB(aabb: b2AABB, transform: b2Transform, childIndex: number): void; + ComputeMass(massData: b2MassData, density: number): void; + SetupDistanceProxy(proxy: b2DistanceProxy, index: number): void; + ComputeSubmergedArea(normal: b2Vec2, offset: number, xf: b2Transform, c: b2Vec2): number; + Dump(log: (format: string, ...args: any[]) => void): void; +} + +declare class b2PolygonShape extends b2Shape { + readonly m_centroid: b2Vec2; + m_vertices: b2Vec2[]; + m_normals: b2Vec2[]; + m_count: number; + constructor(); + Clone(): b2PolygonShape; + Copy(other: b2PolygonShape): b2PolygonShape; + GetChildCount(): number; + private static Set_s_r; + private static Set_s_v; + Set(vertices: XY[]): b2PolygonShape; + Set(vertices: XY[], count: number): b2PolygonShape; + Set(vertices: number[]): b2PolygonShape; + _Set(vertices: (index: number) => XY, count: number): b2PolygonShape; + SetAsBox(hx: number, hy: number, center?: XY, angle?: number): b2PolygonShape; + private static TestPoint_s_pLocal; + TestPoint(xf: b2Transform, p: XY): boolean; + private static RayCast_s_p1; + private static RayCast_s_p2; + private static RayCast_s_d; + RayCast(output: b2RayCastOutput, input: b2RayCastInput, xf: b2Transform, childIndex: number): boolean; + private static ComputeAABB_s_v; + ComputeAABB(aabb: b2AABB, xf: b2Transform, childIndex: number): void; + private static ComputeMass_s_center; + private static ComputeMass_s_s; + private static ComputeMass_s_e1; + private static ComputeMass_s_e2; + ComputeMass(massData: b2MassData, density: number): void; + private static Validate_s_e; + private static Validate_s_v; + Validate(): boolean; + SetupDistanceProxy(proxy: b2DistanceProxy, index: number): void; + private static ComputeSubmergedArea_s_normalL; + private static ComputeSubmergedArea_s_md; + private static ComputeSubmergedArea_s_intoVec; + private static ComputeSubmergedArea_s_outoVec; + private static ComputeSubmergedArea_s_center; + ComputeSubmergedArea(normal: b2Vec2, offset: number, xf: b2Transform, c: b2Vec2): number; + Dump(log: (format: string, ...args: any[]) => void): void; + private static ComputeCentroid_s_s; + private static ComputeCentroid_s_p1; + private static ComputeCentroid_s_p2; + private static ComputeCentroid_s_p3; + private static ComputeCentroid_s_e1; + private static ComputeCentroid_s_e2; + static ComputeCentroid(vs: b2Vec2[], count: number, out: b2Vec2): b2Vec2; +} + +declare function b2CollideCircles(manifold: b2Manifold, circleA: b2CircleShape, xfA: b2Transform, circleB: b2CircleShape, xfB: b2Transform): void; +declare function b2CollidePolygonAndCircle(manifold: b2Manifold, polygonA: b2PolygonShape, xfA: b2Transform, circleB: b2CircleShape, xfB: b2Transform): void; + +declare function b2CollidePolygons(manifold: b2Manifold, polyA: b2PolygonShape, xfA: b2Transform, polyB: b2PolygonShape, xfB: b2Transform): void; + +declare class b2EdgeShape extends b2Shape { + readonly m_vertex1: b2Vec2; + readonly m_vertex2: b2Vec2; + readonly m_vertex0: b2Vec2; + readonly m_vertex3: b2Vec2; + m_oneSided: boolean; + constructor(); + SetOneSided(v0: XY, v1: XY, v2: XY, v3: XY): b2EdgeShape; + SetTwoSided(v1: XY, v2: XY): b2EdgeShape; + Clone(): b2EdgeShape; + Copy(other: b2EdgeShape): b2EdgeShape; + GetChildCount(): number; + TestPoint(xf: b2Transform, p: XY): boolean; + private static RayCast_s_p1; + private static RayCast_s_p2; + private static RayCast_s_d; + private static RayCast_s_e; + private static RayCast_s_q; + private static RayCast_s_r; + RayCast(output: b2RayCastOutput, input: b2RayCastInput, xf: b2Transform, childIndex: number): boolean; + private static ComputeAABB_s_v1; + private static ComputeAABB_s_v2; + ComputeAABB(aabb: b2AABB, xf: b2Transform, childIndex: number): void; + ComputeMass(massData: b2MassData, density: number): void; + SetupDistanceProxy(proxy: b2DistanceProxy, index: number): void; + ComputeSubmergedArea(normal: b2Vec2, offset: number, xf: b2Transform, c: b2Vec2): number; + Dump(log: (format: string, ...args: any[]) => void): void; +} + +declare function b2CollideEdgeAndCircle(manifold: b2Manifold, edgeA: b2EdgeShape, xfA: b2Transform, circleB: b2CircleShape, xfB: b2Transform): void; +declare function b2CollideEdgeAndPolygon(manifold: b2Manifold, edgeA: b2EdgeShape, xfA: b2Transform, polygonB: b2PolygonShape, xfB: b2Transform): void; + +declare class b2ChainShape extends b2Shape { + m_vertices: b2Vec2[]; + m_count: number; + readonly m_prevVertex: b2Vec2; + readonly m_nextVertex: b2Vec2; + constructor(); + CreateLoop(vertices: XY[]): b2ChainShape; + CreateLoop(vertices: XY[], count: number): b2ChainShape; + CreateLoop(vertices: number[]): b2ChainShape; + private _CreateLoop; + CreateChain(vertices: XY[], prevVertex: Readonly, nextVertex: Readonly): b2ChainShape; + CreateChain(vertices: XY[], count: number, prevVertex: Readonly, nextVertex: Readonly): b2ChainShape; + CreateChain(vertices: number[], prevVertex: Readonly, nextVertex: Readonly): b2ChainShape; + private _CreateChain; + Clone(): b2ChainShape; + Copy(other: b2ChainShape): b2ChainShape; + GetChildCount(): number; + GetChildEdge(edge: b2EdgeShape, index: number): void; + TestPoint(xf: b2Transform, p: XY): boolean; + private static RayCast_s_edgeShape; + RayCast(output: b2RayCastOutput, input: b2RayCastInput, xf: b2Transform, childIndex: number): boolean; + private static ComputeAABB_s_v1; + private static ComputeAABB_s_v2; + private static ComputeAABB_s_lower; + private static ComputeAABB_s_upper; + ComputeAABB(aabb: b2AABB, xf: b2Transform, childIndex: number): void; + ComputeMass(massData: b2MassData, density: number): void; + SetupDistanceProxy(proxy: b2DistanceProxy, index: number): void; + ComputeSubmergedArea(normal: b2Vec2, offset: number, xf: b2Transform, c: b2Vec2): number; + Dump(log: (format: string, ...args: any[]) => void): void; +} + +declare class b2Profile { + step: number; + collide: number; + solve: number; + solveInit: number; + solveVelocity: number; + solvePosition: number; + broadphase: number; + solveTOI: number; + Reset(): this; +} +declare class b2TimeStep { + dt: number; + inv_dt: number; + dtRatio: number; + velocityIterations: number; + positionIterations: number; + warmStarting: boolean; + Copy(step: b2TimeStep): b2TimeStep; +} +declare class b2Position { + readonly c: b2Vec2; + a: number; + static MakeArray(length: number): b2Position[]; +} +declare class b2Velocity { + readonly v: b2Vec2; + w: number; + static MakeArray(length: number): b2Velocity[]; +} +declare class b2SolverData { + readonly step: b2TimeStep; + positions: b2Position[]; + velocities: b2Velocity[]; +} + +declare enum b2JointType { + e_unknownJoint = 0, + e_revoluteJoint = 1, + e_prismaticJoint = 2, + e_distanceJoint = 3, + e_pulleyJoint = 4, + e_mouseJoint = 5, + e_gearJoint = 6, + e_wheelJoint = 7, + e_weldJoint = 8, + e_frictionJoint = 9, + e_ropeJoint = 10, + e_motorJoint = 11, + e_areaJoint = 12 +} +declare class b2Jacobian { + readonly linear: b2Vec2; + angularA: number; + angularB: number; + SetZero(): b2Jacobian; + Set(x: XY, a1: number, a2: number): b2Jacobian; +} +declare class b2JointEdge { + private _other; + get other(): b2Body; + set other(value: b2Body); + readonly joint: b2Joint; + prev: b2JointEdge | null; + next: b2JointEdge | null; + constructor(joint: b2Joint); + Reset(): void; +} +interface b2IJointDef { + type: b2JointType; + userData?: any; + bodyA: b2Body; + bodyB: b2Body; + collideConnected?: boolean; +} +declare abstract class b2JointDef implements b2IJointDef { + readonly type: b2JointType; + userData: any; + bodyA: b2Body; + bodyB: b2Body; + collideConnected: boolean; + constructor(type: b2JointType); +} +declare function b2LinearStiffness(def: { + stiffness: number; + damping: number; +}, frequencyHertz: number, dampingRatio: number, bodyA: b2Body, bodyB: b2Body): void; +declare function b2AngularStiffness(def: { + stiffness: number; + damping: number; +}, frequencyHertz: number, dampingRatio: number, bodyA: b2Body, bodyB: b2Body): void; +declare abstract class b2Joint { + readonly m_type: b2JointType; + m_prev: b2Joint | null; + m_next: b2Joint | null; + readonly m_edgeA: b2JointEdge; + readonly m_edgeB: b2JointEdge; + m_bodyA: b2Body; + m_bodyB: b2Body; + m_index: number; + m_islandFlag: boolean; + m_collideConnected: boolean; + m_userData: any; + constructor(def: b2IJointDef); + GetType(): b2JointType; + GetBodyA(): b2Body; + GetBodyB(): b2Body; + abstract GetAnchorA(out: T): T; + abstract GetAnchorB(out: T): T; + abstract GetReactionForce(inv_dt: number, out: T): T; + abstract GetReactionTorque(inv_dt: number): number; + GetNext(): b2Joint | null; + GetUserData(): any; + SetUserData(data: any): void; + IsEnabled(): boolean; + GetCollideConnected(): boolean; + Dump(log: (format: string, ...args: any[]) => void): void; + ShiftOrigin(newOrigin: XY): void; + private static Draw_s_p1; + private static Draw_s_p2; + private static Draw_s_color; + private static Draw_s_c; + Draw(draw: b2Draw): void; + abstract InitVelocityConstraints(data: b2SolverData): void; + abstract SolveVelocityConstraints(data: b2SolverData): void; + abstract SolvePositionConstraints(data: b2SolverData): boolean; +} + +declare class b2DestructionListener { + SayGoodbyeJoint(joint: b2Joint): void; + SayGoodbyeFixture(fixture: b2Fixture): void; +} +declare class b2ContactFilter { + ShouldCollide(fixtureA: b2Fixture, fixtureB: b2Fixture): boolean; + static readonly b2_defaultFilter: b2ContactFilter; +} +declare class b2ContactImpulse { + normalImpulses: number[]; + tangentImpulses: number[]; + count: number; +} +declare class b2ContactListener { + BeginContact(contact: b2Contact): void; + EndContact(contact: b2Contact): void; + PreSolve(contact: b2Contact, oldManifold: b2Manifold): void; + PostSolve(contact: b2Contact, impulse: b2ContactImpulse): void; + static readonly b2_defaultListener: b2ContactListener; +} +declare class b2QueryCallback { + ReportFixture(fixture: b2Fixture): boolean; +} +declare type b2QueryCallbackFunction = (fixture: b2Fixture) => boolean; +declare class b2RayCastCallback { + ReportFixture(fixture: b2Fixture, point: b2Vec2, normal: b2Vec2, fraction: number): number; +} +declare type b2RayCastCallbackFunction = (fixture: b2Fixture, point: b2Vec2, normal: b2Vec2, fraction: number) => number; + +declare function b2MixFriction(friction1: number, friction2: number): number; +declare function b2MixRestitution(restitution1: number, restitution2: number): number; +declare function b2MixRestitutionThreshold(threshold1: number, threshold2: number): number; +declare class b2ContactEdge { + private _other; + get other(): b2Body; + set other(value: b2Body); + readonly contact: b2Contact; + prev: b2ContactEdge | null; + next: b2ContactEdge | null; + constructor(contact: b2Contact); + Reset(): void; +} +declare abstract class b2Contact { + m_islandFlag: boolean; + m_touchingFlag: boolean; + m_enabledFlag: boolean; + m_filterFlag: boolean; + m_bulletHitFlag: boolean; + m_toiFlag: boolean; + m_prev: b2Contact | null; + m_next: b2Contact | null; + readonly m_nodeA: b2ContactEdge; + readonly m_nodeB: b2ContactEdge; + m_fixtureA: b2Fixture; + m_fixtureB: b2Fixture; + m_indexA: number; + m_indexB: number; + m_manifold: b2Manifold; + m_toiCount: number; + m_toi: number; + m_friction: number; + m_restitution: number; + m_restitutionThreshold: number; + m_tangentSpeed: number; + m_oldManifold: b2Manifold; + GetManifold(): b2Manifold; + GetWorldManifold(worldManifold: b2WorldManifold): void; + IsTouching(): boolean; + SetEnabled(flag: boolean): void; + IsEnabled(): boolean; + GetNext(): b2Contact | null; + GetFixtureA(): b2Fixture; + GetChildIndexA(): number; + GetShapeA(): A; + GetFixtureB(): b2Fixture; + GetChildIndexB(): number; + GetShapeB(): B; + abstract Evaluate(manifold: b2Manifold, xfA: b2Transform, xfB: b2Transform): void; + FlagForFiltering(): void; + SetFriction(friction: number): void; + GetFriction(): number; + ResetFriction(): void; + SetRestitution(restitution: number): void; + GetRestitution(): number; + ResetRestitution(): void; + SetRestitutionThreshold(threshold: number): void; + GetRestitutionThreshold(): number; + ResetRestitutionThreshold(): void; + SetTangentSpeed(speed: number): void; + GetTangentSpeed(): number; + Reset(fixtureA: b2Fixture, indexA: number, fixtureB: b2Fixture, indexB: number): void; + Update(listener: b2ContactListener): void; + private static ComputeTOI_s_input; + private static ComputeTOI_s_output; + ComputeTOI(sweepA: b2Sweep, sweepB: b2Sweep): number; +} + +interface b2IDistanceJointDef extends b2IJointDef { + localAnchorA?: XY; + localAnchorB?: XY; + length?: number; + minLength?: number; + maxLength?: number; + stiffness?: number; + damping?: number; +} +declare class b2DistanceJointDef extends b2JointDef implements b2IDistanceJointDef { + readonly localAnchorA: b2Vec2; + readonly localAnchorB: b2Vec2; + length: number; + minLength: number; + maxLength: number; + stiffness: number; + damping: number; + constructor(); + Initialize(b1: b2Body, b2: b2Body, anchor1: XY, anchor2: XY): void; +} +declare class b2DistanceJoint extends b2Joint { + m_stiffness: number; + m_damping: number; + m_bias: number; + m_length: number; + m_minLength: number; + m_maxLength: number; + readonly m_localAnchorA: b2Vec2; + readonly m_localAnchorB: b2Vec2; + m_gamma: number; + m_impulse: number; + m_lowerImpulse: number; + m_upperImpulse: number; + m_indexA: number; + m_indexB: number; + readonly m_u: b2Vec2; + readonly m_rA: b2Vec2; + readonly m_rB: b2Vec2; + readonly m_localCenterA: b2Vec2; + readonly m_localCenterB: b2Vec2; + m_currentLength: number; + m_invMassA: number; + m_invMassB: number; + m_invIA: number; + m_invIB: number; + m_softMass: number; + m_mass: number; + readonly m_qA: b2Rot; + readonly m_qB: b2Rot; + readonly m_lalcA: b2Vec2; + readonly m_lalcB: b2Vec2; + constructor(def: b2IDistanceJointDef); + GetAnchorA(out: T): T; + GetAnchorB(out: T): T; + GetReactionForce(inv_dt: number, out: T): T; + GetReactionTorque(inv_dt: number): number; + GetLocalAnchorA(): Readonly; + GetLocalAnchorB(): Readonly; + SetLength(length: number): number; + GetLength(): number; + SetMinLength(minLength: number): number; + SetMaxLength(maxLength: number): number; + GetCurrentLength(): number; + SetStiffness(stiffness: number): void; + GetStiffness(): number; + SetDamping(damping: number): void; + GetDamping(): number; + Dump(log: (format: string, ...args: any[]) => void): void; + private static InitVelocityConstraints_s_P; + InitVelocityConstraints(data: b2SolverData): void; + private static SolveVelocityConstraints_s_vpA; + private static SolveVelocityConstraints_s_vpB; + private static SolveVelocityConstraints_s_P; + SolveVelocityConstraints(data: b2SolverData): void; + private static SolvePositionConstraints_s_P; + SolvePositionConstraints(data: b2SolverData): boolean; + private static Draw_s_pA; + private static Draw_s_pB; + private static Draw_s_axis; + private static Draw_s_c1; + private static Draw_s_c2; + private static Draw_s_c3; + private static Draw_s_c4; + private static Draw_s_pRest; + private static Draw_s_pMin; + private static Draw_s_pMax; + Draw(draw: b2Draw): void; +} + +interface b2IAreaJointDef extends b2IJointDef { + bodies: b2Body[]; + stiffness?: number; + damping?: number; +} +declare class b2AreaJointDef extends b2JointDef implements b2IAreaJointDef { + bodies: b2Body[]; + stiffness: number; + damping: number; + constructor(); + AddBody(body: b2Body): void; +} +declare class b2AreaJoint extends b2Joint { + m_bodies: b2Body[]; + m_stiffness: number; + m_damping: number; + m_impulse: number; + readonly m_targetLengths: number[]; + m_targetArea: number; + readonly m_normals: b2Vec2[]; + readonly m_joints: b2DistanceJoint[]; + readonly m_deltas: b2Vec2[]; + readonly m_delta: b2Vec2; + constructor(def: b2IAreaJointDef); + GetAnchorA(out: T): T; + GetAnchorB(out: T): T; + GetReactionForce(inv_dt: number, out: T): T; + GetReactionTorque(inv_dt: number): number; + SetStiffness(stiffness: number): void; + GetStiffness(): number; + SetDamping(damping: number): void; + GetDamping(): number; + Dump(log: (format: string, ...args: any[]) => void): void; + InitVelocityConstraints(data: b2SolverData): void; + SolveVelocityConstraints(data: b2SolverData): void; + SolvePositionConstraints(data: b2SolverData): boolean; +} + +interface b2IFrictionJointDef extends b2IJointDef { + localAnchorA?: XY; + localAnchorB?: XY; + maxForce?: number; + maxTorque?: number; +} +declare class b2FrictionJointDef extends b2JointDef implements b2IFrictionJointDef { + readonly localAnchorA: b2Vec2; + readonly localAnchorB: b2Vec2; + maxForce: number; + maxTorque: number; + constructor(); + Initialize(bA: b2Body, bB: b2Body, anchor: b2Vec2): void; +} +declare class b2FrictionJoint extends b2Joint { + readonly m_localAnchorA: b2Vec2; + readonly m_localAnchorB: b2Vec2; + readonly m_linearImpulse: b2Vec2; + m_angularImpulse: number; + m_maxForce: number; + m_maxTorque: number; + m_indexA: number; + m_indexB: number; + readonly m_rA: b2Vec2; + readonly m_rB: b2Vec2; + readonly m_localCenterA: b2Vec2; + readonly m_localCenterB: b2Vec2; + m_invMassA: number; + m_invMassB: number; + m_invIA: number; + m_invIB: number; + readonly m_linearMass: b2Mat22; + m_angularMass: number; + readonly m_qA: b2Rot; + readonly m_qB: b2Rot; + readonly m_lalcA: b2Vec2; + readonly m_lalcB: b2Vec2; + readonly m_K: b2Mat22; + constructor(def: b2IFrictionJointDef); + InitVelocityConstraints(data: b2SolverData): void; + private static SolveVelocityConstraints_s_Cdot_v2; + private static SolveVelocityConstraints_s_impulseV; + private static SolveVelocityConstraints_s_oldImpulseV; + SolveVelocityConstraints(data: b2SolverData): void; + SolvePositionConstraints(data: b2SolverData): boolean; + GetAnchorA(out: T): T; + GetAnchorB(out: T): T; + GetReactionForce(inv_dt: number, out: T): T; + GetReactionTorque(inv_dt: number): number; + GetLocalAnchorA(): Readonly; + GetLocalAnchorB(): Readonly; + SetMaxForce(force: number): void; + GetMaxForce(): number; + SetMaxTorque(torque: number): void; + GetMaxTorque(): number; + Dump(log: (format: string, ...args: any[]) => void): void; +} + +interface b2IPrismaticJointDef extends b2IJointDef { + localAnchorA?: XY; + localAnchorB?: XY; + localAxisA?: XY; + referenceAngle?: number; + enableLimit?: boolean; + lowerTranslation?: number; + upperTranslation?: number; + enableMotor?: boolean; + maxMotorForce?: number; + motorSpeed?: number; +} +declare class b2PrismaticJointDef extends b2JointDef implements b2IPrismaticJointDef { + readonly localAnchorA: b2Vec2; + readonly localAnchorB: b2Vec2; + readonly localAxisA: b2Vec2; + referenceAngle: number; + enableLimit: boolean; + lowerTranslation: number; + upperTranslation: number; + enableMotor: boolean; + maxMotorForce: number; + motorSpeed: number; + constructor(); + Initialize(bA: b2Body, bB: b2Body, anchor: b2Vec2, axis: b2Vec2): void; +} +declare class b2PrismaticJoint extends b2Joint { + readonly m_localAnchorA: b2Vec2; + readonly m_localAnchorB: b2Vec2; + readonly m_localXAxisA: b2Vec2; + readonly m_localYAxisA: b2Vec2; + m_referenceAngle: number; + readonly m_impulse: b2Vec2; + m_motorImpulse: number; + m_lowerImpulse: number; + m_upperImpulse: number; + m_lowerTranslation: number; + m_upperTranslation: number; + m_maxMotorForce: number; + m_motorSpeed: number; + m_enableLimit: boolean; + m_enableMotor: boolean; + m_indexA: number; + m_indexB: number; + readonly m_localCenterA: b2Vec2; + readonly m_localCenterB: b2Vec2; + m_invMassA: number; + m_invMassB: number; + m_invIA: number; + m_invIB: number; + readonly m_axis: b2Vec2; + readonly m_perp: b2Vec2; + m_s1: number; + m_s2: number; + m_a1: number; + m_a2: number; + readonly m_K: b2Mat22; + readonly m_K3: b2Mat33; + readonly m_K2: b2Mat22; + m_translation: number; + m_axialMass: number; + readonly m_qA: b2Rot; + readonly m_qB: b2Rot; + readonly m_lalcA: b2Vec2; + readonly m_lalcB: b2Vec2; + readonly m_rA: b2Vec2; + readonly m_rB: b2Vec2; + constructor(def: b2IPrismaticJointDef); + private static InitVelocityConstraints_s_d; + private static InitVelocityConstraints_s_P; + InitVelocityConstraints(data: b2SolverData): void; + private static SolveVelocityConstraints_s_P; + private static SolveVelocityConstraints_s_df; + SolveVelocityConstraints(data: b2SolverData): void; + private static SolvePositionConstraints_s_d; + private static SolvePositionConstraints_s_impulse; + private static SolvePositionConstraints_s_impulse1; + private static SolvePositionConstraints_s_P; + SolvePositionConstraints(data: b2SolverData): boolean; + GetAnchorA(out: T): T; + GetAnchorB(out: T): T; + GetReactionForce(inv_dt: number, out: T): T; + GetReactionTorque(inv_dt: number): number; + GetLocalAnchorA(): Readonly; + GetLocalAnchorB(): Readonly; + GetLocalAxisA(): Readonly; + GetReferenceAngle(): number; + private static GetJointTranslation_s_pA; + private static GetJointTranslation_s_pB; + private static GetJointTranslation_s_d; + private static GetJointTranslation_s_axis; + GetJointTranslation(): number; + GetJointSpeed(): number; + IsLimitEnabled(): boolean; + EnableLimit(flag: boolean): void; + GetLowerLimit(): number; + GetUpperLimit(): number; + SetLimits(lower: number, upper: number): void; + IsMotorEnabled(): boolean; + EnableMotor(flag: boolean): void; + SetMotorSpeed(speed: number): void; + GetMotorSpeed(): number; + SetMaxMotorForce(force: number): void; + GetMaxMotorForce(): number; + GetMotorForce(inv_dt: number): number; + Dump(log: (format: string, ...args: any[]) => void): void; + private static Draw_s_pA; + private static Draw_s_pB; + private static Draw_s_axis; + private static Draw_s_c1; + private static Draw_s_c2; + private static Draw_s_c3; + private static Draw_s_c4; + private static Draw_s_c5; + private static Draw_s_lower; + private static Draw_s_upper; + private static Draw_s_perp; + Draw(draw: b2Draw): void; +} + +interface b2IRevoluteJointDef extends b2IJointDef { + localAnchorA?: XY; + localAnchorB?: XY; + referenceAngle?: number; + enableLimit?: boolean; + lowerAngle?: number; + upperAngle?: number; + enableMotor?: boolean; + motorSpeed?: number; + maxMotorTorque?: number; +} +declare class b2RevoluteJointDef extends b2JointDef implements b2IRevoluteJointDef { + readonly localAnchorA: b2Vec2; + readonly localAnchorB: b2Vec2; + referenceAngle: number; + enableLimit: boolean; + lowerAngle: number; + upperAngle: number; + enableMotor: boolean; + motorSpeed: number; + maxMotorTorque: number; + constructor(); + Initialize(bA: b2Body, bB: b2Body, anchor: XY): void; +} +declare class b2RevoluteJoint extends b2Joint { + readonly m_localAnchorA: b2Vec2; + readonly m_localAnchorB: b2Vec2; + readonly m_impulse: b2Vec2; + m_motorImpulse: number; + m_lowerImpulse: number; + m_upperImpulse: number; + m_enableMotor: boolean; + m_maxMotorTorque: number; + m_motorSpeed: number; + m_enableLimit: boolean; + m_referenceAngle: number; + m_lowerAngle: number; + m_upperAngle: number; + m_indexA: number; + m_indexB: number; + readonly m_rA: b2Vec2; + readonly m_rB: b2Vec2; + readonly m_localCenterA: b2Vec2; + readonly m_localCenterB: b2Vec2; + m_invMassA: number; + m_invMassB: number; + m_invIA: number; + m_invIB: number; + readonly m_K: b2Mat22; + m_angle: number; + m_axialMass: number; + readonly m_qA: b2Rot; + readonly m_qB: b2Rot; + readonly m_lalcA: b2Vec2; + readonly m_lalcB: b2Vec2; + constructor(def: b2IRevoluteJointDef); + private static InitVelocityConstraints_s_P; + InitVelocityConstraints(data: b2SolverData): void; + private static SolveVelocityConstraints_s_Cdot_v2; + private static SolveVelocityConstraints_s_impulse_v2; + SolveVelocityConstraints(data: b2SolverData): void; + private static SolvePositionConstraints_s_C_v2; + private static SolvePositionConstraints_s_impulse; + SolvePositionConstraints(data: b2SolverData): boolean; + GetAnchorA(out: T): T; + GetAnchorB(out: T): T; + GetReactionForce(inv_dt: number, out: T): T; + GetReactionTorque(inv_dt: number): number; + GetLocalAnchorA(): Readonly; + GetLocalAnchorB(): Readonly; + GetReferenceAngle(): number; + GetJointAngle(): number; + GetJointSpeed(): number; + IsMotorEnabled(): boolean; + EnableMotor(flag: boolean): void; + GetMotorTorque(inv_dt: number): number; + GetMotorSpeed(): number; + SetMaxMotorTorque(torque: number): void; + GetMaxMotorTorque(): number; + IsLimitEnabled(): boolean; + EnableLimit(flag: boolean): void; + GetLowerLimit(): number; + GetUpperLimit(): number; + SetLimits(lower: number, upper: number): void; + SetMotorSpeed(speed: number): void; + Dump(log: (format: string, ...args: any[]) => void): void; + private static Draw_s_pA; + private static Draw_s_pB; + private static Draw_s_c1; + private static Draw_s_c2; + private static Draw_s_c3; + private static Draw_s_c4; + private static Draw_s_c5; + private static Draw_s_color_; + private static Draw_s_r; + private static Draw_s_rlo; + private static Draw_s_rhi; + Draw(draw: b2Draw): void; +} + +interface b2IGearJointDef extends b2IJointDef { + joint1: b2RevoluteJoint | b2PrismaticJoint; + joint2: b2RevoluteJoint | b2PrismaticJoint; + ratio?: number; +} +declare class b2GearJointDef extends b2JointDef implements b2IGearJointDef { + joint1: b2RevoluteJoint | b2PrismaticJoint; + joint2: b2RevoluteJoint | b2PrismaticJoint; + ratio: number; + constructor(); +} +declare class b2GearJoint extends b2Joint { + m_joint1: b2RevoluteJoint | b2PrismaticJoint; + m_joint2: b2RevoluteJoint | b2PrismaticJoint; + m_typeA: b2JointType; + m_typeB: b2JointType; + m_bodyC: b2Body; + m_bodyD: b2Body; + readonly m_localAnchorA: b2Vec2; + readonly m_localAnchorB: b2Vec2; + readonly m_localAnchorC: b2Vec2; + readonly m_localAnchorD: b2Vec2; + readonly m_localAxisC: b2Vec2; + readonly m_localAxisD: b2Vec2; + m_referenceAngleA: number; + m_referenceAngleB: number; + m_constant: number; + m_ratio: number; + m_impulse: number; + m_indexA: number; + m_indexB: number; + m_indexC: number; + m_indexD: number; + readonly m_lcA: b2Vec2; + readonly m_lcB: b2Vec2; + readonly m_lcC: b2Vec2; + readonly m_lcD: b2Vec2; + m_mA: number; + m_mB: number; + m_mC: number; + m_mD: number; + m_iA: number; + m_iB: number; + m_iC: number; + m_iD: number; + readonly m_JvAC: b2Vec2; + readonly m_JvBD: b2Vec2; + m_JwA: number; + m_JwB: number; + m_JwC: number; + m_JwD: number; + m_mass: number; + readonly m_qA: b2Rot; + readonly m_qB: b2Rot; + readonly m_qC: b2Rot; + readonly m_qD: b2Rot; + readonly m_lalcA: b2Vec2; + readonly m_lalcB: b2Vec2; + readonly m_lalcC: b2Vec2; + readonly m_lalcD: b2Vec2; + constructor(def: b2IGearJointDef); + private static InitVelocityConstraints_s_u; + private static InitVelocityConstraints_s_rA; + private static InitVelocityConstraints_s_rB; + private static InitVelocityConstraints_s_rC; + private static InitVelocityConstraints_s_rD; + InitVelocityConstraints(data: b2SolverData): void; + SolveVelocityConstraints(data: b2SolverData): void; + private static SolvePositionConstraints_s_u; + private static SolvePositionConstraints_s_rA; + private static SolvePositionConstraints_s_rB; + private static SolvePositionConstraints_s_rC; + private static SolvePositionConstraints_s_rD; + SolvePositionConstraints(data: b2SolverData): boolean; + GetAnchorA(out: T): T; + GetAnchorB(out: T): T; + GetReactionForce(inv_dt: number, out: T): T; + GetReactionTorque(inv_dt: number): number; + GetJoint1(): b2PrismaticJoint | b2RevoluteJoint; + GetJoint2(): b2PrismaticJoint | b2RevoluteJoint; + GetRatio(): number; + SetRatio(ratio: number): void; + Dump(log: (format: string, ...args: any[]) => void): void; +} + +interface b2IMotorJointDef extends b2IJointDef { + linearOffset?: XY; + angularOffset?: number; + maxForce?: number; + maxTorque?: number; + correctionFactor?: number; +} +declare class b2MotorJointDef extends b2JointDef implements b2IMotorJointDef { + readonly linearOffset: b2Vec2; + angularOffset: number; + maxForce: number; + maxTorque: number; + correctionFactor: number; + constructor(); + Initialize(bA: b2Body, bB: b2Body): void; +} +declare class b2MotorJoint extends b2Joint { + readonly m_linearOffset: b2Vec2; + m_angularOffset: number; + readonly m_linearImpulse: b2Vec2; + m_angularImpulse: number; + m_maxForce: number; + m_maxTorque: number; + m_correctionFactor: number; + m_indexA: number; + m_indexB: number; + readonly m_rA: b2Vec2; + readonly m_rB: b2Vec2; + readonly m_localCenterA: b2Vec2; + readonly m_localCenterB: b2Vec2; + readonly m_linearError: b2Vec2; + m_angularError: number; + m_invMassA: number; + m_invMassB: number; + m_invIA: number; + m_invIB: number; + readonly m_linearMass: b2Mat22; + m_angularMass: number; + readonly m_qA: b2Rot; + readonly m_qB: b2Rot; + readonly m_K: b2Mat22; + constructor(def: b2IMotorJointDef); + GetAnchorA(out: T): T; + GetAnchorB(out: T): T; + GetReactionForce(inv_dt: number, out: T): T; + GetReactionTorque(inv_dt: number): number; + SetLinearOffset(linearOffset: b2Vec2): void; + GetLinearOffset(): b2Vec2; + SetAngularOffset(angularOffset: number): void; + GetAngularOffset(): number; + SetMaxForce(force: number): void; + GetMaxForce(): number; + SetMaxTorque(torque: number): void; + GetMaxTorque(): number; + InitVelocityConstraints(data: b2SolverData): void; + private static SolveVelocityConstraints_s_Cdot_v2; + private static SolveVelocityConstraints_s_impulse_v2; + private static SolveVelocityConstraints_s_oldImpulse_v2; + SolveVelocityConstraints(data: b2SolverData): void; + SolvePositionConstraints(data: b2SolverData): boolean; + Dump(log: (format: string, ...args: any[]) => void): void; +} + +interface b2IMouseJointDef extends b2IJointDef { + target?: XY; + maxForce?: number; + stiffness?: number; + damping?: number; +} +declare class b2MouseJointDef extends b2JointDef implements b2IMouseJointDef { + readonly target: b2Vec2; + maxForce: number; + stiffness: number; + damping: number; + constructor(); +} +declare class b2MouseJoint extends b2Joint { + readonly m_localAnchorB: b2Vec2; + readonly m_targetA: b2Vec2; + m_stiffness: number; + m_damping: number; + m_beta: number; + readonly m_impulse: b2Vec2; + m_maxForce: number; + m_gamma: number; + m_indexA: number; + m_indexB: number; + readonly m_rB: b2Vec2; + readonly m_localCenterB: b2Vec2; + m_invMassB: number; + m_invIB: number; + readonly m_mass: b2Mat22; + readonly m_C: b2Vec2; + readonly m_qB: b2Rot; + readonly m_lalcB: b2Vec2; + readonly m_K: b2Mat22; + constructor(def: b2IMouseJointDef); + SetTarget(target: b2Vec2): void; + GetTarget(): b2Vec2; + SetMaxForce(maxForce: number): void; + GetMaxForce(): number; + SetStiffness(stiffness: number): void; + GetStiffness(): number; + SetDamping(damping: number): void; + GetDamping(): number; + InitVelocityConstraints(data: b2SolverData): void; + private static SolveVelocityConstraints_s_Cdot; + private static SolveVelocityConstraints_s_impulse; + private static SolveVelocityConstraints_s_oldImpulse; + SolveVelocityConstraints(data: b2SolverData): void; + SolvePositionConstraints(data: b2SolverData): boolean; + GetAnchorA(out: T): T; + GetAnchorB(out: T): T; + GetReactionForce(inv_dt: number, out: T): T; + GetReactionTorque(inv_dt: number): number; + Dump(log: (format: string, ...args: any[]) => void): void; + ShiftOrigin(newOrigin: b2Vec2): void; +} + +declare const b2_minPulleyLength: number; +interface b2IPulleyJointDef extends b2IJointDef { + groundAnchorA?: XY; + groundAnchorB?: XY; + localAnchorA?: XY; + localAnchorB?: XY; + lengthA?: number; + lengthB?: number; + ratio?: number; +} +declare class b2PulleyJointDef extends b2JointDef implements b2IPulleyJointDef { + readonly groundAnchorA: b2Vec2; + readonly groundAnchorB: b2Vec2; + readonly localAnchorA: b2Vec2; + readonly localAnchorB: b2Vec2; + lengthA: number; + lengthB: number; + ratio: number; + constructor(); + Initialize(bA: b2Body, bB: b2Body, groundA: b2Vec2, groundB: b2Vec2, anchorA: b2Vec2, anchorB: b2Vec2, r: number): void; +} +declare class b2PulleyJoint extends b2Joint { + readonly m_groundAnchorA: b2Vec2; + readonly m_groundAnchorB: b2Vec2; + m_lengthA: number; + m_lengthB: number; + readonly m_localAnchorA: b2Vec2; + readonly m_localAnchorB: b2Vec2; + m_constant: number; + m_ratio: number; + m_impulse: number; + m_indexA: number; + m_indexB: number; + readonly m_uA: b2Vec2; + readonly m_uB: b2Vec2; + readonly m_rA: b2Vec2; + readonly m_rB: b2Vec2; + readonly m_localCenterA: b2Vec2; + readonly m_localCenterB: b2Vec2; + m_invMassA: number; + m_invMassB: number; + m_invIA: number; + m_invIB: number; + m_mass: number; + readonly m_qA: b2Rot; + readonly m_qB: b2Rot; + readonly m_lalcA: b2Vec2; + readonly m_lalcB: b2Vec2; + constructor(def: b2IPulleyJointDef); + private static InitVelocityConstraints_s_PA; + private static InitVelocityConstraints_s_PB; + InitVelocityConstraints(data: b2SolverData): void; + private static SolveVelocityConstraints_s_vpA; + private static SolveVelocityConstraints_s_vpB; + private static SolveVelocityConstraints_s_PA; + private static SolveVelocityConstraints_s_PB; + SolveVelocityConstraints(data: b2SolverData): void; + private static SolvePositionConstraints_s_PA; + private static SolvePositionConstraints_s_PB; + SolvePositionConstraints(data: b2SolverData): boolean; + GetAnchorA(out: T): T; + GetAnchorB(out: T): T; + GetReactionForce(inv_dt: number, out: T): T; + GetReactionTorque(inv_dt: number): number; + GetGroundAnchorA(): b2Vec2; + GetGroundAnchorB(): b2Vec2; + GetLengthA(): number; + GetLengthB(): number; + GetRatio(): number; + private static GetCurrentLengthA_s_p; + GetCurrentLengthA(): number; + private static GetCurrentLengthB_s_p; + GetCurrentLengthB(): number; + Dump(log: (format: string, ...args: any[]) => void): void; + ShiftOrigin(newOrigin: b2Vec2): void; +} + +interface b2IWeldJointDef extends b2IJointDef { + localAnchorA?: XY; + localAnchorB?: XY; + referenceAngle?: number; + stiffness?: number; + damping?: number; +} +declare class b2WeldJointDef extends b2JointDef implements b2IWeldJointDef { + readonly localAnchorA: b2Vec2; + readonly localAnchorB: b2Vec2; + referenceAngle: number; + stiffness: number; + damping: number; + constructor(); + Initialize(bA: b2Body, bB: b2Body, anchor: b2Vec2): void; +} +declare class b2WeldJoint extends b2Joint { + m_stiffness: number; + m_damping: number; + m_bias: number; + readonly m_localAnchorA: b2Vec2; + readonly m_localAnchorB: b2Vec2; + m_referenceAngle: number; + m_gamma: number; + readonly m_impulse: b2Vec3; + m_indexA: number; + m_indexB: number; + readonly m_rA: b2Vec2; + readonly m_rB: b2Vec2; + readonly m_localCenterA: b2Vec2; + readonly m_localCenterB: b2Vec2; + m_invMassA: number; + m_invMassB: number; + m_invIA: number; + m_invIB: number; + readonly m_mass: b2Mat33; + readonly m_qA: b2Rot; + readonly m_qB: b2Rot; + readonly m_lalcA: b2Vec2; + readonly m_lalcB: b2Vec2; + readonly m_K: b2Mat33; + constructor(def: b2IWeldJointDef); + private static InitVelocityConstraints_s_P; + InitVelocityConstraints(data: b2SolverData): void; + private static SolveVelocityConstraints_s_Cdot1; + private static SolveVelocityConstraints_s_impulse1; + private static SolveVelocityConstraints_s_impulse; + private static SolveVelocityConstraints_s_P; + SolveVelocityConstraints(data: b2SolverData): void; + private static SolvePositionConstraints_s_C1; + private static SolvePositionConstraints_s_P; + private static SolvePositionConstraints_s_impulse; + SolvePositionConstraints(data: b2SolverData): boolean; + GetAnchorA(out: T): T; + GetAnchorB(out: T): T; + GetReactionForce(inv_dt: number, out: T): T; + GetReactionTorque(inv_dt: number): number; + GetLocalAnchorA(): Readonly; + GetLocalAnchorB(): Readonly; + GetReferenceAngle(): number; + SetStiffness(stiffness: number): void; + GetStiffness(): number; + SetDamping(damping: number): void; + GetDamping(): number; + Dump(log: (format: string, ...args: any[]) => void): void; +} + +interface b2IWheelJointDef extends b2IJointDef { + localAnchorA?: XY; + localAnchorB?: XY; + localAxisA?: XY; + enableLimit?: boolean; + lowerTranslation?: number; + upperTranslation?: number; + enableMotor?: boolean; + maxMotorTorque?: number; + motorSpeed?: number; + stiffness?: number; + damping?: number; +} +declare class b2WheelJointDef extends b2JointDef implements b2IWheelJointDef { + readonly localAnchorA: b2Vec2; + readonly localAnchorB: b2Vec2; + readonly localAxisA: b2Vec2; + enableLimit: boolean; + lowerTranslation: number; + upperTranslation: number; + enableMotor: boolean; + maxMotorTorque: number; + motorSpeed: number; + stiffness: number; + damping: number; + constructor(); + Initialize(bA: b2Body, bB: b2Body, anchor: b2Vec2, axis: b2Vec2): void; +} +declare class b2WheelJoint extends b2Joint { + readonly m_localAnchorA: b2Vec2; + readonly m_localAnchorB: b2Vec2; + readonly m_localXAxisA: b2Vec2; + readonly m_localYAxisA: b2Vec2; + m_impulse: number; + m_motorImpulse: number; + m_springImpulse: number; + m_lowerImpulse: number; + m_upperImpulse: number; + m_translation: number; + m_lowerTranslation: number; + m_upperTranslation: number; + m_maxMotorTorque: number; + m_motorSpeed: number; + m_enableLimit: boolean; + m_enableMotor: boolean; + m_stiffness: number; + m_damping: number; + m_indexA: number; + m_indexB: number; + readonly m_localCenterA: b2Vec2; + readonly m_localCenterB: b2Vec2; + m_invMassA: number; + m_invMassB: number; + m_invIA: number; + m_invIB: number; + readonly m_ax: b2Vec2; + readonly m_ay: b2Vec2; + m_sAx: number; + m_sBx: number; + m_sAy: number; + m_sBy: number; + m_mass: number; + m_motorMass: number; + m_axialMass: number; + m_springMass: number; + m_bias: number; + m_gamma: number; + readonly m_qA: b2Rot; + readonly m_qB: b2Rot; + readonly m_lalcA: b2Vec2; + readonly m_lalcB: b2Vec2; + readonly m_rA: b2Vec2; + readonly m_rB: b2Vec2; + constructor(def: b2IWheelJointDef); + GetMotorSpeed(): number; + GetMaxMotorTorque(): number; + SetStiffness(hz: number): void; + GetStiffness(): number; + SetDamping(ratio: number): void; + GetDamping(): number; + private static InitVelocityConstraints_s_d; + private static InitVelocityConstraints_s_P; + InitVelocityConstraints(data: b2SolverData): void; + private static SolveVelocityConstraints_s_P; + SolveVelocityConstraints(data: b2SolverData): void; + private static SolvePositionConstraints_s_d; + private static SolvePositionConstraints_s_P; + SolvePositionConstraints(data: b2SolverData): boolean; + GetDefinition(def: b2WheelJointDef): b2WheelJointDef; + GetAnchorA(out: T): T; + GetAnchorB(out: T): T; + GetReactionForce(inv_dt: number, out: T): T; + GetReactionTorque(inv_dt: number): number; + GetLocalAnchorA(): Readonly; + GetLocalAnchorB(): Readonly; + GetLocalAxisA(): Readonly; + GetJointTranslation(): number; + GetJointLinearSpeed(): number; + GetJointAngle(): number; + GetJointAngularSpeed(): number; + GetPrismaticJointTranslation(): number; + GetPrismaticJointSpeed(): number; + GetRevoluteJointAngle(): number; + GetRevoluteJointSpeed(): number; + IsMotorEnabled(): boolean; + EnableMotor(flag: boolean): void; + SetMotorSpeed(speed: number): void; + SetMaxMotorTorque(force: number): void; + GetMotorTorque(inv_dt: number): number; + IsLimitEnabled(): boolean; + EnableLimit(flag: boolean): void; + GetLowerLimit(): number; + GetUpperLimit(): number; + SetLimits(lower: number, upper: number): void; + Dump(log: (format: string, ...args: any[]) => void): void; + private static Draw_s_pA; + private static Draw_s_pB; + private static Draw_s_axis; + private static Draw_s_c1; + private static Draw_s_c2; + private static Draw_s_c3; + private static Draw_s_c4; + private static Draw_s_c5; + private static Draw_s_lower; + private static Draw_s_upper; + private static Draw_s_perp; + Draw(draw: b2Draw): void; +} + +declare class b2ContactRegister { + pool: b2Contact[]; + createFcn: (() => b2Contact) | null; + destroyFcn: ((contact: b2Contact) => void) | null; + primary: boolean; +} +declare class b2ContactFactory { + readonly m_registers: b2ContactRegister[][]; + constructor(); + private AddType; + private InitializeRegisters; + Create(fixtureA: b2Fixture, indexA: number, fixtureB: b2Fixture, indexB: number): b2Contact | null; + Destroy(contact: b2Contact): void; +} + +declare class b2ContactManager { + readonly m_broadPhase: b2BroadPhase; + m_contactList: b2Contact | null; + m_contactCount: number; + m_contactFilter: b2ContactFilter; + m_contactListener: b2ContactListener; + readonly m_contactFactory: b2ContactFactory; + AddPair(proxyA: b2FixtureProxy, proxyB: b2FixtureProxy): void; + FindNewContacts(): void; + Destroy(c: b2Contact): void; + Collide(): void; +} + +declare let g_blockSolve: boolean; +declare function get_g_blockSolve(): boolean; +declare function set_g_blockSolve(value: boolean): void; +declare class b2VelocityConstraintPoint { + readonly rA: b2Vec2; + readonly rB: b2Vec2; + normalImpulse: number; + tangentImpulse: number; + normalMass: number; + tangentMass: number; + velocityBias: number; + static MakeArray(length: number): b2VelocityConstraintPoint[]; +} +declare class b2ContactVelocityConstraint { + readonly points: b2VelocityConstraintPoint[]; + readonly normal: b2Vec2; + readonly tangent: b2Vec2; + readonly normalMass: b2Mat22; + readonly K: b2Mat22; + indexA: number; + indexB: number; + invMassA: number; + invMassB: number; + invIA: number; + invIB: number; + friction: number; + restitution: number; + threshold: number; + tangentSpeed: number; + pointCount: number; + contactIndex: number; + static MakeArray(length: number): b2ContactVelocityConstraint[]; +} +declare class b2ContactPositionConstraint { + readonly localPoints: b2Vec2[]; + readonly localNormal: b2Vec2; + readonly localPoint: b2Vec2; + indexA: number; + indexB: number; + invMassA: number; + invMassB: number; + readonly localCenterA: b2Vec2; + readonly localCenterB: b2Vec2; + invIA: number; + invIB: number; + type: b2ManifoldType; + radiusA: number; + radiusB: number; + pointCount: number; + static MakeArray(length: number): b2ContactPositionConstraint[]; +} +declare class b2ContactSolverDef { + readonly step: b2TimeStep; + contacts: b2Contact[]; + count: number; + positions: b2Position[]; + velocities: b2Velocity[]; +} +declare class b2PositionSolverManifold { + readonly normal: b2Vec2; + readonly point: b2Vec2; + separation: number; + private static Initialize_s_pointA; + private static Initialize_s_pointB; + private static Initialize_s_planePoint; + private static Initialize_s_clipPoint; + Initialize(pc: b2ContactPositionConstraint, xfA: b2Transform, xfB: b2Transform, index: number): void; +} +declare class b2ContactSolver { + readonly m_step: b2TimeStep; + m_positions: b2Position[]; + m_velocities: b2Velocity[]; + readonly m_positionConstraints: b2ContactPositionConstraint[]; + readonly m_velocityConstraints: b2ContactVelocityConstraint[]; + m_contacts: b2Contact[]; + m_count: number; + Initialize(def: b2ContactSolverDef): b2ContactSolver; + private static InitializeVelocityConstraints_s_xfA; + private static InitializeVelocityConstraints_s_xfB; + private static InitializeVelocityConstraints_s_worldManifold; + InitializeVelocityConstraints(): void; + private static WarmStart_s_P; + WarmStart(): void; + private static SolveVelocityConstraints_s_dv; + private static SolveVelocityConstraints_s_dv1; + private static SolveVelocityConstraints_s_dv2; + private static SolveVelocityConstraints_s_P; + private static SolveVelocityConstraints_s_a; + private static SolveVelocityConstraints_s_b; + private static SolveVelocityConstraints_s_x; + private static SolveVelocityConstraints_s_d; + private static SolveVelocityConstraints_s_P1; + private static SolveVelocityConstraints_s_P2; + private static SolveVelocityConstraints_s_P1P2; + SolveVelocityConstraints(): void; + StoreImpulses(): void; + private static SolvePositionConstraints_s_xfA; + private static SolvePositionConstraints_s_xfB; + private static SolvePositionConstraints_s_psm; + private static SolvePositionConstraints_s_rA; + private static SolvePositionConstraints_s_rB; + private static SolvePositionConstraints_s_P; + SolvePositionConstraints(): boolean; + private static SolveTOIPositionConstraints_s_xfA; + private static SolveTOIPositionConstraints_s_xfB; + private static SolveTOIPositionConstraints_s_psm; + private static SolveTOIPositionConstraints_s_rA; + private static SolveTOIPositionConstraints_s_rB; + private static SolveTOIPositionConstraints_s_P; + SolveTOIPositionConstraints(toiIndexA: number, toiIndexB: number): boolean; +} + +declare class b2Island { + m_listener: b2ContactListener; + readonly m_bodies: b2Body[]; + readonly m_contacts: b2Contact[]; + readonly m_joints: b2Joint[]; + readonly m_positions: b2Position[]; + readonly m_velocities: b2Velocity[]; + m_bodyCount: number; + m_jointCount: number; + m_contactCount: number; + m_bodyCapacity: number; + m_contactCapacity: number; + m_jointCapacity: number; + Initialize(bodyCapacity: number, contactCapacity: number, jointCapacity: number, listener: b2ContactListener): void; + Clear(): void; + AddBody(body: b2Body): void; + AddContact(contact: b2Contact): void; + AddJoint(joint: b2Joint): void; + private static s_timer; + private static s_solverData; + private static s_contactSolverDef; + private static s_contactSolver; + private static s_translation; + Solve(profile: b2Profile, step: b2TimeStep, gravity: b2Vec2, allowSleep: boolean): void; + SolveTOI(subStep: b2TimeStep, toiIndexA: number, toiIndexB: number): void; + private static s_impulse; + Report(constraints: b2ContactVelocityConstraint[]): void; +} + +declare class b2World { + readonly m_contactManager: b2ContactManager; + m_bodyList: b2Body | null; + m_jointList: b2Joint | null; + m_bodyCount: number; + m_jointCount: number; + readonly m_gravity: b2Vec2; + m_allowSleep: boolean; + m_destructionListener: b2DestructionListener | null; + m_debugDraw: b2Draw | null; + m_inv_dt0: number; + m_newContacts: boolean; + m_locked: boolean; + m_clearForces: boolean; + m_warmStarting: boolean; + m_continuousPhysics: boolean; + m_subStepping: boolean; + m_stepComplete: boolean; + readonly m_profile: b2Profile; + readonly m_island: b2Island; + readonly s_stack: Array; + constructor(gravity: XY); + SetDestructionListener(listener: b2DestructionListener | null): void; + SetContactFilter(filter: b2ContactFilter): void; + SetContactListener(listener: b2ContactListener): void; + SetDebugDraw(debugDraw: b2Draw | null): void; + CreateBody(def?: b2IBodyDef): b2Body; + DestroyBody(b: b2Body): void; + private static _Joint_Create; + private static _Joint_Destroy; + CreateJoint(def: b2IAreaJointDef): b2AreaJoint; + CreateJoint(def: b2IDistanceJointDef): b2DistanceJoint; + CreateJoint(def: b2IFrictionJointDef): b2FrictionJoint; + CreateJoint(def: b2IGearJointDef): b2GearJoint; + CreateJoint(def: b2IMotorJointDef): b2MotorJoint; + CreateJoint(def: b2IMouseJointDef): b2MouseJoint; + CreateJoint(def: b2IPrismaticJointDef): b2PrismaticJoint; + CreateJoint(def: b2IPulleyJointDef): b2PulleyJoint; + CreateJoint(def: b2IRevoluteJointDef): b2RevoluteJoint; + CreateJoint(def: b2IWeldJointDef): b2WeldJoint; + CreateJoint(def: b2IWheelJointDef): b2WheelJoint; + DestroyJoint(j: b2Joint): void; + private static Step_s_step; + private static Step_s_stepTimer; + private static Step_s_timer; + Step(dt: number, velocityIterations: number, positionIterations: number): void; + ClearForces(): void; + private static DebugDraw_s_color; + private static DebugDraw_s_vs; + private static DebugDraw_s_xf; + DebugDraw(): void; + QueryAABB(callback: b2QueryCallback, aabb: b2AABB): void; + QueryAABB(aabb: b2AABB, fn: b2QueryCallbackFunction): void; + private _QueryAABB; + QueryAllAABB(aabb: b2AABB, out?: b2Fixture[]): b2Fixture[]; + QueryPointAABB(callback: b2QueryCallback, point: XY): void; + QueryPointAABB(point: XY, fn: b2QueryCallbackFunction): void; + private _QueryPointAABB; + QueryAllPointAABB(point: XY, out?: b2Fixture[]): b2Fixture[]; + QueryFixtureShape(callback: b2QueryCallback, shape: b2Shape, index: number, transform: b2Transform): void; + QueryFixtureShape(shape: b2Shape, index: number, transform: b2Transform, fn: b2QueryCallbackFunction): void; + private static QueryFixtureShape_s_aabb; + private _QueryFixtureShape; + QueryAllFixtureShape(shape: b2Shape, index: number, transform: b2Transform, out?: b2Fixture[]): b2Fixture[]; + QueryFixturePoint(callback: b2QueryCallback, point: XY): void; + QueryFixturePoint(point: XY, fn: b2QueryCallbackFunction): void; + private _QueryFixturePoint; + QueryAllFixturePoint(point: XY, out?: b2Fixture[]): b2Fixture[]; + RayCast(callback: b2RayCastCallback, point1: XY, point2: XY): void; + RayCast(point1: XY, point2: XY, fn: b2RayCastCallbackFunction): void; + private static RayCast_s_input; + private static RayCast_s_output; + private static RayCast_s_point; + private _RayCast; + RayCastOne(point1: XY, point2: XY): b2Fixture | null; + RayCastAll(point1: XY, point2: XY, out?: b2Fixture[]): b2Fixture[]; + GetBodyList(): b2Body | null; + GetJointList(): b2Joint | null; + GetContactList(): b2Contact | null; + SetAllowSleeping(flag: boolean): void; + GetAllowSleeping(): boolean; + SetWarmStarting(flag: boolean): void; + GetWarmStarting(): boolean; + SetContinuousPhysics(flag: boolean): void; + GetContinuousPhysics(): boolean; + SetSubStepping(flag: boolean): void; + GetSubStepping(): boolean; + GetProxyCount(): number; + GetBodyCount(): number; + GetJointCount(): number; + GetContactCount(): number; + GetTreeHeight(): number; + GetTreeBalance(): number; + GetTreeQuality(): number; + SetGravity(gravity: XY, wake?: boolean): void; + GetGravity(): Readonly; + IsLocked(): boolean; + SetAutoClearForces(flag: boolean): void; + GetAutoClearForces(): boolean; + ShiftOrigin(newOrigin: XY): void; + GetContactManager(): b2ContactManager; + GetProfile(): b2Profile; + Dump(log: (format: string, ...args: any[]) => void): void; + DrawShape(fixture: b2Fixture, color: b2Color): void; + Solve(step: b2TimeStep): void; + private static SolveTOI_s_subStep; + private static SolveTOI_s_backup; + private static SolveTOI_s_backup1; + private static SolveTOI_s_backup2; + private static SolveTOI_s_toi_input; + private static SolveTOI_s_toi_output; + SolveTOI(step: b2TimeStep): void; +} + +declare enum b2BodyType { + b2_unknown = -1, + b2_staticBody = 0, + b2_kinematicBody = 1, + b2_dynamicBody = 2 +} +interface b2IBodyDef { + type?: b2BodyType; + position?: XY; + angle?: number; + linearVelocity?: XY; + angularVelocity?: number; + linearDamping?: number; + angularDamping?: number; + allowSleep?: boolean; + awake?: boolean; + fixedRotation?: boolean; + bullet?: boolean; + enabled?: boolean; + userData?: any; + gravityScale?: number; +} +declare class b2BodyDef implements b2IBodyDef { + type: b2BodyType; + readonly position: b2Vec2; + angle: number; + readonly linearVelocity: b2Vec2; + angularVelocity: number; + linearDamping: number; + angularDamping: number; + allowSleep: boolean; + awake: boolean; + fixedRotation: boolean; + bullet: boolean; + enabled: boolean; + userData: any; + gravityScale: number; +} +declare class b2Body { + m_type: b2BodyType; + m_islandFlag: boolean; + m_awakeFlag: boolean; + m_autoSleepFlag: boolean; + m_bulletFlag: boolean; + m_fixedRotationFlag: boolean; + m_enabledFlag: boolean; + m_toiFlag: boolean; + m_islandIndex: number; + readonly m_xf: b2Transform; + readonly m_sweep: b2Sweep; + readonly m_linearVelocity: b2Vec2; + m_angularVelocity: number; + readonly m_force: b2Vec2; + m_torque: number; + m_world: b2World; + m_prev: b2Body | null; + m_next: b2Body | null; + m_fixtureList: b2Fixture | null; + m_fixtureCount: number; + m_jointList: b2JointEdge | null; + m_contactList: b2ContactEdge | null; + m_mass: number; + m_invMass: number; + m_I: number; + m_invI: number; + m_linearDamping: number; + m_angularDamping: number; + m_gravityScale: number; + m_sleepTime: number; + m_userData: any; + constructor(bd: b2IBodyDef, world: b2World); + CreateFixture(def: b2IFixtureDef): b2Fixture; + CreateFixture(shape: b2Shape): b2Fixture; + CreateFixture(shape: b2Shape, density: number): b2Fixture; + CreateFixtureDef(def: b2IFixtureDef): b2Fixture; + private static CreateFixtureShapeDensity_s_def; + CreateFixtureShapeDensity(shape: b2Shape, density?: number): b2Fixture; + DestroyFixture(fixture: b2Fixture): void; + SetTransformVec(position: XY, angle: number): void; + SetTransformXY(x: number, y: number, angle: number): void; + SetTransform(position: XY, angle: number): void; + GetTransform(): Readonly; + GetPosition(): Readonly; + SetPosition(position: XY): void; + SetPositionXY(x: number, y: number): void; + GetAngle(): number; + SetAngle(angle: number): void; + GetWorldCenter(): Readonly; + GetLocalCenter(): Readonly; + SetLinearVelocity(v: XY): void; + GetLinearVelocity(): Readonly; + SetAngularVelocity(w: number): void; + GetAngularVelocity(): number; + GetDefinition(bd: b2BodyDef): b2BodyDef; + ApplyForce(force: XY, point: XY, wake?: boolean): void; + ApplyForceToCenter(force: XY, wake?: boolean): void; + ApplyTorque(torque: number, wake?: boolean): void; + ApplyLinearImpulse(impulse: XY, point: XY, wake?: boolean): void; + ApplyLinearImpulseToCenter(impulse: XY, wake?: boolean): void; + ApplyAngularImpulse(impulse: number, wake?: boolean): void; + GetMass(): number; + GetInertia(): number; + GetMassData(data: b2MassData): b2MassData; + private static SetMassData_s_oldCenter; + SetMassData(massData: b2MassData): void; + private static ResetMassData_s_localCenter; + private static ResetMassData_s_oldCenter; + private static ResetMassData_s_massData; + ResetMassData(): void; + GetWorldPoint(localPoint: XY, out: T): T; + GetWorldVector(localVector: XY, out: T): T; + GetLocalPoint(worldPoint: XY, out: T): T; + GetLocalVector(worldVector: XY, out: T): T; + GetLinearVelocityFromWorldPoint(worldPoint: XY, out: T): T; + GetLinearVelocityFromLocalPoint(localPoint: XY, out: T): T; + GetLinearDamping(): number; + SetLinearDamping(linearDamping: number): void; + GetAngularDamping(): number; + SetAngularDamping(angularDamping: number): void; + GetGravityScale(): number; + SetGravityScale(scale: number): void; + SetType(type: b2BodyType): void; + GetType(): b2BodyType; + SetBullet(flag: boolean): void; + IsBullet(): boolean; + SetSleepingAllowed(flag: boolean): void; + IsSleepingAllowed(): boolean; + SetAwake(flag: boolean): void; + IsAwake(): boolean; + SetEnabled(flag: boolean): void; + IsEnabled(): boolean; + SetFixedRotation(flag: boolean): void; + IsFixedRotation(): boolean; + GetFixtureList(): b2Fixture | null; + GetJointList(): b2JointEdge | null; + GetContactList(): b2ContactEdge | null; + GetNext(): b2Body | null; + GetUserData(): any; + SetUserData(data: any): void; + GetWorld(): b2World; + Dump(log: (format: string, ...args: any[]) => void): void; + private static SynchronizeFixtures_s_xf1; + SynchronizeFixtures(): void; + SynchronizeTransform(): void; + ShouldCollide(other: b2Body): boolean; + ShouldCollideConnected(other: b2Body): boolean; + Advance(alpha: number): void; +} + +interface b2IFilter { + categoryBits: number; + maskBits: number; + groupIndex?: number; +} +declare class b2Filter implements b2IFilter { + static readonly DEFAULT: Readonly; + categoryBits: number; + maskBits: number; + groupIndex: number; + Clone(): b2Filter; + Copy(other: b2IFilter): this; +} +interface b2IFixtureDef { + shape: b2Shape; + userData?: any; + friction?: number; + restitution?: number; + restitutionThreshold?: number; + density?: number; + isSensor?: boolean; + filter?: b2IFilter; +} +declare class b2FixtureDef implements b2IFixtureDef { + shape: b2Shape; + userData: any; + friction: number; + restitution: number; + restitutionThreshold: number; + density: number; + isSensor: boolean; + readonly filter: b2Filter; +} +declare class b2FixtureProxy { + readonly aabb: b2AABB; + readonly fixture: b2Fixture; + readonly childIndex: number; + treeNode: b2TreeNode; + constructor(fixture: b2Fixture, childIndex: number); + Reset(): void; + Touch(): void; + private static Synchronize_s_aabb1; + private static Synchronize_s_aabb2; + private static Synchronize_s_displacement; + Synchronize(transform1: b2Transform, transform2: b2Transform): void; +} +declare class b2Fixture { + m_density: number; + m_next: b2Fixture | null; + readonly m_body: b2Body; + readonly m_shape: b2Shape; + m_friction: number; + m_restitution: number; + m_restitutionThreshold: number; + readonly m_proxies: b2FixtureProxy[]; + get m_proxyCount(): number; + readonly m_filter: b2Filter; + m_isSensor: boolean; + m_userData: any; + constructor(body: b2Body, def: b2IFixtureDef); + Create(allocator: any, body: any, def: any): void; + Destroy(): void; + Reset(): void; + GetType(): b2ShapeType; + GetShape(): b2Shape; + SetSensor(sensor: boolean): void; + IsSensor(): boolean; + SetFilterData(filter: b2Filter): void; + GetFilterData(): Readonly; + Refilter(): void; + GetBody(): b2Body; + GetNext(): b2Fixture | null; + GetUserData(): any; + SetUserData(data: any): void; + TestPoint(p: XY): boolean; + RayCast(output: b2RayCastOutput, input: b2RayCastInput, childIndex: number): boolean; + GetMassData(massData?: b2MassData): b2MassData; + SetDensity(density: number): void; + GetDensity(): number; + GetFriction(): number; + SetFriction(friction: number): void; + GetRestitution(): number; + SetRestitution(restitution: number): void; + GetRestitutionThreshold(): number; + SetRestitutionThreshold(threshold: number): void; + GetAABB(childIndex: number): Readonly; + Dump(log: (format: string, ...args: any[]) => void, bodyIndex: number): void; + CreateProxies(): void; + DestroyProxies(): void; + TouchProxies(): void; + Synchronize(broadPhase: any, transform1: b2Transform, transform2: b2Transform): void; + SynchronizeProxies(transform1: b2Transform, transform2: b2Transform): void; +} + +declare class b2CircleContact extends b2Contact { + static Create(): b2Contact; + static Destroy(contact: b2Contact): void; + Evaluate(manifold: b2Manifold, xfA: b2Transform, xfB: b2Transform): void; +} + +declare class b2PolygonContact extends b2Contact { + static Create(): b2Contact; + static Destroy(contact: b2Contact): void; + Evaluate(manifold: b2Manifold, xfA: b2Transform, xfB: b2Transform): void; +} + +declare class b2PolygonAndCircleContact extends b2Contact { + static Create(): b2Contact; + static Destroy(contact: b2Contact): void; + Evaluate(manifold: b2Manifold, xfA: b2Transform, xfB: b2Transform): void; +} + +declare class b2EdgeAndCircleContact extends b2Contact { + static Create(): b2Contact; + static Destroy(contact: b2Contact): void; + Evaluate(manifold: b2Manifold, xfA: b2Transform, xfB: b2Transform): void; +} + +declare class b2EdgeAndPolygonContact extends b2Contact { + static Create(): b2Contact; + static Destroy(contact: b2Contact): void; + Evaluate(manifold: b2Manifold, xfA: b2Transform, xfB: b2Transform): void; +} + +declare class b2ChainAndCircleContact extends b2Contact { + static Create(): b2Contact; + static Destroy(contact: b2Contact): void; + private static Evaluate_s_edge; + Evaluate(manifold: b2Manifold, xfA: b2Transform, xfB: b2Transform): void; +} + +declare class b2ChainAndPolygonContact extends b2Contact { + static Create(): b2Contact; + static Destroy(contact: b2Contact): void; + private static Evaluate_s_edge; + Evaluate(manifold: b2Manifold, xfA: b2Transform, xfB: b2Transform): void; +} + +declare enum b2StretchingModel { + b2_pbdStretchingModel = 0, + b2_xpbdStretchingModel = 1 +} +declare enum b2BendingModel { + b2_springAngleBendingModel = 0, + b2_pbdAngleBendingModel = 1, + b2_xpbdAngleBendingModel = 2, + b2_pbdDistanceBendingModel = 3, + b2_pbdHeightBendingModel = 4, + b2_pbdTriangleBendingModel = 5 +} +declare class b2RopeTuning { + stretchingModel: b2StretchingModel; + bendingModel: b2BendingModel; + damping: number; + stretchStiffness: number; + stretchHertz: number; + stretchDamping: number; + bendStiffness: number; + bendHertz: number; + bendDamping: number; + isometric: boolean; + fixedEffectiveMass: boolean; + warmStart: boolean; + Copy(other: Readonly): this; +} +declare class b2RopeDef { + readonly position: b2Vec2; + readonly vertices: b2Vec2[]; + count: number; + readonly masses: number[]; + readonly gravity: b2Vec2; + readonly tuning: b2RopeTuning; +} +declare class b2Rope { + private readonly m_position; + private m_count; + private m_stretchCount; + private m_bendCount; + private readonly m_stretchConstraints; + private readonly m_bendConstraints; + private readonly m_bindPositions; + private readonly m_ps; + private readonly m_p0s; + private readonly m_vs; + private readonly m_invMasses; + private readonly m_gravity; + private readonly m_tuning; + Create(def: b2RopeDef): void; + SetTuning(tuning: b2RopeTuning): void; + Step(dt: number, iterations: number, position: Readonly): void; + Reset(position: Readonly): void; + Draw(draw: b2Draw): void; + private SolveStretch_PBD; + private SolveStretch_XPBD; + private SolveBend_PBD_Angle; + private SolveBend_XPBD_Angle; + private SolveBend_PBD_Distance; + private SolveBend_PBD_Height; + private SolveBend_PBD_Triangle; + private ApplyBendForces; +} + +export { RGB, RGBA, XY, XYZ, b2AABB, b2Abs, b2Acos, b2Alloc, b2AngularStiffness, b2AreaJoint, b2AreaJointDef, b2Asin, b2Assert, b2Atan2, b2BendingModel, b2BlockAllocator, b2Body, b2BodyDef, b2BodyType, b2BroadPhase, b2ChainAndCircleContact, b2ChainAndPolygonContact, b2ChainShape, b2CircleContact, b2CircleShape, b2Clamp, b2ClipSegmentToLine, b2ClipVertex, b2CollideCircles, b2CollideEdgeAndCircle, b2CollideEdgeAndPolygon, b2CollidePolygonAndCircle, b2CollidePolygons, b2Color, b2Contact, b2ContactEdge, b2ContactFactory, b2ContactFeature, b2ContactFeatureType, b2ContactFilter, b2ContactID, b2ContactImpulse, b2ContactListener, b2ContactManager, b2ContactPositionConstraint, b2ContactRegister, b2ContactSolver, b2ContactSolverDef, b2ContactVelocityConstraint, b2Cos, b2Counter, b2DegToRad, b2DestructionListener, b2Distance, b2DistanceInput, b2DistanceJoint, b2DistanceJointDef, b2DistanceOutput, b2DistanceProxy, b2Draw, b2DrawFlags, b2DynamicTree, b2EdgeAndCircleContact, b2EdgeAndPolygonContact, b2EdgeShape, b2Filter, b2Fixture, b2FixtureDef, b2FixtureProxy, b2Free, b2FrictionJoint, b2FrictionJointDef, b2GearJoint, b2GearJointDef, b2GetPointStates, b2GrowableStack, b2IAreaJointDef, b2IBodyDef, b2IDistanceJointDef, b2IFilter, b2IFixtureDef, b2IFrictionJointDef, b2IGearJointDef, b2IJointDef, b2IMotorJointDef, b2IMouseJointDef, b2IPrismaticJointDef, b2IPulleyJointDef, b2IRevoluteJointDef, b2IWeldJointDef, b2IWheelJointDef, b2InvSqrt, b2IsPowerOfTwo, b2IsValid, b2Island, b2Jacobian, b2Joint, b2JointDef, b2JointEdge, b2JointType, b2LinearStiffness, b2Log, b2MakeArray, b2MakeNullArray, b2MakeNumberArray, b2Manifold, b2ManifoldPoint, b2ManifoldType, b2MassData, b2Mat22, b2Mat33, b2Max, b2Maybe, b2Min, b2MixFriction, b2MixRestitution, b2MixRestitutionThreshold, b2MotorJoint, b2MotorJointDef, b2MouseJoint, b2MouseJointDef, b2NextPowerOfTwo, b2Pair, b2ParseInt, b2ParseUInt, b2PointState, b2PolygonAndCircleContact, b2PolygonContact, b2PolygonShape, b2Position, b2PositionSolverManifold, b2Pow, b2PrismaticJoint, b2PrismaticJointDef, b2Profile, b2PulleyJoint, b2PulleyJointDef, b2QueryCallback, b2QueryCallbackFunction, b2RadToDeg, b2Random, b2RandomRange, b2RayCastCallback, b2RayCastCallbackFunction, b2RayCastInput, b2RayCastOutput, b2RevoluteJoint, b2RevoluteJointDef, b2Rope, b2RopeDef, b2RopeTuning, b2Rot, b2SeparationFunction, b2SeparationFunctionType, b2Shape, b2ShapeCast, b2ShapeCastInput, b2ShapeCastOutput, b2ShapeType, b2Simplex, b2SimplexCache, b2SimplexVertex, b2Sin, b2SolverData, b2Sq, b2Sqrt, b2StackAllocator, b2StretchingModel, b2Swap, b2Sweep, b2TOIInput, b2TOIOutput, b2TOIOutputState, b2TestOverlapAABB, b2TestOverlapShape, b2TimeOfImpact, b2TimeStep, b2Timer, b2Transform, b2TreeNode, b2TypedColor, b2TypedVec2, b2Vec2, b2Vec2_zero, b2Vec3, b2Velocity, b2VelocityConstraintPoint, b2Version, b2WeldJoint, b2WeldJointDef, b2WheelJoint, b2WheelJointDef, b2World, b2WorldManifold, b2_180_over_pi, b2_aabbExtension, b2_aabbMultiplier, b2_angularSleepTolerance, b2_angularSlop, b2_baumgarte, b2_branch, b2_commit, b2_epsilon, b2_epsilon_sq, b2_gjkCalls, b2_gjkIters, b2_gjkMaxIters, b2_gjk_reset, b2_lengthUnitsPerMeter, b2_linearSleepTolerance, b2_linearSlop, b2_maxAngularCorrection, b2_maxFloat, b2_maxLinearCorrection, b2_maxManifoldPoints, b2_maxPolygonVertices, b2_maxRotation, b2_maxRotationSquared, b2_maxSubSteps, b2_maxTOIContacts, b2_maxTranslation, b2_maxTranslationSquared, b2_minPulleyLength, b2_pi, b2_pi_over_180, b2_polygonRadius, b2_timeToSleep, b2_toiBaumgarte, b2_toiCalls, b2_toiIters, b2_toiMaxIters, b2_toiMaxRootIters, b2_toiMaxTime, b2_toiRootIters, b2_toiTime, b2_toi_reset, b2_two_pi, b2_version, g_blockSolve, get_g_blockSolve, set_g_blockSolve }; diff --git a/shudu/engine/types/cannon.d.ts b/shudu/engine/types/cannon.d.ts new file mode 100644 index 0000000..112561a --- /dev/null +++ b/shudu/engine/types/cannon.d.ts @@ -0,0 +1,1210 @@ +declare module CANNON { + + export interface IAABBOptions { + + upperBound?: Vec3; + lowerBound?: Vec3; + + } + + export class AABB { + + lowerBound: Vec3; + upperBound: Vec3; + + constructor(options?: IAABBOptions); + + clone() : AABB; + setFromPoints(points: Vec3[], position?: Vec3, quaternion?: Quaternion, skinSize?: number): void; + copy(aabb: AABB): void; + extend(aabb: AABB): void; + getCorners( a: Vec3, b: Vec3, c: Vec3, d: Vec3, e: Vec3, f: Vec3, g: Vec3, h: Vec3 ) : void; + overlaps(aabb: AABB): boolean; + toLocalFrame( frame: Transform, target: AABB ) : AABB; + toWorldFrame( frame: Transform, target: AABB ) : AABB; + } + + export class ArrayCollisionMatrix { + + matrix: Mat3[]; + + get(i: number, j: number): number; + set(i: number, j: number, value?: number): void; + reset(): void; + setNumObjects(n: number): void; + + } + + export class Broadphase { + + world: World; + useBoundingBoxes: boolean; + dirty: boolean; + + collisionPairs(world: World, p1: Body[], p2: Body[]): void; + needBroadphaseCollision(bodyA: Body, bodyB: Body): boolean; + intersectionTest(bodyA: Body, bodyB: Body, pairs1: Body[], pairs2: Body[]): void; + doBoundingSphereBroadphase(bodyA: Body, bodyB: Body, pairs1: Body[], pairs2: Body[]): void; + doBoundingBoxBroadphase(bodyA: Body, bodyB: Body, pairs1: Body[], pairs2: Body[]): void; + makePairsUnique(pairs1: Body[], pairs2: Body[]): void; + setWorld(world: World): void; + boundingSphereCheck(bodyA: Body, bodyB: Body): boolean; + aabbQuery(world: World, aabb: AABB, result: Body[]): Body[]; + + } + + export class GridBroadphase extends Broadphase { + + nx: number; + ny: number; + nz: number; + aabbMin: Vec3; + aabbMax: Vec3; + bins: any[]; + + constructor(aabbMin?: Vec3, aabbMax?: Vec3, nx?: number, ny?: number, nz?: number); + + } + + export class NaiveBroadphase extends Broadphase { + } + + export class ObjectCollisionMatrix { + + matrix: number[]; + + get(i: number, j: number): number; + set(i: number, j: number, value: number): void; + reset(): void; + setNumObjects(n: number): void; + + } + + export interface IRayIntersectWorldOptions { + + mode: number; + result: boolean; + skipBackfaces: boolean; + collisionFilterMask: number; + collisionFilterGroup: number; + from: Vec3; + to: Vec3; + callback: Function; + + } + + export class Ray { + + static CLOSEST: number; + static ANY: number; + static ALL: number; + + from: Vec3; + to: Vec3; + precision: number; + checkCollisionResponse: boolean; + callback: Function; + collisionFilterGroup: number; + collisionFilterMask: number; + hasHit: boolean; + mode: number; + result: RaycastResult; + skipBackfaces: boolean; + + constructor(from?: Vec3, to?: Vec3); + + getAABB(result: RaycastResult): void; + intersectBodies(bodies: Body[], result?: RaycastResult): void; + intersectWorld(world: World, options: any): boolean; + + } + + export class RaycastResult { + + rayFromWorld: Vec3; + rayToWorld: Vec3; + hitNormalWorld: Vec3; + hitPointWorld: Vec3; + hitFaceIndex: number; + hasHit: boolean; + shape: Shape; + body: Body; + distance: number; + + abort(): void; + reset(): void; + set(rayFromWorld: Vec3, rayToWorld: Vec3, hitNormalWorld: Vec3, hitPointWorld: Vec3, shape: Shape, body: Body, distance: number): void; + + } + + export class SAPBroadphase extends Broadphase { + + static insertionSortX(a: any[]): any[]; + static insertionSortY(a: any[]): any[]; + static insertionSortZ(a: any[]): any[]; + static checkBounds(bi: Body, bj: Body, axisIndex?: number): boolean; + + axisList: any[]; + world: World; + axisIndex: number; + + constructor(world?: World); + + autoDetectAxis(): void; + aabbQuery(world: World, aabb: AABB, result?: Body[]): Body[]; + + } + + export interface IConstraintOptions { + + collideConnected?: boolean; + wakeUpBodies?: boolean; + + } + + export class Constraint { + + equations: any[]; + bodyA: Body; + bodyB: Body; + id: number; + collideConnected: boolean; + + constructor(bodyA: Body, bodyB: Body, options?: IConstraintOptions); + + update(): void; + disable(): void; + enable(): void; + + } + + export class DistanceConstraint extends Constraint { + + distance: number; + distanceEquation: ContactEquation; + + constructor(bodyA: Body, bodyB: Body, distance?: number, maxForce?: number); + + } + + export interface IHingeConstraintOptions { + + pivotA?: Vec3; + axisA?: Vec3; + pivotB?: Vec3; + axisB?: Vec3; + maxForce?: number; + + } + + export class HingeConstraint extends Constraint { + + axisA: Vec3; + axisB: Vec3; + rotationalEquation1: RotationalEquation; + rotationalEquation2: RotationalEquation; + motorEnabled: boolean; + motorTargetVelocity: number; + motorMinForce: number; + motorMaxForce: number; + motorEquation: RotationalMotorEquation; + + constructor(bodyA: Body, bodyB: Body, options?: IHingeConstraintOptions); + + enableMotor(): void; + disableMotor(): void; + setMotorMaxForce(maxForce: number): void; + setMotorSpeed(speed: number): void; + + } + + export class PointToPointConstraint extends Constraint { + + equationX: ContactEquation; + equationY: ContactEquation; + equationZ: ContactEquation; + pivotA: Vec3; + pivotB: Vec3; + + constructor(bodyA: Body, pivotA: Vec3, bodyB: Body, pivotB: Vec3, maxForce?: number); + + } + + export class ConeTwistConstraint extends PointToPointConstraint { + + coneEquation: ConeEquation; + twistEquation: RotationalEquation; + + constructor(bodyA: Body, bodyB: Body, options?: IHingeConstraintOptions); + + } + + export class LockConstraint extends PointToPointConstraint { + + rotationalEquation1: RotationalEquation; + rotationalEquation2: RotationalEquation; + rotationalEquation3: RotationalEquation; + + constructor(bodyA: Body, bodyB: Body, maxForce?: number); + + } + + export class Equation { + + id: number; + minForce: number; + maxForce: number; + bi: Body; + bj: Body; + a: number; + b: number; + eps: number; + jacobianElementA: JacobianElement; + jacobianElementB: JacobianElement; + enabled: boolean; + + constructor(bi: Body, bj: Body, minForce?: number, maxForce?: number); + + setSpookParams(stiffness: number, relaxation: number, timeStep: number): void; + computeB(a: number, b: number, h: number): number; + computeGq(): number; + computeGW(): number; + computeGWlamda(): number; + computeGiMf(): number; + computeGiMGt(): number; + addToWlamda(deltalambda: number): number; + computeC(): number; + computeInvC( eps: number ): number; + } + + export class FrictionEquation extends Equation { + + constructor(bi: Body, bj: Body, slipForce: number); + + } + + export interface IRotationalEquationOptions { + + axisA?: Vec3; + axisB?: Vec3; + maxForce?: number; + + } + + export class RotationalEquation extends Equation { + + ni: Vec3; + nj: Vec3; + nixnj: Vec3; + njxni: Vec3; + invIi: Mat3; + invIj: Mat3; + relVel: Vec3; + relForce: Vec3; + + constructor(bodyA: Body, bodyB: Body, options?: IRotationalEquationOptions); + + } + + export class RotationalMotorEquation extends Equation { + + axisA: Vec3; + axisB: Vec3; + invLi: Mat3; + invIj: Mat3; + targetVelocity: number; + + constructor(bodyA: Body, bodyB: Body, maxForce?: number); + + } + + export interface IConeEquationOptions { + + axisA?: Vec3; + axisB?: Vec3; + maxForce?: number; + + } + + export class ConeEquation extends Equation { + + angle: number; + + constructor(bodyA: Body, bodyB: Body, options?: IConeEquationOptions); + + } + + export class ContactEquation extends Equation { + + restitution: number; + ri: Vec3; + rj: Vec3; + ni: Vec3; + + constructor(bi: Body, bj: Body); + + getImpactVelocityAlongNormal(): number; + + } + + export interface IContactMaterialOptions { + + friction?: number; + restitution?: number; + contactEquationStiffness?: number; + contactEquationRelaxation?: number; + frictionEquationStiffness?: number; + frictionEquationRelaxation?: number; + + } + + export class ContactMaterial { + + id: number; + materials: Material[]; + friction: number; + restitution: number; + contactEquationStiffness: number; + contactEquationRelaxation: number; + frictionEquationStiffness: number; + frictionEquationRelaxation: number; + + constructor(m1: Material, m2: Material, options?: IContactMaterialOptions); + + } + + export interface IMaterialOptions { + + friction?: number; + restitution?: number; + + } + + export class Material { + + name: string; + id: number; + friction:number; + restitution:number; + + constructor(options?: string|IMaterialOptions); + + } + + export class JacobianElement { + + spatial: Vec3; + rotational: Vec3; + + multiplyElement(element: JacobianElement): number; + multiplyVectors(spacial: Vec3, rotational: Vec3): number; + + } + + export class Mat3 { + + elements: number[]; + + constructor(elements?: number[]); + + identity(): void; + setZero(): void; + setTrace(vec3: Vec3): void; + getTrace(target: Vec3): void; + vmult(v: Vec3, target?: Vec3): Vec3; + smult(s: number): void; + mmult(m: Mat3): Mat3; + scale(v: Vec3, target?: Mat3): Mat3; + solve(b: Vec3, target?: Vec3): Vec3; + e(row: number, column: number, value?: number): number; + copy(source: Mat3): Mat3; + toString(): string; + reverse(target?: Mat3): Mat3; + setRotationFromQuaternion(q: Quaternion): Mat3; + transpose(target?: Mat3): Mat3; + + } + + export class Trimesh extends Shape { + + aabb: AABB; + edges: number[]; + indices: number[]; + normals: number[]; + scale: Vec3; + tree: Octree; + vertices: number[]; + + static computeNormal(va: Vec3, vb: Vec3, vc: Vec3, target: Vec3): void; + static createTorus(radius?: number, tube?: number, radialSegments?: number, tubularSegments?: number, arc?: number): Trimesh; + + constructor(vertices: number[], indices: number[]); + + calculateWorldAABB(pos: Vec3, quat: Quaternion, min: Vec3, max: Vec3): void; + computeLocalAABB(aabb: AABB): void; + getEdgeVector(edgeIndex: number, vectorStore: Vec3): void; + getEdgeVertex(edgeIndex: number, firstOrSecond: number, vertexStore: Vec3): void; + getNormal(i: number, target: Vec3): Vec3; + getTrianglesAABB(aabb: AABB, result: number[]): void; + getTriangleVertices(i: number, a: Vec3, b: Vec3, c: Vec3): void; + getVertex(i: number, out: Vec3): Vec3; + getWorldVertex(i: number, pos: Vec3, quat: Quaternion, out: Vec3): Vec3; + setScale(scale: Vec3): void; + updateAABB(): void; + updateEdges(): void; + updateNormals(): void; + updateTree(): void; + + } + + export class Quaternion { + + x: number; + y: number; + z: number; + w: number; + + constructor(x?: number, y?: number, z?: number, w?: number); + + set(x: number, y: number, z: number, w: number): void; + toString(): string; + toArray(): number[]; + setFromAxisAngle(axis: Vec3, angle: number): void; + toAxisAngle(targetAxis?: Vec3): any[]; + setFromVectors(u: Vec3, v: Vec3): void; + mult(q: Quaternion, target?: Quaternion): Quaternion; + inverse(target?: Quaternion): Quaternion; + conjugate(target?: Quaternion): Quaternion; + normalize(): void; + normalizeFast(): void; + vmult(v: Vec3, target?: Vec3): Vec3; + copy(source: Quaternion): Quaternion; + toEuler(target: Vec3, order?: string): void; + setFromEuler(x: number, y: number, z: number, order?: string): Quaternion; + clone(): Quaternion; + + } + + export class Transform { + + static pointToLocalFrame(position: Vec3, quaternion: Quaternion, worldPoint: Vec3, result?: Vec3): Vec3; + static pointToWorldFrame(position: Vec3, quaternion: Quaternion, localPoint: Vec3, result?: Vec3): Vec3; + static vectorToWorldFrame(quaternion: Quaternion, localVector: Vec3, result: Vec3): Vec3; + static vectorToLocalFrame(position: Vec3, quaternion: Quaternion, worldVector: Vec3, result?: Vec3): Vec3; + + position: Vec3; + quaternion: Quaternion; + + pointToLocal(point: Vec3, result: Vec3): Vec3; + pointToWorld(point: Vec3, result: Vec3): Vec3; + + } + + export class Vec3 { + + static ZERO: Vec3; + static UNIT_X: Vec3; + static UNIT_Y: Vec3; + static UNIT_Z: Vec3; + + x: number; + y: number; + z: number; + + constructor(x?: number, y?: number, z?: number); + + cross(v: Vec3, target?: Vec3): Vec3; + set(x: number, y: number, z: number): Vec3; + setZero(): void; + vadd(v: Vec3, target?: Vec3): Vec3; + vsub(v: Vec3, target?: Vec3): Vec3; + crossmat(): Mat3; + normalize(): number; + unit(target?: Vec3): Vec3; + norm(): number; + norm2(): number; + distanceTo(p: Vec3): number; + distanceSquared(p: Vec3): number; + mult(scalar: number, target?: Vec3): Vec3; + scale(scalar: number, target?: Vec3): Vec3; + dot(v: Vec3): number; + isZero(): boolean; + negate(target?: Vec3): Vec3; + tangents(t1: Vec3, t2: Vec3): void; + toString(): string; + toArray(): number[]; + copy(source: Vec3): Vec3; + length(): number; + lengthSquared(): number; + lerp(v: Vec3, t: number, target?: Vec3): void; + almostEquals(v: Vec3, precision?: number): boolean; + almostZero(precision?: number): boolean; + isAntiparallelTo(v: Vec3, prescision?: number): boolean; + clone(): Vec3; + + } + + export interface IBodyOptions { + + position?: Vec3; + velocity?: Vec3; + angularVelocity?: Vec3; + quaternion?: Quaternion; + mass?: number; + material?: Material; + type?: number; + linearDamping?: number; + angularDamping?: number; + allowSleep?: boolean; + sleepSpeedLimit?: number; + sleepTimeLimit?: number; + collisionFilterGroup?: number; + collisionFilterMask?: number; + fixedRotation?: boolean; + shape?: Shape; + + } + + export class Body extends EventTarget { + + static DYNAMIC: number; + static STATIC: number; + static KINEMATIC: number; + static AWAKE: number; + static SLEEPY: number; + static SLEEPING: number; + static sleepyEvent: IEvent; + static sleepEvent: IEvent; + + id: number; + //miner + layaID:number; + //miner + isTrigger:boolean; + world: World; + preStep: Function; + postStep: Function; + vlambda: Vec3; + collisionFilterGroup: number; + collisionFilterMask: number; + collisionResponse: boolean; + position: Vec3; + previousPosition: Vec3; + initPosition: Vec3; + boundingRadius: number; + velocity: Vec3; + initVelocity: Vec3; + force: Vec3; + mass: number; + invMass: number; + material: Material; + linearDamping: number; + type: number; + allowSleep: boolean; + sleepState: number; + sleepSpeedLimit: number; + sleepTimeLimit: number; + timeLastSleepy: number; + torque: Vec3; + quaternion: Quaternion; + initQuaternion: Quaternion; + angularVelocity: Vec3; + initAngularVelocity: Vec3; + interpolatedPosition: Vec3; + interpolatedQuaternion: Quaternion; + shapes: Shape[]; + shapeOffsets: any[]; + shapeOrientations: any[]; + inertia: Vec3; + invInertia: Vec3; + invInertiaWorld: Mat3; + invMassSolve: number; + invInertiaSolve: Vec3; + invInteriaWorldSolve: Mat3; + fixedRotation: boolean; + angularDamping: number; + aabb: AABB; + aabbNeedsUpdate: boolean; + wlambda: Vec3; + + constructor(options?: IBodyOptions); + + wakeUp(): void; + sleep(): void; + sleepTick(time: number): void; + pointToLocalFrame(worldPoint: Vec3, result?: Vec3): Vec3; + pointToWorldFrame(localPoint: Vec3, result?: Vec3): Vec3; + vectorToLocalFrame(worldPoint: Vec3, result?: Vec3): Vec3; + vectorToWorldFrame(localVector: Vec3, result?: Vec3): Vec3; + addShape(shape: Shape, offset?: Vec3, orientation?: Vec3): void; + computeAABB(): void; + applyForce(force: Vec3, worldPoint: Vec3): void; + applyImpulse(impulse: Vec3, worldPoint: Vec3): void; + applyLocalForce(force: Vec3, localPoint: Vec3): void; + applyLocalImplse(impulse: Vec3, localPoint: Vec3): void; + updateBoundingRadius(): void; + updateMassProperties(): void; + updateInertiaWorld(force: Vec3): void; + updateSolveMassProperties(): void; + getVelocityAtWorldPoint(worldPoint: Vec3, result: Vec3): Vec3; + + } + + export interface IWheelInfoOptions { + + chassisConnectionPointLocal?: Vec3; + chassisConnectionPointWorld?: Vec3; + directionLocal?: Vec3; + directionWorld?: Vec3; + axleLocal?: Vec3; + axleWorld?: Vec3; + suspensionRestLength?: number; + suspensionMaxLength?: number; + radius?: number; + suspensionStiffness?: number; + dampingCompression?: number; + dampingRelaxation?: number; + frictionSlip?: number; + steering?: number; + rotation?: number; + deltaRotation?: number; + rollInfluence?: number; + maxSuspensionForce?: number; + isFrontWheel?: boolean; + clippedInvContactDotSuspension?: number; + suspensionRelativeVelocity?: number; + suspensionForce?: number; + skidInfo?: number; + suspensionLength?: number; + maxSuspensionTravel?: number; + useCustomSlidingRotationalSpeed?: boolean; + customSlidingRotationalSpeed?: number; + + position?: Vec3; + direction?: Vec3; + axis?: Vec3; + body?: Body; + + } + + export class WheelInfo { + + axleLocal: Vec3; + axleWorld: Vec3; + brake: number; + chassisConnectionPointLocal: Vec3; + chassisConnectionPointWorld: Vec3; + clippedInvContactDotSuspension: number; + customSlidingRotationalSpeed: number; + dampingCompression: number; + dampingRelaxation: number; + deltaRotation: number; + directionLocal: Vec3; + directionWorld: Vec3; + engineForce: number; + forwardImpulse: number; + frictionSlip: number; + isFrontWheel: boolean; + isInContact: boolean; + maxSuspensionForce: number; + maxSuspensionTravel: number; + radius: number; + raycastResult: RaycastResult; + rollInfluence: number; + rotation: number; + sideImpulse: number; + skidInfo: number; + sliding: boolean; + steering: number; + suspensionForce: number; + suspensionLength: number; + suspensionMaxLength: number; + suspensionRelativeVelocity: number; + suspensionStiffness: number; + suspensionRestLength: number; + useCustomSlidingRotationalSpeed: boolean; + worldTransform: Transform; + + constructor(options?: IWheelInfoOptions); + + } + + export interface IRaycastVehicleOptions { + + chassisBody?: Body; + indexRightAxis?: number; + indexLeftAxis?: number; + indexUpAxis?: number; + + } + + export class RaycastVehicle { + + chassisBody: Body; + wheelInfos: IWheelInfoOptions[]; + sliding: boolean; + world: World; + iindexRightAxis: number; + indexForwardAxis: number; + indexUpAxis: number; + + constructor(options?: IRaycastVehicleOptions); + + addWheel(options?: IWheelInfoOptions): void; + setSteeringValue(value: number, wheelIndex: number): void; + applyEngineForce(value: number, wheelIndex: number): void; + setBrake(brake: number, wheelIndex: number): void; + addToWorld(world: World): void; + getVehicleAxisWorld(axisIndex: number, result: Vec3): Vec3; + updateVehicle(timeStep: number): void; + updateSuspension(deltaTime: number): void; + updateWheelTransform(wheelIndex: number): void; + removeFromWorld(world: World): void; + getWheelTransformWorld(wheelIndex: number): Transform; + + } + + export interface IRigidVehicleOptions { + + chassisBody: Body; + + } + + export class RigidVehicle { + + wheelBodies: Body[]; + coordinateSystem: Vec3; + chassisBody: Body; + constraints: Constraint[]; + wheelAxes: Vec3[]; + wheelForces: Vec3[]; + + constructor(options?: IRigidVehicleOptions); + + addWheel(options?: IWheelInfoOptions): Body; + setSteeringValue(value: number, wheelIndex: number): void; + setMotorSpeed(value: number, wheelIndex: number): void; + disableMotor(wheelIndex: number): void; + setWheelForce(value: number, wheelIndex: number): void; + applyWheelForce(value: number, wheelIndex: number): void; + addToWorld(world: World): void; + removeFromWorld(world: World): void; + getWheelSpeed(wheelIndex: number): number; + + } + + export class SPHSystem { + + particles: Particle[]; + density: number; + smoothingRadius: number; + speedOfSound: number; + viscosity: number; + eps: number; + pressures: number[]; + densities: number[]; + neighbors: number[]; + + add(particle: Particle): void; + remove(particle: Particle): void; + getNeighbors(particle: Particle, neighbors: Particle[]): void; + update(): void; + w(r: number): number; + gradw(rVec: Vec3, resultVec: Vec3): void; + nablaw(r: number): number; + + } + + export interface ISpringOptions { + + restLength?: number; + stiffness?: number; + damping?: number; + worldAnchorA?: Vec3; + worldAnchorB?: Vec3; + localAnchorA?: Vec3; + localAnchorB?: Vec3; + + } + + export class Spring { + + restLength: number; + stffness: number; + damping: number; + bodyA: Body; + bodyB: Body; + localAnchorA: Vec3; + localAnchorB: Vec3; + + constructor(options?: ISpringOptions); + + setWorldAnchorA(worldAnchorA: Vec3): void; + setWorldAnchorB(worldAnchorB: Vec3): void; + getWorldAnchorA(result: Vec3): void; + getWorldAnchorB(result: Vec3): void; + applyForce(): void; + + } + + export class Box extends Shape { + + static calculateInertia(halfExtents: Vec3, mass: number, target: Vec3): void; + + halfExtents: Vec3; + convexPolyhedronRepresentation: ConvexPolyhedron; + + constructor(halfExtents: Vec3); + + updateConvexPolyhedronRepresentation(): void; + getSideNormals(sixTargetVectors: boolean, quat?: Quaternion): Vec3[]; + forEachWorldCorner(pos: Vec3, quat: Quaternion, callback: Function): void; + + } + + export class ConvexPolyhedron extends Shape { + + static computeNormal(va: Vec3, vb: Vec3, vc: Vec3, target: Vec3): void; + static project(hull: ConvexPolyhedron, axis: Vec3, pos: Vec3, quat: Quaternion, result: number[]): void; + static getFaceNormal(va: Vec3, vb: Vec3, vc: Vec3, target: Vec3): void; + + vertices: Vec3[]; + worldVertices: Vec3[]; + worldVerticesNeedsUpdate: boolean; + faces: number[]; + faceNormals: Vec3[]; + uniqueEdges: Vec3[]; + uniqueAxes: Vec3[]; + + constructor(points?: Vec3[], faces?: number[]); + + computeEdges(): void; + computeNormals(): void; + getFaceNormal(i: number, target: Vec3): Vec3; + clipAgainstHull(posA: Vec3, quatA: Quaternion, hullB: Vec3, quatB: Quaternion, separatingNormal: Vec3, minDist: number, maxDist: number, result: any[]): void; + findSeparatingAxis(hullB: ConvexPolyhedron, posA: Vec3, quatA: Quaternion, posB: Vec3, quatB: Quaternion, target: Vec3, faceListA: any[], faceListB: any[]): boolean; + testSepAxis(axis: Vec3, hullB: ConvexPolyhedron, posA: Vec3, quatA: Quaternion, posB: Vec3, quatB: Quaternion): number; + getPlaneConstantOfFace(face_i: number): number; + clipFaceAgainstHull(separatingNormal: Vec3, posA: Vec3, quatA: Quaternion, worldVertsB1: Vec3[], minDist: number, maxDist: number, result: any[]): void; + clipFaceAgainstPlane(inVertices: Vec3[], outVertices: Vec3[], planeNormal: Vec3, planeConstant: number): Vec3; + computeWorldVertices(position: Vec3, quat: Quaternion): void; + computeLocalAABB(aabbmin: Vec3, aabbmax: Vec3): void; + computeWorldFaceNormals(quat: Quaternion): void; + calculateWorldAABB(pos: Vec3, quat: Quaternion, min: Vec3, max: Vec3): void; + getAveragePointLocal(target: Vec3): Vec3; + transformAllPoints(offset: Vec3, quat: Quaternion): void; + pointIsInside(p: Vec3): boolean; + + } + + export class Cylinder extends ConvexPolyhedron { + + constructor(radiusTop: number, radiusBottom: number, height: number, numSegments: number); + + } + + export interface IHightfieldOptions { + + minValue?: number; + maxValue?: number; + elementSize: number; + + } + + export class Heightfield extends Shape { + + data: number[]; + maxValue: number; + minValue: number; + elementSize: number; + cacheEnabled: boolean; + pillarConvex: ConvexPolyhedron; + pillarOffset: Vec3; + type: number; + + constructor(data: number[], options?: IHightfieldOptions); + + update(): void; + updateMinValue(): void; + updateMaxValue(): void; + setHeightValueAtIndex(xi: number, yi: number, value: number): void; + getRectMinMax(iMinX: number, iMinY: number, iMaxX: number, iMaxY: number, result: any[]): void; + getIndexOfPosition(x: number, y: number, result: any[], clamp: boolean): boolean; + getConvexTrianglePillar(xi: number, yi: number, getUpperTriangle: boolean): void; + + } + + export class Particle extends Shape { + + } + + export class Plane extends Shape { + + worldNormal: Vec3; + worldNormalNeedsUpdate: boolean; + boundingSphereRadius: number; + + computeWorldNormal(quat: Quaternion): void; + calculateWorldAABB(pos: Vec3, quat: Quaternion, min: number, max: number): void; + + } + + export class Shape { + + static types: { + + SPHERE: number; + PLANE: number; + BOX: number; + COMPOUND: number; + CONVEXPOLYHEDRON: number; + HEIGHTFIELD: number; + PARTICLE: number; + CYLINDER: number; + + } + + id: number; + type: number; + boundingSphereRadius: number; + collisionResponse: boolean; + + updateBoundingSphereRadius(): number; + volume(): number; + calculateLocalInertia(mass: number, target?: Vec3): Vec3; + + } + + export class Sphere extends Shape { + + radius: number; + + constructor(radius: number); + + } + + export class GSSolver extends Solver { + + iterations: number; + tolerance: number; + + solve(dy: number, world: World): number; + + + } + + export class Solver { + + equations: Equation[]; + + solve(dy: number, world: World): number; + addEquation(eq: Equation): void; + removeEquation(eq: Equation): void; + removeAllEquations(): void; + + } + + export class SplitSolver extends Solver { + + subsolver: Solver; + + constructor(subsolver: Solver); + + solve(dy: number, world: World): number; + + } + + export class EventTarget { + + addEventListener(type: string, listener: Function): EventTarget; + hasEventListener(type: string, listener: Function): boolean; + removeEventListener(type: string, listener: Function): EventTarget; + dispatchEvent(event: IEvent): IEvent; + + } + + export class Pool { + + objects: any[]; + type: any[]; + + release(): any; + get(): any; + constructObject(): any; + + } + + export class TupleDictionary { + + data: { + keys: any[]; + }; + + get(i: number, j: number): number; + set(i: number, j: number, value: number): void; + reset(): void; + + } + + export class Utils { + + static defaults(options?: any, defaults?: any): any; + + } + + export class Vec3Pool extends Pool { + + static defaults(options: Object, defaults: Object): Object; + + constructObject(): Vec3; + + } + + export class NarrowPhase { + + contactPointPool: Pool[]; + enableFrictionReduction: boolean; + v3pool: Vec3Pool; + + convexHeightfield(convexShape: Shape, hfShape: Heightfield, convexPos: Vec3, hfPos: Vec3, convexQuat: Quaternion, hfQuat: Quaternion, convexBody: Body, hfBody: Body): void; + convexConvex(si: Shape, sj: Shape, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body): void; + convexParticle(result: ContactEquation[], si: Shape, sj: Shape, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body): void; + convexTrimesh( result: ContactEquation[], si: Shape, sj: Shape, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body): void; + createContactEquation(bi: Body, bj: Body, si: Shape, sj: Shape, rsi: Shape, rsj: Shape): ContactEquation; + getContacts(p1: Body[], p2: Body[], world: World, result: ContactEquation[], oldcontacts: ContactEquation[]): void; + particlePlane( result: ContactEquation[], si: Shape, sj: Shape, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body): void; + particleSphere(result: ContactEquation[], si: Shape, sj: Shape, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body): void; + planeBox(result: ContactEquation[], si: Shape, sj: Shape, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body): void; + planeConvex(si: Shape, sj: Shape, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body): void; + planeTrimesh(si: Shape, sj: Shape, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body): void; + sphereBox(si: Shape, sj: Shape, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body): void; + sphereConvex(si: Shape, sj: Shape, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body): void; + sphereHeightfield(sphereShape: Shape, hfShape: Heightfield, spherePos: Vec3, hfPos: Vec3, sphereQuat: Quaternion, hfQuat: Quaternion, sphereBody: Body, hfBody: Body): void; + spherePlane( si: Shape, sj: Shape, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body): void; + sphereSphere(si: Shape, sj: Shape, xi: Vec3, xj: Vec3, qi: Quaternion, qj: Quaternion, bi: Body, bj: Body): void; + sphereTrimesh(sphereShape: Shape, trimeshShape: Shape, spherePos: Vec3, trimeshPos: Vec3, sphereQuat: Quaternion, trimeshQuat: Quaternion, sphereBody: Body, trimeshBody: Body): void; + + } + + export interface IOctreeOptions { + + root: Octree; + aabb: AABB; + + } + + export class OctreeNode { + + aabb: AABB; + children: Octree[]; + data: number[]; + root: OctreeNode; + + } + + export class Octree extends OctreeNode { + + maxDepth: number; + + constructor(aabb: AABB, options: IOctreeOptions); + + aabbQuery(aabb: AABB, result: Object[]): Object[]; + insert(aabb: AABB, elementData: Object): boolean; + rayQuery(ray: Ray, treeTransform: Transform, result: Object[]): Object[]; + removeEmptyNodes(): void; + subdivide(): void; + + } + + export interface IWorld { + + collisisonFilterMask?: number; + collisionFilterGroup?: number; + skipBackfaces?: boolean; + checkCollisionResponse?: boolean; + + } + + export class World extends EventTarget { + + dt: number; + allowSleep: boolean; + contacts: ContactEquation[]; + frictionEquations: FrictionEquation[]; + quatNormalizeSkip: number; + quatNormalizeFast: boolean; + time: number; + stepnumber: number; + default_dt: number; + nextId: number; + gravity: Vec3; + broadphase: NaiveBroadphase; + bodies: Body[]; + //miner + allContacts:ContactEquation[]; + callBackBody:Body[]; + solver: Solver; + constraints: Constraint[]; + narrowPhase: NarrowPhase; + collisionMatrix: ArrayCollisionMatrix; + collisionMatrixPrevious: ArrayCollisionMatrix; + materials: Material[]; + contactMaterials: ContactMaterial[]; + contactMaterialTable: TupleDictionary; + defaultMaterial: Material; + defaultContactMaterial: ContactMaterial; + doProfiling: boolean; + profile: { + solve: number; + makeContactConstraints: number; + broadphaser: number; + integrate: number; + narrowphase: number; + }; + subsystems: any[]; + addBodyEvent: IBodyEvent; + removeBodyEvent: IBodyEvent; + + addBody(body: Body): void; + addConstraint(c: Constraint): void; + addContactMaterial(cmat: ContactMaterial): void; + addEventListener(type: string, listener: Function): EventTarget; + addMaterial(m: Material): void; + clearForces(): void; + collisionMatrixTick(): void; + getContactMaterial(m1: Material, m2: Material): ContactMaterial; + numObjects(): number; + raycastAll(from: Vec3, to: Vec3, options: IWorld, callback: Function): boolean; + raycastAny(from: Vec3, to: Vec3, options: IWorld, result: RaycastResult): boolean; + raycastClosest(from: Vec3, to: Vec3, options: IWorld, result: RaycastResult): boolean; + rayTest(from: Vec3, to: Vec3, result: RaycastResult): void; + remove(body: Body): void; + removeBody(body: Body): void; + removeConstraint(c: Constraint): void; + removeEventListener(type: string, listener: Function): EventTarget; + step(dy: number, timeSinceLastCalled?: number, maxSubSteps?: number): void; + + } + + export interface IEvent { + + type: string; + + } + + export interface IBodyEvent extends IEvent { + + body: Body; + + } + + export class Demo { + + constructor( options: Object ); + + addScene( title: string, initfunc: Function ): void; + restartCurrentScene(): void; + + } + +} \ No newline at end of file diff --git a/shudu/engine/types/editor-client.d.ts b/shudu/engine/types/editor-client.d.ts new file mode 100644 index 0000000..62bdc26 --- /dev/null +++ b/shudu/engine/types/editor-client.d.ts @@ -0,0 +1,295 @@ +export { }; +declare global { + export namespace IEditorClient { + export const ShaderTypePrefix = "Shader."; + export type DefaultValueComparator = (value: any) => boolean; + + export const TypedArrayClasses: Record = { + "Int8Array": Int8Array, + "Uint8Array": Uint8Array, + "Int16Array": Int16Array, + "Uint16Array": Uint16Array, + "Int32Array": Int32Array, + "Uint32Array": Uint32Array, + "Float32Array": Float32Array + }; + + export type TypeMenuItem = { type: FTypeDescriptor, label: string, icon: string }; + + export interface ITypeRegistry { + readonly types: Readonly>; + readonly scriptNameToID: Readonly>; + + nodeTypeName: string; + componentTypeName: string; + + setAllTypes(types: Record): void; + + isDerivedOf(type: string, baseType: string): boolean; + isNodeType(type: string): boolean; + getNodeBaseType(type: string): string; + getRequireComponents(nodeType: string): Array; + + getAllPropsOfType(type: FTypeDescriptor): Readonly>; + getInitProps(typeDef: FTypeDescriptor): any; + getDefaultValue(typeDef: FTypeDescriptor, includePrivate?: boolean): any; + getPropDefaultValue(prop: FPropertyDescriptor): any; + getDefaultValueComparators(typeDef: FTypeDescriptor): Readonly>; + } + + export enum IPCKey { + CreateNode = 'CreateNode', + InstantiatePrefab = 'InstantiatePrefab', + DestroyNode = 'DestroyNode', + NodeChanged = 'NodeChanged', + NodeFeaturesChanged = 'NodeStatusChanged', + GetNodeChildren = 'GetNodeChildren', + GetNode = 'GetNode', + SyncNodeProps = 'SyncNodeProps', + NodeChildrenChanged = 'NodeChildrenChanged', + ResetNodeChildren = 'ResetNodeChildren', + SelectionChanged = 'SelectionChanged', + AddComponent = 'AddComponent', + ReloadTypes = 'ReloadComponentTypes', + RunScript = "RunScript", + + CopyNodes = 'CopyNodes', + PasteNodes = 'PasteNodes', + DuplicateNodes = 'DuplicateNodes', + CreatePrefab = 'CreatePrefab', + FindNodes = 'FindNodes', + + GetResourceProps = "GetResourceProps", + ResourceChanged = "ResourceChanged", + + SendMessageToPanel = 'SendMessageToPanel', + PostMessageToPanel = 'PostMessageToPanel', + } + export interface IMyScene { + readonly allNodes: Map>; + readonly allResources: Map>; + + start(): Promise; + + getNodeById(id: string): IMyNode; + registerNode(node: IMyNode): void; + findNodes(keyword: string, maxResults?: number): Promise>; + setProps(obj: IMyNode | IMyComponent, datapath: ReadonlyArray, value: any): Promise; + setResProps(obj: any, datapath: ReadonlyArray, value: any): Promise; + getProps(obj: any): any; + + sendChildChanged(node: IMyNode): void; + sendNameChanged(node: IMyNode, newName: string): void; + sendFeaturesChanged(node: IMyNode): void; + } + export enum NodeFeatures { + HasChild = 1, + RootNode = 2, + Inactive = 4, + InPrefab = 8, + IsPrefab = 16, + IsPrefabNewAdded = 32, + IsTopPrefab = 64, + IsPrefabReadonly = 128, + HideByEditor = 1024, + LockByEditor = 2048, + PrefabMissing = 4096, + } + + export interface IMyNodeExtra { + id?: string; + type?: string; + selected?: boolean; + scene?: IMyScene; + } + + export interface IMyNode { + hideFlags: number; + name: string; + readonly parent: IMyNode; + readonly destroyed: boolean; + readonly numChildren: number; + + getChildAt(index: number): IMyNode; + isAncestorOf(node: IMyNode): boolean; + hasHideFlag(flag: number): boolean; + + _setBit(type: number, value: boolean): void; + _getBit(type: number): boolean; + + _extra: IMyNodeExtra; + } + + export interface IMyComponent { + readonly owner: IMyNode; + hideFlags: number; + enabled: boolean; + } + export namespace MyMessagePortStatic { + /** + * It is used inside the webview or iframe to create a communication channel with the host. + * @param queueTask Whether to queue the task. If true, the received messages will be queued and processed sequentially. Defaults to false. + * @returns The message port. + */ + function requestFromHost(queueTask?: boolean): Promise; + + /** + * Connect to a named service. + * @param serviceName Service name. + * @param subscribe Whether to receive broadcast messages from the service. Defaults to false. + * @param args Arguments to pass to the service. + * @returns The message port. + */ + function connectService(serviceName: string, subscribe?: boolean, ...args: any[]): IMyMessagePort; + } + + export interface IMyMessagePort { + /** + * A delegate that is called when the port is closed. + */ + readonly onClose: IDelegate<() => void>; + + /** + * Whether to log an error to the console when a received message does not have a corresponding handler function. + */ + logHandlerMissing: boolean; + + /** + * Start the message port. + * + * This function only needs to be called when manually constructing a MyMessagePort object. In other cases, such as the object returned by connectService, it does not need to be called. + */ + start(): void; + + /** + * Close the message port. + */ + close(): void; + + /** + * Register a handler function for a channel. + * @param channel Channel name. + * @param func Handler function. + * @param thisArg The this object to bind the handler function to. + * @param noAwait If true, the handler function will not be awaited. Defaults to false. + */ + handle(channel: string, func: (...args: any[]) => Promise | any, thisArg?: any, noAwait?: boolean): void; + + /** + * Send a message to the other side. + * @param channel Channel name. + * @param args Arguments. + */ + send(channel: string, ...args: any[]): void; + + /** + * Send a message to the other side and transfer some Transferable objects. + * @param channel Channel name. + * @param transfer Transferable objects. + * @param args Arguments. + */ + transfer(channel: string, transfer: Transferable[], ...args: any[]): void; + + /** + * Send a message to the other side and expect a response. + * @param channel Channel name. + * @param args Arguments. + * @returns The response. + */ + invoke(channel: string, ...args: any[]): Promise; + + /** + * Manually call a handler function. + * @param channel Channel name. + * @param args Arguments. + * @returns The response. + */ + callHandler(channel: string, ...args: any[]): Promise; + } + export interface IEditorClientSingleton { + readonly port: IMyMessagePort; + readonly scene: IMyScene; + readonly typeRegistry: ITypeRegistry; + + addStartCallback(callback: () => void | Promise): void; + + sendMessageToPanel(panelId: string, cmd: string, ...args: Array): Promise; + postMessageToPanel(panelId: string, cmd: string, ...args: Array): Promise; + runUIScript(command: string, ...args: any[]): Promise; + } + /** + * A delegate that can be used to manage multiple callbacks. + */ + export interface IDelegate any> { + /** + * By default, callbacks will be executed directly. Unless this property is set, the delegate will use this method to execute the callback. + * @param method The method to execute. + * @param thisArg The this argument of the method. + * @param args The arguments of the method. + */ + executor: (method: Function, thisArg: any, ...args: any[]) => void; + + /** + * Add a callback. + * @param callback The callback to add. + * @param target The this argument of the callback. + */ + add(callback: T, target?: any): void; + + /** + * Add a run-once callback. + * @param callback The callback to add. + * @param target The this argument of the callback. + */ + once(callback: T, target?: any): void; + + /** + * Remove a callback. + * @param callback The callback to remove. + * @param target The this argument of the callback. + */ + remove(callback: T, target?: any): void; + + /** + * Clear all callbacks. + */ + clear(): void; + + /** + * Clear callbacks for a specific target. + * @param target The this argument of the callbacks to clear. + */ + clearForTarget(target: any): void; + + /** + * Clear callbacks that meet a specific condition. + * @param test The test function. Return true to clear the callback. + */ + clearFor(test: (target: any, callback: T) => boolean): void; + + /** + * Count of the callbacks. + */ + readonly count: number; + + /** + * Execute the callbacks immediately. + * @param args Arguments of the callbacks. + */ + invoke(...args: Parameters): void; + } + + /** + * The `MyMessagePort` class is used to create a message port object. + * + * A message port is a communication channel that allows two different processes to communicate with each other. + * @param port The native message port. + * @param queueTask Whether to queue the task. If true, the received messages will be queued and processed sequentially. Defaults to false. + * @see IMyMessagePort + * @see MyMessagePortStatic + */ + const MyMessagePort: (new (port: MessagePort, queueTask?: boolean) => IMyMessagePort) & typeof MyMessagePortStatic; + } + + var EditorClient: IEditorClient.IEditorClientSingleton; +} diff --git a/shudu/engine/types/editor-env.d.ts b/shudu/engine/types/editor-env.d.ts new file mode 100644 index 0000000..85ae0ef --- /dev/null +++ b/shudu/engine/types/editor-env.d.ts @@ -0,0 +1,8903 @@ +export { }; +declare global { + /** + * Namespaces containing various scene-related classes and functions. + * + * All classes and functions in this namespace are running in the Scene process. + */ + export namespace IEditorEnv { + export interface ITypedDataAnalyzer { + analyse(data: any, typeDef: FTypeDescriptor): Array; + } + export interface ITextureToolOptions { + /** + * Abort token. If you want to abort the tool on some conditions, you can pass an abort token here. Call abortToken.signal() to abort the tool. + */ + abortToken?: IAbortToken; + + /** + * If provided, the tool will use this path as the temporary directory, Otherwise, it will create a temporary directory. + */ + tempPath?: string; + + /** + * Progress callback. The progress value is between 0 and 100. + */ + progressCallback?: (progress: number) => void; + } + + export interface ITextureFileWithFormat { + /** + * File name without extension. It could be an empty string, indicating the use of the source file. + */ + file: string; + + /** + * File extension. e.g. "ktx". + */ + ext: string; + + /** + * A Laya.TextureFormat enum value. e.g. 0-R8G8B8, 1-R8G8B8A8, etc. + */ + format: Laya.TextureFormat; + } + + export interface ITexturePlatformSettings { + /** + * Texture format. e.g. "R8G8B8", "R8G8B8A8", etc. + */ + format?: string; + + /** + * Quality of the compressed texture. 0: low, 1: normal, 2: high. + */ + quality?: number; + } + + export interface ITextureSettings { + /** + * 0: default, 1: lightmap, 2: sprite texture + */ + textureType?: number; + /** + * 0-2D, 1-Cube + */ + textureShape?: number; + + /** + * Whether the texture stores data in sRGB (also called gamma) color space. + */ + sRGB?: boolean; + + /** + * + */ + alphaChannel?: boolean; + + /** + * If true, mipmaps will be generated. The purpose of mipmaps is to create a series of texture versions with different resolutions. + * This allows for the selection of an appropriate texture to sample based on the size of the object on the screen during the rendering process. It effectively improves rendering efficiency, reduces computational overhead, and eliminates visual artifacts such as aliasing and blurring, thereby enhancing the visual quality of the rendering. + * However, it should be noted that generating mipmaps will increase the memory usage. + */ + generateMipmap?: boolean; + + /** + * Mipmaps can appear faded or blurred at lower levels. + * It is generally not enabled by default, but it can be useful in cases where there is significant fog or mist to avoid visual artifacts. + * However, in most scenarios, it is recommended to keep mipmaps disabled to maintain the visual quality of the textures without any fading or blurring effects. + */ + fadeOutEnable?: boolean; + + /** + * Anisotropic filtering level. Range is 1-16. Default is 4. + */ + anisoLevel?: number; + + /** + * In the context of pre-multiplied alpha, the term \"Alpha\" refers to the alpha channel of an image or texture, which typically represents the opacity or transparency information. It is used to pre-multiply the color channels with the alpha channel before blending. This means that each color channel is multiplied by the value of the alpha channel before the blending operation takes place. + */ + premultiplyAlpha?: boolean; + + /** + * 0: repeat, 1: clamp, 2: mirrored + */ + wrapMode?: number; + + /** + * 0: nearest, 1: linear, 2: cubic + */ + filterMode?: number; + + /** + * Enable this option will make doubles the amount of memory required for the Texture. + * This property is therefore disabled by default, and you should enable it only if you require script access. + */ + readWrite?: boolean; + + /** + * + */ + hdrEncodeFormat?: number; + + /** + * It divides the image into nine regions, where four corners and four edges remain unstretched, while the middle region stretches as needed to fill the target size. + * This ensures that image elements remain clear and consistent across screens of different sizes. + * (Format: Top margin, Right margin, Bottom margin, Left margin, Repeat filling (Value 0: No repeat fill, 1: Repeat fill))" + * + * @example + * [10, 10, 10, 10, 1] + */ + sizeGrid?: Array; + + /** + * The number of states for button texture skins, supporting monostate, bistate, and tristate buttons. Bistate divides the skin evenly into two parts, while tristate divides the skin evenly into three parts. + */ + stateNum?: number; + + /** + * 0: none, 1: x, 2: y + */ + flip?: number; + + /** + * 0: none, 1: left, 2: right + */ + rotate?: number; + + /** + * Texture non-quadratic power scaling behavior. + * + * 0: none, 1: nearest, 2: larger, 3: smaller + */ + npot?: number; + + /** + * + */ + mipmapCoverageIBL?: boolean; + + /** + * + */ + cubemapSize?: number; + + /** + * + */ + cubemapFileMode?: string; + + /** + * + */ + fadeOutMipmap?: { x: number, y: number }; + + /** + * + */ + mipmapFilter?: number; + + /** + * + */ + extendFilter?: number; + + /** + * Default platform settings. + */ + platformDefault?: { + /** + * 0: RGBA 1: RGB 10:CompressedFormat + * + */ + format?: number, + /** + * Quality of the compressed texture. 0: low, 1: normal, 2: high. + */ + quality?: number + }; + + /** + * PC platform settings. + */ + platformPC?: ITexturePlatformSettings; + + /** + * Android platform settings. + */ + platformAndroid?: ITexturePlatformSettings; + + /** + * iOS platform settings. + */ + platformIOS?: ITexturePlatformSettings; + } + + export interface ITextureConfig { + /** + * 0-default, 1-lightmap, 2-sprite + */ + type: number; + + /** + * Whether the texture stores data in sRGB (also called gamma) color space. + */ + sRGB: boolean; + + /** + * 0: default, 1: cube + */ + shape?: number; + + /** + * 0: repeat, 1: clamp, 2: mirrored + */ + wrapMode: number; + + /** + * 0: nearest, 1: linear, 2: cubic + */ + filterMode: number; + + /** + * Anisotropic filtering level. Range is 1-16. + */ + anisoLevel: number; + + /** + * Enable this option will make doubles the amount of memory required for the Texture. + * This property is therefore disabled by default, and you should enable it only if you require script access. + */ + readWrite: boolean; + + /** + * If true, mipmaps will be generated. The purpose of mipmaps is to create a series of texture versions with different resolutions. + * This allows for the selection of an appropriate texture to sample based on the size of the object on the screen during the rendering process. It effectively improves rendering efficiency, reduces computational overhead, and eliminates visual artifacts such as aliasing and blurring, thereby enhancing the visual quality of the rendering. + * However, it should be noted that generating mipmaps will increase the memory usage. + */ + mipmap: boolean; + + /** + * Premultiply alpha. + */ + pma: boolean; + + /** + * + */ + hdrEncodeFormat: number; + + /** + * It divides the image into nine regions, where four corners and four edges remain unstretched, while the middle region stretches as needed to fill the target size. + * This ensures that image elements remain clear and consistent across screens of different sizes. + * (Format: Top margin, Right margin, Bottom margin, Left margin, Repeat filling (Value 0: No repeat fill, 1: Repeat fill))" + * + * @example + * [10, 10, 10, 10, 1] + */ + sizeGrid?: number[]; + + /** + * The number of states for button texture skins, supporting monostate, bistate, and tristate buttons. Bistate divides the skin evenly into two parts, while tristate divides the skin evenly into three parts. + */ + stateNum?: number; + + /** + * A platform name to file index mapping. The file index is the index of the file in the files array. + */ + platforms: Record; + + /** + * All files. + */ + files: Array; + } + + export namespace ITextureTool { + /** + * Process the texture file with the specified settings. + * @param srcFilePath The source file path. It is an absolute path. + * @param destFilePrefix The destination file prefix. The tool will generate multiple files base on this prefix. + * @param config The texture settings. + * @param options The tool options. + * @returns The texture config. + */ + function run(srcFilePath: string, destFilePrefix: string, config: ITextureSettings, options?: ITextureToolOptions): Promise; + } + export interface ITexturePackerOptions extends IMaxRectsPackingOptions { + /** + * Whether to trim the blank area of the image. + */ + trimImage?: boolean; + + /** + * Scale of the image. + */ + scale?: number; + } + + export interface IAtlasFrame { + frame: { + idx: number; + x: number; + y: number; + w: number; + h: number; + }, + sourceSize: { + w: number; + h: number; + }, + spriteSourceSize: { + x: number, + y: number + } + } + + export interface ITexturePackerResult { + /** + * All the frames in the atlas. + */ + frames: Record; + + /** + * All the atlas images. + */ + images: Array<{ name: string, width: number, height: number }>; + } + + export namespace ITexturePacker { + /** + * Generate a texture atlas from the source files. + * @param sourceFiles Image files to pack. They are absolute paths. + * @param outTexturePath The path of the output texture. It is a absolute path. + * @param options Packing options. + * @returns The result of the packing. + */ + function pack(sourceFiles: string[], outTexturePath: string, options?: ITexturePackerOptions): Promise; + } + export interface IEncodeObjOptions { + /** + * Write "_$type" field in the object. Default is true. + */ + writeType?: boolean, + + /** + * Whether to eliminate default values. If a property on the object has the same value as the default value in the data type, that property will not be included in the returned data. + * Default is true. + */ + eliminateDefaults?: boolean, + + /** + * Callback function to get the id path of the node. + */ + getNodeRef?: (node: Laya.Node) => string | string[], + + /** + * Force the use of this type for object serialization. + */ + forceType?: string; + } + + export interface IDecodeObjOptions { + /** + * An array to receive the errors during deserialization. + */ + outErrors?: Array; + + /** + * Validate the type of the deserialized object strictly. Default is false. + * + * A debug message will be output to console if the type of a property is not matched. + */ + strictTypeCheck?: boolean; + + /** + * Callback function to get the node by id path. + */ + getNodeByRef?: (id: string | string[]) => Laya.Node; + + /** + * Callback function to get the data of the node. + */ + getNodeData?: (node: Laya.Node) => any; + } + + export namespace ISerializeUtil { + /** + * Whether deserialization is in progress. + */ + const isDeserializing: boolean; + + /** + * Serialize an object to a plain object. + * @param data Object to serialize. + * @param typeDef Type descriptor of the object. + * @param options Serialization options. + * @returns The serialized object. + */ + function encodeObj(obj: any, receiver?: any, options?: IEncodeObjOptions): any; + + /** + * Serialize a property to a plain object. + * @param prop Property descriptor. + * @param obj Object that contains the property. + * @param options Serialization options. + * @returns The serialized object. + */ + function encodeProperty(prop: FPropertyDescriptor, obj: any, options?: IEncodeObjOptions): any; + + /** + * Deserialize a plain object to an object. + * @param data Plain object to deserialize. + * @param receiver Use this instance as the result object. If null, a new object will be created. + * @param type Type of the object. + * @param options Deserialization options. + * @returns The deserialized object. + */ + function decodeObj(data: any, receiver?: any, type?: string, options?: IDecodeObjOptions): any; + } + export interface IScriptTool { + /** + * Compress a javascript file. Compressed result is cached for future use. Cache path is library/minifiedJsCache. + * @param filePath The path of the file to compress. + * @param mangleOptions The options for mangling. + * - keep_fnames: Keep the function names. + * - keep_classnames: Keep the class names. + */ + minifyJsFile(filePath: string, mangleOptions?: { keep_fnames?: boolean, keep_classnames?: boolean }): Promise; + + /** + * Transform a javascript to conform the ES5 standard. Transformed result is cached for future use. Cache path is library/babelCache. + * @param filePath The path of the file to transform. + * @param presets The presets to use. Default is "@babel/preset-env". + */ + babelTransform(filePath: string, presets?: string): Promise; + } + export interface ISceneManager { + /** + * Triggered when the selection is changed. + */ + readonly onSelectionChanged: IDelegate<() => void>; + + /** + * Triggered when the scene is activated. + * @param currentScene The current scene. + * @param previousScene The previous scene. + */ + readonly onSceneActivated: IDelegate<(currentScene: IMyScene, previousScene: IMyScene) => void>; + + /** + * Current active scene. + */ + activeScene: IMyScene; + + /** + * All scenes. + */ + readonly scenes: ReadonlyArray; + + /** + * Execute a function by name. The name is in the form of "className.staticMethodName". + * A className must be registered with @IEditorEnv.regClass. + * @param scene The this object. + * @param name objectName.methodName + * @param args The arguments. + * @returns The function found. Null if not found. + * @example + * ``` + * @IEditorEnv.regClass + * class MyTest { + * static sayHello() { + * console.log("Hello"); + * } + * } + * + * const func = EditorEnv.scene.runScript("MyTest.sayHello"); + * func(); // Output: Hello + * ``` + */ + runSceneScript(scene: IMyScene, name: string, ...args: any[]): Promise; + } + export interface ISceneHook { + /** + * Called when a new node is about to be created. + * @param scene The scene where the node is created. + * @param node The new node instance. + */ + onCreateNode?(scene: IMyScene, node: Laya.Node): void | Promise; + + /** + * Called when a new widget is about to be created. + * @param scene The scene where the widget is created. + * @param widget The new widget instance. + */ + onCreateWidget?(scene: IMyScene, widget: gui.Widget): void | Promise; + + /** + * Called when a new component is about to be created. + * @param scene The scene where the component is created. + * @param comp The new component instance. + */ + onCreateComponent?(scene: IMyScene, comp: Laya.Component): void | Promise; + + /** + * Called when a scene is about to be saved. + * @param scene The scene to be saved. + * @param data The data to be saved. + */ + onSaveScene?(scene: IMyScene, data: any): void | Promise; + + /** + * Called when a scene is loaded. + * @param scene The scene to be loaded. + */ + onLoadScene?(scene: IMyScene): void | Promise; + + /** + * Called when a scene is about to write runtime code. + * @param scene The scene. + * @param info The information of the runtime code. + */ + onWriteRuntime?(scene: IMyScene, info: IWriteRuntimeInfo): void | Promise; + } + + export interface IWriteRuntimeInfo { + /** + * The generated code. You can replace it with your own code, or set it to null to skip the generation. + */ + code: string; + + /** + * The runtime script asset. + */ + readonly scriptAsset: IAssetInfo; + + /** + * The import statements. + */ + readonly imports: string[]; + + /** + * The class name. + */ + readonly className: string; + + /** + * The super class name. + */ + readonly superClassName: string; + + /** + * The variable declaration statements. + */ + readonly vars: string[]; + } + + export interface IResourceManager { + /** + * Save all resources. + */ + saveResources(): Promise; + + /** + * All dirty resources. + */ + readonly dirtyResources: Set; + + /** + * Set the value of the specified property. + * @param obj The resource object. + * @param datapath The data path. + * @param value The value to set. + * @returns Returns true if the value is set, otherwise returns false. + */ + setProps(obj: any, datapath: string[], value: any): Promise; + + /** + * Get a plain object that contains all properties of the specified object. + */ + getProps(obj: any): any; + } + export interface IPrefabI18nString { + /** + * Object that contains the property. + */ + obj: any; + + /** + * The property name. + */ + prop: string; + + /** + * The value of the property. + */ + text: string; + } + + export interface IPrefabAnalyseOptions { + /** + * Whether to get the dependencies. + */ + getDeps?: boolean; + + /** + * Whether to get the i18n strings. + */ + getI18nStrings?: boolean; + + /** + * To clear the unused data of the prefab in release mode. + */ + minify?: boolean; + + /** + * A callback function that will be called when visiting an entity. + * @param data Entity data. + * @param typeDef The type definition of the entity. + * @param isOverrideEntry Whether the entity is an override entry. + */ + entityVisitor?: (data: any, typeDef: FTypeDescriptor, isOverrideEntry: boolean) => void; + + /** + * A callback function that will be called when visiting an error entity. + * @param data Entity data. + * @param error The error code. + * @param isComponent Whether the entity is a component. + * @param isOverrideEntry Whether the entity is an override entry. + */ + errorEntityVisitor?: (data: any, error: PrefabEntityErrorCode, isComponent: boolean, isOverrideEntry: boolean) => void; + } + + export enum PrefabEntityErrorCode { + /** + * The type is missing. + */ + TypeMissing = 0, + + /** + * The entity points to a prefab, but the prefab is missing. + */ + ResourceMissing = 1, + + /** + * The entity is an override entry, but the target specified by the override is missing. + */ + OverrideTargetMissing = 2 + } + + export interface IPrefabAnalyseResult { + /** + * Dependencies. + */ + deps: Array | (ProvidedOptions['getDeps'] extends false ? never : undefined); + + /** + * I18n strings. + */ + i18nStrings: Array | (ProvidedOptions['getI18nStrings'] extends false ? never : undefined); + } + + export interface IPrefabDataAnalyzer { + /** + * Analyse the prefab data. + * @param asset The asset to be analysed. + * @param options The options. + * @returns The analysis result. + */ + analyse(asset: IAssetInfo, options: T): Promise>; + + /** + * Analyse the raw data which is in lh format. + * @param sourceData The raw data. + * @param isWidget Whether the raw data is widget format. + * @param options The options. + * @returns The analysis result. + */ + analyseRaw(sourceData: any, isWidget: boolean, options: T): Promise>; + + /** + * Get the raw data of an prefab asset. + */ + getContent(asset: IAssetInfo): Promise; + + /** + * Get the node map of an prefab asset. + */ + getNodeMap(asset: IAssetInfo): Promise>; + + } + export interface IOffscreenRenderSubmit { + /** + * This is the target for offscreen rendering, point to a existing sprite or a scene3D. + * + * If it is null, the rendering result is empty. + */ + readonly renderTarget: Laya.Sprite; + + /** + * The background color of the preview. + */ + readonly bgColor: Laya.Color; + + /** + * Called before rendering. + */ + onPreRender(): void; + + /** + * Called after rendering. + */ + onPostRender(): void; + } + + export interface IOffscreenRenderer { + /** + * Width of the rendertexture. + */ + readonly width: number; + + /** + * Height of the rendertexture. + */ + readonly height: number; + + /** + * Triggered when the rendering is completed. + * @param target The target passed in the submit method. + * @param bitmap The rendering result. + * @param contentWidth The width of the bitmap. + * @param contentHeight THhe height of the bitmap. + */ + onComplete: (target: IOffscreenRenderSubmit, bitmap: ImageBitmap, contentWidth: number, contentHeight: number) => void; + + /** + * Submit a rendering target. The rendering result will be returned by the onComplete event. + * @param target The target to be rendered. + */ + submit(target: IOffscreenRenderSubmit): void; + + /** + * Submit a rendering target, wait for the rendering to complete, and return the rendering result. + * @param target The target to be rendered. + * @returns The rendering result. + * - bitmap: The rendering result. + * - contentWidth: The width of the bitmap. + * - contentHeight: The height of the bitmap. + */ + draw(target: IOffscreenRenderSubmit): Promise<{ bitmap: ImageBitmap, contentWidth: number, contentHeight: number }>; + + /** + * Destroy the renderer. + */ + destroy(): void; + } + + export interface IOffscreenRenderScene { + /** + * Scene3D object. + */ + readonly scene3D: Laya.Scene3D; + + /** + * Camera object. + */ + readonly camera: Laya.Camera; + + /** + * Light object. + */ + readonly light: Laya.Sprite3D; + + /** + * Plane object. + */ + readonly plane: Laya.Sprite3D; + + /** + * A sphere. + */ + readonly obj: Laya.Sprite3D; + + /** + * A sprite3D object mainly used to hold the user's model. + */ + readonly holder: Laya.Sprite3D; + + /** + * Helper object for camera control. + */ + readonly cameraControls: ICameraControls; + + /** + * Focus distance ratio. Default is 1.3. + */ + focusDistanceRatio: number; + + /** + * Destroy the scene. + */ + destroy(): void; + + /** + * Reset the camera transform. + */ + resetCameraTransform(): void; + + /** + * Set focus to the holder object. + */ + focusNode(): void; + + /** + * Set sky material. + */ + setSkyMaterial(mat: Laya.Material): void; + + /** + * Rotate the camera. + * @param x X axis movement. + * @param y Y axis movement. + */ + rotate(x: number, y: number): void; + + /** + * Change the mesh by shape name of the 'obj' object. + * @param shape The shape to be changed to. Such as "Box", "Sphere", "Cylinder", "Capsule", "Cone", "Plane". + */ + changeShape(shape: string): Promise; + } + export interface IObjectPool { + /** + * Get an object from the pool. + * @param className The class name. + * @returns Returns the object. + */ + getObject(className: string): any; + + /** + * Return an object to the pool. + * @param obj The object. + */ + returnObject(obj: any): void; + + /** + * Destroy the pool. + */ + destroy(): void; + } + export interface INavigationManager { + readonly allGizmos: Array; + readonly isMouseDown: boolean; + readonly scroller: gui.IScroller; + hideGizmos: boolean; + viewScale: number; + mode2d: boolean; + + changeToolType(toolType: SceneNavToolType, notifyHost?: boolean, isTemp?: boolean): void; + focusNode(node: IMyNode): void; + } + export type SceneNavToolType = "move" | "orbit" | "orbit_focus" | "zoom" | "obj_move" | "obj_rotate" | "obj_scale" | "obj_transform"; + + export interface ICreateNodeOptions { + /** + * When creating a node, a reasonable position will be set for the node if this option is true. Default is true. + */ + setDefaultPos?: boolean; + + /** + * When creating a node, name conflict will be resolved if this option is true. Default is true. + */ + fixDupName?: boolean; + } + + export interface IMyScene extends gui.EventDispatcher { + /** + * A internal unique id of the scene. + */ + readonly id: string; + + /** + * The asset of the scene. It may be null if the scene is new and not saved. + */ + readonly asset: IAssetInfo; + + /** + * Communication port to the UI process. + */ + readonly port: IMyMessagePort; + + /** + * All nodes in the scene. The key is the id of the node. + */ + readonly allNodes: Map>; + + /** + * The selection of the scene. + */ + readonly selection: ReadonlyArray; + + /** + * The top level selection of the scene. + * This is a subset of the selection, containing only top-level nodes. For example, if the selection contains nodes A and B, and node A is the parent of node B, then the topLevelSelection will only contain node A. + */ + readonly topLevelSelection: ReadonlyArray; + + /** + * Whether the scene is modified. + */ + readonly modified: boolean; + + /** + * Whether the scene is in read-only mode. + */ + readonly viewerMode: boolean; + + /** + * Whether the scene is loading. + */ + readonly loading: boolean; + + /** + * Scene2D node. + */ + readonly rootNode2D: IMyNode; + + /** + * Scene3D node. May be null if the scene is a 2D scene. + */ + readonly rootNode3D: IMyNode; + + /** + * Prefab root node. May be null if the scene is not a prefab editing scene. + */ + readonly prefabRootNode: IMyNode; + + /** + * The world type of the scene. + * - 2d: 2D prefab editing scene. + * - 3d: 3D prefab editing scene. + * - null: Common scene. 2D and 3D nodes can be mixed. + * - gui: GUI scene. + */ + readonly worldType: WorldType; + + /** + * Scene status is used to store temporary data about the scene. + */ + readonly status: IConfigObject; + + /** + * Opened boxes in sequence. + */ + readonly openedBoxChain: ReadonlyArray; + + /** + * The last box in the openedBoxChain. Null if no box is opened. + */ + readonly openedBox: IMyNode; + + /** + * Open a box. Only available for box-like sprites, such as Box, Panel, List, etc. + * + * A box-like sprite is a sprite which children are not selectable in the stage only after it is double-clicked to open. + * @param box The box-like sprite to open. + */ + openBox(box: IMyNode): void; + + /** + * Close the opened box. + */ + closeBox(): void; + + /** + * Find the box that contains the specified node. + * @param node The node to find. + * @returns The box that contains the node. Null if the node is not in any box. + */ + findBox(node: IMyNode): IMyNode; + + /** + * Check if a node is a box. + * @param node The node to check. + */ + isBox(node: IMyNode): boolean; + + /** + * Serialize the nodes to a data object. + * @param nodes The nodes to serialize. + */ + serializeNodes(nodes: ReadonlyArray): any; + + /** + * Deserialize the data to nodes. + * @param data The data to deserialize. + * @param keepStoreId Whether to keep the node id from the data. Default is true. If false, new ids will be generated for the nodes. + * @returns The deserialized nodes. + */ + deserializeNodes(data: any, keepStoreId?: boolean): Promise>; + + /** + * Reload the nodes with the specified data. + * @param nodes Nodes to reload. + * @param datas Data for the nodes. + * @param outErrors An array to receive the errors. If not provided, errors will be printed to the console. + */ + reloadNodes(nodes: ReadonlyArray, datas: ReadonlyArray, outErrors?: Array): Promise; + + /** + * Run these tests to validate the scene: + * - Check if the file is outdated. + * - Check all prefabs to see if they are outdated. + */ + validateScene(): void; + + /** + * Set the scene to modified status. + */ + setModified(): void; + + /** + * Add a node to the selection. + * @param target The node to add. + * @param ctrlKey If this operation is triggered by pressing the Ctrl key. If true, the node will be toggled in the selection. + */ + addSelection(target: IMyNode, ctrlKey?: boolean): void; + + /** + * Set the selection to the specified nodes. + * @param nodes The nodes to set as the selection. + */ + setSelection(nodes: ReadonlyArray): void; + + /** + * Remove a node from the selection. + * @param node The node to remove. + */ + removeSelection(node: IMyNode): void; + + /** + * Clear the selection. + */ + clearSelection(): void; + + /** + * Whether any 3D node is selected. + */ + readonly has3DSelection: boolean; + + /** + * Get a node by id. + * @param id The id of the node. + * @returns The node. Null if not found. + */ + getNodeById(id: string): IMyNode; + /** + * Find nodes by keyword. + * @param keyword Keyword to search. + * @param maxResults The maximum number of results. Default is 200. + * @returns An array where each element contains the node's id, type, name, and features, followed by the next node's information. + */ + findNodes(keyword: string, maxResults?: number): Array; + + /** + * Add a node to the scene. + * @param parentNode The parent node. + * @param node The node to add. + * @param index The index to insert the node. If not provided, the node will be added to the end. + */ + addNode(parentNode: IMyNode, node: IMyNode, index?: number): void; + + /** + * Remove a node from its parent. + * @param node The node to remove. + */ + removeNode(node: IMyNode): void; + + /** + * Instantiate a prefab. Note that the new created node will not be added to the scene in this method. + * @param assetId The id of the prefab asset. + * @param nodeProps The properties of the node. + * @param parentNode The parent node. + * @param options Options for creating the node. + * @returns The new created node. + */ + instantiatePrefab(assetId: string, nodeProps: Record, parentNode: IMyNode, options?: ICreateNodeOptions): Promise; + + /** + * Unpack a prefab. That means all nodes in the prefab will be converted to normal nodes. + * @param prefabNode The prefab node to unpack. + * @param deep If true, all nested prefabs will also be unpacked. Default is false. + */ + unpackPrefab(prefabNode: IMyNode, deep?: boolean): Promise; + + /** + * Create a new prefab asset from the specified node. + * @param node The node to create the prefab from. + * @param savePath The path to save the prefab asset. It is a relative path to the asset root. + * @param fileName If specified, the name of the prefab asset. If not specified, the name of the node will be used. + * @return The new asset. + */ + createPrefab(node: IMyNode, savePath: string, fileName?: string): Promise; + + /** + * Set the value of a property of a node or component. + * @param obj The node or component. + * @param datapath The data path of the property. e.g. ["transform", "localPosition", "x"]. + * @param value The value to set. + * @returns Whether the value is set successfully. + */ + setProps(obj: IMyNode | IMyComponent, datapath: ReadonlyArray, value: any): Promise; + + /** + * Get a plain object containing all properties of a node or component. + * @param obj The node or component. + * @return The plain object containing all properties. + */ + getProps(obj: IMyNode | IMyComponent): any; + + /** + * Track changes to specified properties of a node or component until the next synchronization with the UI process. + * During this period, property changes can be undone. + * @param node The node or component to track. + * @param propNames The properties to track. + */ + recordObject(node: IMyNode | IMyComponent, ...propNames: ReadonlyArray): void; + + /** + * If the node or component is inside a prefab, this method will create an override entry for the specified properties of the node or component. If the node is not inside a prefab, this method does nothing. + * @param obj The node or component. + * @param datapaths Multiple data paths of the properties. + */ + setObjectChanged(obj: IMyNode | IMyComponent, ...datapaths: ReadonlyArray | string>): void; + + /** + * Execute a function by name. The name is in the form of "className.staticMethodName". + * A className must be registered with @IEditorEnv.regClass. + * @param name objectName.methodName + * @param args The arguments. + * @returns The function found. Null if not found. + * @example + * ``` + * @IEditorEnv.regClass + * class MyTest { + * static sayHello() { + * console.log("Hello"); + * } + * } + * + * const func = EditorEnv.scene.runScript("MyTest.sayHello"); + * func(); // Output: Hello + * ``` + */ + runScript(name: string, ...args: any[]): Promise; + + /** + * Execute a function of a node or component. + * @param target The node or component. + * @param methodName The method name. + * @param args The arguments. + * @returns The result of the function. + */ + runNodeScript(target: IMyNode | IMyComponent, methodName: string, ...args: any[]): Promise; + } + export interface IMyNodeExtra { + readonly id?: string; + readonly type?: string; + readonly selected?: boolean; + readonly isTopPrefab?: boolean; + readonly isPrefabReadonly?: boolean; + readonly prefabId?: string; + readonly scene?: IMyScene; + } + + export interface IMyNode { + hideFlags: number; + name: string; + readonly parent: IMyNode; + readonly destroyed: boolean; + readonly numChildren: number; + + getChildAt(index: number): IMyNode; + isAncestorOf(node: IMyNode): boolean; + hasHideFlag(flag: number): boolean; + + _setBit(type: number, value: boolean): void; + _getBit(type: number): boolean; + + _extra: IMyNodeExtra; + } + + export interface IMyComponent { + readonly owner: IMyNode; + hideFlags: number; + enabled: boolean; + } + export interface IRectangle { + width: number; + height: number; + x: number; + y: number; + allowRotation?: boolean; + index?: number; + tag?: number; + data?: any; + + oversized?: boolean; + rotated?: boolean; + } + + export interface IBin { + width: number; + height: number; + freeRects: IRectangle[]; + rects: T[]; + tag?: number; + } + + export enum MaxRectsPackingLogic { + MaxArea = 0, + MaxEdge = 1 + } + + /** + * Options for MaxRect Packer + * @property {boolean} smart Smart sizing packer (default is true) + * @property {boolean} pot use power of 2 sizing (default is true) + * @property {boolean} square use square size (default is false) + * @property {boolean} allowRotation allow rotation packing (default is false) + * @property {boolean} tag allow auto grouping based on `rect.tag` (default is false) + * @property {boolean} exclusiveTag tagged rects will have dependent bin, if set to `false`, packer will try to put tag rects into the same bin (default is true) + * @property {boolean} border atlas edge spacing (default is 0) + * @property {MaxRectsPackingLogic} logic MAX_AREA or MAX_EDGE based sorting logic (default is MAX_EDGE) + * @export + * @interface Option + */ + export interface IMaxRectsPackingOptions { + smart?: boolean, + pot?: boolean, + square?: boolean, + allowRotation?: boolean, + tag?: boolean, + exclusiveTag?: boolean, + border?: number, + logic?: MaxRectsPackingLogic + } + + export interface IMaxRectsPacker { + readonly bins: IBin[]; + + /** + * Add a bin/rectangle object with data to packer + * @param {number} width of the input bin/rectangle + * @param {number} height of the input bin/rectangle + * @param {*} data custom data object + */ + add(width: number, height: number, data: any): T; + /** + * Add a bin/rectangle object extends IRectangle to packer + * @template T Generic type extends IRectangle interface + * @param {T} rect the rect object add to the packer bin + */ + add(rect: T): T; + /** + * Add an Array of bins/rectangles to the packer. + * + * `Javascript`: Any object has property: { width, height, ... } is accepted. + * + * `Typescript`: object shall extends `MaxrectsPacker.IRectangle`. + * + * note: object has `hash` property will have more stable packing result + * + * @param {T[]} rects Array of bin/rectangles + */ + addArray(rects: T[]): void; + /** + * Reset entire packer to initial states, keep settings + */ + reset(): void; + /** + * Stop adding new element to the current bin and return a new bin. + * + * note: After calling `next()` all elements will no longer added to previous bins. + * + * @returns {number} + */ + next(): number; + + /** + * Return current functioning bin index, perior to this wont accept any new elements + * + * @readonly + * @type {number} + */ + get currentBinIndex(): number; + + /** + * Return all rectangles in this packer + * + * @readonly + * @type {T[]} + */ + get rects(): T[]; + } + export interface ILiveServer { + /** + * Host name. + */ + readonly host: string; + + /** + * Port number. + */ + readonly port: number; + + /** + * Port number for secure connection. + */ + readonly securePort: number; + + /** + * URl of the server, it's "http://host:port". + */ + readonly url: string; + + /** + * The instance of the express application. + */ + readonly expressApp: express.Express; + + /** + * The instance of the express application with web socket support. + */ + readonly expressWsApp: expressWs.Application; + + /** + * Start a web server to serve the specified directory. + * @param webRootPath The root path of the web server. It is a absolute path. + * @param secure Whether to use secure connection. Default is false. + * @returns The URL of the server, e.g. "http://192.168.1.1:19090". + */ + serveAnywhere(webRootPath: string, secure?: boolean): Promise; + } + export namespace ILayaDCC { + function build(task: IBuildTask, resourcePath: string): Promise; + } + export interface IIcoEncoder { + /** + * encode writes the stored image buffers into the internal buffer storage, + * creating the appropriate ICONDIR, ICONDIRENTRY, and data locations. + * + * @param imageBuffers An array of image buffers containing images. + * @returns Buffer The resulting Buffer ready to be written to a file. + */ + encode(imageBuffers: Array): Buffer; + } + export namespace II18nUtils { + /** + * Analyze all prefab files in the folder and sub-folers where the configuration file is located, collect all the text that needs to be translated into the reference file, and convert these texts into an internationalized format. If the reference file is not set, one will be automatically generated. + */ + function collectStrings(defAssetId: string): Promise; + + /** + * Make all entries in the translation files match the reference file. + */ + function syncTranslations(defAssetId: string): Promise; + } + export interface IHierarchyWriterOptions { + /** + * Callback function to get the id path of the node. + */ + getNodeRef?: (node: Laya.Node) => string | string[]; + + /** + * Don't product the header like "_$ver: 1" to the output. Default is false. + */ + noHeader?: boolean; + + /** + * If true, additional actions will be performed according to the `forInstanceOnly` flag. + */ + creatingPrefab?: boolean; + } + + export namespace IHierarchyWriter { + /** + * Serialize the node to a plain object. + * @param node The node to serialize. + * @param options The options. + * @returns The serialized object. + */ + function write(node: Laya.Node, options?: IHierarchyWriterOptions): any; + + /** + * Serialize the scene to a plain object. + * @param scene2D The 2D scene to serialize. + * @param scene3D The 3D scene to serialize. + * @returns The serialized object. + */ + function writeScene(scene2D: Laya.Scene, scene3D: Laya.Scene3D, options?: IHierarchyWriterOptions): any; + + /** + * Collect all resources referenced by the node. + * @param node The node. + * @param out The output set. If not specified, a new set will be created. + * @returns The output set. + */ + function collectResources(node: Laya.Node, out?: Set): Set; + } + export interface IHandle { + get valueChanged(): boolean; + } + + export interface IBoxHandle extends IHandle { + position: Laya.Vector3; + size: Laya.Vector3; + } + + export interface ICapsuleHandle extends IHandle { + position: Laya.Vector3; + radius: number; + height: number; + } + + export interface ICylinderHandle extends IHandle { + position: Laya.Vector3; + upRadius: number; + downRadius: number; + height: number; + } + + export namespace IHandles { + /** + * A helper cube mesh. + */ + const cubeMesh: Laya.Mesh; + + /** + * A helper quad mesh. + */ + const quadMesh: Laya.Mesh; + + /** + * A helper sphere mesh. + */ + const sphereMesh: Laya.Mesh; + + /** + * A helper arrow-z mesh. + */ + const arrowZMesh: Laya.Mesh; + + /** + * A helper plane mesh. + */ + const planeMesh: Laya.Mesh; + + /** + * A helper material for mesh. + */ + const meshMaterial: Laya.Material; + + /** + * A helper material for line. + */ + const lineMaterial: Laya.Material; + + /** + * A helper material for dotted line. + */ + const dottedLineMaterial: Laya.Material; + + /** + * A helper line sprite. + */ + const line: Laya.PixelLineSprite3D; + + /** + * Create a position move handle. + * @param position The initial position. + * @returns The new position. + */ + function positionMoveHandle(position: Laya.Vector3): Laya.Vector3; + + /** + * Create a direction move handle. + * @param direction The direction. + * @param position The initial position. + * @param size The handle size. + * @param color The handle color. + * @returns The new position. + */ + function directionMoveHandle(direction: Laya.Vector3, position: Laya.Vector3, size: number, color?: Laya.Color): Laya.Vector3; + + /** + * Create a direction move handle. + * @param direction + * @param position + * @param size + * @param color + */ + function directionMoveQuadHandle(direction: Laya.Vector3, position: Laya.Vector3, size: number, color?: Laya.Color): Laya.Vector3; + + /** + * Create a plane move handle. + * @param direction1 + * @param direction2 + * @param position + * @param size + * @param color + */ + function planeMoveHandle(direction1: Laya.Vector3, direction2: Laya.Vector3, position: Laya.Vector3, size: number, color?: Laya.Color): Laya.Vector3; + + /** + * Create a world move handle. + * @param position + * @param targetVertex + * @param size + * @param color + */ + function worldMoveHandle(position: Laya.Vector3, targetVertex: boolean, size: number, color?: Laya.Color): Laya.Vector3; + + /** + * Create a direction scale handle. + * @param scale The initial scale. + * @param position The position. + * @param rotation The rotation. + * @param size The handle size. + * @param color The handle color. + * @returns The new scale. + */ + function directionScaleHandle(scale: number, position: Laya.Vector3, rotation: Laya.Quaternion, size: number, color?: Laya.Color): number; + + /** + * Create a radius handle. + * @param radius The initial radius. + * @param position The position. + * @param rotation The rotation. + * @param color The handle color. + * @returns The new radius. + */ + function radiusHandle(radius: number, position: Laya.Vector3, rotation?: Laya.Quaternion, color?: Laya.Color): number; + + /** + * Create a cone handle. + * @param rotation The rotation. + * @param topPosition The top position of the cone. + * @param angle The angle of the cone. + * @param range The range of the cone. + * @param color The handle color. + * @returns The new angle(x) and range(y). + */ + function coneHandle(rotation: Laya.Quaternion, topPosition: Laya.Vector3, angle: number, range: number, color?: Laya.Color): Laya.Vector2; + + /** + * Draw a line. + * @param start Start position. + * @param end End position. + * @param color Line color. + */ + function drawLine(start: Laya.Vector3, end: Laya.Vector3, color?: Laya.Color): void; + + /** + * Draw a dotted line. + * @param start Start position. + * @param end End position. + * @param color Line color. + */ + function drawDottedLine(start: Laya.Vector3, end: Laya.Vector3, color?: Laya.Color): void; + + /** + * Draw a arc line. + * @param start Start position. + * @param end End position. + * @param height Height. + * @param startAllow + * @param ednAllow + * @param color Line color. + */ + function drawArcLine(start: Laya.Vector3, end: Laya.Vector3, height: number, startAllow: boolean, ednAllow: boolean, color?: Laya.Color): void; + + /** + * Draw a wire circle. + * @param center The center of the circle. + * @param radius The radius of the circle. + * @param normal The normal direction perpendicular to the plane of the circle. + * @param color The line color. + */ + function drawWireCircle(center: Laya.Vector3, radius: number, normal: Laya.Quaternion | Laya.Vector3, color?: Laya.Color, angle?: number): void; + + /** + * Draw a wire box. + * @param center The center of the box. + * @param size The size of the box. + * @param color The line color. + * @param rotation The rotation of the box. + */ + function drawBox(center: Laya.Vector3, size: Laya.Vector3, color?: Laya.Color, rotation?: Laya.Quaternion): void; + + /** + * Draw a wire capsule. + * @param center The center of the capsule. + * @param size The size of the capsule. + * @param color The line color. + * @param rotation The rotation of the capsule. + */ + function drawCapsule(center: Laya.Vector3, radius: number, height: number, color?: Laya.Color, rotation?: Laya.Quaternion): void; + + /** + * Draw a wire hemisphere. + * @param center The center of the hemisphere. + * @param size The size of the hemisphere. + * @param color The line color. + * @param rotation The rotation of the hemisphere. + */ + function drawHemiSphere(center: Laya.Vector3, radius: number, color?: Laya.Color, rotation?: Laya.Quaternion): void; + + /** + * Draw a wire sphere. + * @param center The center of the sphere. + * @param size The size of the sphere. + * @param color The line color. + */ + function drawSphere(center: Laya.Vector3, radius: number, color?: Laya.Color): void; + + /** + * Draw a wire cylinder. + * @param center The center of the cylinder. + * @param radius The radius of the cylinder. + * @param height The height of the cylinder. + * @param color The line color. + * @param rotation The rotation of the cylinder. + */ + function drawCylinder(center: Laya.Vector3, upRadius: number, downRadius: number, height: number, color?: Laya.Color, rotation?: Laya.Quaternion): void; + + /** + * Draw a wire plane. + * @param rotation The plane rotation. + * @param center The plane center. + * @param width The plane width. + * @param height The plane height. + * @param color The line color. + */ + function drawWirePlane(rotation: Laya.Quaternion, center: Laya.Vector3, width: number, height: number, color?: Laya.Color, spread?: number): void; + + /** + * Draw a wire ellipse. + * @param rotation The ellipse rotation. + * @param center The ellipse center. + * @param width The ellipse width. + * @param height The ellipse height. + * @param color The line color. + */ + function drawEllipse(rotation: Laya.Quaternion, center: Laya.Vector3, width: number, height: number, color?: Laya.Color, spread?: number): Laya.Vector2; + + /** + * Draw billboard. + * @param position Position. + * @param size Size. + * @param color Color. + */ + function drawBillboard(position: Laya.Vector3, size: number, color?: Laya.Color): void; + + /** + * Draw a cube. + * @param position Position. + * @param rotation Rotation. + * @param size Size. + * @param color Color. + */ + function drawCube(position: Laya.Vector3, rotation: Laya.Quaternion, size: number, color?: Laya.Color): void; + + /** + * Draw a mesh. + * @param mesh Mesh. + * @param position Position. + * @param rotation Rotation. + * @param scale Scale. + * @param color Color. + */ + function drawMesh(mesh: Laya.Mesh, position?: Laya.Vector3, rotation?: Laya.Quaternion, scale?: Laya.Vector3, color?: Laya.Color): void; + + /** + * Draw a mesh line. + * @param mesh Mesh. + * @param position Position. + * @param rotation Rotation. + * @param scale Scale. + * @param color Color. + */ + function drawMeshLine(mesh: Laya.Mesh, position?: Laya.Vector3, rotation?: Laya.Quaternion, scale?: Laya.Vector3, color?: Laya.Color): void; + + /** + * Draw a custom handle. + * @param factory The factory function. + * @param args The arguments passed to the factory function. + */ + function drawCustom(factory: (...args: T) => HandleDrawBase, ...args: T): void; + + /** + * Edit a wire box. + * @param center The center of the box. + * @param size The size of the box. + * @param color The line color. + * @param rotation The rotation of the box. + * @return The box handle. + */ + function editBox(center: Laya.Vector3, size: Laya.Vector3, color?: Laya.Color, rotation?: Laya.Quaternion, isCenter?: boolean): IBoxHandle; + + /** + * Edit a capsule. + * @param center The center of the capsule. + * @param radius The radius of the capsule. + * @param height The height of the capsule. + * @param color The line color. + * @param rotation The rotation of the capsule. + * @return The capsule handle. + */ + function editCapsule(center: Laya.Vector3, radius: number, height: number, color?: Laya.Color, rotation?: Laya.Quaternion): ICapsuleHandle; + + /** + * Edit a cylinder. + * @param center The center of the cylinder. + * @param radius The radius of the cylinder. + * @param height The height of the cylinder. + * @param color The line color. + * @param rotation The rotation of the cylinder. + * @return The cylinder handle. + */ + function editCylinder(center: Laya.Vector3, upRadius: number, downRadius: number, height: number, color?: Laya.Color, rotation?: Laya.Quaternion, editorConfig?: any): ICylinderHandle; + + } + export namespace IHandleUtils { + + /** + * Get current mouse position. + */ + const mousePosition: Readonly; + + /** + * Get the appropriate handle size for the specified coordinates. + * @param position The position of the handle. + * @returns The handle size. + */ + function getHandleSize(position: Laya.Vector3): number; + } + export namespace IGizmos3D { + + /** + * Draw icon. + * @param position Position. + * @param url Icon URL. + * @param color The color of icon. Default is white. + */ + function drawIcon(position: Laya.Vector3, url: string, color?: Laya.Color): void; + + /** + * Draw line. + * @param from Start point. + * @param to End point. + * @param color The line color. Default is white. + */ + function drawLine(from: Laya.Vector3, to: Laya.Vector3, color?: Laya.Color): void; + + /** + * Draw a wire box. + * @param center The center of the box. + * @param size The size of the box. + * @param color The line color. Default is white. + * @param rotation The rotation of the box. Default is null. + */ + function drawWireBox(center: Laya.Vector3, size: Laya.Vector3, color?: Laya.Color, rotation?: Laya.Quaternion): void; + + /** + * Draw wire sphere. + * @param center The center of the sphere. + * @param radius The radius of the sphere. + * @param color The line color. Default is white. + */ + function drawWireSphere(center: Laya.Vector3, radius: number, color?: Laya.Color): void; + + /** + * Draw a cylinder. + * @param center The center of the cylinder. + * @param upRadius The radius of the top of the cylinder. + * @param downRadius The radius of the bottom of the cylinder. + * @param height The height of the cylinder. + * @param color The line color. Default is white. + * @param rotation The rotation of the cylinder. Default is null. + * @param scale The scale of the cylinder. Default is null. + */ + function drawCylinder(center: Laya.Vector3, upRadius: number, downRadius: number, height: number, color?: Laya.Color, rotation?: Laya.Quaternion, scale?: Laya.Vector3): void; + + /** + * Draw a bound frustum. + * @param frustum The bound frustum. + * @param color The line color. Default is white. + */ + function drawBoundFrustum(frustum: Laya.BoundFrustum, color?: Laya.Color): void; + + /** + * Draw a bound box. + * @param bBox The bound box. + * @param color The line color. Default is white. + */ + function drawBoundBox(bBox: Laya.BoundBox, color?: Laya.Color): void; + + /** + * Draw Mesh. + * @param mesh A Mesh object. + * @param subMeshIndex Sub mesh index, -1 means draw all sub meshes. + * @param position Position. + * @param rotation Rotation. + * @param scale Scale. + * @param color Color. + */ + function drawMesh(mesh: Laya.Mesh, subMeshIndex: number, position?: Laya.Vector3, rotation?: Laya.Quaternion, scale?: Laya.Vector3, color?: Laya.Color): void; + + /** + * Draw Mesh Line. + * @param mesh The Mesh object. + * @param subMeshIndex The sub mesh index, -1 means draw all sub meshes. + * @param position The position. + * @param rotation The rotation. + * @param scale The scale. + * @param color The color. + */ + function drawMeshLine(mesh: Laya.Mesh, subMeshIndex: number, position?: Laya.Vector3, rotation?: Laya.Quaternion, scale?: Laya.Vector3, color?: Laya.Color): void; + } + export interface IGraphicsEditingInfo { + node: IMyNode; + comp: IMyComponent; + propPath: Array; + } + + export namespace IGizmos2D { + /** + * There can only be one graphic being edited in the scene at a time. Use `switchEditingGraphics` to switch the editing graphic. + */ + const editingGraphics: Readonly; + + /** + * Allow to perform object actions, such as resizing, rotating, draggin anchor, etc. + */ + const allowObjectAction: boolean; + + /** + * Get a manager for drawing gizmos. + * @param node The node. + * @returns The gizmos manager. + */ + function getManager(node: IMyNode): IGizmosManager; + + /** + * There can only be one graphic being edited in the scene at a time, so use this function to switch the editing graphic. + * @param node Graphics owner node. + * @param comp Graphics owner component. Can be null. + * @param propPath Property path of the graphics. Can be null. + */ + function switchEditingGraphics(node: IMyNode, comp?: IMyComponent, propPath?: Array): void; + } + + export interface StrokeData { + color?: string; + width?: number; + opacity?: number; + linecap?: string; + linejoin?: string; + miterlimit?: number; + dasharray?: string; + dashoffset?: number; + } + + export interface FillData { + color?: string + opacity?: number + rule?: string + } + + export interface IGizmosManager { + /** + * Owner node. + */ + readonly owner: IMyNode; + + /** + * Create a rectangle. + * @param width Width. + * @param height Height. + */ + createRect(width: number, height: number): IGizmoRect; + + /** + * Create a circle. + * @param radius Radius of the circle. + */ + createCircle(radius: number): IGizmoCircle; + + /** + * Create a polygon. + * @param easyTouch If the polygon's lines need to be used for interaction, the lines might be too thin for the user to easily select. When set to true, a larger transparent area will be generated around the lines to increase the interaction area. + */ + createPolygon(easyTouch?: boolean): IGizmoPolygon; + + /** + * Create en ellipse. + * @param rx Radius x. + * @param ry Radius y. + */ + createEllipse(rx: number, ry: number): IGizmoEllipse; + + /** + * Create a path. + * @param easyTouch If the path's lines need to be used for interaction, the lines might be too thin for the user to easily select. When set to true, a larger transparent area will be generated around the lines to increase the interaction area. + */ + createPath(easyTouch?: boolean): IGizmoPath; + + /** + * Create a text. + * @param text Text content. + */ + createText(text?: string): IGizmoText; + + /** + * Create a handle. A handle is a small graphic that can be dragged by the user. + * @param shape Shape of the handle. Can be a rectangle or a circle. + * @param size Size of the handle. + * @param fill Fill style of the handle. + * @param stroke Stroke style of the handle. Default is no stroke. + * @param cursor Optional cursor style of the handle, e.g. "default", "pointer", "grab", etc. Default is "pointer". + */ + createHandle(shape: "rect" | "circle", size: number, fill: FillData | string, stroke?: StrokeData | string, cursor?: string): IGizmoHandle; + + /** + * Create a handle group. Handle Group uses caching and can be used to retrieve and recycle handles with the same style each frame. + * @param shape Shape of the handle. Can be a rectangle or a circle. + * @param size Size of the handle. + * @param fill Fill style of the handle. + * @param stroke Stroke style of the handle. Default is no stroke. + * @param cursor Optional cursor style of the handle, e.g. "default", "pointer", "grab", etc. Default is "pointer". + */ + createHandleGroup(shape: "rect" | "circle", size: number, fill: FillData | string, stroke?: StrokeData | string, cursor?: string): IGizmoHandleGroup; + + /** + * Convert local coordinates to global coordinates. + * Local coordinates are relative to the owner node. Global coordinates are relative to the screen, which are used to position the gizmos. + * @param x Local x. + * @param y Local y. + * @param out A optional output vector to receive the result. If not provided, a new vector will be created. + * @returns The global coordinates. + */ + localToGlobal(x: number, y: number, out?: gui.Vec2): gui.Vec2; + + /** + * Convert global coordinates to local coordinates. + * Local coordinates are relative to the owner node. Global coordinates are relative to the screen, which are used to position the gizmos. + * @param x Global x. + * @param y Global y. + * @param out A optional output vector to receive the result. If not provided, a new vector will be created. + * @param targetSpace The target space to convert to. If not provided, the owner node will be used. + * @returns The local coordinates. + */ + globalToLocal(x: number, y: number, out?: gui.Vec2, targetSpace?: IMyNode): gui.Vec2; + } + + export interface IGizmoElement { + /** + * Owner manager. + */ + readonly owner: IGizmosManager; + + /** + * Owner node. + */ + readonly node: SVGElement; + + /** + * Custom tag. + */ + tag: string; + + /** + * Triggered when the user starts dragging the element. + */ + readonly onDragStart: IDelegate<(evt: MouseEvent) => void>; + + /** + * Triggered when the user is dragging the element. + */ + readonly onDragMoving: IDelegate<(evt: MouseEvent, dx: number, dy: number) => void>; + + /** + * Triggered when the user stops dragging the element. + */ + readonly onDragEnd: IDelegate<(evt: MouseEvent) => void>; + + /** + * Triggered when the user clicks the element. + */ + readonly onClick: IDelegate<(evt: MouseEvent) => void>; + + /** + * Triggered when the user double clicks the element. + */ + readonly onDblClick: IDelegate<(evt: MouseEvent) => void>; + + /** + * X position of the element. It's in global coordinates. + */ + get x(): number; + + /** + * Y position of the element. It's in global coordinates. + */ + get y(): number; + + /** + * Visibility of the element. + */ + get visible(): boolean; + set visible(value: boolean); + + /** + * Interactivity of the element. + */ + get touchable(): boolean; + set touchable(value: boolean); + + /** + * 可以给Gizmo设置一个方向属性,鼠标指针样式会根据这个方向属性自动调整。数值与方向的关系见下图: + * + * 0 - 1 - 2 + * | | + * 7 3 + * | | + * 6 - 5 - 4 + */ + get direction(): number; + set direction(value: number); + + /** + * Cusor style of the element. e.g. "default", "pointer", "grab". + */ + get cursor(): string; + set cursor(value: string); + + /** + * Set the position of the element by local coordinates. + * Local coordinates are relative to the owner node. + * @param x Local x. + * @param y Local y. + */ + setLocalPos(x: number, y: number): this; + + /** + * Set the position of the element by global coordinates. + * Global coordinates are relative to the screen. + * @param x Global x. + * @param y Global y. + */ + setPos(x: number, y: number): this; + + /** + * Set the size of the element. + * @param width Width. + * @param height Height. + */ + setSize(width: number, height: number): this; + + /** + * Set the stroke style of the element. + * @param value Stroke style. + */ + stroke(value: StrokeData | string): this; + + /** + * Set the fill style of the element. + * @param value Fill style. + */ + fill(value: FillData | string): this; + + /** + * Set a custom data to the element. + * @param name Name of the data. + * @param value Value of the data. + */ + setData(name: string, value: any): this; + + /** + * Get a custom data from the element. + * @param name Name of the data. + * @returns The value of the data. + */ + getData(name: string): any; + } + + export interface IGizmoHandle extends IGizmoElement { + } + + export interface IGizmoHandleGroup extends IGizmoElement { + /** + * Triggered when the user starts dragging a handle. + */ + readonly onHandleDragStart: IDelegate<(handle: IGizmoHandle, evt: MouseEvent) => void>; + + /** + * Triggered when the user is dragging a handle. + */ + readonly onHandleDragMoving: IDelegate<(handle: IGizmoHandle, evt: MouseEvent, dx: number, dy: number) => void>; + + /** + * Triggered when the user stops dragging a handle. + */ + readonly onHandleDragEnd: IDelegate<(handle: IGizmoHandle, evt: MouseEvent) => void>; + + /** + * Triggered when the user clicks a handle. + */ + readonly onHandleClick: IDelegate<(handle: IGizmoHandle, evt: MouseEvent) => void>; + + /** + * Triggered when the user double clicks a handle. + */ + readonly onHandleDblClick: IDelegate<(handle: IGizmoHandle, evt: MouseEvent) => void>; + + /** + * Get all visible handles. + */ + get array(): ReadonlyArray; + + /** + * Add a handle. + */ + add(): IGizmoHandle; + + /** + * Remove a handle from screen and return it to the pool. + */ + remove(handle: IGizmoHandle): void; + + /** + * Clear all handles and return them to the pool. + */ + clear(): void; + } + + export interface IGizmoRect extends IGizmoElement { + } + + export interface IGizmoCircle extends IGizmoElement { + setLocalRadius(value: number): this; + setRadius(value: number): this; + } + + export interface IGizmoEllipse extends IGizmoElement { + /** + * Set the radius of the ellipse. The value is in local coordinates. + * @param rx Radius x. + * @param ry Radius y. + */ + setLocalRadius(rx: number, ry: number): this; + + /** + * Set the radius of the ellipse. The value is in global coordinates. + * @param rx Radius x. + * @param ry Radius y. + */ + setRadius(rx: number, ry: number): this; + } + + export interface IGizmoPolygon extends IGizmoElement { + /** + * All points of the polygon. The coordinates of the points are stored in the array in the order of x0, y0, x1, y1, etc. + * + * You can directly modify this array. After modification, you need to call refresh to update the graphics. + */ + readonly points: Array; + + /** + * Refresh the polygon. + */ + refresh(): void; + } + + export interface IGizmoPath extends IGizmoElement { + /** + * If true, the coordinates passed in the subsequent drawing operations are relative to the coordinates of the last drawing operation. + * If false, the coordinates passed are absolute coordinates. Default is false. + */ + relativeCoords: boolean; + + moveTo(x: number, y: number): this; + lineTo(x: number, y: number): this; + cubicCurveTo(x: number, y: number, x2: number, y2: number): this; + cubicCurveTo(x: number, y: number, x1: number, y1: number, x2: number, y2: number): this; + quadCurveTo(x: number, y: number): this; + quadCurveTo(x: number, y: number, x1: number, y1: number): this; + quadCurveTo(x: number, y: number, x1?: number, y1?: number): this; + + /** + * Clear the path. + */ + resetPath(): this; + + /** + * Refresh the path. + */ + refresh(): void; + } + + export interface IGizmoText extends IGizmoElement { + /** + * Set the font style of the text. + * @param value Font style. + * @example + * ``` + * setFontProp('family', 'Menlo'); + * setFontProp('size', 12); + * setFontProp('weight', 'bold'); + * ``` + */ + setFontProp(prop: string, value: string | number): this; + + setText(text: string): this; + } + export interface IGameScene extends IMyScene { + readonly selection: ReadonlyArray; + readonly allNodes: Map>; + readonly topLevelSelection: ReadonlyArray; + + /** + * All nodes in the scene that have the onDrawGizmos method. + */ + readonly nodesSet_gizmo: Set; + + /** + * All camera nodes in the scene. + */ + readonly nodesSet_cameras: Set; + + readonly rootNode2D: Laya.Scene; + readonly rootNode3D: Laya.Scene3D; + readonly prefabRootNode: Laya.Sprite | Laya.Sprite3D; + + readonly openedBoxChain: ReadonlyArray; + readonly openedBox: Laya.Sprite; + + getNodeById(id: string): Laya.Node; + } + export interface IGUIPrefabWriterOptions { + getNodeRef?: (node: gui.Widget) => string | string[]; + noHeader?: boolean; + creatingPrefab?: boolean; + } + + export namespace IGUIPrefabWriter { + function write(node: gui.Widget, options?: IGUIPrefabWriterOptions): any; + function collectResources(node: gui.Widget, out?: Set): Set; + } + export enum ReloadReason { + Code = 1, + ScriptBundles = 2, + JsPlugins = 4, + Blueprints = 8, + } + + export interface IJsPluginInfo { + asset: IAssetInfo; + type: number; + allowLoadInEditor: boolean; + allowLoadInRuntime: boolean; + autoLoad: boolean; + scriptElement: HTMLElement; + loadOrder: number; + minifyOnPublish: boolean; + keepNames: boolean; + keepUnused: boolean; + } + + export interface IExtensionManager { + /** + * Whether a reload is in progress. + */ + readonly loading: boolean; + + /** + * Whether a reload of packages is in progress. + * + * When a hot reload occurs, there are two modes: + * 1. Reload all packages (`loadingPackages=true`) and reload user scripts (`loadingPackages=false`). + * 2. Only reload user scripts (`loadingPackages=false`). + */ + readonly loadingPackages: boolean; + + /** + * Find a function by name. The name is in the form of "className.staticMethodName". + * A className must be registered with @IEditorEnv.regClass. + * @param name objectName.methodName + * @returns The function found. Null if not found. + */ + findFunction(name: string): Function; + + /** + * Get all js plugins. + * @returns A map of all js plugins. + */ + getJsPlugins(): ReadonlyMap>; + + /** + * Get bundle names of the packages. + * @returns An array of bundle names. + */ + getPackageBundles(): ReadonlyArray; + /** + * Issue a reload request. + * @param reason The reason of the reload. + * @see ReloadReason + */ + reload(reason: number): void; + + /** + * If there is an ongoing reload task, wait for the reload task to complete. + */ + flushScriptChanges(): Promise; + } + export type IFileContent = { + /** + * If set, the file name will have its extension removed and the nameSuffix appended to the file name upon output. + * For example: if the file name is "test.png" and the nameSuffix is "@0.ktx", the output file name will be "test@0.ktx". + */ + nameSuffix?: string; + + /** + * A positive number used to calculate the progress of the output process. The higher the value, the more time the importer takes. Default is 1. + */ + weight?: number; + + /** + * How many tasks can be executed in parallel. Default is 100. + */ + numParallelTasks?: number; + } & ({ + type: "text"; + data: string; + } | { + type: "json"; + data: any; + } | { + type: "xml"; + data: gui.XML | XMLDocument; + } | { + type: "arraybuffer"; + data: ArrayBuffer; + } | { + type: "bytes"; + data: Uint8Array; + } | { + type: "filePath"; + /** + * Absolute path of the file. + */ + data: string; + } | { + type: "autoAtlas"; + data: IAutoAtlasInfo; + } | { + type: "custom"; + /** + * Custom data to transfer to the transformer as the second parameter. + */ + data?: any; + /** + * Called when the file is being written. Return that actual file content. + * @param owner Current asset export info. + * @param data Custom data. + * @returns The actual file content. + */ + transformer: (owner: IAssetExportInfo, data: any) => IFileContent; + }); + + export enum AssetExportConfigType { + Texture = 0, + Atlas = 1, + Shader = 2, + RenderTexture = 3 + } + + export interface IAssetLinkInfo { + /** + * Plain object that contains the property. + */ + obj: any; + + /** + * The property name. + */ + prop: string; + + /** + * The value here can be a UUID, "res://uuid", or a path. If it is a path, when absolutePath is true, the path is relative to the assets folder; when false, it is relative to the referencing asset; + */ + url: string; + + /** + * If url is a path, this flag indicates whether the path is absolute. When true, the path is relative to the assets folder; when false, it is relative to the referencing asset. + * + * This option also affects the output path, whether the URL is a UUID or a path. If true, the output path is the relative path to the web root; if false, the output path is relative to the referencing asset. + * + * Default is false. + */ + absolutePath?: boolean; + } + + export interface IAssetExportDepInfo { + /** + * Referenced asset. + */ + target: IAssetInfo; + + /** + * Plain object that contains the property. + */ + data: any; + + /** + * The property name. + */ + key: string; + + /** + * If true, the output path is the relative path to the web root; if false, the output path is relative to the referencing asset. + */ + absolutePath?: boolean; + } + + export interface IAssetExportInfo { + /** + * Owner asset. + */ + asset: IAssetInfo; + + /** + * File contents. + */ + contents: Array; + + /** + * Output path. + */ + outPath: string; + + /** + * Dependencies. + */ + deps?: Array; + + /** + * Configuration. e.g. Texture export configuration. + */ + config?: Record; + + /** + * Whether to output to a remote package. + */ + remote?: boolean; + } + + export interface IAutoAtlasConfig { + /** + * Whether to trim the blank area of the image. + */ + trimImage: boolean; + + /** + * Maximum width of the atlas. e.g. 2048. + */ + maxWidth: number; + + /** + * Maximum height of the atlas. e.g. 2048. + */ + maxHeight: number; + + /** + * Padding between images. e.g. 2. + */ + padding: number; + + /** + * Whether to use the power of two size. + */ + pot: boolean; + + /** + * Scale of the image. + */ + scale: number; + } + + export interface ITextureInAutoAtlasInfo { + /** + * Image asset. + */ + asset: IAssetInfo; + + /** + * Metadata of the image. + */ + meta: sharp.Metadata; + + /** + * Texture configuration. + */ + config: any; + + /** + * Output path. + */ + outPath: string; + } + + export interface IAutoAtlasInfo { + /** + * Name of the auto atlas. It will use as the file name. + */ + name: string; + + /** + * Sub-folder name. If it is not empty, images are placed in this folder. + */ + prefix: string; + + /** + * Configuration of the auto atlas. + */ + config: IAutoAtlasConfig; + + /** + * All textures to be packed. + */ + textures: Array; + } + + export interface ISubpackageInfo { + /** + * Path of the subpackage. e.g. "subpackage". + */ + path: string; + + /** + * A script bundle definition asset. If provided, the compiled JS file of this script bundle will be used as the entry file of the subpackage. + */ + mainScript?: IAssetInfo; + + /** + * Whether it is a remote package. + */ + remote?: boolean; + + /** + * If remote is true, the remote address of the subpackage. + */ + remoteUrl?: string; + + /** + * Whether to load the subpackage on startup. + */ + autoLoad?: boolean; + } + + export interface IExportAssetToolOptions { + /** + * If provided, all output paths will have this prefix added. + * + * For example, if baseUrl="http://example.com" and an asset's export path is "test.json", the asset reference address in the file will become "http://example.com/test.json". + */ + baseUrl?: string; + + /** + * The texture may be configured to apply compression formats required by various platforms. + * Here you need to configure which platforms need to be supported for this build, + * so that the corresponding formats can be packaged. Default is all platforms. + */ + runtimePlatforms?: RuntimePlatformType[]; + + /** + * If false, even if the texture is configured to use a compressed format on a certain platform, it will not be used and the original format will be used instead. + * Default is true. + */ + allowTextureCompressedFormat?: boolean; + + /** + * If true, the original texture file will be kept in the release folder. + * For example, If a.png is compressed to a.ktx, then both a.png and a.ktx will be present in the release folder. The benefit of this is that if a certain runtime platform does not support the ktx format, it can fall back to using the png format. + * Default is false. + */ + keepTextureSourceFile?: boolean; + + /** + * Some file extensions cannot be used due to restrictions of mini-game platforms or servers. + * In this case, you can enable a mapping table to map the original extensions to new extensions. + * Default is false. + */ + useSafeFileExtensions?: boolean; + + /** + * Whether to export the auto atlas. Default is true. + */ + exportAutoAtlas?: boolean; + + /** + * All subpackages. + */ + subpackages?: Array; + + /** + * By default, the class id of the script bundle is the compressed version of the asset id. You can provide a custom transformer to change the class id. + */ + classIdTransformer?: IClassIdTransformer; + + /** + * Overide the default exporter of certain assets. + */ + customAssetExporters?: Map IAssetExporter>; + + /** + * A logger for writing logs. + */ + logger?: ILogger; + } + + export interface IOutFileInfo { + /** + * Owner asset. + */ + asset?: IAssetInfo; + + /** + * A path relative to the output base path. If provided, it will override the default output path. + */ + filePath?: string; + + /** + * Explicitly provide the file extension. + * + * For example, "abc.shader.json", the value here is "shader.json" to avoid misunderstanding it as "json". If there are no special cases, ext is empty. + */ + ext?: string; + + /** + * Configuration. If provided, it will be written to fileconfig.json. + */ + config?: any; + + /** + * If true, no real file in filesystem of this item. + * + * For example, if an abc.png is output with compression format, the `noFile` of the corresponding IOutFileInfo for abc.png will be true, and the real file will be through another IOutFileInfo corresponding to abc.ktx. + */ + noFile?: boolean; + + /** + * If true, forbid to generate and use hash for this file even if version management is enabled. + */ + noHash?: boolean; + + /** + * This field will be filled with the hash value of the file by the version manager. + */ + hash?: string; + + /** + * If this is a JS file, this field indicates whether it needs to be minified. + */ + minify?: boolean; + + /** + * When minify is true, whether to keep the class names and function names during compression. Default is false. + */ + keepNamesOnMinify?: boolean; + + /** + * When minify is true, whether to keep unreferenced functions and variables. Default is false. + */ + keepUnusedOnMinify?: boolean; + } + + export interface IExportAssetTool { + /** + * Some file extensions cannot be used due to restrictions of mini-game platforms or servers. + * Here you can set up a mapping table to map the original extensions to new extensions. + * @example + * ``` + * tool.fileExtensionOverrides["abc"] = "abc.json"; + * ``` + */ + readonly fileExtensionOverrides: Record; + + /** + * Set the assets to be exported. + * @param assets The assets to be exported. + * @param progressCallback The callback function that is called when the progress of the export process changes. The value is between 0 and 1. + * @param abortToken The token that can be used to cancel the export process. + */ + setAssets(assets: Iterable, progressCallback?: (value: number) => void, abortToken?: IAbortToken): Promise; + + /** + * Get the export information of the assets. + * @returns A map of the export information of the assets. The key is the asset. + */ + get items(): Map; + + /** + * Write the output files to the specified folder. + * @param outputPath The output folder. + * @param outFiles Receive the out files information if provided. + * @param progressCallback The callback function that is called when the progress of the export process changes. The value is between 0 and 1. + * @param abortToken The token that can be used to cancel the export process. + */ + write(outputPath: string, outFiles?: Map, progressCallback?: (value: number) => void, abortToken?: IAbortToken): Promise; + } + + export interface IEngineLib { + /** + * The name of the engine library. It should be unique. + */ + name: string; + /** + * The caption of the engine library. + */ + caption: string; + /** + * The description of the engine library. + */ + tips: string; + /** + * The catalog of the engine library. + */ + catalog: string; + /** + * The files of the engine library, including the js files and the wasm files. + */ + files: string[]; + /** + * The worker files of the engine library, empty if there is no worker files. + */ + workerFiles: string[]; + /** + * The debugger files of the engine library, empty if there is no debugger files. + */ + debuggerFiles: string[]; + /** + * Whether this library should be loaded in the editor on startup. + */ + runInEditor: boolean; + /** + * Whether this library should be shown in the modules section of the Project Settings. Default is true. + */ + visible: boolean; + /** + * The key to store the selected addon in the data. Default is the name of the library. + */ + settingsKey: string; + /** + * The default addon name of the engine library. + */ + defaultAddon: string; + /** + * All the addons of the engine library. Null if no addons. + */ + addons: Array; + } + + export interface IEngineLibAddOn { + /** + * The name of the addon. + */ + name: string; + /** + * The caption of the addon. + */ + caption: string; + /** + * The description of the addon. + */ + tips: string; + /** + * The files of the addon, including the js files and the wasm files. + */ + files: string[]; + /** + * The worker files of the addon, empty if there is no worker files. + */ + workerFiles: string[]; + /** + * The debugger files of the addon, empty if there is no debugger files. + */ + debuggerFiles: string[]; + /** + * Whether this addon will not include the files defines in it's owner. Default is false. + */ + ignoreEntryFiles: boolean; + } + + export interface IEngineLibsManager { + /** + * All the engine libraries. + */ + readonly allLibs: ReadonlyMap; + /** + * All the engine library names. + */ + readonly allLibNames: ReadonlyArray; + + /** + * Get all files. + * @param options + * - renderDevice: The render device. Default is "webgl". + * - debug: Whether to load the debug files. Default is false. + * - disableWebAssembly: Whether to disable the web assembly. Default is false. + * @returns The files. + */ + getFiles(options?: { renderDevice?: string, debug?: boolean, disableWebAssembly?: boolean }): { files: Array, otherFiles: Array, workerFiles: Array, wasmFallbackLog: Array }; + + /** + * Get the full path of the lib. + * @param libName The lib name. + */ + getFullPathSync(libName: string): string; + + /** + * Get the full path of the lib. + * @param libName The lib name. + */ + getFullPath(libName: string): Promise; + } + export interface IEditorEnvSingleton { + /** + * The path of the project + */ + readonly projectPath: string; + + /** + * The name of the project + */ + readonly projectName: string; + + /** + * The type of the project + */ + readonly projectType: string; + + /** + * The current application directory. + */ + readonly appPath: string; + + /** + * The path of the user data. + * + * On Windows, it is c:/Users/username/AppData/Roaming/LayaAirIDE + * + * On MacOS, it is ~/Library/Application Support/LayaAirIDE + */ + readonly userDataPath: string; + + /** + * The path of the assets. + */ + readonly assetsPath: string; + + /** + * The path of the packed resources. + * + * On Windows, it is path/to/LayaAirIDE/resources/app.asar + * + * On MacOS, it is path/to/LayaAirIDE.app/Contents/Resources/app.asar + */ + readonly webRootPath: string; + + /** + * The path of the unpacked resources. + * + * On Windows, it is path/to/LayaAirIDE/resources + * + * On MacOS, it is path/to/LayaAirIDE.app/Contents/Resources + */ + readonly unpackedWebRootPath: string; + + /** + * Whether the app is packaged. It is only false in the development mode. + */ + readonly isPackaged: boolean; + + /** + * Whether the app is in the cli mode. A cli mode is a mode that runs the app in the command line. + */ + readonly cliMode: boolean; + + /** + * Whether the app is in the foreground. + */ + readonly isForeground: boolean; + + /** + * Whether current window is in the foreground. + */ + readonly isSelfForeground: boolean; + + /** + * Whether the module is started and ready to communicate with the UI process. + */ + readonly started: boolean; + + /** + * The electron ipc service. + */ + readonly ipc: IIpc; + + /** + * The type registry of the editor. + */ + readonly typeRegistry: ITypeRegistry; + + /** + * The asset manager. + */ + readonly assetMgr: IAssetManager; + + /** + * A live server that can be used to preview the game. + */ + readonly liveServer: ILiveServer; + + /** + * The code builder. + */ + readonly codeBuilder: ICodeBuilder; + + /** + * The scene manager. + */ + readonly sceneManager: ISceneManager; + + /** + * The resource manager. + */ + readonly resourceManager: IResourceManager; + + /** + * The navigation manager. + */ + readonly navigationManager: INavigationManager; + + /** + * The 3D manager. + */ + readonly d3Manager: ID3Manager; + + /** + * Communication port between the scene process and the UI process. + */ + readonly port: IMyMessagePort; + + /** + * Current active scene. + */ + readonly scene: IGameScene; + + /** + * Root sprite of the editor UI. + */ + readonly uiRoot: Laya.Sprite; + + /** + * The build manager. + */ + readonly buildManager: IBuildManager; + + /** + * The extension manager. + */ + readonly extensionManager: IExtensionManager; + + /** + * The engine libs manager. + */ + readonly engineLibsManager: IEngineLibsManager; + + /** + * Frame update event. + */ + readonly onUpdate: IDelegate<() => void>; + + /** + * Application activate event. + */ + readonly onAppActivate: IDelegate<() => void>; + + /** + * Player settings. + */ + readonly playerSettings: ISettings; + + /** + * Editor settings. + */ + readonly editorSettings: ISettings; + + /** + * Scene view settings. + */ + readonly sceneViewSettings: ISettings; + + /** + * Clipboard service. + */ + readonly clipboard: IClipboard; + + /** + * A path to a special directory or file associated with `name`. On failure, an + * `Error` is thrown. + * @param name The name of the path to retrieve. + * @return The path to the directory or file associated with `name`. + */ + getPath(name: CommonPathName): Promise; + + /** + * Get a settings object by name. Note that the settings are defined in the UI process, so the data read directly from settings may not be the latest. You can set autoSync=true to automatically synchronize when the data changes, or you can call the sync method to synchronize manually. + * + * EditorEnv.playerSettings/EditorEnv.editorSettings/EditorEnv.sceneViewSettings are pre-cached settings objects and have autoSync=true set. + * + * @param name The name of the settings. + * @param autoSync Whether to automatically synchronize when the data changes. + * @return The settings object. + */ + getSettings(name: string, autoSync?: boolean): ISettings; + + /** + * Send a message to the panel in the UI process and wait for the response. + * @param panelId The id of the panel. + * @param cmd Method name of the panel. + * @param args The arguments. + * @return The response. + */ + sendMessageToPanel(panelId: string, cmd: string, ...args: Array): Promise; + + /** + * Post a message to the panel in the UI process. + * @param panelId The id of the panel. + * @param cmd Method name of the panel. + * @param args The arguments. + */ + postMessageToPanel(panelId: string, cmd: string, ...args: Array): Promise; + + /** + * Run a script in the UI process. + * @param command The script to run. It is in the form of "objectName.methodName". + * @param params The parameters. + * @return The result of the script. + * @example + * ``` + * EditorEnv.runUIScript("window.eval", "console.log('Hello, world!')"); + * ``` + */ + runUIScript(command: string, ...params: any[]): Promise; + + /** + * Show a message box. + * @param msg The message to show. + * @param type The type of the message box. + * @return A promise that resolves when the message box is closed. + */ + alert(msg: string, type?: "none" | "info" | "error" | "question" | "warning"): Promise; + + /** + * Show a message box with a confirm and cancel button. + * @param msg The message to show. + * @return A promise that resolves with true if the confirm button is clicked, and false if the cancel button is clicked. + */ + confirm(msg: string): Promise; + + /** + * Show a message box. + * @param options The options of the message box. + * @return A promise that resolves with the return value of the message box. + */ + showMessageBox(options: MessageBoxOptions): Promise; + + /** + * Open the dev tools. + */ + openDevTools(): void; + + /** + * Clear the console message. + * @param group If specified, only clear the messages of the group. + */ + clearConsoleMessage(group?: string): void; + + /** + * Synchronize data with the UI process and refresh gizmos/handles immediately in the next frame. + */ + invalidateFrame(): void; + } + export interface ID3Manager { + /** + * Camera used for scene editing. + */ + readonly sceneCamera: Laya.Camera; + + /** + * Scene camera control tool. + */ + readonly cameraControls: ICameraControls; + + /** + * Render texture of the scene. + */ + readonly sceneRT: Laya.RenderTexture; + + /** + * Immediately refresh gizmos/handles in the next frame + */ + invalidateGizmos(): void; + + /** + * Set refresh rate of the view. + * @param value Default is "on-demand". + * - "on-demand": Refresh only when necessary. This option will reduce the CPU and GPU usage. + * - "realtime": Refresh in real-time. The view will be refreshed in a 30 FPS rate. + */ + setRefreshRate(value: "on-demand" | "realtime"): void; + + /** + * Temporarily switch the refresh rate to 'realtime' and maintain it for one second. + */ + requestTempRealtimeRefresh(): void; + + /** + * Change the transform component operation mode. + * @param mode The new mode. + */ + transformCtrlMode(mode: SceneNavToolType): void; + + /** + * Pick 3D objects within the scene. + * @param x The x coordinate of the mouse. + * @param y The y coordinate of the mouse. + * @returns The picked object. + */ + getSpriteUnderMouse(x: number, y: number): Laya.Sprite3D; + + /** + * Find 3D objects within the specified rectangle. + * @param x The x coordinate of the rectangle. + * @param y The y coordinate of the rectangle. + * @param width The width of the rectangle. + * @param height The height of the rectangle. + * @param result The result array to store the found objects. + */ + getSpritesInRect(x: number, y: number, width: number, height: number, result: Laya.Node[]): void; + + /** + * + */ + getLookDirectionPos(pos: Laya.Vector3, dir: Laya.Vector3): Readonly; + } + export namespace ICreateAssetUtil { + /** + * Create a prefab asset from the specified node object. + * @param node The node object. + * @param path Save path of the prefab asset. The path is relative to the assets folder. + * @param textureImporter The texture importer options. + * @returns The new created asset. + */ + function createPrefab(node: Laya.Node, path: string, textureImporter?: Record): Promise; + + /** + * Create a scene asset from the specified scene object. + * @param scene The scene object. + * @param path Save path of the scene asset. The path is relative to the assets folder. + * @param textureImporter The texture importer options. + * @returns The new created asset. + */ + function createScene(scene: Laya.Scene, path: string, textureImporter?: Record): Promise; + + /** + * Create a material asset from the specified material object. + * @param mat The material object. + * @param path Save path of the material asset. The path is relative to the assets folder. + * @param textureImporter The texture importer options. + * @returns The new created asset. + */ + function createMaterial(mat: Laya.Material, path: string, textureImporter?: Record): Promise; + + /** + * Create a mesh asset from the specified mesh object. + * @param mesh The mesh object. + * @param path Save path of the mesh asset. The path is relative to the assets folder. + * @returns The new created asset. + */ + function createMesh(mesh: Laya.Mesh, path: string): Promise; + + /** + * Create a texture asset from the specified texture object. + * @param tex The texture object. + * @param path Save path of the texture asset. The path is relative to the assets folder. + * @param textureImporter The texture importer options. + * @returns The new created asset. + */ + function createTexture(tex: Laya.Texture | Laya.BaseTexture, path: string, textureImporter?: Record): Promise; + + /** + * Unpack a model asset. A model asset is a FBX, glTF, or other model file. + * @param modelAsset The model asset. + * @param outputPath The output path of the unpacked model. + */ + function unpackModel(modelAsset: IAssetInfo, outputPath: string): Promise; + + /** + * Serialize a animation clip object to a binary buffer. + * @param clip Animation clip object. + * @returns The binary buffer. + */ + function writeAnimationClip(clip: Laya.AnimationClip): ArrayBuffer; + + /** + * Serialize a 2D animation clip object to a binary buffer. + * @param clip 2D Animation clip object. + * @returns The binary buffer. + */ + function writeAnimationClip2D(clip: Laya.AnimationClip2D): ArrayBuffer; + + /** + * Serialize a material object to a JSON object. + * @param mat Material object. + * @returns The JSON object. + */ + function writeMaterial(mat: Laya.Material): any; + + /** + * Serialize a mesh object to a binary buffer. + * @param mesh Mesh object. + * @returns The binary buffer. + */ + function writeMesh(mesh: Laya.Mesh): ArrayBuffer; + + /** + * Write a texture object to a binary buffer. + * @param tex Texture object. + * @param extend Extend the non-transparent area of the image by a certain number of pixels before saving. The image size remains unchanged. + * @returns The binary buffer. + */ + function writeTexture(tex: Laya.Texture | Laya.BaseTexture, extend?: number): ArrayBuffer; + } + export interface IScriptBundleDefinition { + /** + * Whether the script bundle is enabled. + */ + enabled: boolean; + + /** + * The asset of the script bundle. + */ + asset: IAssetInfo; + + /** + * When set, a variable with the specified name will be defined on the window object referencing this script bundle. + */ + globalName: string; + + /** + * An internal id of the script bundle. Generally, it is the compressed version of the asset id. + */ + bundleId: string; + + /** + * Whether the script bundle can be loaded in the editor. + */ + allowLoadInEditor: boolean; + + /** + * Whether the script bundle can be loaded in runtime. + */ + allowLoadInRuntime: boolean; + + /** + * Whether to auto-load + */ + autoLoad: boolean; + + /** + * List of entry script files + */ + entries: string[]; + + /** + * Whether to include all typescript files. + */ + includeAllFiles: boolean; + + /** + * If true, external code files referenced by the script bundle will be packaged into the script bundle, otherwise only references will be created. + */ + bundleExternals: boolean; + + /** + * Whether to load this script bundle before the main script bundle. + */ + loadBeforeMain: boolean; + + /** + * File name of the script bundle. + */ + fileName: string; + + /** + * References to other script bundles. + */ + references: IScriptBundleDefinition[]; + } + + export interface IClassIdTransformer { + (classId: string): string; + } + + export interface ICodeBuildOptions { + /** + * Whether to compress the js files. + */ + minify?: boolean; + + /** + * If minify is true, whether to keep the class names and function names during compression. + */ + keepNames?: boolean; + + /** + * Whether to generate source map files. + */ + sourcemap?: boolean; + + /** + * Whether to include the source code in the source map files. Be aware that this may expose your source code. + */ + sourcesContent?: boolean, + + /** + * By default, the class id of the script bundle is the compressed version of the asset id. You can provide a custom transformer to change the class id. + */ + classIdTransformer?: IClassIdTransformer; + + /** + * Use a custom logger instead of the default console logger. + */ + logger?: ILogger; + } + + export interface ICodeBuilder { + /** + * Get all script bundle definitions in the project. + * @returns A map of script bundle definitions. The key is the file name of the script bundle. + */ + getScriptBundleDefs(): ReadonlyMap>; + /** + * Compile the release version of the code. + * @param outDir The output directory for the compiled code. + * @param outputAssets A test function that determines whether an asset should be included in the build. + * @param options Additional options for the build process. + * @returns The list of output files. + */ + buildRelease(outDir: string, outputAssets: { has(asset: IAssetInfo): boolean }, options?: ICodeBuildOptions): Promise>; + + /** + * Compile a script bundle. + * @param defAsset The definition asset of the script bundle. + * @param outDir The output directory for the compiled code. + * @param options Additional options for the build process. + * @returns The list of output files. + */ + buildScriptBundle(defAsset: IAssetInfo, outDir: string, options?: ICodeBuildOptions): Promise>; + } + export enum OrthographicMode { + Orthographic_XZ, + Orthographic_XY, + Orthographic_YZ, + None + } + + export interface ICameraControls { + /** + * Zoom scale factor + */ + zoomScale: number; + + /** + * Transform scale factor + */ + transformScale: number; + + /** + * Get the camera instance + */ + get camera(): Laya.Camera; + + /** + * Get or set the orthographic mode + */ + get orthographicMode(): OrthographicMode; + set orthographicMode(value: OrthographicMode); + + /** + * Get or set the perspective field of view + */ + get perspectiveFov(): number; + set perspectiveFov(value: number); + + /** + * Get or set whether the camera is orthographic + */ + get orthographic(): boolean; + set orthographic(value: boolean); + + /** + * Get or set the size of the camera + */ + get size(): number; + set size(value: number); + + /** + * Get or set the rotation of the camera + */ + set rotation(value: Laya.Quaternion); + get rotation(): Laya.Quaternion; + + /** + * Get the distance of the camera + */ + get cameraDistance(): number; + + /** + * Get the position of the camera + */ + get cameraPostion(): Readonly; + + /** + * Get the focus position + */ + get focusPosition(): Laya.Vector3; + + /** + * Get the normalized right vector + */ + get normalizedRight(): Laya.Vector3; + + /** + * Get the normalized up vector + */ + get normalizedUp(): Laya.Vector3; + + /** + * Get the normalized forward vector + */ + get normalizedForward(): Laya.Vector3; + + /** + * Update the camera controls + */ + update(): void; + + /** + * Set the focus position of the camera + * @param pos The focus position + * @param distance Optional distance + * @param isanim Optional animation flag + */ + setFocusPosition(pos: Laya.Vector3, distance?: number, isanim?: boolean): void; + + /** + * Look at a direction + * @param direction The direction to look at + */ + lookAtDirection(direction: Laya.Quaternion): void; + + /** + * Look at a point + * @param point The point to look at + * @param direction The direction to look at + * @param newSize The new size of the camera + * @param ortho Whether the camera is orthographic + */ + lookAt(point: Laya.Vector3, direction: Laya.Quaternion, newSize: number, ortho: boolean): void; + + /** + * Get the serialized data of the current focus + */ + getFocusData(): any; + + /** + * Set the serialized data of the focus + * @param data The serialized data + * @param isanim Optional animation flag + */ + setFocusData(data: any, isanim?: boolean): void; + + /** + * Get a ray from screen space coordinates + * @param x The x coordinate + * @param y The y coordinate + */ + getScreenRay(x: number, y: number): Readonly; + + /** + * Calculate the cursor ray + * @param pos The position + * @param camera The camera instance + * @param out The output ray + */ + caculateCursorRay(pos: Laya.Vector2, camera: Laya.Camera, out: Laya.Ray): void; + + /** + * Get the screen position + * @param position The position + * @param out The output vector + */ + getScreenPosition(position: Laya.Vector3, out: Laya.Vector4): boolean; + + /** + * Zoom the camera + * @param distance The distance to zoom + */ + zoom(distance: number): void; + + /** + * Translate the camera + * @param distanceX The distance to translate along the X axis + * @param distanceY The distance to translate along the Y axis + * @param distanceZ The distance to translate along the Z axis + */ + translate(distanceX: number, distanceY: number, distanceZ: number): void; + + /** + * Move the camera in fly mode + * @param distanceX The distance to move along the X axis + * @param distanceY The distance to move along the Y axis + * @param distanceZ The distance to move along the Z axis + * @param isshift Whether the shift key is pressed + */ + flyMove(distanceX: number, distanceY: number, distanceZ: number, isshift: boolean): void; + + /** + * Reset the camera motion + */ + resetMotion(): void; + + /** + * Rotate around an axis + * @param axis The axis to rotate around + * @param angle The angle to rotate + * @param lockPivot Optional flag to lock the pivot + */ + rotateFromAxis(axis: Laya.Vector3, angle: number, lockPivot?: boolean): void; + + /** + * Rotate yaw (left/right) + * The rotation axis is fixed to the scene up vector (0, 1, 0) + * @param angle The angle to rotate + * @param lockPivot Optional flag to lock the pivot + */ + rotateYaw(angle: number, lockPivot?: boolean): void; + + /** + * Rotate pitch (up/down) + * @param angle The angle to rotate + * @param lockPivot Optional flag to lock the pivot + */ + rotatePicth(angle: number, lockPivot?: boolean): void; + + /** + * Rotate yaw around the focus point (left/right) + * @param angle The angle to rotate + */ + focusRotateYaw(angle: number): void; + + /** + * Rotate pitch around the focus point (up/down) + * @param angle The angle to rotate + */ + focusRotatePicth(angle: number): void; + + /** + * Focus on a node + * @param node The node to focus on + */ + focusNode(node: Laya.Sprite3D): void; + + /** + * Preview focus on a node + * @param node The node to preview focus on + * @param distanceRatio The distance ratio + */ + previewFocusNode(node: Laya.Sprite3D, distanceRatio: number): void; + + /** + * Set the camera transform + * @param data The transform data + */ + setCameraTransform(data: any): void; + + /** + * Get the camera transform + */ + getCameraTransform(): any; + } + export interface IBuildTask { + /** + * Task name is the caption of the build target. + * @see IBuildTargetInfo.caption + */ + readonly name: string; + + /** + * Platform name. For example, "android", "ios", "web", etc. + */ + readonly platform: string; + + /** + * Whether the build target is a mini-game platform, e.g. WeChat Mini Game, Oppo Mini Game, etc. + */ + readonly isMiniGame: boolean; + + /** + * Configurations of the build. It is a copy of the build settings. Feel free to modify it, as it won't affect the original settings. + */ + readonly config: IBuildConfig; + + /** + * Configurations of the platform. It is a copy of the platform settings. Feel free to modify it, as it won't affect the original settings. + */ + readonly platformConfig: any; + + /** + * Player settings. It is a copy of the player section of project settings. Feel free to modify it, as it won't affect the original settings. + */ + readonly playerSettings: any; + + /** + * Output path of the build. + */ + readonly destPath: string; + + /** + * Resource path of the build. By default, it is the same as destPath. + * + * You cannot modify this value directly, set config.resourcePath in onSetup event instead. + */ + readonly resourcePath: string; + + /** + * The path for the remote packages. Default is destPath+"-remote". For example, if destPath is "build/android", remotePkgPath will be "build/android-remote". + * + * All the remote packages will be put in this folder. + */ + remotePkgPath: string; + + /** + * Build template path. It is the path of the internal build template folder. + * + * All files in this folder will be copied to the destPath during the build process. + */ + readonly buildTemplatePath: string; + + /** + * Build template path of the project. It is the path of the project's build-templates folder. + * + * All files in this folder will be copied to the destPath during the build process. + */ + readonly projectBuildTemplatePath: string; + + /** + * If there are any long-running operations during the build process, it is recommended to call abortToken.check() to check if the operation needs to be aborted. Some utility classes also support passing in abortToken, such as IEditorEnv.utils.exec, IEditorEnv.utils.httpRequest, etc. + */ + readonly abortToken: IAbortToken; + + /** + * A full list of files that will write to the output folder. + */ + readonly exports: IBuildExports; + + /** + * A logger for writing logs. Use it to write logs instead of directly using console.xxx. + */ + readonly logger: ILogger; + + /** + * Status of current build task. + */ + readonly status: BuildTaskStatus; + + /** + * Wait for the completion of the build task. + */ + waitForCompletion(): Promise; + + /** + * Terminate the build task. + * @param success If true, the build task will be marked as successful. Otherwise, it will be marked as failed. + */ + terminate(success: boolean): void; + + /** + * Merge two or more configuration files. The target configuration file is at the path specified by filePath, and the source configuration files may be located at: + * - If it is a built-in build target of the IDE, it is in the built-in release template folder of the IDE; if it is a custom build target added by a plugin, it is in the template folder specified by the plugin. + * - The build-templates folder under the project, that is, the project's build-templates folder. + * + * This method will merge all found configuration files together, and if the overrides parameter provides additional data, it will also be written into the configuration file. + * @param filePath The path of the configuration file, relative to `destPath`. + * @param overrides Additional configuration data. + * @example + * ``` + * // Find project.config.json in the project's build-templates folder, if found, merge it with the project.config.json in the output folder, and then write it to the output folder. + * task.mergeConfigFile("project.config.json"); + * ``` + */ + mergeConfigFile(filePath: string, overrides?: any): void; + + /** + * Find a file in the build template folder. The search order is as follows: + * - The build-templates folder under the project, that is, the project's build-templates folder. + * - If it is a built-in build target of the IDE, it is in the built-in release template folder of the IDE; if it is a custom build target added by a plugin, it is in the template folder specified by the plugin. + * + * @param filePath A relative path. + * @returns The absolute path of the file. + */ + findFileInBuildTemplate(filePath: string): string; + + /** + * Get a module location by its ID. + * @param moduleId The ID of the module. + * @returns The absolute path of the module. + */ + getModulePath(moduleId: string): string; + + /** + * Set the title of the progress bar. + * @param text The title text. + */ + setProgressTitle(text: string): void; + + /** + * Increase the progress of the progress bar. In every event, the range of the progress bar is 0-100. If the value exceeds 100, it will be reset to 100. + * @param value The value to increase. + */ + addProgress(value: number): void; + + /** + * Set the progress of the progress bar. In every event, the range of the progress bar is 0-100. + * @param value The value to set. + */ + setProgress(value: number): void; + } + + export interface IOutSubpackageInfo { + /** + * Subpackage path. It is a relative path to the assets folder. e.g. "test". + */ + path: string; + + /** + * If the subpackage is a remote package, set this to a URL. e.g. "http://example.com/test". + */ + remoteUrl?: string; + + /** + * Whether to autoload the subpackage on startup. + */ + autoLoad?: boolean; + + /** + * If version management is enabled, this is the hash value of the fileconfig.json. + */ + hash?: string; + } + + export interface IBuildExports { + /** + * index.js file path. + */ + indexJS: string; + + /** + * All engine js files. + */ + libs: Array; + + /** + * If disableWebAssembly is `alternative`, this is the alternative engine js files if WebAssembly is supported. + */ + alternativeLibs: Array; + + /** + * All user js files. + */ + bundles: Array; + + /** + * All subpackages. + */ + subpackages: Array; + + /** + * All local subpackages that can be registered as mini-game subpackages. + */ + miniGameSubPackages: Array<{ name: string, root: string }>; + + /** + * All files that will be copied to the output folder. + */ + files: Map; + } + + export interface IBuildPlugin { + /** + * Build task initialization. You can modify task.config, task.platformConfig, task.playerSettings, etc. in this event. + * The modifications to these configurations are only effective for this task and will not affect the project. + * @param task The build task. + */ + onSetup?(task: IBuildTask): Promise; + + /** + * Build task start event. You can initialize the structure of the output folder, perform necessary checks, and module installations in this event. + * @param task The build task. + */ + onStart?(task: IBuildTask): Promise; + + /** + * Collecting assets required for the build. The assets set is collected based on dependencies, rules of the resources directory, and all other valid rules. You can add more assets to the set. + * @param task The build task. + * @param assets The set of assets to be exported. + */ + onCollectAssets?(task: IBuildTask, assets: Set): Promise; + + /** + * Assets are ready to be written to the output directory. The exportInfoMap contains information about all the resources to be written, including the output path, etc. You can modify outPath to customize the output path of the asset. + * @param task The build task. + * @param exportInfoMap The information of all the assets to be written. + */ + onBeforeExportAssets?(task: IBuildTask, exportInfoMap: Map): Promise; + + /** + * Script generation completed. If developers need to modify the generated code files, e.g. minify, obsfucate, etc., they can handle it in this event. + * @param task The build task. + */ + onExportScripts?(task: IBuildTask): Promise; + + /** + * Assets writing completed. If developers need to add their own files, or perform operations such as file compression, they can handle it in this event. + * @param task The build task. + */ + onAfterExportAssets?(task: IBuildTask): Promise; + + /** + * The build is complete. You can generate some manifest files, configuration files, etc. in this event. + * Common examples include generating the index.html file for web platforms, manifest.json files for mini-game platforms, etc. + * @param task The build task. + */ + onCreateManifest?(task: IBuildTask): Promise; + + /** + * If there is a native packaging process, handle it here. e.g. apk, ipa, etc. + * @param task The build task. + */ + onCreatePackage?(task: IBuildTask): Promise; + + /** + * Event triggered when the build task is completed. + * @param task The build task. + */ + onEnd?(task: IBuildTask): Promise; + } + + export enum BuildTaskStatus { + Running, + Success, + Failed + } + + export namespace BuildTaskStatic { + /** + * Start a build task. + * @param platform The platform to build. e.g. "android", "ios", "web", etc. + * @returns The build task. + */ + function start(platform: string): IBuildTask; + + /** + * Start a build task. The output path is specified by destPath and overrides the output path in the build settings. + * @param platform The platform to build. e.g. "android", "ios", "web", etc. + * @param destPath The output path. + * @returns The build task. + */ + function start(platform: string, destPath: string): IBuildTask; + + /** + * Start a build task with temporary plugins. + * @param platform The platform to build. e.g. "android", "ios", "web", etc. + * @param tempPlugins Temporary plugins. + * @returns The build task. + */ + function start(platform: string, ...tempPlugins: Array): IBuildTask; + + /** + * Start a build task with temporary plugins. The output path is specified by destPath and overrides the output path in the build settings. + * @param platform The platform to build. e.g. "android", "ios", "web", etc. + * @param destPath The output path. + * @param tempPlugins Temporary plugins. + * @returns The build task. + */ + function start(platform: string, destPath: string, ...tempPlugins: Array): IBuildTask; + } + export interface IBuildManager { + /** + * Get the target information of the specified platform. + * @param platform The platform. For example, "android", "ios", "web", etc. + */ + getTargetInfo(platform: string): IBuildTargetInfo; + } + export interface IBuildConfig { + /** + * The name of this build. It is generally used as the name of the native project folder, the product name of the App, etc. + */ + name: string; + + /** + * Display name of this build. It is generally used as the web page title, window title, etc. + */ + displayName: string; + + /** + * Version string. The format is generally "major.minor.patch". For example, "1.0.0". + */ + version: string; + + /** + * Icon path. It is in the form of "res://uuid". For example, "res://12345678-1234-1234-1234-1234567890ab". + */ + icon: string; + + /** + * Whether to compress the engine js files. + */ + useCompressedEngine: boolean; + + /** + * Whether to compress the user js files. + */ + minifyJS: boolean; + + /** + * Whether to generate source map files. + */ + sourcemap: boolean; + + /** + * Wether to include the source code in the source map files. Be aware that this may expose your source code. + */ + sourcesContent: boolean; + + /** + * The scene that automatically opens after startup. It is in the form of "res://uuid". + */ + startupScene: string; + + /** + * Include these scenes in the build. Each element is in the form of "res://uuid". + */ + includedScenes: Array; + + /** + * Include these assets in the build. Each element is in the form of "res://uuid". + */ + alwaysIncluded: Array; + + /** + * Whether to copy all files in the bin folder to the release folder. + */ + copyBinFiles: boolean; + + /** + * When copyBinFiles is true, ignore these files in the bin folder. They can be glob patterns. + * + * For example, ["*.txt"]. + */ + ignoreFilesInBin: Array; + + /** + * Enable version management. If true, the hash value of the file will be appended to the file name. + */ + enableVersion: boolean; + + /** + * When enableVersion is true, ignore these files in the version management. They are asset ids in 'res://uuid' format. + */ + ignoreFilesInVersion: Array; + + /** + * The length of the hash value of the file name when version management is enabled. Default is 5. + */ + versionTagLength: number; + + /** + * The algorithm used to generate the hash value of the file name when version management is enabled. Default is md5. + */ + versionAlgorithm: 'md5' | 'sha256'; + + /** + * Enable subpackages. If true, the assets will be divided into multiple packages. + */ + enableSubpackages: boolean; + + /** + * Subpackages configuration. + */ + subpackages: Array; + + /** + * If true, The main package will be treated as a remote package, which means the main package also needs to be configured with a remote address and will be automatically loaded from the remote at startup. + */ + enableRemoteMainPackage: boolean; + + /** + * When enableRemoteMainPackage is true, the remote address of the main package. + */ + mainPackageRemoteUrl: string; + + /** + * By default, all exported files are placed in the release folder. If you want to place them in a sub-folder, you can set this value. + * For example, "resource". + */ + resourcePath: string; + + /** + * Some file extensions cannot be used due to restrictions of mini-game platforms or servers. + * In this case, you can enable a mapping table to map the original extensions to new extensions. + */ + useSafeFileExtensions: boolean; + + /** + * When useSafeFileExtensions is true, the mapping table of file extensions. + * + * Please note that there are already built-in mappings, such as shader -> shader.json. You only need to add additional mappings. + * + * For example, { "abc": "abc.json" }. + */ + fileExtensionOverrides: Record; + + /** + * The texture may be configured to apply compression formats required by various platforms. + * Here you need to configure which platforms need to be supported for this build, + * so that the corresponding formats can be packaged. Default is all platforms. + */ + runtimePlatforms: RuntimePlatformType[]; + + /** + * If false, even if the texture is configured to use a compressed format on a certain platform, it will not be used and the original format will be used instead. + */ + allowTextureCompressedFormat: boolean; + + /** + * If true, the original texture file will be kept in the release folder. + * For example, If a.png is compressed to a.ktx, then both a.png and a.ktx will be present in the release folder. The benefit of this is that if a certain runtime platform does not support the ktx format, it can fall back to using the png format. + */ + keepTextureSourceFile: boolean; + + /** + * Additional engine js files can be added to the build. + */ + engineLibs: Array; + + /** + * For some platforms whose do not support WebAssembly, you can disable WebAssembly here. + * + * After disabling, all WebAssembly libraries will be replaced with pure JavaScript libraries. + * + * If you set it to "alternative", the engine will still export WebAssembly libraries, but will set task.exports.libs to pure JavaScript libraries and set task.exports.alternativeLibs to WebAssembly libraries. + */ + disableWebAssembly: boolean | "alternative"; + + /** + * Chose the rendering device. + */ + renderDevice: "webgl" | "webgpu" | "opengl" | "metal" | "vulkan"; + + /** + * Files or folders listed here will not be deleted during the cleanup phrase if they already exist in the release folder. + * + * Note: Wildcards cannot be used, names must match exactly. Paths are relative to destPath. + * + * For example: ["folder", "abc.js"] + */ + keepFilesDuringCleaning: Array; + + /** + * Set multiple filename match strings. The matched files will not be copied from the build template folder (build-templates) to the release folder. + * + * Note: Can use glob pattern. Paths are relative to destPath. + * + * For example: ["*.txt"] + */ + ignoreFilesInBuildTemplate: Array; + + /** + * The script name of the subpackage entry for mini-games, default is game.js. Some platforms may use different names, such as main.js. + */ + subpackageGameJsName: string; + + /** + * Overide the default exporter of certain assets. + */ + customAssetExporters: Map IAssetExporter>; + + /** + * Define an action that can be executed after the build. Currently supported actions are: + * - Open a webpage. `serve` is the folder path relative to `destPath`, used as the root directory of the website, and can be an empty string; `open` is the file path relative to `serve`, used as the webpage to open, and can be an empty string. If you want to use https, you can set `secure` to true. + * - Show a QR code. `serve` is the folder path relative to `destPath`, used as the root directory of the website, and can be an empty string; `QRCode` is the file path relative to `destPath`, used as the webpage to open after scanning the QR code, and can be an empty string. If you want to use https, you can set `secure` to true. + * - Open an external url. 'open' is the url to open, and can be a local file path or a remote url. + * - Run a command in terminal. `runInTerminal` is a command line string. + * @example + * ``` + * { serve: "", open: "" } // Open the root page of the website. + * { serve: "abc", open: "test.html" } // Open the test.html page of the website, the root directory is abc. + * { serve: "", QRCode: "abc.apk" } // Open the test.apk page of the website by scanning the QR code. + * { open: "https://example.com" } // Open an url. + * { runInTerminal: "{projectPath}/abc.exe" } // Open the abc.exe in the project folder. + * ``` + */ + runHandler: { serve?: string, open?: string, QRCode?: string, secure?: boolean, runInTerminal?: string }; + } + export interface IAssetThumbnail { + /** + * Generate a thumbnail for the asset. + * @param asset The asset to generate thumbnail for. + * @returns The thumbnail data. + * - String type: It is the absolute path of a png/jpg/svg file. + * - Buffer type: It is data encoded as png. The recommended size for the image is IEditorEnv.AssetThumbmail.imageSize + * - "source": Use the source image directly. + * - null: No thumbnail is generated. + */ + generate(asset: IAssetInfo): Promise; + + /** + * Destroy the thumbnail generator. + */ + destroy(): void; + } + + export interface IAssetSaver { + /** + * Called when a resource object is being saved. + * @param asset The asset to be saved. + * @param res The resource object to be saved. + */ + onSave(asset: IAssetInfo, res: any): Promise; + } + export interface IAssetProcessor { + /** + * Called before importing an image asset. + * @param assetImporter The asset importer. + */ + onPreprocessImage?(assetImporter: IImageAssetImporter): void | Promise; + + /** + * Called before importing an asset. + * + * Please note that only asset types with registered importers will trigger this callback before import; otherwise, it will not be triggered. For example, importing text files will not trigger it. + * @param assetImporter The asset importer. + */ + onPreprocessAsset?(assetImporter: IAssetImporter): void | Promise; + + /** + * Called after importing an image asset. + * @param assetImporter The asset importer. + */ + onPostprocessImage?(assetImporter: IImageAssetImporter): void | Promise; + + /** + * Called after importing an asset. + * + * Please note that only asset types with registered importers will trigger this callback after import; otherwise, it will not be triggered. For example, importing text files will not trigger it. + * @param assetImporter The asset importer. + */ + onPostprocessAsset?(assetImporter: IAssetImporter): void | Promise; + + /** + * Json files may have various usage, this method is used to recognize the real type of a json file, and return the type name as sub type. Return null if no special type is recognized. + * @param headText The first 200 characters of the json file. + * @param asset The json asset. + * @returns The type name as sub type. + * @example + * ``` + * onRecognizeJson(headText: string, asset: IAssetInfo): AssetType | string { + * if (headText.indexOf("\"skeleton\":") != -1 && headText.indexOf("\"spine\":") != -1) + * return IEditorEnv.AssetType.Spine; + * else + * return null; + * } + * ``` + */ + onRecognizeJson?(headText: string, asset: IAssetInfo): AssetType | string; + } + export interface IAssetPreview extends IOffscreenRenderSubmit { + /** + * A helper scene for rendering. + */ + readonly scene: IOffscreenRenderScene; + + /** + * A helper sprite for rendering. + */ + readonly sprite: Laya.Sprite; + + /** + * Derived class should implement this method to create the preview. + * @param asset The asset to be previewed. + * @returns Any data that can be used by the caller. + */ + setAsset(asset: IAssetInfo): Promise; + + /** + * Objects of this class are cached and reused, this method is called when a object is returned to the pool. + */ + onReset(): void; + + /** + * Change the shape of 3D object. + * @param shape The shape to be changed to. Such as "Box", "Sphere", "Cylinder", "Capsule", "Cone", "Plane". + */ + changeShape(shape: string): Promise; + + /** + * Set the light on or off. + * @param on True to turn on the light, false to turn off. + */ + setLight(on: boolean): void; + + /** + * Rotate the camera. + * @param x X axis movement. + * @param y Y axis movement. + */ + rotate(x: number, y: number): void; + + /** + * Destroy the preview. + */ + destroy(): void; + } + export interface IPackageInfo { + version: string; + displayName?: string; + resolved?: string; + dependencies: Record; + contributes?: any; + } + + export interface IAssetManager { + /** + * All assets in the project. The key is the asset id which is a UUID string. + */ + readonly allAssets: Readonly>; + + /** + * An asset that represents the root of the project. + */ + readonly rootAsset: IAssetInfo; + + /** + * Custom asset filters. + * @example + * ``` + * IEditorEnv.assetManager.customAssetFilters["myFilter"] = (asset: IAssetInfo)=> { + * return asset.name.startsWith("my"); + * }; + * ``` + */ + readonly customAssetFilters: Record; + + /** + * Notifies when an asset is changed. + */ + readonly onAssetChanged: IDelegate<(asset: IAssetInfo, flag: AssetChangedFlag) => void>; + + /** + * All packages in the project. The key is the package name. + */ + readonly packages: Readonly>>; + + /** + * All package names in the project. They are already sorted by dependencies. + */ + readonly packageNames: ReadonlyArray; + + /** + * Get all assets in the specified folder. + * @param folderAsset The folder asset. + * @param types The types of assets to get. If not specified, all types of assets will be returned. + * @param customFilter The custom filter to use. The filter should have been registered through the `IEditorEnv.assetMgr.customAssetFilters` method. + * @returns The assets. + */ + getAllAssetsInDir(folderAsset: IAssetInfo, types?: ReadonlyArray, customFilter?: string): Array; + + /** + * Get all folders named `resources` in the project. + */ + readonly resourceDirs: Readonly>; + + /** + * Get all assets in all `resources` folder. + * @param types The types of assets to get. If not specified, all types of assets will be returned. + * @param customFilter The custom filter to use. The filter should have been registered through the `IEditorEnv.assetMgr.customAssetFilters` method. + * @returns The assets. + */ + getAllAssetsInResourceDir(types?: ReadonlyArray, customFilter?: string): Array; + + /** + * Get children assets of the specified folder. + * @param folderAsset The folder asset. + * @param types The types of assets to get. If not specified, all types of assets will be returned. + * @param matchSubType Whether to return assets whose subtypes match the types parameter. + * @param customFilter The custom filter to use. The filter should have been registered through the `IEditorEnv.assetMgr.customAssetFilters` method. + * @returns The assets. + */ + getChildrenAssets(folderAsset: IAssetInfo, types: ReadonlyArray, matchSubType?: boolean, customFilter?: string): Array; + + /** + * Find assets by keyword. + * @param keyword The keyword to search. + * @param types The types of assets to get. If not specified, all types of assets will be returned. + * @param matchSubType Whether to return assets whose subtypes match the types parameter. + * @param customFilter The custom filter to use. The filter should have been registered through the `IEditorEnv.assetMgr.customAssetFilters` method. + * @param limit The maximum number of assets to return. Default is 5000. + * @returns The assets. + */ + findAssets(keyword: string, types?: ReadonlyArray, matchSubType?: boolean, customFilter?: string, limit?: number): Array; + + /** + * Find assets by keyword. + * @param keyword The keyword to search. + * @param types The types of assets to get. If not specified, all types of assets will be returned. + * @param options The options. + * @returns The assets. + */ + findAssets(keyword: string, types?: ReadonlyArray, options?: IFindAssetsOptions): Array; + + /** + * Filter a collection of assets. + * @param assetIds The asset ids to filter. + * @param types The types of assets to get. If not specified, all types of assets will be returned. + * @param matchSubType Whether to return assets whose subtypes match the types parameter. + * @param customFilter The custom filter to use. The filter should have been registered through the `IEditorEnv.assetMgr.customAssetFilters` method. + * @returns The assets. + */ + filterAssets(assetIds: ReadonlyArray, types?: ReadonlyArray, matchSubType?: boolean, customFilter?: string): Array; + + /** + * Get an asset by its id or path. + * @param idOrPath The id or path of the asset. + * @param allowResourcesSearch Whether to follow the resources search rules. + * @returns The asset. + * @example + * ``` + * IEditorEnv.assetManager.getAsset("12345678-1234-1234-1234-1234567890ab"); + * IEditorEnv.assetManager.getAsset("textures/texture.png"); //path is relative to the assets folder + * IEditorEnv.assetManager.getAsset("resources/textures/texture.png", true); //search in all resources folders + * ``` + */ + getAsset(idOrPath: string, allowResourcesSearch?: boolean): IAssetInfo; + + /** + * Get all assets of the specified types. + * @param types The types of assets to get. If not specified, all types of assets will be returned. + * @param matchSubType Whether to return assets whose subtypes match the types parameter. + * @returns The assets. + */ + getAssetsByType(types?: ReadonlyArray, matchSubType?: boolean): Array; + + /** + * Create a new asset with the specified path. If the asset already exists, throw an error when allowOverwrite is false. When allowOverwrite is true or null, return the existing resource. + * @param filePath The path of the asset. The path is relative to the assets folder. + * @param metaData The metadata of the asset. + * @param allowOverwrite Whether to allow overwriting the existing asset. Default is true. + * @returns The asset. + */ + createFileAsset(filePath: string, metaData?: any, allowOverwrite?: boolean): IAssetInfo; + + /** + * Create a new folder asset with the specified path. If the folder already exists, the existing folder asset will be returned. + * @param folderPath The path of the folder. The path is relative to the assets folder. + * @returns The asset. + */ + createFolderAsset(folderPath: string): IAssetInfo; + + /** + * Get shader asset by its shader name. Shader name may be different from the asset name. + * @param shaderName The name of the shader. + * @returns The shader asset. + */ + getShader(shaderName: string): IAssetInfo; + + /** + * Get all shader assets. The key is the shader name. + * @returns The shader assets. + */ + getAllShaders(): Record; + + /** + * Get i18n settings asset by id. + * @param id The id of the i18n settings. The id is not the asset id. + * @returns The asset. + */ + getI18nSettings(id: string): IAssetInfo; + + /** + * Get all i18n settings assets. The key is the i18n settings id. + * @returns The i18n settings assets. + */ + getAllI18nSettings(forGUI?: boolean): Record; + + /** + * Get asset type by file extension. + * @param ext The file extension. + * @returns The asset type. + * @example + * ``` + * IEditorEnv.assetManager.getAssetTypeByFileExt("png"); + * //=> AssetType.Texture + * ``` + */ + getAssetTypeByFileExt(ext: string): AssetType; + + /** + * Get file extensions by asset type. + * @param type The asset type. + * @returns The file extensions. + * @example + * ``` + * IEditorEnv.assetManager.getFileExtByAssetType(AssetType.Texture); + * //=> ["png", "jpg", "jpeg", "astc", "ktx", "ktx2", "dds", "pvr", "hdr", "tif", "tiff", "tga", "rendertexture"] + * ``` + */ + getFileExtByAssetType(type: AssetType): Array; + + /** + * Set metadata of the asset. + * + * The difference between setting meta data with this method and directly writing to the meta file is that this method will only trigger reimport when you modify the data in the importer section of the meta. Modifying other data will not trigger reimport. + * @param asset The asset. + * @param data The metadata. + */ + setMetaData(asset: IAssetInfo, data: any): Promise; + + /** + * Get absolute path of the asset. + * @param asset The asset. + * @returns The absolute path. + */ + getFullPath(asset: IAssetInfo): string; + + /** + * Convert a relative path to a absolute path. + * @param path The relative path to the assets folder. + * @returns The absolute path. + */ + toFullPath(path: string): string; + + /** + * Convert the path to the relative path. + * @param path The path, which is absolute. + * @returns The relative path to the assets folder, or if it is in internal folders, prefix with `~/`. + */ + toRelativePath(path: string): string; + + /** + * Get absolute path of the scene file of a prefab. + * @param asset The prefab asset. + * @returns The absolute path of the scene file. + * @example + * ``` + * IEditorEnv.assetManager.getPrefabSourcePath(aFbxAsset); + * //=> "/path/to/project/library/0a/0a0a0a0a-0a0a-0a0a-0a0a-0a0a0a0a0a0a.lh" + * ``` + */ + getPrefabSourcePath(asset: IAssetInfo): string; + + /** + * Import an asset. + * @param asset The asset to import. + * @param args Additional arguments for the importer. + */ + importAsset(asset: IAssetInfo, args?: ReadonlyArray): void; + + /** + * Unpack a model asset. A model asset is a FBX, glTF, or other model file. + * + * The files in the model will be extracted to a folder named model name + "-unpacked", and this folder will be in the same directory as the model file. + * @param asset The model asset. + */ + unpackModel(asset: IAssetInfo): Promise; + + /** + * Read metadata of the asset. + * @param asset The asset. + * @returns The metadata. + */ + readMeta(asset: IAssetInfo): any; + + /** + * Write metadata of the asset. + * @param asset The asset. + * @param meta The metadata. + */ + writeMeta(asset: IAssetInfo, meta: any): void; + + /** + * Write metadata of the asset asynchronously. + * @param asset The asset. + * @param meta The metadata. + */ + writeMetaAsync(asset: IAssetInfo, meta: any): Promise; + + /** + * Whether the asset manager is busying with importing assets. + */ + get busy(): boolean; + + /** + * If there is an ongoing import task, wait for the import task to complete. + */ + flushChanges(): Promise; + } + export interface IAssetImporterOptions { + /** + * Importer version. This is used to handle the compatibility of the importer. + * + * If the importer is changed, the version should be increased. Then the engine will call the importer to re-import the asset. + */ + version?: number; + + /** + * Execution order of the importer. The lower the value, the earlier the importer runs. Default is 0. + * + * Suggestions: If the importer depends on other importers, set the value to a higher number. + */ + sortingOrder?: number; + + /** + * A positive number used to calculate the progress of the importer. The higher the value, the more time the importer takes. Default is 1. + */ + weight?: number; + + /** + * How many tasks of this importer can be executed in parallel. Default is 100. + */ + numParallelTasks?: number; + } + + export interface IAssetImporter { + /** + * The asset to be imported. + */ + readonly asset: IAssetInfo; + + /** + * The parent asset of the asset to be imported. + */ + readonly parentAsset: IAssetInfo; + + /** + * If the asset has any sub-assets, store them here. + */ + readonly subAssets: ReadonlyArray; + + /** + * Absolute path of the asset. + */ + readonly assetFullPath: string; + + /** + * Whether the asset is a new imported asset. If false, the asset is in a re-import process. + */ + readonly isNewAsset: boolean; + + /** + * The metadata of the asset. + */ + readonly metaData: Record; + + /** + * The settings of the asset, which is defined in the section of "importer" in the asset's meta file. + */ + readonly settings: Record; + + /** + * Additional arguments for the importer. + */ + readonly importArgs: ReadonlyArray; + + /** + * Get a absolute path of which the sub-asset is saved. + */ + readonly subAssetLocation: string; + + /** + * If you need a temporary directory, use this path. + */ + readonly tempPath: string; + + handleImport(): Promise; + + /** + * If you need to create a sub-asset, call this method in the very beginning to cleanup the last generated files. + */ + clearLibrary(): void; + + /** + * Create a sub-asset. + * @param fileName File name of the sub-asset. e.g. "texture.png" + * @param id ID of the sub-asset. The ID is unique within the sub-assets of the asset. Commonly you dont need to provide this value, it will be generated automatically. + * @returns The sub-asset info. + */ + createSubAsset(fileName: string, id?: string): ISubAssetInfo; + + /** + * Create a asset in the asset library. + * @param filePath A path relative to the assets folder. + * @param metaData Metadata of the asset. + * @returns The asset info. + */ + createAsset(filePath: string, metaData?: any): IAssetInfo; + + /** + * Set sub type of the asset. + * + * Some assets have a type and a sub type. Such as a json asset has a type of `Json` and a sub type of `Spine` if it is a description file of spine. + * @param value sub type of the asset. + */ + setSubType(value: AssetType | string): void; + + /** + * If this asset can generate types, call this method to register them. + * + * Only last call of this method will take effect. + * @param types The types to be registered. + */ + addTypesToRegistry(types: ReadonlyArray): void; + + /** + * Set shader name of the asset. If multiple assets have the same shader name, the first one will be used. + * @param shaderName The name of the shader. + * @param typeDef The type definition of the shader. + */ + setIsShader(shaderName: string, typeDef: FTypeDescriptor): void; + + /** + * Get the path relative to the assets folder by the asset ID. + * @param assetId + * @returns The path relative to the assets folder. + */ + getAssetPathById(assetId: string): string; + + /** + * Find an asset by a relative path, starting from the folder where the current asset is located. Null if not found. + * @param filePath A relative path. + * @param predicate An optional filter function. + * @returns The asset info. + * @example + * ``` + * let asset = this.findAsset("textures/texture.png"); + * ``` + */ + findAsset(filePath: string, predicate?: (asset: IAssetInfo) => boolean): IAssetInfo; + + /** + * Report the progress of the importer. The value should be between 0 and 100. + * @param progress The progress value. The value should be between 0 and 100. + */ + setProgress(progress: number): void; + } + + export interface IImageAssetImporter extends IAssetImporter { + /** + * Texture settings. + */ + readonly settings: ITextureSettings; + } + export interface IAssetExporterOptions { + /** + * If a exporter has this flag set to true, assets handled by this exporter will not be exported, and the handleExport method will not be called. + */ + exclude?: boolean; + } + + export interface IAssetExporter { + /** + * The asset to be exported. + */ + readonly asset: IAssetInfo; + + /** + * Get the parent asset of the current asset. + */ + readonly parentAsset: IAssetInfo; + + /** + * Some file extensions cannot be used due to restrictions of mini-game platforms or servers. + * Here you can set up a mapping table to map the original extensions to new extensions. + * @example + * ``` + * this.fileExtensionOverrides["abc"] = "abc.json"; + * ``` + */ + readonly fileExtensionOverrides: Record; + + /** + * A object that contains the export information. + */ + readonly exportInfo: IAssetExportInfo; + + /** + * Used to log messages. + */ + readonly logger: ILogger; + + /** + * Used to analyze the prefab data. + */ + readonly prefabDataAnalyzer: IPrefabDataAnalyzer; + + /** + * Global export options. + */ + readonly toolOptions: IExportAssetToolOptions; + + /** + * Handle the export of the asset. + */ + handleExport(): Promise; + } + export type FEnumDescriptor = { + name: string, + value: any, + extend?: FEnumDescriptor, + [index: string]: any, + }[] | any[] | string; + + export type WorldType = "2d" | "3d" | "gui" | null; + export type FPropertyType = string | [FPropertyType] | ["Record", FPropertyType]; + + /** + * Property descriptor. + */ + export interface FPropertyDescriptor { + /** + * Property name + */ + name: string; + /** + * Property type. + * Basic types include: number, string, boolean, any. + * Composite types include: arrays, expressed as [number]; dictionaries, expressed as ["Record", number], where the first element is fixed as "Record" and the second element is the actual type. + * Other names are types registered in the typeRegistry. + * If type is not provided, it means it is only used for UI display and does not correspond to actual data. + */ + type?: FPropertyType; + + /** + * The initial value of this property in the prototype. This value is also used for comparison during serialization; if they are the same, this property will not be serialized. Therefore, it is essential to ensure that the value set here is the initial value of the variable in the class. + */ + default?: any; + + /** + * Dislay title. If not provided, the name will be used. + * + * Use "i18n:<key>" or "i18n:<file-id>:<key>" to specify the key of the internationalization string. + */ + caption?: string; + + /** + * Whether to hide the title. Default is "normal". + * - normal: display the title. + * - hidden: hide the title, but the title will still occupy space. + * - none: hide the title and the space it occupies. + */ + captionDisplay?: "normal" | "hidden" | "none"; + + /** + * Tooltip text. + */ + tips?: string; + + /** + * A catalog is a composite display control in the Inspector, featuring a title bar and a content area that can be collapsed by clicking the title bar. + * + * Setting the same catalog value for multiple properties will display them within the same catalog. + */ + catalog?: string; + + /** + * This is a URL value. When set, a help button will appear on the right side of the Catalog's title bar, which opens this URL when clicked. + */ + catalogHelp?: string; + + /** + * Text displayed on the catalog title bar. Defaults to using the catalog name. + * + * Use "i18n:<key>" or "i18n:<file-id>:<key>" to specify the key of the internationalization string. + */ + catalogCaption?: string; + + /** + * Display order of the catalog. The smaller the value, the earlier it is displayed. If not provided, it follows the order of the properties. + */ + catalogOrder?: number; + + /** + * Inspector for editing this property. Built-in inspectors include: + * - number : Number input. + * - string : String input. Defaults to single-line input; if multiline is needed, activate the multiline option. + * - boolean : Checkbox. + * - color : A color box + color palette + color picker. + * - vec2 : Combination of XY inputs. + * - vec3 : Combination of XYZ inputs. + * - vec4 : Combination of XYZW inputs. + * - asset : Resource selector. + * - gradient : Gradient editor. + * - curve : Curve editor. + * - matrix3 : 3x3 matrix inputs. + * - matrix4 : 4x4 matrix inputs. + * - TabBar : Tab control. Display properties grouped in different Tab pages. + * - Group : Make a group of properties with an indent and collapsible. + * - RadioGroup : Display the captions of multiple properties using a dropdown box and select the property whose current value is true. The property value is converted to a boolean using `!!`. + * - Info : Display a text block, useful for displaying help information. + * - Buttons : Display a button or several buttons. + * - File : File or directory selector. + * + * Generally, this option does not need to be set, as the editor will automatically choose the appropriate control based on the property type. However, in some cases, it may be necessary to forcefully specify it. + * For example, if the data type is Vector4 but it actually represents a color, using the default control for editing Vector4 is not suitable, and it needs to be set to "color" here. + * + * Explicitly setting inspector to null will not construct an inspector for the property. This is different from setting hidden to true. Hidden being true means the inspector is created but not visible, + * while inspector being null means it is not created at all. + */ + inspector?: string; + + /** + * A boolean value or a function or an expression that determines whether this property is hidden. + * + * boolean: True means hidden, false means visible. + * + * string: For example, "!data.a && !data.b" means that this property is hidden when both properties a and b are empty. There are two implicit variables: data, which is the current data, and field, which is the IPropertyField interface. + * + * function: A function to do the test. + */ + hidden?: boolean | string | ((data: any, field: IPropertyField) => boolean); + + /** + * A boolean value or a function or an expression that determines whether this property is read-only. + * + * boolean: True means read-only, false means writable. + * + * string: For example, "!data.a && !data.b" means that this property is read-only when both properties a and b are empty. There are two implicit variables: data, which is the current data, and field, which is the IPropertyField interface. + * + * function: A function to do the test. + */ + readonly?: boolean | string | ((data: any, field: IPropertyField) => boolean); + + /** + * A function or an expression that validates the property value. + * + * string: For example, "data.a". If data.a is a string, it indicates validation failure, and this string is displayed as an error message; if it is not a string, it indicates validation success. + * There are three implicit variables: data, which is the current data; value, which is the current user input value; and field, which is the IPropertyField interface. + * + * function: A function to do the test. If the return value is a string, it indicates validation failure, and this string is displayed as an error message; if it is not a string, it indicates validation success. + */ + validator?: string | ((data: any, value: any, field: IPropertyField) => any); + + /** + * A boolean value or a function or an expression that determines whether this property is required. + * + * boolean: True means required, false means optional. + * + * string: For example, "!!data.a". If !!data.a is true, it indicates that this property is required. + * + * function: A function to do the test. + */ + required?: boolean | string | ((data: any, value: any, field: IPropertyField) => boolean); + + /** + * Whether the property is serializable. If false, the property will not be serialized. Default is true. + */ + serializable?: boolean; + /** + * When the property does not participate in serialization, if its data may be affected by another serializable property, fill in the name of other property here. + * + * This is usually used to determine whether the prefab property is overridden. + */ + affectBy?: string; + + /** + * Whether the text input is multiline. Default is false. + */ + multiline?: boolean; + + /** + * Whether the input is a password. Default is false. + */ + password?: boolean; + + /** + * If true, the text input will trigger a submit event with each character typed; otherwise, it will only submit when it loses focus. Default is false. + */ + submitOnTyping?: boolean; + + /** + * If the property is of type string, this is the placeholder text for the input field; if it is of type boolean, this is the title for the checkbox. Default is empty. + */ + prompt?: string; + + /** + * Applicable to string type, indicating that the text supports multiple languages. In this case, the text input box will add the function of selecting the language key value. Default is false. + */ + multiLanguage?: boolean; + + /** + * The property will be displayed as a dropdown for the user to select from, and this is the data source for the dropdown. + * + * The property can be of type number or string. If it is of type number, it represents the index of the data source; if it is of type string, it represents the value of the data source. + * + * The data source can take various forms: + * - An array of strings: e.g., ["a", "b", "c"]. + * - An array of objects: e.g., [{name: "A", value: "a"}, {name: "B", value: "b"}]. + * - A string: This represents the name of another property, whose value is an array of strings or objects. Using this method, cascading dropdowns can also be achieved. + * + * Example of cascading dropdowns 1: + * ``` + * { + * name: "province", + * type: "string", + * enumSource: [ + * { name: "Guangdong", value: "gd", extend: [ + * { name: "Guangzhou", value: "gz" }, + * { name: "Shenzhen", value: "sz" } + * ]}, + * + * { name: "Hunan", value: "hn", extend: [ + * { name: "Changsha", value: "cs" }, + * { name: "Xiangtan", value: "xt" } + * ]} + * ] + * }, + * + * { + * name: "city", + * type: "string", + * enumSource: "province" + * }, + * ``` + * In this way, when Guangdong is selected for province, the dropdown for city will only have Guangzhou and Shenzhen. + * + * Example of cascading dropdowns 2: + * ``` + * { + * name: "province", + * type: "string", + * enumSource: [ + * { name: "Guangdong", value: "gd", + * city: [ + * { name: "Guangzhou", value: "gz" }, + * { name: "Shenzhen", value: "sz" } + * ], + * river: [ + * { name: "Pearl River", value: "pr" }, + * { name: "Dongjiang River", value: "dj" } + * ] + * }, + * + * { name: "Hunan", value: "hn", + * city: [ + * { name: "Changsha", value: "cs" }, + * { name: "Xiangtan", value: "xt" } + * ], + * river: [ + * { name: "Xiangjiang River", value: "xj" }, + * { name: "Zijiang River", value: "zj" } + * ] + * } + * ] + * }, + * + * { + * name: "city", + * type: "string", + * enumSource: "province" + * }, + * + * { + * name: "river", + * type: "string", + * enumSource: "province" + * } + * ``` + * In this way, when Guangdong is selected for province, the dropdown for city will only have Guangzhou and Shenzhen, and the dropdown for river will only have Pearl River and Dongjiang River. + */ + enumSource?: FEnumDescriptor; + + /** + * Hide this property when the data source is empty. + */ + hideIfEnumSourceEmpty?: boolean; + + /** + * Whether to reverse the boolean value. For example, when the property value is true, the UI renders it as false. + */ + reverseBool?: boolean; + + /** + * Whether null values are allowed. Default is true. Sometimes it is necessary to explicitly set it to true, e.g. to display a checkbox for a color/vec2/vec3/vec4 inspector to determine whether the property value is null. + */ + nullable?: boolean; + + /** + * For a property that can switch between null and non-null, when switching from a null value to a non-null value, the value here will be used. + */ + nonNullDefault?: any; + + /** + * Minimum value for numbers. Default is -Infinity. + */ + min?: number; + + /** + * Maximum value for numbers. Default is Infinity. + */ + max?: number; + + /** + * Range of values, equivalent to setting min and max at once. + */ + range?: [number, number]; + + /** + * The amount by which the value changes each time when changing the value by dragging. Default is 0.01. + * + * If fractionDigits is set, the step will be adjusted to 1 / 10 ^ fractionDigits if it is less than that value. + */ + step?: number; + + /** + * Number of decimal places. Default is 3. + */ + fractionDigits?: number; + + /** + * Display the number as a percentage, for example, 0.01 will be displayed as 1%. Default is false. + */ + percentage?: boolean; + + /** + * Applicable to array type properties. Indicates that the array is of fixed length. Default is false. + */ + fixedLength?: boolean; + + /** + * Applicable to array type properties. If not provided, it means all operations are allowed on the array; if provided, only the listed operations are allowed. + * - append: Add an element to the end of the array. + * - insert: Insert an element at a specified position. + * - delete: Delete an element. + * - move: Move an element to a specified position. + */ + arrayActions?: Array<"append" | "insert" | "delete" | "move">; + + /** + * Applicable to array or dictionary type properties. Here you can define the properties of array/dictionary elements. + */ + elementProps?: Partial; + + /** + * Applicable to dictionary type properties. Indicates that the dictionary uses a specified set of fixed key values. + */ + fixedKeys?: Array; + + /** + * Applicable to color type properties. Indicates whether to provide transparency (alpha) value modification. For properties of type string or Color, the default is true; for properties of type number, the default is false. + */ + showAlpha?: boolean; + + /** + * @deprecated Use 'nonNullDefault' instead. + */ + defaultColor?: any; + + /** + * @deprecated Explicitly set 'nullable' to true to display a checkbox. + */ + colorNullable?: boolean; + + /** + * Applicable to color type properties. When storing hexadecimal color values, this property determines the position of each channel. If the color value does not include an alpha channel, the default value is 'rgb'; if it does, the default value is 'argb'. + */ + colorFormat?: 'rgb' | 'argb' | 'abgr'; + + /** + * Applicable to object type properties. If true, hides the object's title, and the display indentation of the object's properties will be reduced by one level. + * + * ``` + * UI demonstration when hideHeader is false: + * + Object + * Property1 + * Property2 + * + * UI demonstration when hideHeader is true: + * Property1 + * Property2 + * ``` + */ + hideHeader?: boolean; + + /** + * Applicable to object type properties. Allows selecting a type from a dropdown menu when creating an object. + * + * If explicitly set to null, the menu is disabled. By default, a menu for creating the base class is displayed. + * + * There are two ways to customize the menu: + * - Array: The array contains the names of the types that can be created. If any type name ends with "*"", the array will include all derived classes of that type. + * - Function: The function is responsible to do anything you want. + */ + createObjectMenu?: Array | ((sender: gui.Widget, field: IPropertyField, insertIndex?: number) => void); + + /** + * Applicable to object type properties. Indicates that this property type has struct-like behavior, meaning it is always used as a whole. + * For example, if the value of property b of object obj is a1, and a1 is an instance of type T with structLike set to true, then when a1's properties change, the editor will simultaneously call obj.b = a1. + * The default is false. + */ + structLike?: boolean; + + /** + * Indicates that this property references an asset. + */ + isAsset?: boolean; + + /** + * Applicable to asset type properties. Multiple asset types are separated by commas, such as "Image,Audio". Refer to IEditor.AssetType for available values. + */ + assetTypeFilter?: string; + + /** + * If isAsset is true and property is of type string, this option determines whether the property value is the original path of the asset or in the format res://uuid. If true, it is the original path of the asset. The default is false. + */ + useAssetPath?: boolean; + + /** + * Applicable to asset type properties. Indicates whether internal assets can be selected. Default is true. + */ + allowInternalAssets?: boolean; + + /** + * Applicable to asset type properties. Indicates whether GUI assets can be selected. Default is false. + */ + allowInternalGUIAssets?: boolean; + + /** + * Applicable to asset type properties. Allows setting a custom filter. The filter needs to be registered through EditorEnv.assetMgr.customAssetFilters. + */ + customAssetFilter?: string; + + /** + * Applicable to properties of type Node or Component. It sets an alternative property name. During serialization, the node's serialized data will be saved to the specified property, and the node itself will no longer be serialized into its parent node tree. During deserialization, the opposite operation is performed. + * + * @example + * ``` + * { + * name: "itemNode", + * type: "Sprite", + * toTemplate: "itemNodeData" + * }, + * + * { + * name : "itemNodeData", + * type : "any", + * } + * + * ``` + */ + toTemplate?: string; + + /** + * Indicates whether the property is writable. The default is true. If set to false, the property is read-only. + * + * This usually refers to a property that has only a getter and no setter. + */ + writable?: boolean; + + /** + * By default, properties are arranged in the order they are defined, but this can be adjusted through this option. + * - first: The property is displayed at the beginning. + * - last: The property is displayed at the end. + * - before xxx: The property is displayed before the specified property. + * - after xxx: The property is displayed after the specified property. + */ + position?: string; + + /** + * Adds indentation, measured in levels, not pixels. + */ + addIndent?: number; + + /** + * Default collapsed state of child properties. + */ + collapsed?: boolean; + + /** + * Indicates that the property is private. Private properties are not displayed in the Inspector but are serialized. Unlike inspector=null, private data is not transferred from the scene process to the UI process. + */ + "private"?: boolean; + + /** + * If true, the property is always written during serialization. Otherwise, it is compared with the default value, and if they are the same, it is not written. Default is false. + */ + forceWriteDefault?: boolean; + + /** + * If true, the root node of the prefab instance will always write this property during serialization, regardless of whether it is overridden. This also means that this property will not appear in the override list. Default is false. + */ + forceWriteInPrefabRoot?: boolean; + + /** + * Indicates that this property is not written to the prefab file when it is the root node of the prefab template. Default is false. + */ + forInstanceOnly?: boolean; + + /** + * Indicates whether the property can be edited in multi-selection mode. Default is true. + */ + allowMultipleObjects?: boolean; + + /** + * Indicates that the property is not displayed in the property list of derived classes. Default is false. + */ + hideInDeriveType?: boolean; + + /** + * Indicates that the property is not allowed to reset to default by the "Reset Default" menu. Default is false. + */ + disableReset?: boolean; + + /** + * Calls an additional function of the object when the property changes. This is the function name. + * The function prototype is func(key?:string):void. The key is passed when changing internal properties of a member. + * For example, when changing an element of an array, the key is the index of the element, and when changing a element of a dictionary, the key is the key of the element. + */ + onChange?: string; + + /** + * Additional options. The meaning of these options depends on the inspector used. + */ + options?: Record; + } + + export type CatalogBarStyle = "normal" | "hidden" | "transparent"; + + /** + * Type descriptor. + */ + export interface FTypeDescriptor { + /** + * Type name. + */ + name: string; + + /** + * Help document URL. + */ + help?: string; + + /** + * Title. If not provided, the name will be used. + */ + caption?: string; + + /** + * If provided, the type will be displayed as a menu item in the specified menu. + * + * If the type is a component, the type will be displayed in the "Add Component" dialog. + * + * If the type is a node, the type will be displayed in the context menu of the hierarchy panel. + * + * If the type is a component and the inHierarchyMenu option is set to true, the type will be displayed in the context menu of the hierarchy panel. + * + * Use a comma and a number to specify the position of the menu item. For example, "2D,0" means the first item in the "2D" menu. + * + * It can also be an i18n key, such as "i18n:MyKey", in this case, the menu id will be the value of the key, and the menu label will be the translation of the key. + * + * @example + * ``` + * menu: "2D" + * menu: "2D,0" + * menu: "i18n:MyKey" + * ``` + */ + menu?: string; + + /** + * When this type is clicked in the menu to create a new node, the name of the new node. + */ + newNodeName?: string; + + /** + * Icon of the type. Images are generally placed in the editorResources directory or its subdirectories, and then referenced using a path starting from editorResources, such as "editorResources/my-plugin/icon.png". + */ + icon?: string; + + /** + * Script path. The value if not empty only if the type is registered by a typescript file. + */ + scriptPath?: string; + + /** + * Indicates that this type has struct-like behavior, meaning it is always used as a whole. + * + * For example, if the value of property b of object obj is a1, and a1 is an instance of type T with structLike set to true, then when a1's properties change, the editor will simultaneously call obj.b = a1. + * + * The default is false. + */ + structLike?: boolean; + + /** + * Base class name. It must be a type in the typeRegistry. + */ + base?: string; + + /** + * An object that contains the initial values of the properties. + * + * This initial value only takes effect when the object is manually created from the UI. + */ + init?: any; + + /** + * Property definitions. + */ + properties: Array; + + /** + * Inspector for editing this type. + * + * Generally, this option does not need to be set, as the editor will automatically choose the appropriate control based on the type. However, in some cases, it may be necessary to forcefully specify it. + */ + inspector?: string; + + /** + * Whether it is an engine symbol. Default is false. + * + * In the language settings of the preferences, if "Do not translate engine symbols" is checked, types with this option set to true will not be localized. + */ + isEngineSymbol?: boolean; + + /** + * Whether it is an asset reference. Default is false. + */ + isAsset?: boolean; + + /** + * Effective when isAsset is true. Multiple asset types are separated by commas, such as "Image,Audio". Refer to IEditor.AssetType for available values. + */ + assetTypeFilter?: string; + + /** + * Effective when isAsset is true. When an instance of the asset is referenced by a field in the inspector, setting it to true allows the properties of the resource to be displayed inline. Similar to the display effect of materials. Default is false. + */ + allowInpectInline?: boolean; + + /** + * Applicable to Component, whether it is allowed to execute in the Editor. Default is false. + */ + runInEditor?: boolean; + + /** + * Applicable to Component, whether it is allowed to add this type of component multiple times to the same node. Default is false. + */ + allowMultipleComponent?: boolean; + + /** + * Applicable to Component, when AddComponent is used, it also adds dependent Components. + */ + requireComponents?: Array; + + /** + * Applicable to Component, when true, it hides the enable checkbox and disables the "Remove Component" menu item. + */ + noRemoveComponent?: boolean; + + /** + * Indicates whether this type belongs to 3D or 2D. For example, if it is a 3D type, it will not be displayed in the menu of a 2D scene. + * - 2d: 2D type. + * - 3d: 3D type. + * - gui: Editor GUI type. + * - null: No restrictions. + */ + worldType?: WorldType; + + /** + * If true, and the menu attribute is defined, this component will also appear in the new object menu of the hierarchy panel. + */ + inHierarchyMenu?: boolean; + + /** + * For use with Node and Component. When creating a new Node or adding a Component, automatically add the dependent engine libraries. For example: ["laya.physics3D"] + */ + requireEngineLibs?: Array; + + /** + * Catalog bar style. Use `Hidden` to hide the catalog bar. Default is `normal`. + * - `normal`: Normal style. + * - `hidden`: Hide the catalog bar. + * - `transparent`: Show the catalog bar without the background. + */ + catalogBarStyle?: CatalogBarStyle; + + /** + * A translation strings collection for localization of the captions. + */ + captionTranslation?: Record; + + /** + * A translation strings collection for localization of the tips. + */ + tipsTranslation?: Record; + + /** + * Additional options. The meaning of these options depends on the inspector used. + */ + options?: Record; + } + + export interface IPropertyButtonsOptions { + /** + * Whether to display the caption of property buttons. Default is "hidden". + */ + showCaption?: boolean | "normal" | "hidden" | "none"; + /** + * Alignment of the button list. Default is "left". + */ + align?: "left" | "center" | "right" | gui.AlignType; + /** + * Padding of the button list. The order is [top, right, bottom, left]. + */ + padding?: [number, number, number, number]; + /** + * Additional space between buttons. Default is 0. + */ + spacing?: number; + /** + * Button list. + */ + buttons: Array; + } + + export interface IPropertyButtonInfo { + /** + * Button name. + */ + name?: string; + + /** + * Button caption. If not provided, the name will be used. + * + * Use "i18n:<key>" or "i18n:<file-id>:<key>" to specify the key of the internationalization string. + */ + caption?: string; + + /** + * Button tips. + */ + tips?: string; + + /** + * If this is defined, a event with this name will be emitted when the button is clicked. + * + * The event is bubbling, and you can get the button object through event.initiator. + */ + event?: string; + + /** + * If this is defined, a scene script will be executed when the button is clicked. + * + * The script is executed by Editor.scene.runScript. + */ + runScript?: string; + + /** + * If this is defined, a node script will be executed when the button is clicked. + * + * The script is executed by Editor.scene.runnNodeScript. + */ + runNodeScript?: string; + + /** + * Bind a hotkey to the button. + */ + sceneHotkey?: string; + } + /** + * Asset type + */ + export enum AssetType { + Unknown = 0, + Folder, + Image, + Scene, + Prefab, + Material, + Mesh, + Model, + TypeScript, + JavaScript, + ShaderScript, + WebAssembly, + ScriptBundleDefinition, + Json, + Text, + XML, + Binary, + BitmapFont, + TTFFont, + Audio, + Video, + Shader, + ShaderBlueprint, + ShaderBlueprintFunction, + Blueprint, + Blackboard, + BlueprintTree, + AnimationClip, + AnimationClip2D, + AnimationController, + AnimationController2D, + Cubemap, + AvatarMask, + LightingSettings, + RenderTexture, + Atlas, + AtlasConfig, + Skeleton, + Spine, + GUIPrefab, + + FairyGUIPackage, + LensFlareData, + Texture2DArray, + + SVGImage, + I18nSettings + } + + /** + * Asset flags + */ + export enum AssetFlags { + /** + * Readonly asset + */ + Readonly = 0x1, + /** + * Sub asset. Sub assets are assets that are part of another asset. Such as a fbx file that contains multiple meshes or materials. + */ + SubAsset = 0x2, + /** + * Internal asset. Internal assets are stored in the IDE's internal installation directory and are read-only. + */ + Internal = 0x100, + /** + * Memory asset. Memory assets are not stored on disk and are only available in memory. + */ + Memory = 0x200, + /** + * No database cache. The asset is not cached in the database. + */ + NoDbCache = 0x400, + /** + * The asset is not visible to the user. + */ + Hidden = 0x800, + /** + * The asset is a temporary asset. Temporary assets are not saved to disk. + */ + Temp = 0x1000, + /** + * The asset is inside the `packages` folder. + */ + Packages = 0x2000, + /** + * The asset is top level asset of the project. + */ + ProjectLayoutFolder = 0x4000, + /** + * The asset is hidden in all assets view. + */ + InternalGUI = 0x8000, + /** + * The asset is a built-in asset. + */ + BuiltIn = 0x10000, + } + + /** + * Asset changed flag + */ + export enum AssetChangedFlag { + Modified = 0, + New = 1, + Deleted = 2, + Moved = 3 + } + + /** + * Asset script type + */ + export enum AssetScriptType { + /** + * Not a special script. The asset is not a typescript file or a typescript file that has no special decorators. + */ + None = 0, + /** + * A script that has Laya's `@regClass` decorators. + */ + Runtime = 1, + /** + * A script that has decorators with prefix `@IEditorEnv`. + */ + Scene = 2, + /** + * A script that has decorators with prefix `@IEditor`. + */ + Editor = 4, + /** + * A script is a javascript file. + */ + Javascript = 8 + } + + /** + * Asset Infomation + */ + export interface IAssetInfo { + /** + * Asset id + */ + id: string; + /** + * Asset name + */ + name: string; + /** + * Asset file name, including extension. + */ + fileName: string; + /** + * Asset file path, relative to the assets folder. + */ + file: string; + /** + * Asset extension, excluding the dot. + */ + ext: string; + /** + * Asset type + */ + type: AssetType; + /** + * Asset sub type. Some assets have a type and a sub type. Such as a json asset has a type of `Json` and a sub type of `Spine` if it is a description file of spine. + */ + subType: string; + /** + * Asset version + */ + ver: number; + /** + * Parent asset id + */ + parentId: string; + /** + * If the asset has children, only meaningful for folders and some special assets like fbx. + */ + hasChild: boolean; + /** + * Asset flags + */ + flags: number; + /** + * Asset script type + */ + scriptType: AssetScriptType; + /** + * Children assets. + */ + children: ReadonlyArray; + } + + /** + * Sub asset information. Sub assets are assets that are part of another asset. Such as a fbx file that contains multiple meshes or materials. + */ + export interface ISubAssetInfo { + /** + * Sub asset id + */ + readonly id: string; + /** + * Sub asset name + */ + readonly fileName: string; + /** + * Sub asset absolute path + */ + readonly fullPath: string; + } + + /** + * Custom asset filter. Can be used to register custom asset filters through the `IEditorEnv.assetMgr.customAssetFilters` method. + */ + export interface IAssetFilter { + /** + * Check if the asset should be included in the asset list. + * @param asset The asset to check. + * @returns `true` if the asset should be included, `false` otherwise. + */ + (asset: IAssetInfo): boolean; + } + + export interface IFindAssetsOptions { + /** + * Whether to match the sub type. Some assets have a type and a sub type. Such as a json asset has a type of `Json` and a sub type of `Spine` if it is a description file of spine. + */ + matchSubType?: boolean; + + /** + * The custom filter. Developers can register custom filters by calling the `IEditorEnv.assetMgr.customAssetFilters` method in scene process. + */ + customFilter?: string; + + /** + * Whether to ignore the internal assets. The default value is true. + */ + ignoreInternalAssets?: boolean; + + /** + * Whether to ignore the internal GUI assets. The default value is true. + */ + ignoreInternalGUIAssets?: boolean; + + /** + * The maximum number of assets to return. The default value is 5000. + */ + limit?: number; + } + /** + * Interface for the configuration file. + */ + export interface IConf { + /** + * Set the value of the key. + * @param key + * @param value + */ + set(key: string, value: any): void; + + /** + * Get the value of the key. + * @param key + * @param defaultValue + */ + get(key: string, defaultValue?: any): any; + + /** + * Release the resources. + */ + dispose(): void; + + /** + * Save the configuration. + */ + save(): void; + } + /** + * Interface for configuration objects. + */ + export interface IConfigObject { + [index: string]: any, + + /** + * Get the value of the key. + * @param key key. + * @param defaultValue If the key does not exist, return the default value. + * @returns The value of the key. + */ + get(key: string, defaultValue?: any): any; + + /** + * Get the number value of the key. + * @param key key. + * @param defaultValue If the key does not exist, return the default value. + * @returns The number value of the key. + */ + getNumber(key: string, defaultValue?: number): number; + + /** + * Get the boolean value of the key. + * @param key key. + * @param defaultValue If the key does not exist, return the default value. + * @returns The boolean value of the key. + */ + getBool(key: string, defaultValue?: boolean): boolean; + + /** + * Get a section. + * @param key name of the section. + * @returns The section. + */ + getSection(key: string): IConfigObject; + + /** + * Set the value of the key. + * @param key key. + * @param value value. + */ + set(key: string, value: any): void; + + /** + * Delete the key. + * @param key key. + */ + delete(key: string): void; + + /** + * Clear all keys. + */ + clear(): void; + + /** + * Copy data from another object. + * @param data The data to copy from. + */ + copyFrom(data: any): void; + } + /** + * Interface for the crypto utils + */ + export interface ICryptoUtils { + /** + * Create a MD5 hash. + * @param data The data to create hash. + * @param algorithm The algorithm to use. Default is md5. + * @returns The hash. + */ + createHash(data: string, algorithm?: 'md5' | 'sha1' | 'sha256' | 'sha512'): string; + + /** + * Create a MD5 hash for a file. + * @param path file absolute path. + * @param algorithm The algorithm to use. Default is md5. + * @returns The hash. + */ + createFileHash(path: string, algorithm?: 'md5' | 'sha1' | 'sha256' | 'sha512'): Promise; + + /** + * Encrypt data with AES. + * @param data data to encrypt. + * @param key The key. + * @returns The encrypted data. + */ + encryptAES(data: string, key: string): string; + + /** + * Decrypt data with AES. + * @param encrypted The encrypted data. + * @param key The key + * @returns The decrypted data. + */ + decryptAES(encrypted: string, key: string): string; + } + /** + * A delegate that can be used to manage multiple callbacks. + */ + export interface IDelegate any> { + /** + * By default, callbacks will be executed directly. Unless this property is set, the delegate will use this method to execute the callback. + * @param method The method to execute. + * @param thisArg The this argument of the method. + * @param args The arguments of the method. + */ + executor: (method: Function, thisArg: any, ...args: any[]) => void; + + /** + * Add a callback. + * @param callback The callback to add. + * @param target The this argument of the callback. + */ + add(callback: T, target?: any): void; + + /** + * Add a run-once callback. + * @param callback The callback to add. + * @param target The this argument of the callback. + */ + once(callback: T, target?: any): void; + + /** + * Remove a callback. + * @param callback The callback to remove. + * @param target The this argument of the callback. + */ + remove(callback: T, target?: any): void; + + /** + * Clear all callbacks. + */ + clear(): void; + + /** + * Clear callbacks for a specific target. + * @param target The this argument of the callbacks to clear. + */ + clearForTarget(target: any): void; + + /** + * Clear callbacks that meet a specific condition. + * @param test The test function. Return true to clear the callback. + */ + clearFor(test: (target: any, callback: T) => boolean): void; + + /** + * Count of the callbacks. + */ + readonly count: number; + + /** + * Execute the callbacks immediately. + * @param args Arguments of the callbacks. + */ + invoke(...args: Parameters): void; + } + export type CommonPathName = 'home' | 'appData' | 'userData' | 'cache' | 'temp' | 'exe' + | 'module' | 'desktop' | 'documents' | 'downloads' | 'music' | 'pictures' | 'videos' | 'recent' | 'logs' | 'crashDumps'; + + /** + * Interface for ipc + */ + export interface IIpc { + /** + * Resolves with the response from the main process. + * + * Send a message to the main process via `channel` and expect a result + * asynchronously. Arguments will be serialized with the Structured Clone + * Algorithm, just like `window.postMessage`, so prototype chains will not be + * included. Sending Functions, Promises, Symbols, WeakMaps, or WeakSets will throw + * an exception. + * + * The main process should listen for `channel` with `ipcMain.handle()`. + * + * For example: + * + * If you need to transfer a `MessagePort` to the main process, use + * `ipcRenderer.postMessage`. + * + * If you do not need a response to the message, consider using `ipcRenderer.send`. + * + * > **Note** Sending non-standard JavaScript types such as DOM objects or special + * Electron objects will throw an exception. + * + * Since the main process does not have support for DOM objects such as + * `ImageBitmap`, `File`, `DOMMatrix` and so on, such objects cannot be sent over + * Electron's IPC to the main process, as the main process would have no way to + * decode them. Attempting to send such objects over IPC will result in an error. + * + * > **Note** If the handler in the main process throws an error, the promise + * returned by `invoke` will reject. However, the `Error` object in the renderer + * process will not be the same as the one thrown in the main process. + */ + invoke(channel: string, ...args: any[]): Promise; + + /** + * Listens to `channel`, when a new message arrives `listener` would be called with + * `listener(event, args...)`. + */ + on(channel: string, listener: (event: Event, ...args: any[]) => void): void; + + /** + * Adds a one time `listener` function for the event. This `listener` is invoked + * only the next time a message is sent to `channel`, after which it is removed. + */ + once(channel: string, listener: (event: Event, ...args: any[]) => void): void; + + /** + * Send a message to the main process, optionally transferring ownership of zero or + * more `MessagePort` objects. + * + * The transferred `MessagePort` objects will be available in the main process as + * `MessagePortMain` objects by accessing the `ports` property of the emitted + * event. + * + * For example: + * + * For more information on using `MessagePort` and `MessageChannel`, see the MDN + * documentation. + */ + postMessage(channel: string, message: any, transfer?: MessagePort[]): void; + + /** + * Removes all listeners, or those of the specified `channel`. + */ + removeAllListeners(channel: string): void; + + /** + * Removes the specified `listener` from the listener array for the specified + * `channel`. + */ + removeListener(channel: string, listener: (...args: any[]) => void): void; + + /** + * Send an asynchronous message to the main process via `channel`, along with + * arguments. Arguments will be serialized with the Structured Clone Algorithm, + * just like `window.postMessage`, so prototype chains will not be included. + * Sending Functions, Promises, Symbols, WeakMaps, or WeakSets will throw an + * exception. + * + * > **NOTE:** Sending non-standard JavaScript types such as DOM objects or special + * Electron objects will throw an exception. + * + * Since the main process does not have support for DOM objects such as + * `ImageBitmap`, `File`, `DOMMatrix` and so on, such objects cannot be sent over + * Electron's IPC to the main process, as the main process would have no way to + * decode them. Attempting to send such objects over IPC will result in an error. + * + * The main process handles it by listening for `channel` with the `ipcMain` + * module. + * + * If you need to transfer a `MessagePort` to the main process, use + * `ipcRenderer.postMessage`. + * + * If you want to receive a single response from the main process, like the result + * of a method call, consider using `ipcRenderer.invoke`. + */ + send(channel: string, ...args: any[]): void; + + /** + * The value sent back by the `ipcMain` handler. + * + * Send a message to the main process via `channel` and expect a result + * synchronously. Arguments will be serialized with the Structured Clone Algorithm, + * just like `window.postMessage`, so prototype chains will not be included. + * Sending Functions, Promises, Symbols, WeakMaps, or WeakSets will throw an + * exception. + * + * > **NOTE:** Sending non-standard JavaScript types such as DOM objects or special + * Electron objects will throw an exception. + * + * Since the main process does not have support for DOM objects such as + * `ImageBitmap`, `File`, `DOMMatrix` and so on, such objects cannot be sent over + * Electron's IPC to the main process, as the main process would have no way to + * decode them. Attempting to send such objects over IPC will result in an error. + * + * The main process handles it by listening for `channel` with `ipcMain` module, + * and replies by setting `event.returnValue`. + * + * > :warning: **WARNING**: Sending a synchronous message will block the whole + * renderer process until the reply is received, so use this method only as a last + * resort. It's much better to use the asynchronous version, `invoke()`. + */ + sendSync(channel: string, ...args: any[]): any; + + /** + * Like `ipcRenderer.send` but the event will be sent to the `` element in + * the host page instead of the main process. + */ + sendToHost(channel: string, ...args: any[]): void; + } + export interface ILanguageModule { + /** + * Current language. Currently two possible values: 'en' and 'zh-CN'. + */ + readonly language: string; + + /** + * Translation function. + * @param name Key name in the language file. + * @param defaultValue You can provide a default value if the key does not exist in the language file. + */ + t(name: string, defaultValue?: string): string; + + /** + * Translation function. + * @param name Key name in the language file. + * @param options Key-value pairs for string interpolation. + * @example + * ``` + * //en.json + * { + * "key" : "{{what}} is {{how}}" + * } + * + * //test.ts + * console.log(i18n.t("key", { what: "LayaAir", how: "great" })); + * //Output: "LayaAir is great" + * ``` + */ + t(name: string, options: Record): string; + + /** + * Translation function. + * @param name Key name in the language file. + * @param defaultValue You can provide a default value if the key does not exist in the language file. + * @param options Key-value pairs for string interpolation. + * @example + * ``` + * //en.json + * { + * "key" : "{{what}} is {{how}}" + * } + * + * //test.ts + * console.log(i18n.t("key", { what: "LayaAir", how: "great" })); + * //Output: "LayaAir is great" + * ``` + */ + t(name: string, defaultValue: string, options: Record): string; + } + export namespace MyMessagePortStatic { + /** + * It is used inside the webview or iframe to create a communication channel with the host. + * @param queueTask Whether to queue the task. If true, the received messages will be queued and processed sequentially. Defaults to false. + * @returns The message port. + */ + function requestFromHost(queueTask?: boolean): Promise; + + /** + * Connect to a named service. + * @param serviceName Service name. + * @param subscribe Whether to receive broadcast messages from the service. Defaults to false. + * @param args Arguments to pass to the service. + * @returns The message port. + */ + function connectService(serviceName: string, subscribe?: boolean, ...args: any[]): IMyMessagePort; + } + + export interface IMyMessagePort { + /** + * A delegate that is called when the port is closed. + */ + readonly onClose: IDelegate<() => void>; + + /** + * Whether to log an error to the console when a received message does not have a corresponding handler function. + */ + logHandlerMissing: boolean; + + /** + * Start the message port. + * + * This function only needs to be called when manually constructing a MyMessagePort object. In other cases, such as the object returned by connectService, it does not need to be called. + */ + start(): void; + + /** + * Close the message port. + */ + close(): void; + + /** + * Register a handler function for a channel. + * @param channel Channel name. + * @param func Handler function. + * @param thisArg The this object to bind the handler function to. + * @param noAwait If true, the handler function will not be awaited. Defaults to false. + */ + handle(channel: string, func: (...args: any[]) => Promise | any, thisArg?: any, noAwait?: boolean): void; + + /** + * Send a message to the other side. + * @param channel Channel name. + * @param args Arguments. + */ + send(channel: string, ...args: any[]): void; + + /** + * Send a message to the other side and transfer some Transferable objects. + * @param channel Channel name. + * @param transfer Transferable objects. + * @param args Arguments. + */ + transfer(channel: string, transfer: Transferable[], ...args: any[]): void; + + /** + * Send a message to the other side and expect a response. + * @param channel Channel name. + * @param args Arguments. + * @returns The response. + */ + invoke(channel: string, ...args: any[]): Promise; + + /** + * Manually call a handler function. + * @param channel Channel name. + * @param args Arguments. + * @returns The response. + */ + callHandler(channel: string, ...args: any[]): Promise; + } + export type ExecResult = { code: number, error: string, output: string }; + export type ExecProgressCallback = (output: string, part: string) => void; + + export interface IExecOptions { + /** + * Current working directory. + */ + cwd?: string; + + /** + * Progress callback. + * - output: The full output of the command. + * - part: The current part of the output. + */ + progressCallback?: ExecProgressCallback; + + /** + * Abort token. If you want to abort the command on some conditions, you can pass an abort token here. Call abortToken.signal() to abort the command. + */ + abortToken?: IAbortToken; + + /** + * If true, runs command inside of a shell. Uses '/bin/sh' on Unix, and process.env.ComSpec on Windows. A different shell can be specified as a string. See Shell requirements and Default Windows shell. Default: false (no shell). + */ + shell?: boolean | string; + + /** + * Environment key-value pairs. Default: process.env + */ + env?: Record; + + /** + * The encoding used for all stdio inputs and outputs. On MacOs and Linux, the default is 'utf8'. On Windows, we will try to detect the encoding of the console, and use that encoding. + */ + stringEncoding?: string; + + /** + * Whether to throw an error If the process exits with a non-zero exit code. Default: false. + */ + throwIfNonZeroExitCode?: boolean; + + /** + * Whether to throw an error If AbortToken is signaled. Default: false. + */ + throwIfAborted?: boolean; + } + + /** + * + */ + export interface INativeTools { + /** + * Executes a command. + * @param command The command to execute. + * @param args The command arguments. + * @param options The execution options. + * @returns A promise that resolves to the execution result. + */ + exec(command: string, args: ReadonlyArray, options: IExecOptions): Promise; + + /** + * Executes a command. + * @param command The command to execute + * @param args The command arguments. + * @param progressCallback The progress callback. + * @param abortToken The abort token. If you want to abort the execution on some conditions, you can pass an abort token here. Call abortToken.signal() to abort the execution. + * @returns A promise that resolves to the execution result. + */ + exec(command: string, args: ReadonlyArray, progressCallback?: ExecProgressCallback, abortToken?: IAbortToken): Promise; + + /** + * Run a built-in tool. All tools are installed in the IDE's nativetools directory. + * @param toolName The tool name. + * @param args The command arguments. + * @param options The execution options. + * @returns A promise that resolves to the execution result. + */ + runTool(toolName: string, args: ReadonlyArray, options: IExecOptions): Promise; + + /** + * Run a built-in tool. All tools are installed in the IDE's nativetools directory. + * @param toolName The tool name. + * @param args The command arguments. + * @param progressCallback The progress callback. + * @param abortToken The abort token. If you want to abort the execution on some conditions, you can pass an abort token here. Call abortToken.signal() to abort the execution. + * @returns A promise that resolves to the execution result. + */ + runTool(toolName: string, args: ReadonlyArray, progressCallback?: ExecProgressCallback, abortToken?: IAbortToken): Promise; + + /** + * Runs a npm cli command. CliName can be “npm” or “npx”. If it is another command, it needs to be installed first using installCli(). + * @param cliName The cli name. "npm", "npx", or a custom cli name. + * @param args The command arguments. + * @param options The execution options. + * @returns A promise that resolves to the execution result. + */ + execCli(cliName: string, args: ReadonlyArray, options?: IExecOptions): Promise; + + /** + * Install a npm package. The pacakge will install to the project's library/cli-package directory. + * @param pkgName The package name. e.g. "typescript" or ["typescript", "eslint"] + * @param options The execution options. + * @returns A promise that resolves to the execution result. + */ + installCli(pkgName: string | string[], options?: IExecOptions): Promise; + + /** + * Converts an absolute path to a path relative to the project root directory. + * + * The main purpose of this is to avoid issues with command-line tools that may not work properly if the project path contains Chinese characters or spaces. + * @param path The path to convert. + * @returns The converted path. + */ + formatOutpathArg(path: string): string; + + /** + * Converts an absolute path to a path relative to the project root directory. If the input path contains Chinese characters, a temporary file will be created, and the content of the input path will be written to the temporary file. The path of the temporary file will be returned. + * + * The main purpose of this is to avoid issues with command-line tools that may not work properly if the file name contains Chinese characters. + * @param path The path to convert. + * @param tempPath The directory for the temporary file. Default is library/temp/mbcNameFiles. + * @returns The converted path. + */ + formatInFileArg(path: string, tempPath?: string): Promise; + + /** + * Opens the code editor. + * @param filePath The file path. + */ + openCodeEditor(filePath: string): void; + + /** + * Opens the browser. + * @param url The URL address. + */ + openBrowser(url: string): void; + + /** + * Gets the string encoding of the console. Only effective on Windows systems, returns 'utf8' on other platforms. + * @returns The string encoding. + */ + getStringEncoding(): Promise; + + /** + * Gets the machine identification code. + * @returns The machine identification code. + */ + getMachineId(): Promise; + + /** + * Opens the terminal and runs a command. + * @param command The command to run. + * @param workingDirectory The working directory. Default is the project root directory. + */ + runCommandInTerminal(command: string, workingDirectory?: string): Promise; + } + export interface IFetchResponseTypeMap { + "text": string; + "json": any; + "arraybuffer": ArrayBuffer; + } + + export interface IFetchOptions { + /** + * post, get, put, delete, etc. + */ + method?: string; + + /** + * Query parameters. These will be appended to the URL by a '?' and joined by '&'. + */ + query?: Record; + + /** + * Upload data. This can be a JSON object, URLSearchParams, FormData, or ArrayBuffer. + */ + body?: Record | URLSearchParams | FormData | ArrayBuffer; + + /** + * Http headers. + */ + headers?: Record; + + /** + * Response type. + * - text: The response is a string. + * - json: The response is a JSON object. + * - arraybuffer: The response is an ArrayBuffer. + */ + responseType?: K, + + /** + * Username for basic authentication. + */ + username?: string, + + /** + * Password for basic authentication. + */ + password?: string, + + /** + * This callback will be called with the download progress. + * @param loaded Loaded bytes. + * @param total Total bytes. + */ + downloadProgress?: (loaded: number, total: number) => void; + + /** + * This callback will be called with the upload progress. + * @param loaded + * @param total + * @returns + */ + uploadProgress?: (loaded: number, total: number) => void; + + /** + * Abort token. If you want to abort the http request on some conditions, you can pass an abort token here. Call abortToken.signal() to abort the requset. + */ + abortToken?: IAbortToken; + } + + export interface INetUtils { + /** + * Issues an http request. + * @param url URL. + * @param options Options. + * @returns A promise that resolves to the response. + */ + httpRequest(url: string, options?: IFetchOptions): Promise; + + /** + * Downloads a file to a buffer. + * @param url URL. + * @param progress Progress callback. + * @param abortToken Abort token. If you want to abort the http request on some conditions, you can pass an abort token here. Call abortToken.signal() to abort the requset. + * @returns A promise that resolves to the file buffer. + */ + downloadFileToBuffer(url: string, progress?: (receivedLength: number, contentLength: number) => void, abortToken?: IAbortToken): Promise; + + /** + * Downloads a file. + * @param url URL. + * @param localPath Local path to save the file. + * @param progress Progress callback. + */ + downloadFile(url: string, localPath: string, progress?: (receivedLength: number, contentLength: number) => void): Promise; + + /** + * Gets the IP address of the local machine. + */ + getIPAddress(): string; + } + + export interface IObjectUtils { + + /** + * Clears an object by deleting all its properties. + * + * Since it might be a proxy and could be referenced elsewhere, it cannot be directly assigned. + * @param obj The object to clear. + */ + clearObj(obj: any): void; + + /** + * Deep clones an object. + * @param obj The object to clone. + * @returns The cloned object. + */ + deepCloneObj(obj: any): any; + + /** + * Merge two objects. + * + * If a property with the same name exists in both objects, and the value of it is an object, the two objects will be merged recursively. + * + * If a property with the same name exists in both objects, and the value of it is primitive, the value of the source object will only be used when override is true. + * + * If a property exists in the source object but not in the target object, it will be added to the target object. + * + * @param target The target object. + * @param source The source object. + * @param override Override option. Default is true. + * @example + * ``` + * let target = { b: { x: 1 } }; + * let source = { a: 1, b: { y: 1 }, c: 2}; + * let result = mergeObjs(target, source); + * //Output: { a: 1, b: { x:1, y:1 }, c: 2} + * ``` + */ + mergeObjs(target: any, source: any, override?: boolean): void; + + /** + * Set the value of a property in an object by a path. + * @param obj The object to set the property. + * @param datapath The path of the property. + * @param pathIndex The start index of datapath. Default is 0. + * @param value The value to set. + * @param forceCreate If true, the path will be created if it does not exist. Default is false. + * @example + * ``` + * let obj = { a: { b: { c: 1 } } }; + * setDataByPath(obj, ['a', 'b', 'c'], 0, 2); + * //Output: { a: { b: { c: 2 } } } + * + * let obj = { a: { b: { c: 1 } } }; + * setDataByPath(obj, ['a', 'd', 'c'], 0, 2, true); + * //Output: { a: { b: { c: 1 }, d: { c: 2 } } } + * + * let obj = { a: { b: { c: 1 } } }; + * setDataByPath(obj, ['a', 'd', 'c'], 0, 2, false); + * //Output: { a: { b: { c: 1 } } + * ``` + */ + setDataByPath(obj: any, datapath: ReadonlyArray, pathIndex: number, value: any, forceCreate?: boolean): boolean; + + /** + * Delete a property in an object by a path. + * @param obj The object to delete the property. + * @param datapath The path of the property. + * @param pathIndex The start index of datapath. Default is 0. + */ + deleteDataByPath(obj: any, datapath: ReadonlyArray, pathIndex: number): boolean; + + /** + * Get the value of a property in an object by a path. + * @param obj The object to get the property. + * @param datapath The path of the property. + * @param pathLen The length of the path. Default is the length of datapath. + * @return The value of the property. + * @example + * ``` + * let obj = { a: { b: { c: 1 } } }; + * let result = getDataByPath(obj, ['a', 'b', 'c']); + * //Output: 1 + * ``` + */ + getDataByPath(obj: any, datapath: ReadonlyArray, pathLen?: number): any; + + /** + * Whether an object is empty. A empty object has no properties. + * @param obj The object to check. + * @returns True if the object is empty, otherwise false. + */ + isEmptyObj(obj: any): boolean; + + /** + * Compares whether two arrays are equal. Two arrays are equal if they have the same length and all their elements are equal by comparing them using ===. + * @param a The first array. + * @param b The second array. + * @returns True if the two arrays are equal, otherwise false. + */ + arrayEquals(a: ReadonlyArray, b: ReadonlyArray): boolean; + + /** + * Whether the first array starts with the second array. + * @param a The first array. + * @param b The second array. + * @returns True if the first array starts with the second array, otherwise false. + */ + arrayStartsWith(a: ReadonlyArray, b: ReadonlyArray): boolean; + + /** + * Compares whether two objects are equal. Two objects are equal if they have the same properties and the values of the properties are equal by comparing them using ===. + */ + objEquals(a: any, b: any): boolean; + + /** + * Copies the properties of one object to another, making the two objects have exactly the same properties. + * Unlike Object.assign, it will first delete properties in the target object that do not exist in the source. + * @param target The target object. + * @param source The source object. + * @returns The target object. + */ + assignObject(target: any, source: any): any; + } + export type SettingsLocation = "application" | "project" | "local" | "memory"; + + export interface ISettings { + /** + * Data of the settings. + */ + readonly data: IConfigObject; + + /** + * Triggered when the settings are changed. + */ + readonly onChanged: IDelegate<(sender: ISettings) => void>; + + /** + * Update the settings from the UI process. Only meaningful when the settings are queried from the process other than the UI process. + */ + sync(): Promise; + + /** + * Push local changes to the UI process. Only meaningful when the settings are queried from the process other than the UI process. + * @param keys The keys of the settings to push. If not specified, all settings are pushed. + */ + push?(keys?: ReadonlyArray): Promise; + } + + export interface ISettingsService { + /** + * Create a built-in configuration file. This method is only available in the UI process. User should call this method directly. + * @param name The name of the settings. + * @param location The location of the configuration file. The default is "project". + * - application: Saved to the user data directory of the application. On Windows, it is generally C:\Users\{user}\AppData\Local\{appname}, and on Mac, it is generally ~/Library/Application Support/{appname}. This means that this configuration needs to be shared across different projects. + * - project: Saved to the `settings` directory of the project. This means that this configuration is specific to the current project. + * - local: Saved to the `local` directory of the project. This means that this configuration is specific to the current project but does not need to be tracked by the version control system. + * - memory: Maintained only in memory and not saved to a file. + * @param typeName The data type corresponding to the configuration. + */ + enableSettings(name: string, location?: SettingsLocation, typeName?: string): void; + + /** + * Create a built-in configuration file. This method is only available in the UI process. User should call this method directly. + * @param name The name of the configuration. It should be unique within the editor and use characters that conform to file name specifications. + * @param pathToAsset The path to the configuration file. It is a relative path to the assets directory. + * @param typeName The data type corresponding to the configuration. + */ + enableSettings(name: string, pathToAsset: string, typeName?: string): void; + /** + * Query the settings by name. + * @param name The name of the settings. + * @returns The settings. + */ + getSettings(name: string): ISettings; + } + export const ShaderTypePrefix = "Shader."; + /** + * A callback function that is used to determine whether a value is equal to the default value. + * @param value The value to compare. + * @param overridedDefaultValue By default, the `default` property of the property descriptor is used as the default value. You can override it by passing in this parameter. + */ + export type DefaultValueComparator = (value: any, overridedDefaultValue?: any) => boolean; + export type TypeMenuItem = { type: FTypeDescriptor, label: string, icon: string, order: number }; + export type TypeMenuItems = Array & { menuLabel: string }; + export type PropertyTestFunctions = { hiddenTest: Function, readonlyTest: Function, validator: Function, requiredTest: Function }; + + export interface ITypeRegistry { + /** + * All types. Key is the name of the type. + */ + readonly types: Readonly>; + + /** + * A version number that is incremented when the type list is changed. + */ + readonly version: number; + + /** + * Triggered when the types those are defined in the typescript code are changed. + */ + readonly onUserTypesChanged: IDelegate<() => void>; + + /** + * Node type name, it is "Node". + */ + nodeTypeName: string; + + /** + * Component type name, it is "Component". + */ + componentTypeName: string; + + /** + * Add some types to the registry. If the type already exists, it will be overwritten. + * @param types Types to add. + * @param bindClasses Whether to bind the types to premapped engine classes. This option is available only in the scene process. Default is false. + */ + addTypes(types: ReadonlyArray, bindClasses?: boolean): void; + + /** + * Remove some types from the registry. + * @param names Names of the types to remove. + */ + removeTypes(names: ReadonlyArray): void; + + /** + * Notify the registry that the user types are changed. User types are types that are defined in the typescript code. + */ + setUserTypesChanged(): void; + + /** + * Get derived types of a type. + * @param type The type to get derived types. + * @returns Derived types of the type. + */ + getDerivedTypes(type: FTypeDescriptor): Array; + + /** + * Get all component types that need to be added when a component type is added to a node. + * + * This is determined by the requireComponents property of the type. + * @param type The component type. + * @returns A collection of component types, including the type itself. + * @see FTypeDescriptor.requireComponents + */ + getRequireComponents(type: string): Array; + + /** + * Get all engine libraries that need to be enabled when a component type is added to a node. + * + * This is determined by the requireEngineLibs property of the type. + * @param type The component type. + * @returns A collection of engine libraries. + * @see FTypeDescriptor.requireEngineLibs + */ + getRequireEngineLibs(type: string): Array; + + /** + * Get whether a component type can be added multiple times to a node. + * + * This is determined by the allowMultipleComponent property of the type and its base types. + * @param type The component type. + * @returns Whether the component type can be added multiple times to a node. + * @see FTypeDescriptor.allowMultipleComponent + */ + getAllowMultipleComponent(type: FTypeDescriptor): boolean; + + /** + * Get node menu items. + * @param type The world type. + * @param inHierarchyMenu Whether to include the component types that are allowed to be added in the hierarchy menu. This is determined by the inHierarchyMenu option of the type. + * @returns Node menu items. Key is the category name, value is the menu items. + * @see FTypeDescriptor.inHierarchyMenu + */ + getNodeMenuItems(type: WorldType, inHierarchyMenu?: boolean): Readonly>; + + /** + * Get component menu items. + * @param type The world type. + * @returns Component menu items. Key is the category name, value is the menu items. + */ + getComponentMenuItems(type: WorldType): Readonly>; + + /** + * Find a type defined in the typescript code by its path. + * @param path A path relative to the assets folder. + */ + findScriptByPath(path: string): FTypeDescriptor; + + /** + * Whether a type is a 3D type. + * @param type The type name. + * @returns Whether the type is a 3D type. + */ + isType3d(type: string): boolean; + + /** + * Check whether a type is derived from another type. + * @param type The type name. + * @param baseType The base type name. + * @returns Whether the type is derived from the base type. + */ + isDerivedOf(type: string, baseType: string | ReadonlyArray): boolean; + + /** + * Whether a type is a node type. In other words, this type is derived from Node. + * @param type The type name. + * @returns Whether the type is a node type. + */ + isNodeType(type: string): boolean; + + /** + * If a type is derived from Node, return Node; if it is derived from Component, return Component; otherwise return null. + * @param type The type name. + * @returns The base type name or null. + */ + getNodeBaseType(type: string): string; + + /** + * Whether a type is deprecated. If an new type descriptor is registered with the same name, the original type descriptor will be marked as deprecated. + * @param type The type descriptor. + * @returns Whether the type is deprecated. + */ + isTypeDeprecated(type: FTypeDescriptor): boolean; + + /** + * Get caption of a type. + * @param type The type name or the type descriptor. + * @param noSplit Whether to tokenize the results. The default is false, meaning the results will be tokenized. + * @param noLocalize Whether to localize the results. The default is null, meaning the results will be processed according to the localization settings. + * @returns The caption of the type. + */ + getTypeCaption(type: string | FTypeDescriptor, noSplit?: boolean, noLocalize?: boolean): string; + + /** + * Get icon of a type. + * @param type The type name or the type descriptor. + * @returns The icon of the type. + */ + getTypeIcon(type: string | FTypeDescriptor): string; + + /** + * @en Get property of a type, if the property is not found, look for it in the base types. + * @param type The type descriptor. + * @param propName The property name. + * @returns The property value. + * @zh 获取类型的属性,如果属性未找到,则在基类中查找。 + * @param type 类型描述符。 + * @param propName 属性名称。 + * @returns 属性值。 + */ + findTypePropertyInChain(typeDef: FTypeDescriptor, propName: string): string; + + /** + * Get caption of a property. + * @param type The type descriptor. + * @param prop The property descriptor. + * @param noSplit Whether to tokenize the results. The default is false, meaning the results will be tokenized. + * @param noLocalize Whether to localize the results. The default is null, meaning the results will be processed according to the localization settings. + * @returns The caption of the property. + */ + getPropCaption(type: FTypeDescriptor, prop: FPropertyDescriptor, noSplit?: boolean, noLocalize?: boolean): string; + + /** + * Get tips of a property. + * @param type The type descriptor. + * @param prop The property descriptor. + * @param showPropertyName Whether to add a banner to the tips to indicate the property name. The default is false. + * @returns The tips of the property. + */ + getPropTips(type: FTypeDescriptor, prop: FPropertyDescriptor, showPropertyName?: boolean): string; + + /** + * Get the caption of the catalog. + * @param type The type descriptor. + * @param prop The property descriptor. + * @returns The caption of the catalog. + */ + getCatalogCaption(type: FTypeDescriptor, prop: FPropertyDescriptor): string; + + /** + * Get all properties of a type in a map. Key is the property name. + * @param type The type descriptor. + * @returns Result map. + */ + getAllPropsOfType(type: FTypeDescriptor): Readonly>; + + /** + * Get an object that contains the initial values of the type. + * + * This initial value only takes effect when the object is manually created from the UI. + * @param typeDef The type descriptor. + * @returns The initial values of the type. + */ + getInitProps(typeDef: FTypeDescriptor): any; + + /** + * Get an object that contains the default values of the type. + * @param typeDef The type descriptor. + * @param includePrivate Whether to include private properties. The default is false. + * @param data The object data. + * @returns The default values of the type. + */ + getDefaultValue(typeDef: FTypeDescriptor, includePrivate?: boolean, data?: any): any; + + /** + * Get the default value of a property. + * @param prop The property descriptor. + * @param realType If the type is a polymorphic reference type, use this parameter to specify the actual type. + * @param includePrivate Whether to include private properties. The default is false. + * @param data The property data. + * @returns The default value of the property. + */ + getPropDefaultValue(prop: FPropertyDescriptor, realType?: string, includePrivate?: boolean, data?: any): any; + + /** + * Get the test functions of a property. + * @param prop The property descriptor. + * @returns The test functions of the property. + */ + getPropTestFunctions(prop: FPropertyDescriptor): PropertyTestFunctions; + + /** + * Get all default value comparator functions of a type. This function is used to determine whether a value is equal to the default value. The key is the property name. + * @param typeDef The type descriptor. + * @returns Functions map. + */ + getDefaultValueComparators(typeDef: FTypeDescriptor): Readonly>; + + /** + * Find a property by path. + * @param type The type descriptor. + * @param datapath The path of the property. + * @param out The result array. If it is not null, the result will be added to this array, otherwise a new array will be created. + * @returns The result array. + */ + getPropertyByPath(type: FTypeDescriptor, datapath: ReadonlyArray, out?: FPropertyDescriptor[]): FPropertyDescriptor[]; + + /** + * Get the type descriptor of an object. Null will be returned if the prototype of the object is not registered. + * @param obj The object. + * @returns The type descriptor of the object. + */ + getTypeOfObj(obj: any): FTypeDescriptor; + + /** + * Get the type descriptor of a class. Null will be returned if the class is not registered. + * @param cls The class. + * @returns The type descriptor of the class. + */ + getTypeOfClass(cls: Function): FTypeDescriptor; + + /** + * Sort properties. The order is determined by the position property and the catalog property of the property descriptor. + * @param props The properties to sort. + * @param considerCatalog Whether to consider the catalog property. The default is false. + */ + sortProps(props: Array, considerCatalog?: boolean): void; + } + export interface IUtils { + /** + * Parse string content from a file to a JSON object. + * @param filePath The path of the file. + * @param silent Whether to suppress the error message. The default is false, meaning the error message will be output to the console. + * @returns The JSON object. + */ + readJson(filePath: string, silent?: boolean): any; + + /** + * Parse string content from a file to a JSON object. + * + * This is the promise version of `readJson`. + * @param filePath The path of the file. + * @param silent Whether to suppress the error message. The default is false, meaning the error message will be output to the console. + * @returns The JSON object. + */ + readJsonAsync(filePath: string, silent?: boolean): Promise; + + /** + * Parse string content from a file to a JSON object, enabling JSON5 support. + * @param filePath The path of the file. + * @param silent Whether to suppress the error message. The default is false, meaning the error message will be output to the console. + * @returns The JSON object. + */ + readJson5(filePath: string, silent?: boolean): any; + + /** + * Parse string content from a file to a JSON object, enabling JSON5 support. + * + * This is the promise version of `readJson5`. + * @param filePath The path of the file. + * @param silent Whether to suppress the error message. The default is false, meaning the error message will be output to the console. + * @returns The JSON object. + */ + readJson5Async(filePath: string, silent?: boolean): Promise; + + /** + * Stringify a JSON object and write it to a file. + * @param filePath The path of the file. + * @param content The JSON object. + * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read. Default is 2. + */ + writeJson(filePath: string, content: any, space?: string | number): void; + + /** + * Stringify a JSON object and write it to a file. + * + * This is the promise version of `writeJson`. + * @param filePath The path of the file. + * @param content The JSON object. + * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read. Default is 2. + */ + writeJsonAsync(filePath: string, content: any, space?: string | number): Promise; + + /** + * Read the first N bytes of a file. This is useful for reading the file signature. + * @param filePath The path of the file. + * @param bytesCount The number of bytes to read. + * @returns The buffer containing the first N bytes. + */ + readFirstNBytes(filePath: string, bytesCount: number): Promise; + + /** + * Test whether a value is an object. It is equivalent to `type === 'function' || typeof obj === 'object' && obj !== null`. + * @param value The value to test. + * @returns Whether the value is an object. + */ + isObject(value: any): boolean; + + /** + * Parse a string with format `key1=value1,key2=value2,...` to a key-value object. + * @param features The string to parse. + * @returns The key-value object. + */ + parseFeatures(features: string): Record; + + /** + * Convert a number to a string with a fixed number of decimal places. Trailing zeros are removed. + * @param n The number to convert. + * @param fractionDigits The number of decimal places. + * @returns The string representation of the number. + * @example + * ``` + * toFixedPro(1.2345, 2) // "1.23" + * toFixedPro(1.01, 1) // "1" + * ``` + */ + toFixedPro(n: number, fractionDigits: number): string; + + /** + * Splits a camelCase string into words and capitalizes the first letter of each word. + * @param str The string to convert. + * @returns The result. + * @example + * ``` + * splitCamelCase("helloWorld") // "Hello World" + * ``` + */ + splitCamelCase(str: string): string; + + /** + * Get the base directory for temporary files. It is the `library/temp` folder in the project. The API ensures that this folder exists. + * @returns The base directory for temporary files. + */ + getTempBaseDir(): string; + + /** + * Create a subdirectory in the temporary directory. The temporary directory is returned by `getTempBaseDir`. + * @param subDir The name of the subdirectory. If not specified, a subdirectory with a random name is created. + * @returns The absolute path of the subdirectory. + */ + mkTempDir(subDir?: string): string; + + /** + * It is equivalent to `path.join`. Only for the purpose of without importing `path`. + * @param paths The paths to join. + * @returns The joined path. + */ + joinPaths(...paths: string[]): string; + + /** + * It is equivalent to `fs.copyFile`. Only for the purpose of without importing `fs`. + * @param src The source file path. + * @param dest The destination file path. + */ + copyFile(src: string, dest: string): Promise; + + /** + * Delete a folder recursively. + * @param path The path of the folder. + */ + rmDirSync(path: string): void; + + /** + * Delete a file or an empty folder. + * @param path The path of the file. + */ + rmSync(path: string): void; + + /** + * Copy all files and subfolders recursively from a folder to another folder. + * @param src The source folder path. + * @param destDir The destination folder path. + * @param options The options. + * - autoRename: Whether to automatically rename the file when a file with the same name exists in the destination folder. The default is false, meaning the file will be overwritten. + * - regenerateUUID: Whether to regenerate the UUID of the file. The default is false. + */ + copyDir(source: string, destDir: string, options?: { autoRename?: boolean, regenerateUUID?: boolean }): Promise; + + /* + * Move all files and subfolders recursively from a folder to another folder. + * @param src The source folder path. + * @param destDir The destination folder path. + * @param options The options. + * - autoRename: Whether to automatically rename the file when a file with the same name exists in the destination folder. The default is false, meaning the file will be overwritten. + */ + moveDir(source: string, destDir: string, options?: { autoRename?: boolean }): Promise; + + /** + * If source is a file, copy it to destDir; if source is a folder path, copy all files and subfolders recursively from it to destination. + * @param source The source file or folder path. + * @param destDir The destination folder path. + * @param options The options. + * - autoRename: Whether to automatically rename the file when a file with the same name exists in the destination folder. The default is false, meaning the file will be overwritten. + */ + copyFileOrDir(source: string, destDir: string, options?: { autoRename?: boolean }): Promise; + + /** + * Copy all files and subfolders that match the pattern from a folder to another folder. + * @param source The source folder path. + * @param pattern The glob pattern. + * @param destDir The destination folder path. + * @param options The options. + * - dot: Whether to include files and subfolders starting with a dot. The default is false. + * - ignore: The glob pattern to exclude files and subfolders. + */ + copyFiles(source: string, pattern: string, destDir: string, options?: { dot?: boolean, ignore?: string | Array }): Promise; + + /** + * Delete all files in a folder except for the specified files. + * @param folder The folder path. + * @param ignores The files to ignore. The elements are the filenames, exactly matching the filenames in the folder. + */ + deleteFiles(folder: string, ignores?: Iterable): Promise; + + /** + * Check if the file exists. It is promise version of `fs.existsSync`. + * @param filePath The path of the file. + * @returns Whether the file exists. + */ + fileExists(filePath: string): Promise; + + /** + * Check if a filename conflicts in the specified folder. If there is a conflict, add a numeric suffix to the filename and continue checking until there is no conflict. + * @param path The folder path. + * @param name The filename. + * @returns The new filename. + */ + getNewFilePath(path: string, name: string): string; + + /** + * Check if a filename conflicts in the specified folder. If there is a conflict, add a numeric suffix to the filename and continue checking until there is no conflict. + * + * The difference with `getNewFilePath` is that it allows specifying a delimiter to connect the filename and the numeric suffix. + * @param path The folder path. + * @param name The filename. + * @param connectorSymbol The delimiter to connect the filename and the numeric suffix. The default is "_". + * @returns The new filename. + */ + resolveConflictFileName(path: string, name: string, connectorSymbol?: string): Promise; + + /** + * Check if a filename conflicts in the specified folder. If there is a conflict, add a numeric suffix to the filename and continue checking until there is no conflict. + * + * The difference with `getNewFilePath` is that it allows specifying a delimiter to connect the filename and the numeric suffix. + * + * This is the synchronous version of `resolveConflictFileName`. + * @param path The folder path. + * @param name The filename. + * @param connectorSymbol The delimiter to connect the filename and the numeric suffix. The default is "_". + * @returns The new filename. + */ + resolveConflictFileNameSync(path: string, name: string, connectorSymbol?: string): string; + + /** + * Replace invalid filename characters in a string (compatible with both Windows and Mac) + * @param fileName The filename. + * @param replaceChar The character to replace the invalid characters. The default is "_". + * @returns The sanitized filename. + */ + sanitizeFileName(fileName: string, replaceChar?: string): string; + + /** + * Add a hash to the filename. The hash is added before the extension. + * @param filename The filename. + * @param hash The hash string. + * @param ext The extension. If not specified, the extension of the filename is used. + * @returns The new filename. + */ + addHashToFileName(filename: string, hash: string, ext?: string): string; + + /** + * Handle . and .. in the path, converting it to an absolute path and returning an array of path segments. + * @param filePath The path to normalize. + * @returns The normalized path. + * @example + * ``` + * normalizePath("a/b/../c") // ["a", "c"] + * ``` + */ + normalizePath(filePath: string): Array; + + /** + * Create a promise that resolves after a specified amount of time, implementing a sleep function. + * @param ms The number of milliseconds to sleep. + * @example + * ``` + * await sleep(1000); // sleep for 1 second + * ``` + */ + sleep(ms: number): Promise; + + /** + * Create a promise that resolves until the predicate returns true, or the timeout is reached. + * @param predicate The predicate function. + * @param timeoutInMs The timeout in milliseconds. If not specified, there is no timeout. + * @example + * ``` + * await until(() => document.querySelector("div") !== null); // wait until the div element is loaded + * ``` + */ + until(predicate: () => boolean, timeoutInMs?: number): Promise; + + /** + * Escape special characters in a string to be used in a regular expression. + * @param str The string to escape. + * @returns The escaped string. + * @example + * ``` + * escapeRegExp("hello.world") // "hello\.world" + * ``` + */ + escapeRegExp(str: string): string; + + /** + * Load a script file through script tag injection. + * @param src The URL of the script file. + * @param async Whether to load the script asynchronously. The default is false. + * @param onScriptError The error handler when the script fails to load. + * @returns The script element. + */ + loadLib(src: string, async?: boolean, onScriptError?: (err: ErrorEvent) => void): Promise; + + /** + * Execute arithmetic expressions. + * @param str The arithmetic expression. + * @returns The result of the arithmetic expression. + * @example + * ``` + * calculate("1+2*3") // 7 + * ``` + */ + calculate(str: string): number; + + /** + * Remove unsupported tags from HTML content. + * + * Supported tags: `b`, `i`, `u`, `strike`, `font`, `img`, `a`. + * @param source The HTML content. + * @param removeWhiteSpace Whether to remove white spaces between tags. The default is false if no or tag is found, otherwise true. + * @returns The simplified HTML content. + */ + simplifyHtml(source: string, removeWhiteSpace?: boolean): string; + + /** + * Serialize an XML document to a string. + * @param xmlDoc The XML document. + * @returns The XML string. + */ + serializeXML(xmlDoc: XMLDocument): string; + + /** + * Find an XML element in a collection that satisfies the predicate. + * @param col The collection of XML elements. + * @param predicate The predicate function. + * @returns The XML element that satisfies the predicate. + * @example + * ``` + * findXMLElement(xmlDoc.getElementsByTagName("a"), node => node.getAttribute("href") === "https://www.example.com") + * ``` + */ + findXMLElement(col: NodeListOf | HTMLCollection, predicate: (node: Element) => boolean): Element; + + /** + * Add elements to a set. + * @param set The set to add elements to. + * @param elements The elements to add. + */ + addToSet(set: Set, elements: Iterable): void; + + /** + * Convert a number representing bytes into a string with units. + * @param bytes The number of bytes. + * @returns The formatted string with appropriate units. + * @example + * ``` + * formatBytes(1024) // "1 KB" + * formatBytes(1024 * 1024) // "1 MB" + * formatBytes(1024 * 1024 * 1024) // "1 GB" + * formatBytes(12345) // "12.06 KB" + * ``` + */ + formatBytes(bytes: number): string; + + /** + * Convert a timestamp to a time string relative to now. + * @param time The timestamp to convert. + * @param includeTime Whether to include the time in the output string. If false, only the date is included. The default is true. + * @returns The time string. + * @example + * ``` + * getTimeAgo(1620000000000) // "2021-05-03 12:00:00" + * getTimeAgo(1620000000000, false) // "2021-05-03" + * ``` + */ + getTimeAgo(time: number, includeTime?: boolean): string; + + /** + * Get the current time as a string. + * @returns The current time string. + * @example + * ``` + * getNowStr() // "2021-05-03 12:00:00" + * ``` + */ + getNowStr(): string; + + /** + * Format a string as a JavaScript variable name. + * @param str The string to format. + * @returns The formatted string. + * @example + * ``` + * formatAsJsVariable("private") // "private_" + * formatAsJsVariable("1abc") // "_1abc" + * formatAsJsVariable("a$b") // "a_b" + * ``` + */ + formatAsJsVariable(str: string): string; + + /** + * Run a batch of tasks in parallel. Rejects if any task fails. + * @param datas The data to process. + * @param numParallelTasks The number of parallel tasks. If it is a function, it is called with the number of concurrent tasks and returns whether to continue running more tasks. + * @param taskFunc The task function. + * @param abortToken The abort token. If you want to abort the execution on some conditions, you can pass an abort token here. Call abortToken.signal() to abort the execution. + * @returns The results of the tasks. + * @example + * ``` + * let result = await runTasks([1, 2, 3], 2, async (data, index) => { + * await sleep(1000); + * return data * 2; + * }); + * // result: [2, 4, 6] + * ``` + */ + runTasks(datas: Array | Iterable & { size?: number }, numParallelTasks: number | ((numTasks: number) => boolean), taskFunc: (data: T2, index: number) => T | Promise, abortToken?: IAbortToken): Promise; + + /** + * Run a batch of tasks in parallel. Resolves even if some tasks fail. + * @param datas The data to process. + * @param numParallelTasks The number of parallel tasks. If it is a function, it is called with the number of concurrent tasks and returns whether to continue running more tasks. + * @param taskFunc The task function. + * @param abortToken The abort token. If you want to abort the execution on some conditions, you can pass an abort token here. Call abortToken.signal() to abort the execution. + * @returns The promise results of the tasks. + * @example + * ``` + * let result = await runAllTasks([1, 2, 3], 2, async (data, index) => { + * await sleep(1000); + * if (data === 2) { + * throw new Error("error"); + * } + * return data * 2; + * }); + * // result: [ { status: "fulfilled", value: 2 }, { status: "rejected", reason: Error: error }, { status: "fulfilled", value: 6 } ] + * ``` + */ + runAllTasks(datas: Array | Iterable & { size?: number }, numParallelTasks: number | ((numTasks: number) => boolean), taskFunc: (data: T2, index: number) => T | Promise, abortToken?: IAbortToken): Promise[]>; + + /** + * Print the results of a promise. + * @param rets The results of the promises. + * @param group The optinal group name of console messages. + */ + printPromiseResult(rets: Iterable>, group?: string): void; + + /** + * Create a function that wrap the execution of another function. The wrapped function will only be executed once. The result is cached and returned directly for subsequent calls. + * @param fn The function to execute. + * @param errorHandler The error handler when the function fails. If not specified, the error will be reported to the console. + * @returns The wrapped function. + * @example + * ``` + * let fn = makeExecuteOnceFunction(async () => { + * await sleep(1000); + * return 1; + * }); + * let result = await fn(); // 1, return after 1 second + * let result2 = await fn(); // 1, return immediately + * ``` + */ + makeExecuteOnceFunction(fn: () => Promise, errorHandler?: (err: any) => T): () => Promise; + } + export interface IUUIDUtils { + /** + * Generate a UUID. UUID is a 36-character string with 4 dashes. + * @example + * ``` + * genUUID(); // "550e8400-e29b-41d4-a716-446655440000" + * ``` + */ + genUUID(): string; + + /** + * Generate a short ID. A short ID is a string of a specified length, composed of numbers and lowercase letters, and does not start with a number. + * @param size Size of the short ID. Default is 8. + * @example + * ``` + * genShortId(); // "a550e840" + * genShortId(6); // "a550e8" + * ``` + */ + genShortId(size?: number): string; + + /** + * Check if a string is a UUID. + * @param str String to check. + * @return Whether the string is a UUID. + * @example + * ``` + * isUUID("550e8400-e29b-41d4-a716-446655440000"); // true + * isUUID("550e8400-e29b-41d4-a716-44665544000"); // false + * ``` + */ + isUUID(str: string): boolean; + + /** + * Compress a UUID. Compressed UUID is a string of 22 characters without dashes. + * @param uuid UUID to compress. + * @return Compressed UUID. + * @example + * ``` + * compressUUID("550e8400-e29b-41d4-a716-446655440000"); // "VQ6EBiW0QaFHRmVUZAAB" + * ``` + */ + compressUUID(uuid: string): string; + + /** + * Decompress a compressed UUID. + * @param str Compressed UUID. + * @return Decompressed UUID. + * @example + * ``` + * decompressUUID("VQ6EBiW0QaFHRmVUZAAB"); // "550e8400-e29b-41d4-a716-446655440000" + * ``` + */ + decompressUUID(str: string): string; + } + /** + * Zip file writer. + */ + export interface IZipFileW { + /** + * When adding files, if the file path matches any of the names in this list, it will be excluded. + * + * This is useful when you want to exclude some files from the zip file. + * @example + * ``` + * excludeNames: ["*.tmp", ".*"] + * ``` + */ + excludeNames: Array; + + /** + * Add a file to the zip file. + * @param realPath Path to the file in the file system. + * @param entryPath Path in the zip file. If not specified, the entry path will use the relative path from realPath to the basePath value of this object. + * @example + * ``` + * let zip = new IEditor.ZipFileW("C:/temp"); + * zip.addFile("C:/temp/abc/test.txt"); // The entry path will be "abc/test.txt" + * zip.addFile("D:/test.txt", "def/test.txt"); // The entry path will be "def/test.txt" + * ``` + */ + addFile(realPath: string, entryPath?: string): void; + + /** + * Add a folder to the zip file. Files in the folder will be added recursively based on the pattern and ignore parameters. + * @param realPath Path to the folder in the file system. + * @param entryPath Path in the zip file. If not specified, the entry path will use the relative path from realPath to the basePath value of this object. + * @param pattern Glob pattern to match files in the folder. If not specified, all files will be added. + * @param ignore Glob pattern to exclude files in the folder. If not specified, no files will be excluded. + * @example + * ``` + * let zip = new IEditor.ZipFileW("C:/temp"); + * zip.addFolder("C:/temp/abc"); // All files in the "abc" folder will be added. + * zip.addFolder("C:/temp/abc", "def", "*.txt", ["*.tmp"]); // Only .txt files in the "abc" folder will be added, and .tmp files will be excluded. + * ``` + */ + addFolder(realPath: string, entryPath?: string, pattern?: string, ignore?: string[]): void; + + /** + * Add a buffer to the zip file. + * @param entryPath Path in the zip file. + * @param buf Buffer to add. + * @param encoding Encoding of the buffer. Default is "utf8". + * @example + * ``` + * let zip = new IEditor.ZipFileW("C:/temp"); + * zip.addBuffer("abc/test.txt", "Hello, world!", "utf8"); + * ``` + */ + addBuffer(entryPath: string, buf: string | NodeJS.ArrayBufferView | Iterable | AsyncIterable, encoding?: string): void; + + /** + * Write the zip file to the file system. + * @param filePath Path to the zip file. + * @param progressCallback Callback function to report the progress of the operation. The progress value is between 0 and 100. + * @param abortToken Abort token. If you want to abort the operation on some conditions, you can pass an abort token here. Call abortToken.signal() to abort the operation. + */ + save(filePath: string, progressCallback?: (progress: number) => void, abortToken?: IAbortToken): Promise; + } + + /** + * Zip file reader. + */ + export interface IZipFileR { + + /** + * Open a zip file. + * @param filePath File path of the zip file. + */ + open(filePath: string): Promise; + + /** + * Open a zip file in memory. + * @param buf Buffer of the zip file. + */ + open(buf: ArrayBuffer): Promise; + + /** + * Get the entries in the zip file. + */ + getEntries(): Array; + + /** + * Test whether the zip file contains the specified entry. + * @param entryName The name of the entry. + * @returns True if the zip file contains the entry; otherwise, false. + */ + hasEntry(entryName: string): boolean; + + /** + * Extract the specified entry to the file system. + * @param entryName The name of the entry. + * @param savePath The path to save the extracted file. + */ + extract(entryName: string, savePath: string): Promise; + + /** + * Unzip the entire zip file to the file system. + * @param savePath The path to save the extracted files. + * @param progressCallback Callback function to report the progress of the operation. The progress value is between 0 and 100. + * @param abortToken Abort token. If you want to abort the operation on some conditions, you can pass an abort token here. Call abortToken.signal() to abort the operation. + */ + extractAll(savePath: string, progressCallback?: (progress: number) => void, abortToken?: IAbortToken): Promise; + + /** + * Close the zip file. Remember to call this method after you finish using the zip file. + */ + close(): void; + } + /** + * Interface for an abort token. + */ + export interface IAbortToken { + /** + * Whether the token has been aborted. + */ + readonly aborted: boolean; + + /** + * Signal the token. This will cause the `aborted` property to become `true`. + */ + signal(): void; + + /** + * Check if the token has been aborted. If it has, an `aborted` string will be thrown. + */ + check(): void; + + /** + * Reset the token. This will cause the `aborted` property to become `false`. + */ + reset(): void; + } + /** + * Build target info interface + */ + export interface IBuildTargetInfo { + /** + * The display name of the build target. + */ + caption?: string; + + /** + * The settings panel id of the build target. The panel will be integrated into the build settings panel. + * Be aware that the panel usage should be "build-settings". + * @example + * ``` + * //The settings panel id is "TestBuildSettings", which can be used in this field. + * @IEditor.panel("TestBuildSettings", { usage: "build-settings", title: "My Test" }) + * export class TestBuildSettings extends IEditor.EditorPanel { + * } + * ``` + */ + inspector?: string; + + /** + * The build template path. It is a absolute path to the directory that contains the build template files. + * Contents in the directory will be copied to the build output directory during the build process. + */ + templatePath?: string; + + /** + * The settings id of the build target. It needs to be registered first using Editio.extensionManager.createSettings. + * During the build process, you can use BuildTask.platformConfig to get a copy of this setting. + */ + settingsName?: string; + + /** + * The real platform type of the build target. It is meaningful for native platform build, but not for web or mini game build. + */ + runningPlatforms?: Array; + + /** + * The dependent modules that are required by the build target. Modules are external packages that managed by the editor. + */ + requireModules?: Array; + + /** + * Whether the build target is a mini-game platform, e.g. WeChat Mini Game, Oppo Mini Game, etc. + */ + isMiniGame?: boolean; + } + + /** + * Runtime platform type + */ + export enum RuntimePlatformType { + PC = 0, + Android = 1, + IOS = 2, + } + /** + * Interface for logging messages + */ + export interface ILogger { + + /** + * Logs an informational message to the console. + * @param message - The message to log. + * @param optionalParams - Additional parameters to log. + */ + log(message?: any, ...optionalParams: any[]): void; + + /** + * Logs a warning message to the console. + * @param message - The message to log. + * @param optionalParams - Additional parameters to log. + */ + warn(message?: any, ...optionalParams: any[]): void; + + /** + * Logs an error message to the console. + * @param message - The message to log. + * @param optionalParams - Additional parameters to log. + */ + error(message?: any, ...optionalParams: any[]): void; + + /** + * Logs a debug message to the console. + * @param message - The message to log. + * @param optionalParams - Additional parameters to log. + */ + debug(message?: any, ...optionalParams: any[]): void; + } + export type RenderTemplateOptions = { + /** + * Whether to escape html characters. Default is false. + * @example + * ``` + * renderTemplate("{{name}}", { name: "" }, { escape: true }); + * // Output: <script>alert('hello')</script> + * + * renderTemplate("{{name}}", { name: "" }, { escape: false }); + * // Output: + * ``` + */ + escape?: boolean; + + /** + * Use single bracket as the template tag. Default is false. + * @example + * ``` + * renderTemplate("{{name}}", { name: "world" }, { useSingleBracket: false }); + * // Output: world + * + * renderTemplate("{name}", { name: "world" }, { useSingleBracket: true }); + * // Output: world + * ``` + */ + useSingleBracket?: boolean; + }; + + export interface ITemplateUtils { + /** + * Render a template string. + * @param content Source template string. + * @param templateArgs Template arguments. + * @param options Options. + * @returns Rendered string. + */ + renderTemplate(content: string, templateArgs?: Record, options?: RenderTemplateOptions): string; + + /** + * Render a template string read from a file and write the result back to the file. + * @param filePath Path to the template file. + * @param templateArgs Template arguments. + * @param options Options. + */ + renderTemplateFile(filePath: string, templateArgs?: Record, options?: RenderTemplateOptions): void; + + /** + * Render a template string read from a file and write the result back to the file. + * + * This is the promise version of `renderTemplateFile`. + * @param filePath Path to the template file. + * @param templateArgs Template arguments. + * @param options Options. + */ + renderTemplateFileAsync(filePath: string, templateArgs?: Record, options?: RenderTemplateOptions): Promise; + } + + export interface IClipboard { + // Docs: https://electronjs.org/docs/api/clipboard + + /** + * An array of supported formats for the clipboard `type`. + */ + availableFormats(type?: 'selection' | 'clipboard'): string[]; + /** + * Clears the clipboard content. + */ + clear(type?: 'selection' | 'clipboard'): void; + /** + * Whether the clipboard supports the specified `format`. + * + * @experimental + */ + has(format: string, type?: 'selection' | 'clipboard'): boolean; + /** + * Reads `format` type from the clipboard. + * + * `format` should contain valid ASCII characters and have `/` separator. `a/c`, + * `a/bc` are valid formats while `/abc`, `abc/`, `a/`, `/a`, `a` are not valid. + * + * @experimental + */ + read(format: string): string; + /** + * * `title` string + * * `url` string + * + * Returns an Object containing `title` and `url` keys representing the bookmark in + * the clipboard. The `title` and `url` values will be empty strings when the + * bookmark is unavailable. The `title` value will always be empty on Windows. + * + * @platform darwin,win32 + */ + readBookmark(): any; + /** + * Reads `format` type from the clipboard. + * + * @experimental + */ + readBuffer(format: string): Buffer; + /** + * The text on the find pasteboard, which is the pasteboard that holds information + * about the current state of the active application’s find panel. + * + * This method uses synchronous IPC when called from the renderer process. The + * cached value is reread from the find pasteboard whenever the application is + * activated. + * + * @platform darwin + */ + readFindText(): string; + /** + * The content in the clipboard as markup. + */ + readHTML(type?: 'selection' | 'clipboard'): string; + /** + * The image content in the clipboard. + */ + readImage(type?: 'selection' | 'clipboard'): any; + /** + * The content in the clipboard as RTF. + */ + readRTF(type?: 'selection' | 'clipboard'): string; + /** + * The content in the clipboard as plain text. + */ + readText(type?: 'selection' | 'clipboard'): string; + /** + * Writes `data` to the clipboard. + */ + write(data: any, type?: 'selection' | 'clipboard'): void; + /** + * Writes the `title` (macOS only) and `url` into the clipboard as a bookmark. + * + * **Note:** Most apps on Windows don't support pasting bookmarks into them so you + * can use `clipboard.write` to write both a bookmark and fallback text to the + * clipboard. + * + * @platform darwin,win32 + */ + writeBookmark(title: string, url: string, type?: 'selection' | 'clipboard'): void; + /** + * Writes the `buffer` into the clipboard as `format`. + * + * @experimental + */ + writeBuffer(format: string, buffer: Buffer, type?: 'selection' | 'clipboard'): void; + /** + * Writes the `text` into the find pasteboard (the pasteboard that holds + * information about the current state of the active application’s find panel) as + * plain text. This method uses synchronous IPC when called from the renderer + * process. + * + * @platform darwin + */ + writeFindText(text: string): void; + /** + * Writes `markup` to the clipboard. + */ + writeHTML(markup: string, type?: 'selection' | 'clipboard'): void; + /** + * Writes `image` to the clipboard. + */ + writeImage(image: any, type?: 'selection' | 'clipboard'): void; + /** + * Writes the `text` into the clipboard in RTF. + */ + writeRTF(text: string, type?: 'selection' | 'clipboard'): void; + /** + * Writes the `text` into the clipboard as plain text. + */ + writeText(text: string, type?: 'selection' | 'clipboard'): void; + } + export interface IPlist { + /** + * Parse a plist format string to an object. + * @param content The plist format string. + * @returns The object. + * @example + * ``` + * let content = ` + * + * + * + * key1 + * value1 + * key2 + * 2 + * + * `; + * let obj = parsePlist(content); + * //Output: { key1: 'value1', key2: 2 } + * ``` + */ + parsePlist(content: string): Record; + + /** + * Build a plist format string from an object. + * @param obj The object. + * @returns The plist format string. + */ + buildPlist(obj: Record): string; + } + export interface MessageBoxOptions { + /** + * Content of the message box. + */ + message: string; + /** + * Can be `"none"`, `"info"`, `"error"`, `"question"` or `"warning"`. On Windows, + * `"question"` displays the same icon as `"info"`, unless you set an icon using + * the `"icon"` option. On macOS, both `"warning"` and `"error"` display the same + * warning icon. + */ + type?: string; + /** + * Array of texts for buttons. On Windows, an empty array will result in one button + * labeled "OK". + */ + buttons?: string[]; + /** + * Index of the button in the buttons array which will be selected by default when + * the message box opens. + */ + defaultId?: number; + /** + * Pass an instance of AbortSignal to optionally close the message box, the message + * box will behave as if it was cancelled by the user. On macOS, `signal` does not + * work with message boxes that do not have a parent window, since those message + * boxes run synchronously due to platform limitations. + */ + signal?: AbortSignal; + /** + * Title of the message box, some platforms will not show it. + */ + title?: string; + /** + * Extra information of the message. + */ + detail?: string; + /** + * If provided, the message box will include a checkbox with the given label. + */ + checkboxLabel?: string; + /** + * Initial checked state of the checkbox. `false` by default. + */ + checkboxChecked?: boolean; + /** + * Custom width of the text in the message box. + * + * @platform darwin + */ + textWidth?: number; + /** + * The index of the button to be used to cancel the dialog, via the `Esc` key. By + * default this is assigned to the first button with "cancel" or "no" as the label. + * If no such labeled buttons exist and this option is not set, `0` will be used as + * the return value. + */ + cancelId?: number; + /** + * On Windows Electron will try to figure out which one of the `buttons` are common + * buttons (like "Cancel" or "Yes"), and show the others as command links in the + * dialog. This can make the dialog appear in the style of modern Windows apps. If + * you don't like this behavior, you can set `noLink` to `true`. + */ + noLink?: boolean; + /** + * Normalize the keyboard access keys across platforms. Default is `false`. + * Enabling this assumes `&` is used in the button labels for the placement of the + * keyboard shortcut access key and labels will be converted so they work correctly + * on each platform, `&` characters are removed on macOS, converted to `_` on + * Linux, and left untouched on Windows. For example, a button label of `Vie&w` + * will be converted to `Vie_w` on Linux and `View` on macOS and can be selected + * via `Alt-W` on Windows and Linux. + */ + normalizeAccessKeys?: boolean; + } + + export interface MessageBoxReturnValue { + /** + * The index of the clicked button. + */ + response: number; + /** + * The checked state of the checkbox if `checkboxLabel` was set. Otherwise `false`. + */ + checkboxChecked: boolean; + } + + export interface FileFilter { + + // Docs: https://electronjs.org/docs/api/structures/file-filter + + extensions: string[]; + name: string; + } + + export interface OpenDialogOptions { + title?: string; + defaultPath?: string; + /** + * Custom label for the confirmation button, when left empty the default label will + * be used. + */ + buttonLabel?: string; + filters?: FileFilter[]; + /** + * Contains which features the dialog should use. The following values are + * supported: + */ + properties?: Array<'openFile' | 'openDirectory' | 'multiSelections' | 'showHiddenFiles' | 'createDirectory' | 'promptToCreate' | 'noResolveAliases' | 'treatPackageAsDirectory' | 'dontAddToRecent'>; + /** + * Message to display above input boxes. + * + * @platform darwin + */ + message?: string; + /** + * Create security scoped bookmarks when packaged for the Mac App Store. + * + * @platform darwin,mas + */ + securityScopedBookmarks?: boolean; + } + + export interface OpenDialogReturnValue { + /** + * whether or not the dialog was canceled. + */ + canceled: boolean; + /** + * An array of file paths chosen by the user. If the dialog is cancelled this will + * be an empty array. + */ + filePaths: string[]; + /** + * An array matching the `filePaths` array of base64 encoded strings which contains + * security scoped bookmark data. `securityScopedBookmarks` must be enabled for + * this to be populated. (For return values, see table here.) + * + * @platform darwin,mas + */ + bookmarks?: string[]; + } + + export interface SaveDialogOptions { + /** + * The dialog title. Cannot be displayed on some _Linux_ desktop environments. + */ + title?: string; + /** + * Absolute directory path, absolute file path, or file name to use by default. + */ + defaultPath?: string; + /** + * Custom label for the confirmation button, when left empty the default label will + * be used. + */ + buttonLabel?: string; + filters?: FileFilter[]; + /** + * Message to display above text fields. + * + * @platform darwin + */ + message?: string; + /** + * Custom label for the text displayed in front of the filename text field. + * + * @platform darwin + */ + nameFieldLabel?: string; + /** + * Show the tags input box, defaults to `true`. + * + * @platform darwin + */ + showsTagField?: boolean; + properties?: Array<'showHiddenFiles' | 'createDirectory' | 'treatPackageAsDirectory' | 'showOverwriteConfirmation' | 'dontAddToRecent'>; + /** + * Create a security scoped bookmark when packaged for the Mac App Store. If this + * option is enabled and the file doesn't already exist a blank file will be + * created at the chosen path. + * + * @platform darwin,mas + */ + securityScopedBookmarks?: boolean; + } + + export interface SaveDialogReturnValue { + /** + * whether or not the dialog was canceled. + */ + canceled: boolean; + /** + * If the dialog is canceled, this will be `undefined`. + */ + filePath?: string; + /** + * Base64 encoded string which contains the security scoped bookmark data for the + * saved file. `securityScopedBookmarks` must be enabled for this to be present. + * (For return values, see table here.) + * + * @platform darwin,mas + */ + bookmark?: string; + } + export interface IServiceProvider { + /** + * Start the service. + */ + start(): Promise; + + /** + * Stop the service. + */ + stop(): void; + + /** + * Whether the service is started. + */ + get started(): boolean; + + /** + * Get all clients. + */ + get clients(): ReadonlyArray; + + /** + * Register a handler for a channel. + * @param channel Channel name. + * @param func Handler function. + * @param thisArg This object of the handler function. + * @param passClientParam Whether to pass the client object as the first parameter to the handler function. + */ + handle(channel: string, func: Function, thisArg?: any, passClientParam?: boolean): void; + + /** + * Broadcast a message to all clients those have `subscribe` flag setted to true. + * @param channel Channel name. + * @param args Message arguments. + */ + notifyAll(channel: string, ...args: any[]): void; + } + export interface ITypeParser { + getClassMeta(constructor: Function, forceCreate?: boolean): any; + parsePropType(ptype: any): Partial; + } + export namespace IReflectUtils { + /** + * Define metadata for a target. + * @param key Metadata key. + * @param value Metadata value. + * @param target Target object. + * @param propertyName Optional property name. + */ + function defineMetadata(key: string, value: any, target: any, propertyName?: string): void; + + /** + * Get metadata for a target. + * @param key Metadata key. + * @param target Target object. + * @param propertyName Optional property name. + * @returns Metadata value or undefined if not found. + */ + function getMetadata(key: string, target: any, propertyName?: string): any; + + /** + * Get own metadata for a target. + * @param key Metadata key. + * @param target Target object. + * @param propertyName Optional property name. + * @returns Metadata value or undefined if not found. + */ + function getOwnMetadata(key: string, target: any, propertyName?: string): any; + } + + export class CustomEditor { + /** + * Owner node. + */ + readonly owner: Laya.Node; + /** + * Owner component. Null if the script is attached to a node. + */ + readonly comp: Laya.Component; + /** + * Called when the script is added to a node or a component. + */ + onAwake?(): void; + /** + * Called when a child node is added or removed. + */ + onChildChanged?(): void; + /** + * Called when the node's size changes. Only available for 2D nodes. + */ + onSizeChanged?(): void; + /** + * Called when the node is opened in the stage. Only available for box-like sprites, such as Box, Panel, List, etc. + * + * A box-like sprite is a sprite which children are not selectable in the stage only after it is double-clicked to open. + */ + onOpenBox?(): void; + /** + * Called when the node is closed in the stage. Only available for box-like sprites, such as Box, Panel, List, etc. + * + * A box-like sprite is a sprite which children are not selectable in the stage only after it is double-clicked to open. + */ + onCloseBox?(): void; + /** + * Called when the node is selected in the stage. Available for both 2D and 3D nodes. + */ + onSelected?(): void; + /** + * Called when the node is unselected in the stage. Available for both 2D and 3D nodes. + */ + onUnSelected?(): void; + /** + * In this callback, you can draw elements or create handles in the scene view. Only available for 3D nodes. + * @example + * ``` + * // Draw a hemisphere at the node's position. + * onSceneGUI() { + * IEditorEnv.Handles.drawHemiSphere(this.owner.transform.position, 2); + * } + * ``` + */ + onSceneGUI?(): void; + /** + * In this callback, you can draw gizmos that are always drawn. Only available for 3D nodes. + * @example + * ``` + * // Draw a gizmo icon at the node's position. + * onDrawGizmos() { + * IEditorEnv.Gizmos.drawIcon(this.owner.transform.position, "editorResources/UI/gizmo.png"); + * } + * ``` + */ + onDrawGizmos?(): void; + /** + * In this callback, you can draw gizmos only when the object is selected. Available for both 2D and 3D nodes. + * @example + * ``` + * //Demo for drawing a circle gizmo when a 2D sprite is selected. + * private _circle: IEditorEnv.IGizmoCircle; + * onDrawGizmosSelected() { + * if (!this._circle) { + * let manager = IEditorEnv.Gizmos2D.getManager(this.owner); + * this._circle = manager.createCircle(10); + * this._circle.fill("#ff0"); + * } + * this._circle.setLocalPos(10, 10); + * } + * ``` + */ + onDrawGizmosSelected?(): void; + } + + export class HandleDrawBase { + /** + * A color-like structure for picking support internally. + */ + pickColor: Laya.Vector4; + constructor(); + /** + * Implement the drawing logic. + * @param cmdBuffer The command buffer to manage the drawing commands. + */ + execute(cmdBuffer: Laya.CommandBuffer): void; + /** + * Recover any resources here. + */ + recover(): void; + /** + * Destroy the object. + */ + destroy(): void; + } + + export class HandleBaseLine extends HandleDrawBase { + protected _isDotted: boolean; + protected _dotScale: number; + protected _dotTotalSize: number; + protected _dotSize: number; + constructor(dotted?: boolean); + addLine(line: Laya.PixelLineSprite3D): void; + execute(cmdBuffer: Laya.CommandBuffer): void; + } + + export class AssetPreview implements IAssetPreview { + readonly scene: IOffscreenRenderScene; + readonly sprite: Laya.Sprite; + renderTarget: Laya.Sprite | Laya.Scene3D | null; + constructor(); + get bgColor(): Laya.Color; + set bgColor(value: Laya.Color); + /** + * Set target asset by its id. + * @param assetId The id of the asset. + * @returns Any data that can be used by the caller. + */ + setAssetById(assetId: string): Promise; + setAsset(asset: IAssetInfo): Promise; + onReset(): void; + onPreRender(): void; + onPostRender(): void; + changeShape(shape: string): Promise; + setLight(on: boolean): void; + rotate(x: number, y: number): void; + destroy(): void; + } + + /// + /// + + export class AssetThumbnail implements IAssetThumbnail { + /** + * Suggestions for the size of the thumbnail. + */ + static readonly imageSize = 112; + /** + * Background color of the thumbnail. + */ + static readonly bgColor: Laya.Color; + private static _border; + private static _renderer; + generate(asset: IAssetInfo): Promise; + destroy(): void; + /** + * Get a helper renderer for generating thumbnails. + */ + static get offscreenRenderer(): IOffscreenRenderer; + /** + * Add border to ImageBitmap. + * @param bitmap ImageBitmap instance. + * @returns PNG format encoded data. + */ + static addBorder(bitmap: ImageBitmap): Promise; + } + + export class AssetImporter implements IAssetImporter { + metaData: Record; + settings: Record; + importArgs: ReadonlyArray; + handleImport(): Promise; + get asset(): IAssetInfo; + get parentAsset(): IAssetInfo; + get isNewAsset(): boolean; + get subAssets(): ReadonlyArray; + get assetFullPath(): string; + clearLibrary(): void; + get subAssetLocation(): string; + createSubAsset(fileName: string, id?: string): ISubAssetInfo; + createAsset(filePath: string, metaData?: any): IAssetInfo; + setSubType(value: AssetType | string): void; + addTypesToRegistry(types: FTypeDescriptor[]): void; + setIsShader(shaderName: string, typeDef: FTypeDescriptor): void; + getAssetPathById(assetId: string): string; + findAsset(filePath: string, predicate?: (asset: IAssetInfo) => boolean): IAssetInfo; + get tempPath(): string; + /** + * @param progress 0-100的值 + */ + setProgress(progress: number): void; + } + + export class AssetExporter implements IAssetExporter { + readonly asset: IAssetInfo; + readonly fileExtensionOverrides: Record; + readonly exportInfo: IAssetExportInfo; + readonly logger: ILogger; + readonly prefabDataAnalyzer: IPrefabDataAnalyzer; + readonly toolOptions: IExportAssetToolOptions; + get parentAsset(): IAssetInfo; + handleExport(): Promise; + /** + * Pase the links, add referenced assets to the export queue, and then return the export dependency information. + * @param links The links to be parsed. + * @param basePath The base path of the links. + * @returns The export dependency information. + */ + protected parseLinks(links: Array, basePath?: string): Array; + /** + * Add the asset to the export queue. + * @param asset The asset to be added. + * @returns The export information of the asset. + */ + protected addQueue(asset: IAssetInfo): IAssetExportInfo; + /** + * If you want to share data between different exporters, you can use this method. + * @param key The key of the shared data. + * @returns The shared data. + */ + protected getSharedData(key: string): T; + /** + * If you want to share data between different exporters, you can use this method. + * @param key The key of the shared data. + * @param value The shared data. + */ + protected setSharedData(key: string, value: T): void; + } + + export class NumericInput extends gui.Label { + /** + * Minimum value. Default is -Infinity. + */ + min: number; + /** + * Maximum value. Default is Infinity. + */ + max: number; + private _value; + private _holder; + private _lastHolderPos; + private _textField; + private _lastScroll; + private _fractionDigits; + private _step; + private _suffix; + private _prevTabStop; + private _savedText; + constructor(); + /** + * Number of decimal places. Default is 3; + */ + get fractionDigits(): number; + set fractionDigits(value: number); + /** + * The amount by which the value changes each time when changing the value by dragging. Default is 0.01. + * + * If fractionDigits is set, the step will be adjusted to 1 / 10 ^ fractionDigits if it is less than that value. + */ + get step(): number; + set step(value: number); + /** + * Whether the input is editable. Default is true. + */ + get editable(): boolean; + set editable(value: boolean); + /** + * The suffix of the number. Default is "". For example, if the suffix is "%", the displayed value will be "100%". + */ + get suffix(): string; + set suffix(value: string); + get value(): number; + set value(val: number); + get text(): string; + set text(value: string); + onConstruct(): void; + private __onKeydown; + private _holderDragStart; + private _holderDragEnd; + private _holderDragMove; + private __click; + private __focusIn; + private __focusOut; + private __onSubmit; + private __mouseWheel; + } + + export class NumericInputWithSlider extends gui.Label { + private _slider; + private _input; + constructor(); + get min(): number; + set min(value: number); + get max(): number; + set max(value: number); + get fractionDigits(): number; + set fractionDigits(value: number); + get step(): number; + set step(value: number); + get editable(): boolean; + set editable(value: boolean); + get suffix(): string; + set suffix(value: string); + get value(): number; + set value(value: number); + get text(): string; + set text(value: string); + onConstruct(): void; + } + + export class TextInput extends gui.Label { + protected _savedText: string; + protected _textField: gui.TextInput; + protected _clear: gui.Widget; + protected _lang: gui.Widget; + protected _key: gui.TextField; + protected _textInfo: gui.I18nTextInfo; + get text(): string; + set text(value: string); + get editable(): boolean; + set editable(value: boolean); + onConstruct(): void; + private __keyDown; + private __focusIn; + private __focusOut; + private __textChanged; + private __clickClear; + private __clickLang; + private __clickLangRemove; + } + + export class TextArea extends gui.Label { + private _savedText; + private _textField; + private _lang; + private _key; + private _textInfo; + get editable(): boolean; + set editable(value: boolean); + get text(): string; + set text(value: string); + onConstruct(): void; + private __keyDown; + private __focusIn; + private __focusOut; + private __clickLang; + private __clickLangRemove; + } + + export class ServiceProvider implements IServiceProvider { + private _name; + private _handlers; + protected _listenPort: MessagePort; + protected _clients: Array; + protected _subscribedClients: Array; + constructor(name: string); + start(): Promise; + stop(): void; + get started(): boolean; + /** + * Get all clients. + */ + get clients(): ReadonlyArray; + private registerClient; + protected onNewClient(client: IMyMessagePort, ...args: any[]): Promise; + /** + * Register a handler for a channel. + * @param channel Channel name. + * @param func Handler function. + * @param thisArg This object of the handler function. + * @param passClientParam Whether to pass the client object as the first parameter to the handler function. + * @param noAwait If true, the handler function will not be awaited. Defaults to false. + */ + handle(channel: string, func: Function, thisArg?: any, passClientParam?: boolean, noAwait?: boolean): void; + /** + * Broadcast a message to all clients those have `subscribe` flag setted to true. + * @param channel Channel name. + * @param args Message arguments. + */ + notifyAll(channel: string, ...args: any[]): void; + } + + + /** + * The `Conf` class is used to read and write configuration files. + * @param path The path to the configuration file. The path is the absolute path. + * @param fileName The name of the configuration file. + */ + const Conf: new (path: string, fileName?: string) => IConf; + + /** + * The `Delegate` class is used to create a delegate object. + * + * It can be used to manage multiple callback functions and call them in sequence. + */ + const Delegate: new any>() => IDelegate; + + /** + * The `MyMessagePort` class is used to create a message port object. + * + * A message port is a communication channel that allows two different processes to communicate with each other. + * @param port The native message port. + * @param queueTask Whether to queue the task. If true, the received messages will be queued and processed sequentially. Defaults to false. + * @see IMyMessagePort + * @see MyMessagePortStatic + */ + const MyMessagePort: (new (port: MessagePort, queueTask?: boolean) => IMyMessagePort) & typeof MyMessagePortStatic; + /** + * `Gizmos2D` is a helper class for drawing 2D gizmos. + */ + const Gizmos2D: typeof IGizmos2D; + + /** + * `Gizmos` is a helper class for drawing 3D gizmos. + */ + const Gizmos: typeof IGizmos3D; + + /** + * `Handles` is a helper class for drawing handles. + */ + const Handles: typeof IHandles; + + /** + * `HandleUtils` is a helper class for manupulating handles. + */ + const HandleUtils: typeof IHandleUtils; + + /** + * The `ZipFileW` class is used to create a writable zip file. + * @param basePath The base path of the zip file. + * @see IZipFileW + */ + const ZipFileW: new (basePath: string) => IZipFileW; + + /** + * The `ZipFileR` class is used to create a readable zip file. + * @see IZipFileR + */ + const ZipFileR: new () => IZipFileR; + + /** + * The `AbortToken` class is used to create an abort token. + * Abort tokens are used to cancel asynchronous operations. + * @see IAbortToken + */ + const AbortToken: new () => IAbortToken; + + /** + * The `utils` object provides various utility functions. + */ + const utils: ICryptoUtils & INativeTools & IUUIDUtils & IObjectUtils & IUtils & INetUtils & ITemplateUtils & IPlist & IScriptTool & ITypeParser; + + /** + * `CreateAssetUtil` is a helper class for creating assets. + */ + const CreateAssetUtil: typeof ICreateAssetUtil; + + /** + * `HierarchyWriter` is a helper class for serializing nodes and components. + */ + const HierarchyWriter: typeof IHierarchyWriter; + + /** + * `SerializeUtil` is a helper class for serializing and deserializing objects. + */ + const SerializeUtil: typeof ISerializeUtil; + + /** + * `ExportAssetTool` is a helper class for exporting assets. + */ + const ExportAssetTool: new (options?: IExportAssetToolOptions) => IExportAssetTool; + + /** + * `PrefabDataAnalyzer` is a helper class for analyzing prefab data. + */ + const PrefabDataAnalyzer: new () => IPrefabDataAnalyzer; + + /** + * `TypedDataAnalyzer` is a helper class for analyzing typed data. + */ + const TypedDataAnalyzer: new () => ITypedDataAnalyzer; + + /** + * `MaxRectsPacker` is a helper class for packing rectangles. + * @param width The width of the packing area. + * @param height The height of the packing area. + * @param padding The padding between rectangles. + * @param options The options for packing. + */ + const MaxRectsPacker: new (width: number, height: number, padding: number, options?: IMaxRectsPackingOptions) => IMaxRectsPacker; + + /** + * `TexturePacker` is a helper class for packing textures. + */ + const TexturePacker: typeof ITexturePacker; + + /** + * `TextureTool` is a helper class for manipulating textures. + */ + const TextureTool: typeof ITextureTool; + + /** + * `OffscreenRenderer` is a helper class for rendering offscreen. + * @param width The width of the offscreen renderer. + * @param height The height of the offscreen renderer. + */ + const OffscreenRenderer: new (width: number, height: number) => IOffscreenRenderer; + + /** + * `OffscreenRenderScene` is a helper scene for rendering offscreen. + */ + const OffscreenRenderScene: new () => IOffscreenRenderScene; + + /** + * `CameraControls` is a helper class for controlling cameras. + */ + const CameraControls: new (camera: Laya.Camera) => ICameraControls; + + /** + * `ObjectUtils` is a helper class for icon files. + */ + const IcoEncoder: new () => IIcoEncoder; + + /** + * `I18nUtils` is a helper class for internationalization. + */ + const i18nUtils: typeof II18nUtils; + + /** + * Build task class. + */ + const BuildTask: typeof BuildTaskStatic; + + /** + * Laya DCC machanism. + */ + const LayaDCC: typeof ILayaDCC; + + /** + * The `PropsKey` symbol is used to define the key of the props. + */ + const PropsKey: Symbol; + + /** + * The `GUIPrefabWriter` class is used to write the GUI prefab to a file. + */ + const GUIPrefabWriter: typeof IGUIPrefabWriter; + + /** + * The `RelectUtils` class is used to manage metadata. + */ + const ReflectUtils: typeof IReflectUtils; + /** + * References a commonjs module. You can import built-in Node.js modules such as: path, fs, child_process, etc. + * The IDE also includes some third-party modules, including: electron, @svgdotjs, sharp, glob, qrcode, typescript, etc. + * @param id The identifier of the module. For example: "path", "fs", "electron", etc. + * @returns The module object. + */ + function require(id: string): any; + + /** + * Decorator function for registering a one-time initialization function. + * @example + * ``` + * class MyClass { + * @IEditorEnv.onLoad + * static onLoad() { + * console.log("Initialization function called."); + * } + * } + * ``` + */ + function onLoad(target: Object, propertyName: string): void; + + /** + * Decorator function for registering a one-time cleanup function. + * @example + * ``` + * class MyClass { + * @IEditorEnv.onUnload + * static onUnload() { + * console.log("Cleanup function called."); + * } + * } + * ``` + */ + function onUnload(target: Object, propertyName: string): void; + + /** + * Decorator function for registering a callback to be invoked when the user script loads. + * + * The difference between `onUserScriptsLoad` and `onLoad` is that if the script is inside a package, `onUserScriptsLoad` will execute during every reload, but `onLoad` will not. This is because hot module replacement (HMR) triggered by user script modifications does not include the scripts from the package. + */ + function onUserScriptsLoad(target: Object, propertyName: string): void; + + /** + * Decorator function for registering a callback to be invoked when the Hot Module Replacement (HMR) ends. + * + * The difference between `onUserScriptsUnload` and `onUnload` is that if the script is inside a package, `onUserScriptsUnload` will execute during every reload, but `onUnload` will not. This is because hot module replacement (HMR) triggered by user script modifications does not include the scripts from the package. + */ + function onUserScriptsUnload(target: Object, propertyName: string): void; + + /** + * Decorator function for registering a function that is called when the scene environment is about to be reloded. + */ + function onPreload(target: Object, propertyName: string): void; + + /** + * Decorator function for registering a class. The registered class can be visited by it's name in UI process. + * @returns The class decorator function. + * @example + * ``` + * @IEditorEnv.regClass() + * class MyClass { + * static test() { + * } + * } + * + * //In UI process + * IEditor.scene.runScript("MyClass.test"); + * ``` + */ + function regClass(): Function; + + /** + * Decorator function for registering a class as a custom editor. + * @param target The target class to be mounted with the custom editor. + * @returns The class decorator function. + * @example + * ``` + * @IEditorEnv.customEditor(MyComponent) + * class MyEditor extends IEditorEnv.CustomEditor { + * //... + * } + * ``` + */ + function customEditor(target: new () => Laya.Node | Laya.Component): (func: new () => CustomEditor) => void; + + /** + * Decorator function for registering a class as a build plugin. + * @param platform The target platform for the application. For example: "web", "android", "ios", etc. + * @param piority Execution priority. The larger the number, the higher the priority + */ + function regBuildPlugin(platform: string, piority?: number): (func: new () => IBuildPlugin) => void; + + /** + * Decorator function for registering a class as a asset processor. + * @returns The class decorator function. + * @see IAssetProcessor + * @example + * ``` + * @IEditorEnv.regAssetProcessor() + * class MyAssetProcessor extends IEditorEnv.IAssetProcessor { + * async onPostprocessAsset(assetImporter: IAssetImporter) { + * } + * } + * ``` + */ + function regAssetProcessor(): (func: new () => IAssetProcessor) => void; + + /** + * Decorator function for registering a class as a asset importer. + * @param assetTypeOrFileExts The asset type or file extensions that the importer can handle. + * @param options The options for the importer. + * @returns The class decorator function. + * @see IAssetImporter + * @example + * ``` + * @IEditorEnv.regAssetImporter(["abc"]) + * export class DemoAssetImporter extends IEditorEnv.AssetImporter { + * async handleImport(): Promise { + * console.log("importing asset", this.assetFullPath); + * } + * } + * ``` + */ + function regAssetImporter(assetTypeOrFileExts: ReadonlyArray, options?: IAssetImporterOptions): (func: new () => AssetImporter) => void; + + /** + * Decorator function for registering a class as a asset exporter. + * @param assetTypeOrFileExts The asset type or file extensions that the exporter can handle. + * @param options The options for the exporter. + * @returns The class decorator function. + * @see IAssetExporter + * @example + * ``` + * @IEditorEnv.regAssetExporter(["abc"]) + * export class DemoAssetExporter extends IEditorEnv.AssetExporter { + * async handleExport(): Promise { + * console.log("exporting asset", this.asset.file); + * + * this.exportInfo.contents[0] = { type: "text", data: "exported" }; + * } + * } + * ``` + */ + function regAssetExporter(assetTypeOrFileExts: ReadonlyArray, options?: IAssetExporterOptions): (func: new () => AssetExporter) => void; + + /** + * Decorator function for registering a class as a asset saver. + * @param assetTypeOrFileExts The asset type or file extensions that the saver can handle. + * @returns The class decorator function. + * @see IAssetSaver + * @example + * ``` + * @IEditorEnv.regAssetSaver(["abc"]) + * export class DemoAssetSaver extends IEditorEnv.IAssetSaver { + * async onSave(asset: IEditorEnv.IAssetInfo, res: ABCResource): Promise { + * let data = IEditorEnv.SerializeUtil.encodeObj(res, null, { writeType: false }); + * await IEditorEnv.utils.writeJsonAsync(EditorEnv.assetMgr.getFullPath(asset), data); + * } + * } + * ``` + */ + function regAssetSaver(assetTypeOrFileExts: ReadonlyArray): (func: new () => IAssetSaver) => void; + + /** + * Decorator function for registering a class as a scene hook. + * @returns The class decorator function. + * @see ISceneHook + * @example + * ``` + * @IEditorEnv.regSceneHook() + * class MySceneHook extends IEditorEnv.ISceneHook { + * onCreateNode(scene: IEditorEnv.IGameScene, node: Laya.Node) { + * if (node instanceof Laya.Sprite) + * node.anchorX = node.anchorY = 0.5; + * } + * } + * ``` + */ + function regSceneHook(): (func: new () => ISceneHook) => void; + } + + /** + * EditorEnv is a global object used to access various functions of the editor. + */ + var EditorEnv: IEditorEnv.IEditorEnvSingleton; +} diff --git a/shudu/engine/types/editor-ui.d.ts b/shudu/engine/types/editor-ui.d.ts new file mode 100644 index 0000000..8b809b0 --- /dev/null +++ b/shudu/engine/types/editor-ui.d.ts @@ -0,0 +1,3006 @@ +declare namespace gui { + type EnumDescriptor = { + name: string; + value: any; + extend?: EnumDescriptor; + [index: string]: any; + }[] | any[] | Object | string; + type PropertType = string | Function | Object | [ + PropertType + ] | [ + "Record", + PropertType + ]; + interface PropertyDescriptor { + /** 属性名称。一般不需要设定。 */ + name: string; + /** + * 属性类型。 + * 基础类型有:number,string,boolean,any,注意是使用字符串,不是类型。 + * 复合类型有:数组,使用类似["number"]这样的方式表达;字典,使用类似["Record", "number"]这样的方式表达,第一个元素固定为Record,第二个元素为实际类型。 + * 其他对象类型可以直接使用类名,但要注意该类必须有使用regClass装饰器。也支持枚举类型。枚举类型不需要regClass。 + * 如果不提供type,表示只用于ui样式,没有实际对应数据,和不会序列化 + */ + type: PropertType; + /** 标题。如果不提供,则使用name。 */ + caption: string; + /** 提示文字 */ + tips: string; + /** 属性栏目。为多个属性设置相同的值,可以将它们显示在同一个Inspector栏目内。 */ + catalog: string; + catalogCaption: string; + catalogOrder: number; + /** + * 编辑这个属性的控件。内置有:number,string,boolean,color,vec2,vec3,vec4,asset + * + * number : 数字输入。 + * string : 字符串输入。默认为单行输入,如果是多行,需要激活multiline选项。 + * boolean : 布尔值输入,用于单选框或多选框。 + * color : 一个颜色框+调色盘+拾色器 + * vec2 : XY输入的组合 + * vec3 : XYZ输入的组合 + * vec4 : XYZW输入的组合 + * asset : 选择资源 + * + * 一般来说,不需要设置这个选项,编辑器会自动根据属性类型选择适合的控件,但在某些情况下可以需要强制指定。 + * 例如,如果数据类型是Vector4,但其实它表达的是颜色,用默认编辑Vector4的控件不适合,需要在这里设置为“color”。 + * + * 显式设置inspector为null,则不会为属性构造inspector。这与hidden设置为true不同。hidden为true是创建但不可见, + * inspector为null的话则是完全不创建。 + */ + inspector: string; + /** 隐藏控制:true隐藏,false显示。常用于关联属性的情况。 + * 1. 可以用表达式,通过将条件表达式放到字符串里,获得布尔类型的运算结果,例如"!data.a && !data.b",表示属性a和属性b均为空时,条件成立(true),隐藏这个属性。 + * 2. 这里的data为当前组件的对象数据,data.a与data.b属性字段的a与b就是指当前组件中的a与b属性值,通过这种方法取到组件对象数据中的属性值,用于条件判断,作用于当前属性是否隐藏。 + */ + hidden: boolean | string; + /** 只读控制。 + * 1. 可以用表达式,通过将条件表达式放到字符串里,获得布尔类型的运算结果,例如"!data.a && !data.b",表示属性a和属性b均为空时,条件成立(true),该属性只读。 + * 2. 这里的data为当前组件的对象数据,data.a与data.b属性字段的a与b就是指当前组件中的a与b属性值,通过这种方法取到组件对象数据中的属性值,用于条件判断,作用于当前属性是否隐藏。 + */ + readonly: boolean | string; + /** 数据检查机制。 + * 1. 将包括表达式的字符串传入,用于判断检查是否符合表达式的条件。符合条件,需要返回报错信息。 + * 2. 使用示例为:"if(value == data.a) return '不能与a的值相同'" + * 其中的value为当前用户在该属性输入的值,data为当前组件的对象数据,data.a是当前组件中的a属性值 + */ + validator: string; + /** 是否序列化 */ + serializable: boolean; + /** 属性在不参与序列化时,如果它的数据可能受其他可序列化的属性影响,在这里填写其他属性名称。这通常用于判断预制体属性是否覆盖。*/ + affectBy?: string; + /** 是否多行文本输入 */ + multiline: boolean; + /** 是否密码输入 */ + password: boolean; + /** 如果true或者缺省,文本输入每次输入都提交;否则只有在失焦时才提交 */ + submitOnTyping: boolean; + /** 输入文本的提示信息 */ + prompt: string; + /** 定义枚举 */ + enumSource: EnumDescriptor; + /** 是否反转布尔值。例如当属性值为true时,多选框显示为不勾选。 */ + reverseBool: boolean; + /** 是否允许null值。默认为true。*/ + nullable: boolean; + /** 数字的最小值 */ + min: number; + /** 数字的最大值 */ + max: number; + /** 数值范围,等同于一次性设置min和max。 */ + range: [ + number, + number + ]; + /** 拖动方式改变数值时,每次数值改变的幅度。 */ + step: number; + /** 小数点后的位数 */ + fractionDigits: number; + /** 显示为百分比 */ + percentage: boolean; + /** 对数组类型属性适用。表示数组是固定长度,不允许修改。*/ + fixedLength: boolean; + /** 对数组类型属性适用。如果不提供,则表示数组允许所有操作,如果提供,则只允许列出的操作。*/ + arrayActions: Array<"append" | "insert" | "delete" | "move">; + /** 对数组类型属性适用。这里可以定义数组元素的属性 */ + elementProps: Partial; + /** 对颜色类型属性适用。表示是否提供透明度a值的修改。 */ + showAlpha: boolean; + /** 对颜色类型属性适用。它与default值不同的是,当default是null时,可以用defaultColor定义一个非null时的默认值。*/ + defaultColor: any; + /** 对颜色类型属性适用。允许显示一个checkbox决定颜色是否为null。 */ + colorNullable: boolean; + /** 对对象类型属性适用。如果为true,隐藏对象的标题,同时对象下的属性的显示缩进会减少一级。*/ + hideHeader: boolean; + /** 对对象类型属性适用。对象创建时可以下拉选择一个类型。如果显示设置为null,则禁止菜单。默认是显示一个创建基类的菜单。*/ + createObjectMenu: Array; + /** 说明此属性是引用一个资源 */ + isAsset?: boolean; + /** 对资源类型的属性适用。多个资源类型用逗号分隔,例如“Image,Audio"。*/ + assetTypeFilter: string; + /** 如果属性类型是string,并且进行资源选择时,这个选项决定属性值是资源原始路径还是res://uuid这样的格式。如果是true,则是资源原始路径。默认false。*/ + useAssetPath: boolean; + /** 对资源类型的属性适用。选择资源时是否允许选择内部资源 */ + allowInternalAssets: boolean; + /** 显示位置。语法:before xxx/after xxx/first/last。 */ + position: string; + /** 表示属性是私有属性。私有属性不会显示在Inspector里,但会序列化保存。 */ + "private": boolean; + /** 增加缩进,单位是层级,不是像素。 */ + addIndent: number; + /** 表示属性是否允许多选情况下编辑。默认true。 */ + allowMultipleObjects: boolean; + /** 表示属性不显示在派生类的属性表中 */ + hideInDeriveType: boolean; + /** 属性改变时额外调用对象的一个函数,这里是函数名称。 + * 函数原型是func(key?:string)。其中key在改变成员内部属性时会传递。 + * 例如改变数据某个元素的内部属性,则key是这个元素的索引。 + */ + onChange: string; + /** 额外的选项 */ + options: Record; + } + interface TypeDescriptor { + /** 标题。如果不提供,则使用name。 */ + caption: string; + /** 添加到组件菜单。 */ + menu: string; + /** 图标。*/ + icon: string; + /** 属性列表 */ + properties: Array>; + /** 编辑这个类实例的控件 */ + inspector: string; + /** 额外的选项 */ + options: Record; + } + class decorator { + /** + * 注册一个类型,注册后才能被序列化系统自动保存和载入。 + */ + static regClass(assetId?: string): any; + /** + * 设置类型的额外信息。 + * @param info 类型的额外信息 + */ + static classInfo(info?: Partial): any; + /** + * 设置组件可以在编辑器环境中执行完整声明周期。 + */ + static runInEditor(constructor: Function): void; + /** + * 使用这个装饰器,可以使属性显示在编辑器属性设置面板上,并且能序列化保存。 + * @param info 属性的类型,如: Number,"number",[Number],["Record", Number]等。或传递对象描述详细信息,例如{ type: "string", multiline: true }。 + */ + static property(info: PropertType | Partial): any; + } + class UIConfig { + static defaultFont: string; + static windowModalWaiting: Prefab; + static globalModalWaiting: Prefab; + static modalLayerColor: Color; + static buttonSound: string; + static buttonSoundVolumeScale: number; + static horizontalScrollBar: Prefab; + static verticalScrollBar: Prefab; + static defaultScrollStep: number; + static defaultScrollDecelerationRate: number; + static defaultScrollBarDisplay: number; + static defaultScrollTouchEffect: boolean; + static defaultScrollBounceEffect: boolean; + /** + * 当滚动容器设置为“贴近ITEM”时,判定贴近到哪一个ITEM的滚动距离阀值。 + */ + static defaultScrollSnappingThreshold: number; + /** + * 当滚动容器设置为“页面模式”时,判定翻到哪一页的滚动距离阀值。 + */ + static defaultScrollPagingThreshold: number; + static popupMenu: Prefab; + static tooltipsWin: Prefab; + static defaultTooltipsShowDelay: number; + static defaultComboBoxVisibleItemCount: number; + static touchScrollSensitivity: number; + static touchDragSensitivity: number; + static clickDragSensitivity: number; + static bringWindowToFrontOnClick: boolean; + static frameTimeForAsyncUIConstruction: number; + static defaultLinkClass: string; + } + interface IUIPackage { + isPlaying: boolean; + isPreview: boolean; + assetDb: IAssetDb; + i18nProvider: import("i18next").i18n; + language: string; + readonly resourceMgr: IResourceManager; + createWidget(url: string, options?: Record, errors?: Array): Promise; + createWidgetSync(url: string, options?: Record, errors?: Array): T; + playSound(src: string, volumeScale?: number): void; + } + var UIPackage: IUIPackage; + function setInstance(inst: IUIPackage): void; + class Component { + private _hideFlags; + private _enableState; + _status: number; + owner: Widget; + _enabled: boolean; + _extra: IComponentExtra; + runInEditor: boolean; + scriptPath: string; + get hideFlags(): number; + set hideFlags(value: number); + constructor(); + hasHideFlag(flag: number): boolean; + get enabled(): boolean; + set enabled(value: boolean); + get awaked(): boolean; + get destroyed(): boolean; + destroy(): void; + onAdded(): void; + onAwake(): void; + onEnable(): void; + onStart?(): void; + onUpdate?(): void; + onLateUpdate?(): void; + onDisable(): void; + onDestroy(): void; + } + interface IComponentExtra { + } + class ComponentDriver { + static readonly onUpdates: Set; + static readonly onLateUpdates: Set; + static readonly toStarts: Set; + static readonly toDestroys: Set; + static callStart(): void; + static callUpdate(): void; + static callLateUpdate(): void; + static callDestroy(): void; + static add(comp: Component): void; + static remove(comp: Component): void; + } + class AssetDb implements IAssetDb { + static uuidMap: Record; + static urlMap: Record; + static metaMap: Record; + static i18nUrlMap: Record; + UUID_to_URL_sync(uuid: string): string; + UUID_to_URL(uuid: string): Promise; + URL_to_UUID(url: string): Promise; + formatURL(url: string): string; + getMeta(url: string, uuid: string): Promise; + getI18nSettingsURL(id: string): string; + } + type ProgressCallback = (progress: number) => void; + interface IBatchProgress { + readonly itemCount: number; + createCallback(weight?: number): ProgressCallback; + update(index: number, progress: number): void; + } + class BatchProgress implements IBatchProgress { + private _callback; + private _items; + private _weights; + private _progress; + constructor(callback: ProgressCallback); + get itemCount(): number; + reset(): void; + createCallback(weight?: number): ProgressCallback; + update(index: number, value: number): void; + } + class ClassUtils { + static classRegistry: Record; + static runtimeRegistry: Record; + static regClass(name: string, cls: Function): void; + static getClass(name: string): Function; + static regRuntime(url: string, cls: Function): void; + static getRuntime(url: string): Function; + } + class Downloader { + common(owner: any, url: string, originalUrl: string, contentType: string, onProgress: (progress: number) => void, onComplete: (data: any, error?: string) => void): void; + image(owner: any, url: string, originalUrl: string, onProgress: (progress: number) => void, onComplete: (data: any, error?: string) => void): void; + imageWithBlob(owner: any, data: ArrayBuffer, originalUrl: string, onProgress: (progress: number) => void, onComplete: (data: any, error?: string) => void): void; + audio(owner: any, url: string, originalUrl: string, onProgress: (progress: number) => void, onComplete: (data: any, error?: string) => void): void; + } + interface IAssetDb { + UUID_to_URL_sync(uuid: string): string; + UUID_to_URL(uuid: string): Promise; + URL_to_UUID(url: string): Promise; + formatURL(url: string): string; + getMeta(url: string, uuid: string): Promise; + getI18nSettingsURL(id: string): string; + } + interface IPrefabParserAPI { + /**收集资源链接 */ + collectResourceLinks: (data: any, basePath: string) => (string | ILoadURL)[]; + /**解析 */ + parse: (data: any, basePath?: string, options?: Record, errors?: Array) => Widget; + } + interface IResource { + url: string; + uuid: string; + lock: boolean; + get destroyed(): boolean; + get obsolute(): boolean; + set obsolute(value: boolean); + get refCount(): number; + isCreateFrom(url: string): boolean; + addRef(count?: number): void; + removeRef(count?: number): void; + clearRef(): void; + destroy(): void; + } + interface ILoadTask { + readonly type: string; + readonly url: string; + readonly formattedUrl: string; + readonly uuid: string; + readonly ext: string; + readonly manager: IResourceManager; + readonly obsoluteInst: IResource; + readonly options: Readonly; + readonly progress: IBatchProgress; + } + interface IResourceLoader { + load(task: ILoadTask): Promise; + } + interface ILoadOptions { + type?: string; + priority?: number; + group?: string; + cache?: boolean; + ignoreCache?: boolean; + noRetry?: boolean; + silent?: boolean; + blob?: ArrayBuffer; + initiator?: ILoadTask; + [key: string]: any; + } + interface ILoadURL extends ILoadOptions { + url: string; + } + interface ContentTypeMap { + "text": string; + "json": any; + "xml": XML; + "arraybuffer": ArrayBuffer; + "image": HTMLImageElement | ImageBitmap; + "sound": HTMLAudioElement; + } + interface IResourceManager { + baseUrl: string; + baseUrls: Record; + version: Record; + debug: boolean; + retryNum: number; + retryDelay: number; + maxLoader: number; + loadedMap: { + [url: string]: Array; + }; + preLoadedMap: { + [url: string]: any; + }; + get loading(): boolean; + load(url: string | ILoadURL | (string | Readonly)[], type?: string, onProgress?: ProgressCallback): Promise; + load(url: string | ILoadURL | (string | Readonly)[], options?: Readonly, onProgress?: ProgressCallback): Promise; + load(url: string | ILoadURL | (string | Readonly)[], arg1?: string | Readonly, onProgress?: ProgressCallback): Promise; + fetch(url: string, contentType: K, onProgress?: ProgressCallback, options?: Readonly): Promise; + cancelLoad(urls: string | string[]): void; + getRes(url: string, type?: string): any; + cacheRes(url: string, res: IResource, type?: string): void; + clearRes(url: string, checkObj?: IResource): void; + formatURL(url: string, base?: string): string; + forEachResource(callback: (res: IResource) => void): void; + } + class Prefab extends Resource { + static parserAPI: IPrefabParserAPI; + protected _deps: Array; + data: any; + basePath: string; + constructor(data: any, basePath?: string, deps?: Array); + create(options?: Record, errors?: Array): T; + get deps(): ReadonlyArray; + addDep(res: IResource): void; + addDeps(resArr: Array): void; + protected onDestroy(): void; + get obsolute(): boolean; + set obsolute(value: boolean); + private onDepObsolute; + } + class PrefabLoader implements IResourceLoader { + load(task: ILoadTask): Promise; + } + class PrefabParser { + static parse(data: any, basePath?: string, options?: Record, errors?: Array): Widget; + static collectResourceLinks(data: any, basePath: string): (string | ILoadURL)[]; + } + class Resource extends EventDispatcher implements IResource { + protected _ref: number; + protected _obsolute: boolean; + protected _destroyed?: boolean; + url: string; + uuid: string; + lock: boolean; + get destroyed(): boolean; + get obsolute(): boolean; + set obsolute(value: boolean); + get refCount(): number; + protected constructor(); + isCreateFrom(url: string): boolean; + addRef(count?: number): void; + removeRef(count?: number): void; + clearRef(): void; + protected onDestroy(): void; + destroy(): void; + } + class ResourceManager implements IResourceManager { + static readonly extMap: { + [ext: string]: Array; + }; + static readonly typeMap: { + [type: string]: TypeMapEntry; + }; + static downloader: Downloader; + static registerLoader(exts: string[], cls: new () => IResourceLoader, type?: string): void; + baseUrl: string; + baseUrls: Record; + version: Record; + debug: boolean; + retryNum: number; + retryDelay: number; + maxLoader: number; + loadedMap: { + [url: string]: Array; + }; + preLoadedMap: { + [url: string]: any; + }; + private _loadings; + private _queue; + private _downloadings; + constructor(); + get loading(): boolean; + load(url: string | ILoadURL | (string | Readonly)[], type?: string, onProgress?: ProgressCallback): Promise; + load(url: string | ILoadURL | (string | Readonly)[], options?: Readonly, onProgress?: ProgressCallback): Promise; + fetch(url: string, contentType: K, onProgress?: ProgressCallback, options?: Readonly): Promise; + private queueToDownload; + private download; + private completeItem; + getURLInfo(url: string, type?: string): URLInfo; + warnFailed(url: string, err?: any, initiatorUrl?: string): void; + warn(msg: string, err?: any): void; + getRes(url: string, type?: string): any; + cacheRes(url: string, data: any, type?: string): void; + clearRes(url: string, checkObj?: any): void; + forEachResource(callback: (res: Resource) => void): void; + cancelLoad(url: string | string[]): void; + private _cancelLoad; + formatURL(url: string, base?: string): string; + clearUnusedResources(): void; + private destroyUnusedResources; + } + type TypeMapEntry = { + typeId: number; + loaderType: new () => IResourceLoader; + }; + interface URLInfo { + ext: string; + typeId: number; + main: boolean; + loaderType: new () => IResourceLoader; + } + const TypedArrayClasses: Record; + class SerializeUtil { + static isDeserializing: boolean; + static hasProp(...keys: string[]): boolean; + errors: Array; + getNodeByRef: (id: string | string[]) => Widget; + getNodeData: (node: Widget) => any; + basePath: string; + decodeObj(data: any, obj?: any): any; + decodeObjBounds(data: any, obj: Widget): void; + decodeObjSome(data: any, obj: any, includeKeys: Array): void; + decodeObjWithFilter(data: any, obj: any, excludeKeys: Set): void; + private _decode; + static bakeOverrideData(overrideData: any): Record; + static applyOverrideData(nodeData: any, overrideDataMap: Record>): any; + } + class Texture extends Resource { + sizeGrid: Array; + svgSize: Array; + source: HTMLImageElement | ImageBitmap; + formattedUrl: string; + constructor(); + get width(): number; + get height(): number; + } + class TextureLoader implements IResourceLoader { + load(task: ILoadTask): Promise; + } + type I18nTextInfo = { + sid?: string; + key?: string; + text: string; + }; + class Translations extends Resource { + private _id; + private _t; + private _lngs; + private _fallbackLng; + static _allInsts: Map; + static getById(id: string): Translations; + static create(id: string, fallbackLng?: string): Translations; + static translate(text: string, options?: Record): string; + static decodeI18nText(text: string, out?: I18nTextInfo): I18nTextInfo; + static encodeI18nText(info: I18nTextInfo, newText?: string): string; + protected constructor(id: string, fallbackLng?: string); + get id(): string; + setContent(lng: string, content: any): this; + t(name: string, defaultValue?: string): string; + t(name: string, options: Record): string; + t(name: string, defaultValue: string, options: Record): string; + protected onDestroy(): void; + } + class TranslationsLoader implements IResourceLoader { + load(task: ILoadTask): Promise; + } + interface IGraphics { + owner: UIElement; + getColor(): number; + setColor(value: number): void; + refresh(): void; + } + class SEllipse extends SRect { + protected onRender(style: CSSStyleDeclaration): void; + } + class SGraphics implements IGraphics { + protected sizeSensitive: boolean; + protected empty: boolean; + protected _owner: UIElement; + get owner(): UIElement; + set owner(value: UIElement); + getColor(): number; + setColor(value: number): void; + refresh(bySizeChanged?: boolean): void; + protected refreshNow(): void; + private _draw; + protected adjustContentBox(offsetX: number, offsetY: number): void; + protected onRender(style: CSSStyleDeclaration): void; + protected onDestroy(): void; + } + class SImage extends SGraphics { + protected _tex: Texture; + protected _tile: boolean; + protected _radius: Array; + protected _ratio: boolean; + protected _color: number; + constructor(src?: Texture); + get texture(): Texture; + set texture(value: Texture); + private onTextureReload; + get tile(): boolean; + set tile(value: boolean); + get borderRadius(): Array; + set borderRadius(value: Array); + get radiusIsRatio(): boolean; + set radiusIsRatio(value: boolean); + get color(): number; + set color(value: number); + getColor(): number; + setColor(value: number): void; + protected onDestroy(): void; + protected onRender(style: CSSStyleDeclaration): void; + } + class SLine extends SGraphics { + protected _color: Color; + protected _style: string; + constructor(color?: Color, style?: string); + get color(): Color; + set color(value: Color); + getColor(): number; + setColor(value: number): void; + get style(): string; + set style(value: string); + protected onRender(style: CSSStyleDeclaration): void; + } + class SRect extends SGraphics { + protected _lineWidth: number; + protected _lineColor: Color; + protected _fillColor: Color; + protected _lineStyle: string; + protected _radius: Array; + protected _ratio: boolean; + constructor(lineWidth?: number, lineColor?: Color, fillColor?: Color); + get lineWidth(): number; + set lineWidth(value: number); + get lineColor(): Color; + set lineColor(value: Color); + get fillColor(): Color; + set fillColor(value: Color); + get lineStyle(): string; + set lineStyle(value: string); + /** + * [TL,TR,BR,BL] + */ + get borderRadius(): Array; + set borderRadius(value: Array); + get radiusIsRatio(): boolean; + set radiusIsRatio(value: boolean); + get color(): number; + set color(value: number); + getColor(): number; + setColor(value: number): void; + protected onRender(style: CSSStyleDeclaration): void; + } + class UIElement extends HTMLDivElement { + owner: Widget; + _x: number; + _y: number; + _width: number; + _height: number; + _alpha: number; + _grayed: boolean; + _visible: boolean; + _finalGrayed: boolean; + _touchable: boolean; + _touchThrough: boolean; + _touchFlag: number; + _scaleX: number; + _scaleY: number; + _rot: number; + _anchorX: number; + _anchorY: number; + _transformDirty: boolean; + _disableLowScroll: boolean; + static create(): UIElement; + constructor(); + get name(): string; + set name(value: string); + get x(): number; + set x(value: number); + get y(): number; + set y(value: number); + setPos(x: number, y: number): void; + get width(): number; + set width(value: number); + get height(): number; + set height(value: number); + setSize(wv: number, hv: number): void; + get anchorX(): number; + set anchorX(value: number); + get anchorY(): number; + set anchorY(value: number); + setAnchor(xv: number, yv: number): void; + get scaleX(): number; + set scaleX(value: number); + get scaleY(): number; + set scaleY(value: number); + setScale(xv: number, yv: number): void; + get rotation(): number; + set rotation(value: number); + get alpha(): number; + set alpha(value: number); + get visible(): boolean; + set visible(value: boolean); + get grayed(): boolean; + set grayed(value: boolean); + appendChild(node: T): T; + insertBefore(node: T, child: Node): T; + removeSelf(): void; + globalToLocal(x: number, y: number, out?: Vec2): Vec2; + localToGlobal(x: number, y: number, out?: Vec2): Vec2; + get clipping(): boolean; + set clipping(value: boolean); + get touchable(): boolean; + set touchable(value: boolean); + get touchThrough(): boolean; + set touchThrough(value: boolean); + private updateGrayed; + private updatePointerEvents; + private updateTransform; + clearBackgroundStyle(): void; + static addStyles(doc: Document): void; + } + const defaultInputPadding: Array; + type EventType = "pointer_down" | "pointer_up" | "pointer_move" | "click" | "right_click" | "roll_over" | "roll_out" | "mouse_wheel" | "key_down" | "key_up" | "added_to_stage" | "removed_from_stage" | "pos_changed" | "size_changed" | "content_size_changed" | "controllers_changed" | "changed" | "focus_in" | "focus_out" | "drag_start" | "drag_move" | "drag_end" | "drop" | "native_dragstart" | "native_dragover" | "native_dragend" | "native_dragleave" | "native_drop" | "scroll" | "scroll_end" | "pull_down_release" | "pull_up_release" | "click_item" | "click_link" | "submit" | "play_end" | "gear_stop" | "popup" | "loaded" | "instance_reload"; + class Event { + data: any; + static readonly _lastInput: InputInfo; + constructor(); + get type(): string; + get target(): EventDispatcher; + get sender(): Widget; + get initiator(): Widget; + get originalTarget(): HTMLElement; + get input(): Readonly; + stopPropagation(): void; + preventDefault(): void; + capturePointer(): void; + get isDefaultPrevented(): boolean; + } + type EventCallback = (evt: Event) => void; + class EventDispatcher { + private _listeners; + constructor(); + on(type: EventType, callback: EventCallback, target?: any, capture?: boolean): void; + on(type: string, callback: EventCallback, target?: any, capture?: boolean): void; + off(type: EventType, callback: EventCallback, target?: any, capture?: boolean): void; + off(type: string, callback: EventCallback, target?: any, capture?: boolean): void; + offAll(type?: EventType, capture?: boolean): void; + offAll(type?: string, capture?: boolean): void; + offAllCaller(target: any): void; + hasListener(type: EventType, capture?: boolean): boolean; + hasListener(type: string, capture?: boolean): boolean; + emit(type: EventType, data?: any): boolean; + emit(type: string, data?: any): boolean; + bubbleEvent(type: string, data?: any): void; + protected onStartListeningToType(type: string): void; + private getDelegate; + } + var EventPool: Pool; + class InputInfo { + x: number; + y: number; + mouseWheelDelta: number; + pointerId: number; + button: number; + clickCount: number; + holdTime: number; + shiftKey: boolean; + altKey: boolean; + ctrlKey: boolean; + commandKey: boolean; + keyCode: string; + key: string; + keyTimestamp: number; + get isDblClick(): boolean; + get isRightButton(): boolean; + get ctrlOrCmdKey(): boolean; + } + class InputManager { + touchScreen: boolean; + electron: boolean; + private _pointers; + private _touchTarget; + private _pointerPos; + private _touchCount; + private _rollOverChain; + private _rollOutChain; + private _lastPointerId; + private _nextCursor; + private _focus; + private _nextFocus; + private _focusOutChain; + private _focusInChain; + private _focusHistory; + private _dragging; + constructor(root: GRoot); + get pointerPos(): Vec2; + get touchTarget(): Widget; + get touchCount(): number; + getPointerPos(pointerId?: number, out?: Vec2): Vec2; + addCaptor(pointerId: number, target: EventDispatcher): void; + removeCaptor(target: EventDispatcher): void; + cancelClick(pointerId?: number): void; + getLastPressedKey(timeThreshold?: number): string; + private onKeydown; + private onKeyup; + private setLastInput; + private handlePointer; + private clickTest; + private handleWheel; + private handleContextMenu; + private getPointer; + private handleRollOver; + private setLastPointer; + onClickLink(event: Event, href: string): void; + get focus(): Widget; + validateFocus(container: Widget, child: Widget): void; + setFocus(newFocus: Widget): void; + private onFocusRemoving; + private checkNextFocus; + private onWindowBlur; + } + const lastFocus: unique symbol; + class Color { + static CLEAR: Readonly; + static RED: Readonly; + static GREEN: Readonly; + static BLUE: Readonly; + static YELLOW: Readonly; + static GRAY: Readonly; + static BLACK: Readonly; + static WHITE: Readonly; + r: number; + g: number; + b: number; + a: number; + static hexToString(rgb: number): string; + static stringToHex(str: string): number; + constructor(str: string); + constructor(r?: number, g?: number, b?: number, a?: number); + copy(source: Color): this; + clone(): Color; + getHex(): number; + toString(): string; + getStyleString(): string; + parse(src: number | string): void; + } + class Rect { + x: number; + y: number; + width: number; + height: number; + constructor(x?: number, y?: number, width?: number, height?: number); + set(x: number, y: number, width: number, height: number): void; + setMinMax(xMin: number, yMin: number, xMax: number, yMax: number): void; + get position(): Vec2; + get size(): Vec2; + get xMin(): number; + set xMin(value: number); + get xMax(): number; + set xMax(value: number); + get yMin(): number; + set yMin(value: number); + get yMax(): number; + set yMax(value: number); + intersection(another: Rect, out?: Rect): Rect; + intersects(another: Rect): boolean; + union(another: Rect, out?: Rect): Rect; + extend(x: number, y: number): void; + contains(x: number | Vec2, y?: number): boolean; + copy(source: Rect): void; + clone(): Rect; + equals(another: Rect): boolean; + } + class StretchParam { + ratio: number; + priority: number; + min: number; + max: number; + fixed: boolean; + setRatio(value: number): this; + setPriority(value: number): this; + setLimit(min: number, max: number): this; + setFixed(): this; + } + class Vec2 { + x: number; + y: number; + constructor(x?: number, y?: number); + set(x: number, y: number): this; + reset(): this; + distance(x: number, y: number): number; + toString(): string; + normalize(): void; + copy(Vec2: Vec2): Vec2; + clone(): Vec2; + equals(another: Vec2): boolean; + } + function evaluateEase(easeType: number, time: number, duration: number, overshootOrAmplitude: number, period: number): number; + enum EaseType { + Linear = 0, + SineIn = 1, + SineOut = 2, + SineInOut = 3, + QuadIn = 4, + QuadOut = 5, + QuadInOut = 6, + CubicIn = 7, + CubicOut = 8, + CubicInOut = 9, + QuartIn = 10, + QuartOut = 11, + QuartInOut = 12, + QuintIn = 13, + QuintOut = 14, + QuintInOut = 15, + ExpoIn = 16, + ExpoOut = 17, + ExpoInOut = 18, + CircIn = 19, + CircOut = 20, + CircInOut = 21, + ElasticIn = 22, + ElasticOut = 23, + ElasticInOut = 24, + BackIn = 25, + BackOut = 26, + BackInOut = 27, + BounceIn = 28, + BounceOut = 29, + BounceInOut = 30, + Custom = 31 + } + class GPath { + private _segments; + private _points; + private _fullLength; + constructor(); + get length(): number; + create2(pt1: PathPoint, pt2: PathPoint, pt3?: PathPoint, pt4?: PathPoint): void; + create(points: Array): void; + private createSplineSegment; + clear(): void; + getPointAt(t: number, out?: Vec2): Vec2; + get segmentCount(): number; + getAnchorsInSegment(segmentIndex: number, points?: Array): Array; + getPointsInSegment(segmentIndex: number, t0: number, t1: number, points?: Array, ts?: Array, pointDensity?: number): Array; + getAllPoints(points?: Array, ts?: Array, pointDensity?: number): Array; + private onCRSplineCurve; + private onBezierCurve; + } + enum CurveType { + CRSpline = 0, + Bezier = 1, + CubicBezier = 2, + Straight = 3 + } + class PathPoint { + x: number; + y: number; + control1_x: number; + control1_y: number; + control2_x: number; + control2_y: number; + curveType: number; + static newPoint(x: number, y: number, curveType: number): PathPoint; + static newBezierPoint(x: number, y: number, control1_x: number, control1_y: number): PathPoint; + static newCubicBezierPoint(x: number, y: number, control1_x: number, control1_y: number, control2_x: number, control2_y: number): PathPoint; + clone(): PathPoint; + } + class Tween { + static catchCallbackExceptions: boolean; + static to(start: number, end: number, duration: number): Tweener; + static to2(start: number, start2: number, end: number, end2: number, duration: number): Tweener; + static to3(start: number, start2: number, start3: number, end: number, end2: number, end3: number, duration: number): Tweener; + static to4(start: number, start2: number, start3: number, start4: number, end: number, end2: number, end3: number, end4: number, duration: number): Tweener; + static toColor(start: number, end: number, duration: number): Tweener; + static delayedCall(delay: number): Tweener; + static shake(startX: number, startY: number, amplitude: number, duration: number): Tweener; + static isTweening(target: any, propType?: any): Boolean; + static kill(target: any, complete?: boolean, propType?: any): void; + static getTween(target: any, propType?: any): Tweener; + } + class TweenManager { + static __init__(): void; + static createTween(): Tweener; + static isTweening(target: any, propType?: any): boolean; + static killTweens(target: any, completed?: boolean, propType?: any): boolean; + static getTween(target: any, propType?: any): Tweener; + static update(): void; + } + class TweenValue { + x: number; + y: number; + z: number; + w: number; + get color(): number; + set color(value: number); + getField(index: number): number; + setField(index: number, value: number): void; + reset(): void; + } + type TweenCallback = (tweener: Tweener) => void; + class Tweener { + _target: any; + _propType: any; + _killed: boolean; + _paused: boolean; + private _delay; + private _duration; + private _breakpoint; + private _easeType; + private _easeOvershootOrAmplitude; + private _easePeriod; + private _repeat; + private _yoyo; + private _timeScale; + private _snapping; + private _userData; + private _path; + private _onUpdate; + private _onStart; + private _onComplete; + private _onUpdateCaller; + private _onStartCaller; + private _onCompleteCaller; + private _startValue; + private _endValue; + private _value; + private _deltaValue; + private _valueSize; + private _started; + private _ended; + private _elapsedTime; + private _normalizedTime; + constructor(); + setDelay(value: number): this; + get delay(): number; + setDuration(value: number): this; + get duration(): number; + setBreakpoint(value: number): this; + setEase(value: number): this; + setEasePeriod(value: number): this; + setEaseOvershootOrAmplitude(value: number): this; + setRepeat(repeat: number, yoyo?: boolean): this; + get repeat(): number; + setTimeScale(value: number): this; + setSnapping(value: boolean): this; + setTarget(value: any, propType?: any): this; + get target(): any; + setPath(value: GPath): this; + setUserData(value: any): this; + get userData(): any; + onUpdate(callback: TweenCallback, target?: any): this; + onStart(callback: TweenCallback, target?: any): this; + onComplete(callback: TweenCallback, target?: any): this; + get startValue(): TweenValue; + get endValue(): TweenValue; + get value(): TweenValue; + get deltaValue(): TweenValue; + get normalizedTime(): number; + get completed(): boolean; + get allCompleted(): boolean; + setPaused(paused: boolean): this; + /** + * seek position of the tween, in seconds. + */ + seek(time: number): void; + kill(complete?: boolean): void; + _to(start: number, end: number, duration: number): this; + _to2(start: number, start2: number, end: number, end2: number, duration: number): this; + _to3(start: number, start2: number, start3: number, end: number, end2: number, end3: number, duration: number): this; + _to4(start: number, start2: number, start3: number, start4: number, end: number, end2: number, end3: number, end4: number, duration: number): this; + _toColor(start: number, end: number, duration: number): this; + _shake(startX: number, startY: number, amplitude: number, duration: number): this; + _init(): void; + _reset(): void; + _update(dt: number): void; + private update; + private callStartCallback; + private callUpdateCallback; + private callCompleteCallback; + } + class Box extends Widget { + protected _layout: ILayout; + constructor(layoutClass?: Constructor); + get layout(): ILayout; + get background(): IGraphics; + set background(value: IGraphics); + setLayoutChangedFlag(reason?: LayoutChangedReason): void; + protected _sizeChanged(changeByLayout?: boolean): void; + } + const ButtonPageAlternatives: Record; + class Button extends Label { + private _mode; + private _selected; + private _titleStr; + private _iconStr; + private _selectedTitleStr; + private _selectedIconStr; + private _sound; + private _soundVolumeScale; + private _buttonController; + private _selectedController; + private _selectedPage; + private _changeStateOnClick; + private _downEffect; + private _scaleEffect; + private _down; + private _over; + constructor(); + destroy(): void; + get title(): string; + set title(value: string); + get selectedTitle(): string; + set selectedTitle(value: string); + get icon(): string; + set icon(value: string); + get selectedIcon(): string; + set selectedIcon(value: string); + get downEffect(): ButtonDownEffect; + set downEffect(value: ButtonDownEffect); + get sound(): string; + set sound(val: string); + get soundVolumeScale(): number; + set soundVolumeScale(value: number); + get selected(): boolean; + set selected(value: boolean); + get mode(): ButtonMode; + set mode(value: ButtonMode); + get selectedController(): ControllerRef; + set selectedController(value: ControllerRef); + get selectedPage(): number; + set selectedPage(value: number); + get changeStateOnClick(): boolean; + set changeStateOnClick(value: boolean); + get touchable(): boolean; + set touchable(value: boolean); + fireClick(downEffect?: boolean, clickCall?: boolean): void; + protected setState(page: ButtonStatus): void; + protected setCurrentState(): void; + protected _controllersChanged(): void; + protected _onPartChanged(which: string): void; + private selectChanged; + private _rollover; + private _rollout; + private _btnTouchBegin; + private _btnTouchEnd; + private _removeFromStage; + private _click; + private _rightClick; + } + class ComboBox extends Label { + popupDirection: PopupDirection; + visibleItemCount: number; + private _items; + private _icons; + private _values; + private _dropdownRes; + private _itemsUpdated; + private _selectedIndex; + private _buttonController; + private _selectedController; + private _dropdown; + private _list; + private _down; + private _over; + constructor(); + get items(): string[]; + set items(value: string[]); + get icons(): string[]; + set icons(value: string[]); + get values(): string[]; + set values(value: string[]); + get selectedIndex(): number; + set selectedIndex(val: number); + get value(): string; + set value(val: string); + get dropdownRes(): Prefab; + set dropdownRes(value: Prefab); + get dropdown(): Widget; + get selectedController(): ControllerRef; + set selectedController(value: ControllerRef); + destroy(): void; + updateList(): void; + private createDropdown; + protected _controllersChanged(): void; + private selectChanged; + protected setState(page: number): void; + protected setCurrentState(): void; + protected showDropdown(): void; + private _updateDropDown; + private _popupWinClosed; + private _clickItem; + private _rollover; + private _rollout; + private _mousedown; + private _mouseup; + } + class NodeFlags { + static ON_STAGE: number; + static ACTIVE_INHIERARCHY: number; + static AWAKED: number; + static ENABLED: number; + static OBSOLUTE: number; + static ESCAPE_LAYOUT: number; + static DISABLE_CLIPPING: number; + static FORCE_HIDDEN: number; + static FORCE_VISIBLE: number; + static EDITING_NODE: number; + static HIDE_BY_EDITOR: number; + static LOCK_BY_EDITOR: number; + static EDITING_ROOT_NODE: number; + } + class HideFlags { + static HideInHierarchy: number; + static HideInInspector: number; + static DontSave: number; + static HideAndDontSave: number; + } + enum ButtonStatus { + Up = 0, + Down = 1, + Over = 2, + SelectedOver = 3, + Disabled = 4, + SelectedDisabled = 5 + } + enum AlignType { + Left = 0, + Center = 1, + Right = 2, + None = 3 + } + enum VAlignType { + Top = 0, + Middle = 1, + Bottom = 2, + None = 3 + } + enum LayoutChangedReason { + Size = 0, + Pos = 1, + Visible = 2, + Hierarchy = 3 + } + enum ButtonMode { + Common = 0, + Check = 1, + Radio = 2 + } + enum ButtonDownEffect { + None = 0, + Dark = 1, + UpScale = 2, + DownScale = 3 + } + enum TextAutoSize { + None = 0, + Both = 1, + Height = 2, + Shrink = 3, + Ellipsis = 4 + } + enum LayoutType { + None = 0, + SingleColumn = 1, + SingleRow = 2, + FlowX = 3, + FlowY = 4 + } + enum StretchMode { + None = 0, + Stretch = 1, + ResizeToFit = 2 + } + enum SelectionMode { + None = 0, + Single = 1, + Multiple = 2, + MultipleBySingleClick = 3, + Disabled = 4 + } + enum LoaderFitMode { + None = 0, + Fill = 1, + Contain = 2, + Cover = 3, + CoverWidth = 4, + CoverHeight = 5 + } + enum ProgressTitleType { + Percent = 0, + ValueAndMax = 1, + Value = 2, + Max = 3 + } + enum ScrollDirection { + Vertical = 0, + Horizontal = 1, + Both = 2 + } + enum ScrollTouchEffect { + Default = 0, + On = 1, + Off = 2 + } + enum ScrollBounceBackEffect { + Default = 0, + On = 1, + Off = 2 + } + enum ScrollBarDisplay { + Default = 0, + Always = 1, + OnOverflow = 2, + OnScroll = 3, + OnOverflowAndScroll = 4, + Hidden = 5 + } + enum ChildrenRenderOrder { + Ascent = 0, + Descent = 1, + Arch = 2 + } + enum PopupDirection { + Auto = 0, + Up = 1, + Down = 2 + } + enum TreeClickToExpandType { + None = 0, + SingleClick = 1, + DoubleClick = 2 + } + enum RelationType { + Width = 1, + Height = 2, + Left_Left = 3, + Left_Center = 4, + Left_Right = 5, + Center_Center = 6, + Right_Left = 7, + Right_Center = 8, + Right_Right = 9, + Top_Top = 10, + Top_Middle = 11, + Top_Bottom = 12, + Middle_Middle = 13, + Bottom_Top = 14, + Bottom_Middle = 15, + Bottom_Bottom = 16, + LeftExt_Left = 17, + LeftExt_Right = 18, + RightExt_Left = 19, + RightExt_Right = 20, + TopExt_Top = 21, + TopExt_Bottom = 22, + BottomExt_Top = 23, + BottomExt_Bottom = 24, + Size = 100, + Pos = 101, + CenterAndMiddle = 102 + } + class Controller extends EventDispatcher { + private _selectedIndex; + private _previousIndex; + private _pages; + owner: Widget; + name: string; + changing: boolean; + constructor(); + get pages(): Array; + set pages(value: Array); + get numPages(): number; + set numPages(value: number); + addPage(name?: string): this; + get selectedIndex(): number; + set selectedIndex(value: number); + get selectedPage(): string; + set selectedPage(value: string); + get previousIndex(): number; + set oppositeIndex(value: number); + } + class ControllerRef { + private _target; + private _name; + private _inst; + private _inited; + onChanged: Function; + constructor(target: Widget, name: string); + constructor(inst: Controller); + get target(): Widget; + get name(): string; + get inst(): Controller; + get selectedIndex(): number; + set selectedIndex(value: number); + get selectedPage(): string; + set selectedPage(value: string); + get previousIndex(): number; + set oppositeIndex(value: number); + release(): void; + validate(): void; + private _reload; + private _check; + private _onChanged; + } + class DragSupport { + private _owner; + private _dragStartPos; + private _dragTesting; + static get draggingInst(): Widget; + constructor(owner: Widget); + setAutoStart(value: boolean): void; + start(pointerId: number): void; + stop(): void; + private _touchBegin; + private _touchMove; + private _touchEnd; + } + class GRoot extends Widget { + private _window; + private _modalLayer; + private _modalWaitPane; + private _inputMgr; + private _popupMgr; + static get inst(): GRoot; + static getInst(w: Widget): GRoot; + constructor(ownerWindow: globalThis.Window); + get window(): globalThis.Window; + get inputMgr(): InputManager; + get touchTarget(): Widget; + get pointerPos(): Vec2; + getPointerPos(pointerId?: number, out?: Vec2): Vec2; + get popupMgr(): PopupManager; + showWindow(win: Window): void; + hideWindow(win: Window): void; + hideWindowImmediately(win: Window): void; + bringToFront(win: Window): void; + showModalWait(msg?: string): void; + closeModalWait(): void; + closeAllExceptModals(): void; + closeAllWindows(): void; + getTopWindow(): Window; + get modalLayer(): Widget; + get hasModalWindow(): boolean; + get modalWaiting(): boolean; + showPopup(popup: Widget, target?: Widget, dir?: PopupDirection): void; + togglePopup(popup: Widget, target?: Widget, dir?: PopupDirection): boolean; + hidePopup(popup?: Widget): void; + get hasAnyPopup(): boolean; + adjustModalLayer(): void; + } + interface IScroller { + get owner(): Panel; + set owner(value: Panel); + get hScrollBar(): ScrollBar; + get vScrollBar(): ScrollBar; + get header(): Widget; + get footer(): Widget; + get hScrollBarRes(): Prefab; + set hScrollBarRes(value: Prefab); + get vScrollBarRes(): Prefab; + set vScrollBarRes(value: Prefab); + get headerRes(): Prefab; + set headerRes(value: Prefab); + get footerRes(): Prefab; + set footerRes(value: Prefab); + get direction(): ScrollDirection; + set direction(value: ScrollDirection); + get barDisplay(): ScrollBarDisplay; + set barDisplay(value: ScrollBarDisplay); + get barOnLeft(): boolean; + set barOnLeft(value: boolean); + get barFloating(): boolean; + set barFloating(value: boolean); + get barMargin(): Array; + set barMargin(value: Array); + get bouncebackEffect(): ScrollBounceBackEffect; + set bouncebackEffect(value: ScrollBounceBackEffect); + get touchEffect(): ScrollTouchEffect; + set touchEffect(value: ScrollTouchEffect); + get touchEffectButton(): number; + set touchEffectButton(value: number); + get pageMode(): boolean; + set pageMode(value: boolean); + set step(value: number); + get step(): number; + get snapToItem(): boolean; + set snapToItem(value: boolean); + get inertiaDisabled(): boolean; + set inertiaDisabled(value: boolean); + get paddingMaskDisabled(): boolean; + set paddingMaskDisabled(value: boolean); + get mouseWheelDisabled(): boolean; + set mouseWheelDisabled(value: boolean); + get decelerationRate(): number; + set decelerationRate(value: number); + get percX(): number; + set percX(value: number); + setPercX(value: number, ani?: boolean): void; + get percY(): number; + set percY(value: number); + setPercY(value: number, ani?: boolean): void; + get posX(): number; + set posX(value: number); + setPosX(value: number, ani?: boolean): void; + get posY(): number; + set posY(value: number); + setPosY(value: number, ani?: boolean): void; + get pageX(): number; + set pageX(value: number); + get pageY(): number; + set pageY(value: number); + setPageX(value: number, ani?: boolean): void; + setPageY(value: number, ani?: boolean): void; + get contentWidth(): number; + get contentHeight(): number; + get viewWidth(): number; + get viewHeight(): number; + setViewSize(width: number, height: number): void; + get isBottomMost(): boolean; + get isRightMost(): boolean; + get scrollingPosX(): number; + get scrollingPosY(): number; + scrollTop(ani?: boolean): void; + scrollBottom(ani?: boolean): void; + scrollUp(ratio?: number, ani?: boolean): void; + scrollDown(ratio?: number, ani?: boolean): void; + scrollLeft(ratio?: number, ani?: boolean): void; + scrollRight(ratio?: number, ani?: boolean): void; + scrollTo(target: Widget, ani?: boolean, setFirst?: boolean): void; + scrollTo(target: Widget, ani?: boolean, secondTarget?: Widget): void; + scrollTo(target: Rect, ani?: boolean, setFirst?: boolean): void; + scrollTo(target: number, ani?: boolean, setFirst?: boolean): void; + isChildInView(obj: Widget): boolean; + getFirstChildInView(): number; + get isDragged(): boolean; + cancelDragging(): void; + lockHeader(size: number): void; + lockFooter(size: number): void; + destroy(): void; + } + class Image extends Widget { + private _src; + private _autoSize; + private _loadId; + _graphics: SImage; + constructor(); + get src(): string; + set src(value: string); + get texture(): Texture; + set texture(value: Texture); + get borderRadius(): Array; + set borderRadius(value: Array); + get radiusIsRatio(): boolean; + set radiusIsRatio(value: boolean); + get icon(): string; + set icon(value: string); + get autoSize(): boolean; + set autoSize(value: boolean); + get tile(): boolean; + set tile(value: boolean); + get color(): number; + set color(value: number); + protected onLoaded(res: Texture, loadID: number): void; + protected _sizeChanged(changeByLayout?: boolean): void; + protected onReload(): void; + } + class Label extends Widget { + protected _titleWidget: WidgetRef; + protected _iconWidget: WidgetRef; + get title(): string; + set title(value: string); + get text(): string; + set text(value: string); + get icon(): string; + set icon(value: string); + get titleColor(): number; + set titleColor(value: number); + get titleFontSize(): number; + set titleFontSize(value: number); + get titleWidget(): Widget; + set titleWidget(val: Widget); + get iconWidget(): Widget; + set iconWidget(val: Widget); + protected _onPartChanged(which: string): void; + findTextWidget(): T; + get background(): IGraphics; + set background(value: IGraphics); + } + class List extends Panel { + itemRenderer: (index: number, item: any) => void; + itemProvider: (index: number) => string; + _layout: IListLayout; + private _pool; + private _initItemNum; + private _itemData; + private _isDemo; + _templateNode: Widget; + constructor(); + destroy(): void; + get layout(): IListLayout; + get itemTemplate(): Prefab; + set itemTemplate(value: Prefab); + get itemPool(): WidgetPool; + getFromPool(url?: string): Widget; + returnToPool(obj: Widget): void; + addItemFromPool(url?: string): Widget; + removeChildToPoolAt(index: number): void; + removeChildToPool(child: Widget): void; + removeChildrenToPool(beginIndex?: number, endIndex?: number): void; + get numItems(): number; + set numItems(value: number); + resizeToFit(itemCount?: number, minSize?: number): void; + childIndexToItemIndex(index: number): number; + itemIndexToChildIndex(index: number): number; + refreshVirtualList(): void; + setVirtual(): void; + /** + * Set the list to be virtual list, and has loop behavior. + */ + setVirtualAndLoop(): void; + private _setVirtual; + onAfterDeserialize(): void; + } + class Loader extends Widget { + private _src; + private _align; + private _valign; + private _fitMode; + private _shrinkOnly; + private _updatingLayout; + private _content; + private _srcWidth; + private _srcHeight; + private _loadId; + constructor(); + get src(): string; + set src(value: string); + get icon(): string; + set icon(value: string); + get align(): AlignType; + set align(value: AlignType); + get valign(): VAlignType; + set valign(value: VAlignType); + get fitMode(): LoaderFitMode; + set fitMode(value: LoaderFitMode); + get shrinkOnly(): boolean; + set shrinkOnly(value: boolean); + get color(): number; + set color(value: number); + get texture(): Texture; + set texture(value: Texture); + protected loadContent(): Promise; + protected onLoaded(value: any, loadId: number): void; + protected updateLayout(): void; + protected _sizeChanged(): void; + } + class Panel extends Box { + private _clipping; + private _scroller; + protected _selection: ISelection; + constructor(layoutClass?: Constructor, selectionClass?: Constructor); + protected createElement(): void; + get scroller(): IScroller; + set scroller(value: IScroller); + get selection(): ISelection; + get selectionMode(): SelectionMode; + set selectionMode(value: SelectionMode); + get selectedIndex(): number; + set selectedIndex(value: number); + get clipping(): boolean; + set clipping(value: boolean); + _processClipping(): void; + get viewWidth(): number; + set viewWidth(value: number); + get viewHeight(): number; + set viewHeight(value: number); + get touchItem(): Widget; + protected _sizeChanged(changeByLayout?: boolean): void; + destroy(): void; + } + class PopupManager { + private _owner; + private _popupStack; + private _justClosedPopups; + private _tooltipWin; + private _defaultTooltipWin; + constructor(owner: GRoot); + showPopup(popup: Widget, target?: Widget, dir?: PopupDirection): void; + validatePopupPosition(popup: Widget, target: Widget, dir: PopupDirection, offsetX?: number, offsetY?: number): void; + togglePopup(popup: Widget, target?: Widget, dir?: PopupDirection): boolean; + hidePopup(popup?: Widget): void; + get hasAnyPopup(): boolean; + isPopupJustClosed(popup: Widget): boolean; + private closePopup; + showTooltips(msg: string, delay?: number): void; + showTooltipsWin(tooltipWin: Widget, delay?: number): void; + private _doShowTooltips; + hideTooltips(): void; + checkPopups(): void; + private _touchBegin; + } + class PopupMenu extends EventDispatcher { + visibleItemCount: number; + hideOnClickItem: boolean; + autoSize: boolean; + protected _content: Widget; + protected _list: List; + protected _initWidth: number; + constructor(res?: Prefab); + destroy(): void; + addItem(caption: string, callback?: EventCallback, target?: any): Widget; + addItemAt(caption: string, index: number, callback?: EventCallback, target?: any): Widget; + private createItem; + addSeperator(index?: number): void; + getItemName(index: number): string; + setItemText(name: string, caption: string): void; + setItemVisible(name: string, visible: boolean): void; + setItemGrayed(name: string, grayed: boolean): void; + setItemCheckable(name: string, checkable: boolean): void; + setItemChecked(name: string, checked: boolean): void; + isItemChecked(name: string): boolean; + removeItem(name: string): boolean; + clearItems(): void; + get itemCount(): number; + get contentPane(): Widget; + get list(): List; + show(target?: Widget, dir?: PopupDirection, parentMenu?: PopupMenu): void; + hide(): void; + private _clickItem; + } + class ProgressBar extends Widget { + private _hBar; + private _vBar; + private _titleWidget; + private _min; + private _max; + private _value; + private _titleType; + private _reverse; + private _barMaxWidth; + private _barMaxHeight; + private _barMaxWidthDelta; + private _barMaxHeightDelta; + private _barStartX; + private _barStartY; + constructor(); + get titleType(): ProgressTitleType; + set titleType(value: ProgressTitleType); + get min(): number; + set min(value: number); + get max(): number; + set max(value: number); + get value(): number; + set value(value: number); + tweenValue(value: number, duration: number): Tweener; + update(newValue: number): void; + private updateTitle; + private setFillAmount; + _setup(hBar: Widget, vBar: Widget, titleWidget: Widget, reverse: boolean): void; + protected _sizeChanged(): void; + } + class Relation { + private _owner; + private _target; + private _data; + private _tx; + private _ty; + private _tw; + private _th; + constructor(); + get owner(): Widget; + set owner(value: Widget); + set target(value: Widget); + get target(): Widget; + get data(): Array; + set data(value: Array); + add(type: RelationType, percent: boolean): void; + remove(type: RelationType): void; + private setTarget; + private unsetTarget; + applyOnSelfResized(): void; + private applyOnPosChanged; + private applyOnSizeChanged; + private posChanged; + private sizeChanged; + private instReload; + } + class ScrollBar extends Widget { + private _gripButton; + private _arrowButton1; + private _arrowButton2; + private _bar; + private _target; + private _vertical; + private _scrollPerc; + private _fixedGripSize; + private _dragOffset; + private _gripDragging; + constructor(); + setOwner(target: IScroller, vertical: boolean): void; + setDisplayPerc(value: number): void; + setScrollPerc(val: number): void; + get minSize(): number; + get gripDragging(): boolean; + get fixedGripSize(): boolean; + set fixedGripSize(value: boolean); + _setup(arrowButton1: Widget, arrowButton2: Widget, bar: Widget, grip: Widget): void; + private _gripTouchBegin; + private _gripTouchMove; + private _gripTouchEnd; + private _arrowButton1Click; + private _arrowButton2Click; + private _barTouchBegin; + } + class Scroller implements IScroller { + static draggingInst: Scroller; + private _owner; + private _layout; + private _container; + private _maskContainer; + private _dir; + private _step; + private _decelerationRate; + private _barMargin; + private _barDisplay; + private _barDisplay2; + private _barOnLeft; + private _barFloating; + private _touchEffect; + private _touchEffect2; + private _bouncebackEffect; + private _bouncebackEffect2; + private _touchEffectButton; + private _snapToItem; + private _mouseWheelDisabled; + private _pageMode; + private _inertiaDisabled; + private _paddingMaskDisabled; + private _hScrollBarRes; + private _vScrollBarRes; + private _footerRes; + private _headerRes; + private _vScrollNone; + private _hScrollNone; + private _needRefresh; + private _refreshBarAxis; + private _xPos; + private _yPos; + private _viewSize; + private _contentSize; + private _overlapSize; + private _pageSize; + private _containerPos; + private _beginTouchPos; + private _lastTouchPos; + private _lastTouchGlobalPos; + private _velocity; + private _velocityScale; + private _lastMoveTime; + private _isHoldAreaDone; + private _aniFlag; + private _loop; + private _headerLockedSize; + private _footerLockedSize; + private _refreshEventDispatching; + private _dragged; + private _hover; + private _lastAutoScroll?; + private _autoScrollThresold?; + private _tweening; + private _tweenTime; + private _tweenDuration; + private _tweenStart; + private _tweenChange; + private _hScrollBar; + private _vScrollBar; + private _header; + private _footer; + constructor(); + get owner(): Panel; + set owner(value: Panel); + destroy(): void; + get hScrollBar(): ScrollBar; + get vScrollBar(): ScrollBar; + get header(): Widget; + get footer(): Widget; + get hScrollBarRes(): Prefab; + set hScrollBarRes(value: Prefab); + get vScrollBarRes(): Prefab; + set vScrollBarRes(value: Prefab); + get headerRes(): Prefab; + set headerRes(value: Prefab); + get footerRes(): Prefab; + set footerRes(value: Prefab); + get direction(): ScrollDirection; + set direction(value: ScrollDirection); + get barDisplay(): ScrollBarDisplay; + set barDisplay(value: ScrollBarDisplay); + get barOnLeft(): boolean; + set barOnLeft(value: boolean); + get barFloating(): boolean; + set barFloating(value: boolean); + get barMargin(): Array; + set barMargin(value: Array); + get bouncebackEffect(): ScrollBounceBackEffect; + set bouncebackEffect(value: ScrollBounceBackEffect); + get touchEffect(): ScrollTouchEffect; + set touchEffect(value: ScrollTouchEffect); + get touchEffectButton(): number; + set touchEffectButton(value: number); + get pageMode(): boolean; + set pageMode(value: boolean); + set step(value: number); + get step(): number; + get snapToItem(): boolean; + set snapToItem(value: boolean); + get inertiaDisabled(): boolean; + set inertiaDisabled(value: boolean); + get paddingMaskDisabled(): boolean; + set paddingMaskDisabled(value: boolean); + get mouseWheelDisabled(): boolean; + set mouseWheelDisabled(value: boolean); + get decelerationRate(): number; + set decelerationRate(value: number); + get isDragged(): boolean; + get percX(): number; + set percX(value: number); + setPercX(value: number, ani?: boolean): void; + get percY(): number; + set percY(value: number); + setPercY(value: number, ani?: boolean): void; + get posX(): number; + set posX(value: number); + setPosX(value: number, ani?: boolean): void; + get posY(): number; + set posY(value: number); + setPosY(value: number, ani?: boolean): void; + get contentWidth(): number; + get contentHeight(): number; + get viewWidth(): number; + get viewHeight(): number; + setViewSize(width: number, height: number): void; + get pageX(): number; + set pageX(value: number); + get pageY(): number; + set pageY(value: number); + setPageX(value: number, ani?: boolean): void; + setPageY(value: number, ani?: boolean): void; + get isBottomMost(): boolean; + get isRightMost(): boolean; + get scrollingPosX(): number; + get scrollingPosY(): number; + scrollTop(ani?: boolean): void; + scrollBottom(ani?: boolean): void; + scrollUp(ratio?: number, ani?: boolean): void; + scrollDown(ratio?: number, ani?: boolean): void; + scrollLeft(ratio?: number, ani?: boolean): void; + scrollRight(ratio?: number, ani?: boolean): void; + private getRect; + scrollTo(target: Widget, ani?: boolean, setFirst?: boolean): void; + scrollTo(target: Widget, ani?: boolean, secondTarget?: Widget): void; + scrollTo(target: Rect, ani?: boolean, setFirst?: boolean): void; + scrollTo(target: number, ani?: boolean, setFirst?: boolean): void; + isChildInView(obj: Widget): boolean; + getFirstChildInView(): number; + cancelDragging(): void; + _setDefaultDirection(): void; + private createVtScrollBar; + private createHzScrollBar; + private createHeader; + private createFooter; + lockHeader(size: number): void; + lockFooter(size: number): void; + _prepareActiveChangeList(active: boolean, out: Array): void; + _shouldCheckOverflow(): number; + _processClipping(): void; + _ownerSizeChanged(): void; + private onSizeChanged; + _ownerContentSizeChanged(): void; + _changeContentSizeOnScrolling(deltaWidth: number, deltaHeight: number, deltaPosX: number, deltaPosY: number): void; + private onContentSizeChanged; + private posChanged; + private refresh; + private refresh2; + private _touchBegin; + private _touchMove; + private _touchEnd; + private _mouseWheel; + private _rollOver; + private _rollOut; + private _dragOver; + private updateScrollBarPos; + _updateScrollBarVisible(): void; + private updateScrollBarVisible2; + private _barTweenComplete; + private getLoopPartSize; + private loopCheckingCurrent; + private loopCheckingTarget; + private loopCheckingTarget2; + private loopCheckingNewPos; + private alignPosition; + private alignByPage; + private updateTargetAndDuration; + private updateTargetAndDuration2; + private fixDuration; + private startTween; + private killTween; + private checkRefreshBar; + private tweenUpdate; + private runTween; + } + class Shape extends Widget { + get graphics(): IGraphics; + set graphics(value: IGraphics); + get color(): number; + set color(value: number); + getGraphics(classType: Constructor): T; + drawRect(lineWidth: number, lineColor: Color, fillColor: Color, topLeftRadius?: number, topRightRadius?: number, bottomRightRadius?: number, bottomLeftRadius?: number): SRect; + } + class Slider extends Widget { + changeOnClick: boolean; + canDrag: boolean; + private _hBar; + private _vBar; + private _gripButton; + private _titleWidget; + private _min; + private _max; + private _value; + private _titleType; + private _reverse; + private _wholeNumbers; + private _barMaxWidth; + private _barMaxHeight; + private _barMaxWidthDelta; + private _barMaxHeightDelta; + private _clickPos; + private _clickPercent; + private _barStartX; + private _barStartY; + constructor(); + get titleType(): ProgressTitleType; + set titleType(value: ProgressTitleType); + get wholeNumbers(): boolean; + set wholeNumbers(value: boolean); + get min(): number; + set min(value: number); + get max(): number; + set max(value: number); + get value(): number; + set value(value: number); + update(): void; + private updateWithPercent; + private updateTitle; + _setup(hBar: Widget, vBar: Widget, grip: Widget, title: Widget, reverse: boolean): void; + protected _sizeChanged(): void; + private _gripTouchBegin; + private _gripTouchMove; + private _barTouchBegin; + } + class TextField extends Widget { + protected _style: TextStyle; + protected _text: string; + protected _autoSize: TextAutoSize; + protected _wrap: boolean; + protected _html: boolean; + protected _maxWrapWidth: number; + protected _span: HTMLSpanElement; + protected _textWidth: number; + protected _textHeight: number; + protected _selectable: boolean; + protected _ubb: boolean; + protected _updatingSize: boolean; + protected _templateVars: Record; + protected _parsedText: string; + protected _changed: boolean; + protected _wrapChanged: boolean; + constructor(); + protected createElement(): void; + get text(): string; + set text(value: string); + get title(): string; + set title(value: string); + get templateVars(): Record; + set templateVars(value: Record | boolean); + setVar(name: string, value: any): this; + get style(): TextStyle; + set html(value: boolean); + get html(): boolean; + set ubb(value: boolean); + get ubb(): boolean; + get color(): number; + set color(value: number); + get autoSize(): TextAutoSize; + set autoSize(value: TextAutoSize); + get wrap(): boolean; + set wrap(value: boolean); + get maxWrapWidth(): number; + set maxWrapWidth(value: number); + get selectable(): boolean; + set selectable(value: boolean); + setLinkStyle(underline: boolean): void; + get textWidth(): number; + get textHeight(): number; + protected markChanged(): void; + protected applyStyle(): void; + private typeset; + private renderText; + protected _sizeChanged(changeByLayout: boolean): void; + protected parseTemplate(template: string): string; + } + type InputElement = HTMLTextAreaElement | HTMLInputElement; + class TextInput extends Widget { + static activeInst: TextInput; + static get isAnyEditing(): boolean; + private _style; + private _text; + private _multiline; + private _password; + private _prompt; + private _maxLength; + private _maxHeight; + private _minHeight; + private _padding; + private _autoHeight; + private _updatingSize; + private _focusEventFlag; + _input: InputElement; + constructor(multiline?: boolean); + get text(): string; + set text(value: string); + get title(): string; + set title(value: string); + get style(): TextStyle; + get multiline(): boolean; + set multiline(value: boolean); + get password(): boolean; + set password(value: boolean); + set editable(value: boolean); + get editable(): boolean; + get maxLength(): number; + set maxLength(value: number); + get prompt(): string; + set prompt(value: string); + get padding(): Array; + set padding(value: Array); + get autoHeight(): boolean; + set autoHeight(value: boolean); + get maxHeight(): number; + set maxHeight(value: number); + get background(): IGraphics; + set background(value: IGraphics); + setSelection(start: number, end: number): void; + private createInputElement; + private adjustHeight; + private applyAutoHeight; + protected applyStyle(): void; + _processTouchable(): void; + protected _sizeChanged(changeByLayout?: boolean): void; + } + class TextStyle { + font: string; + fontSize: number; + color: number; + leading: number; + bold: boolean; + underline: boolean; + italic: boolean; + strikethrough: boolean; + align: AlignType; + valign: VAlignType; + stroke: number; + strokeColor: number; + get alignStr(): string; + get valignStr(): string; + } + const AlignNames: string[]; + const VAlignNames: string[]; + class Tree extends Panel { + treeNodeRender: (node: TreeNode, obj: any) => void; + treeNodeWillExpand: (node: TreeNode, expanded: boolean) => void; + readonly rootNode: TreeNode; + indent: number; + scrollToViewOnExpand: boolean; + private _pool; + _selection: ITreeSelection; + constructor(); + get selection(): ITreeSelection; + get clickToExpand(): TreeClickToExpandType; + set clickToExpand(value: TreeClickToExpandType); + get itemTemplate(): Prefab; + set itemTemplate(value: Prefab); + get itemPool(): WidgetPool; + expandAll(folderNode?: TreeNode): void; + collapseAll(folderNode?: TreeNode): void; + private getInsertIndexForNode; + private getFolderEndIndex; + private checkChildren; + private hideFolderNode; + private removeNode; + } + class TreeNode { + data: any; + private _parent; + private _children; + private _expanded; + private _level; + private _indentLevel; + private _addIndent; + private _tree; + private _cell; + private _indentObj; + private _resURL; + private _leafController; + private _isFolder; + private _expandCtrler; + onExpanded?: (expand: boolean) => void; + constructor(isFolder?: boolean, resURL?: string, addIndent?: number); + set expanded(value: boolean); + _setExpanded(value: boolean, byEvent?: boolean): void; + get expanded(): boolean; + get isFolder(): boolean; + set isFolder(value: boolean); + get addIndent(): number; + set addIndent(value: number); + get parent(): TreeNode; + get text(): string; + set text(value: string); + get icon(): string; + set icon(value: string); + get cell(): Widget; + set cell(value: Widget); + createCell(tree?: Tree): void; + get level(): number; + addChild(child: TreeNode): TreeNode; + addChildAt(child: TreeNode, index: number): TreeNode; + removeChild(child: TreeNode): TreeNode; + removeChildAt(index: number): TreeNode; + removeChildren(beginIndex?: number, endIndex?: number): void; + getChildAt(index: number): TreeNode; + getChildIndex(child: TreeNode): number; + getPrevSibling(): TreeNode; + getNextSibling(): TreeNode; + getLastVisibleDecendant(): TreeNode; + private findLastVisibleChild; + setChildIndex(child: TreeNode, index: number): void; + swapChildren(child1: TreeNode, child2: TreeNode): void; + swapChildrenAt(index1: number, index2: number): void; + get numChildren(): number; + get children(): ReadonlyArray; + expandToRoot(): void; + get tree(): Tree; + _setTree(value: Tree): void; + private _expandedStateChanged; + private _cellMouseDown; + private _clickExpandButton; + } + class Widget extends EventDispatcher { + prefabUrl: string; + data: any; + private _id; + private _name; + private _bits; + private _hideFlags; + private _width; + private _height; + private _visible; + private _visible2; + private _active; + private _touchable; + private _touchThrough; + private _destroyed; + private _zOrder; + private _childrenRenderOrder; + private _apexIndex; + private _tooltips; + private _asGroup; + private _cursor; + private _draggable; + private _dragBounds; + private _dragSupport; + private _focusable; + private _tabStop; + private _tabStopChildren; + private _parent; + private _children; + private _components; + private _controllers; + private _controllerCount; + private _gears; + private _relations; + private _changeList; + private _forceSizeFlag; + private _zSortings; + protected _element: UIElement; + protected _container: UIElement; + protected _graphics: IGraphics; + _extra: IWidgetExtra; + _giveWidth: number; + _giveHeight: number; + sourceWidth: number; + sourceHeight: number; + constructor(); + get id(): string; + get name(): string; + set name(value: string); + get hideFlags(): number; + set hideFlags(value: number); + get x(): number; + set x(value: number); + get y(): number; + set y(value: number); + setPos(xv: number, yv: number): void; + get left(): number; + set left(value: number); + get top(): number; + set top(value: number); + setLeftTop(xv: number, yv: number): void; + center(target?: Widget): this; + get width(): number; + set width(value: number); + get height(): number; + set height(value: number); + setSize(wv: number, hv: number, changeByLayout?: boolean): void; + makeFullSize(target?: Widget): this; + get scaleX(): number; + set scaleX(value: number); + get scaleY(): number; + set scaleY(value: number); + setScale(xv: number, yv: number): void; + get anchorX(): number; + set anchorX(value: number); + get anchorY(): number; + set anchorY(value: number); + setAnchor(xv: number, yv: number): void; + get touchable(): boolean; + set touchable(value: boolean); + get touchThrough(): boolean; + set touchThrough(value: boolean); + get grayed(): boolean; + set grayed(value: boolean); + get enabled(): boolean; + set enabled(value: boolean); + get rotation(): number; + set rotation(value: number); + get alpha(): number; + set alpha(value: number); + get visible(): boolean; + set visible(value: boolean); + get active(): boolean; + set active(value: boolean); + get activeInHierarchy(): boolean; + get onStage(): boolean; + get treeNode(): TreeNode; + get zOrder(): number; + set zOrder(value: number); + get childrenRenderOrder(): ChildrenRenderOrder; + set childrenRenderOrder(value: ChildrenRenderOrder); + get apexIndex(): number; + set apexIndex(value: number); + get tooltips(): string; + set tooltips(value: string); + private _rollOver; + private _rollOut; + get focusable(): boolean; + set focusable(value: boolean); + get tabStop(): boolean; + set tabStop(value: boolean); + get tabStopChildren(): boolean; + set tabStopChildren(value: boolean); + get focused(): boolean; + requestFocus(): void; + private _focusEventHandler; + get cursor(): string; + set cursor(value: string); + get text(): string; + set text(value: string); + get icon(): string; + set icon(value: string); + get element(): UIElement; + get container(): UIElement; + get destroyed(): boolean; + get draggable(): boolean; + set draggable(value: boolean); + get nativeDraggable(): boolean; + set nativeDraggable(value: boolean); + get dragBounds(): Rect; + set dragBounds(value: Rect); + startDrag(pointerId?: number): void; + stopDrag(): void; + get dragging(): boolean; + get relations(): Array; + addRelation(target: Widget, type: RelationType, percent?: boolean): this; + removeRelation(target: Widget, type: RelationType): this; + clearRelations(): this; + get controllers(): Readonly>; + get controllerCount(): number; + addController(name: string, pageCount?: number): Controller; + getController(name: string): Controller; + protected _controllersChanged(): void; + get gears(): ReadonlyArray>; + addGear(value: Gear): void; + removeGear(value: Gear): void; + destroy(): void; + protected onStartListeningToType(type: string): void; + onClick(listener: EventCallback, target?: any): void; + offClick(listener: EventCallback, target?: any): void; + localToGlobal(ax?: number, ay?: number, out?: Vec2): Vec2; + globalToLocal(ax?: number, ay?: number, out?: Vec2): Vec2; + localToRoot(ax: number, ay: number, out?: Vec2): Vec2; + rootToLocal(ax: number, ay: number, out?: Vec2): Vec2; + localToGlobalRect(ax: number, ay: number, aWidth: number, aHeight: number, out?: Rect): Rect; + globalToLocalRect(ax: number, ay: number, aWidth: number, aHeight: number, out?: Rect): Rect; + transformRect(ax: number, ay: number, aWidth: number, aHeight: number, targetSpace?: Widget, out?: Rect): Rect; + hitTest(x: number, y: number): boolean; + protected createElement(): void; + protected _sizeChanged(changeByLayout?: boolean): void; + setLayoutChangedFlag(reason?: LayoutChangedReason): void; + _setBit(bit: number, value: boolean): void; + _getBit(type: number): boolean; + hasHideFlag(flag: number): boolean; + get asGroup(): boolean; + set asGroup(value: boolean); + addChild(child: T): T; + addChildAt(child: Widget, index: number): Widget; + getChildIndex(child: Widget): number; + getChildAt(index: number, classType?: Constructor): T; + getChild(name: string, classType?: Constructor): T; + findChild(name: string, classType?: Constructor): T; + getChildByPath(path: String, classType?: new () => T): T; + setChildIndex(child: Widget, index: number): Widget; + setChildIndexBefore(child: Widget, index: number): number; + removeChild(child: Widget, destroy?: boolean): Widget; + removeChildAt(index: number, destroy?: boolean): Widget; + removeChildren(beginIndex?: number, endIndex?: number, destroy?: boolean): void; + removeSelf(): void; + get children(): ReadonlyArray; + get numChildren(): number; + get parent(): Widget; + findRoot(): GRoot; + isAncestorOf(child: Widget): boolean; + private prepareActiveChangeList; + _processActive(active: boolean, fromSetter?: boolean): void; + _processAddRemove(add: boolean): void; + _processVisible(): void; + _processTouchable(): void; + protected _setGraphics(value: IGraphics): void; + private childSortingOrderChanged; + private getInsertPosForSortingChild; + getChildrenBounds(recursive?: boolean, ignoreInvisibles?: boolean, ignoreScale?: boolean, out?: Rect): Rect; + addComponent(type: new () => T): T; + getComponent(type: new () => T): T; + get components(): ReadonlyArray; + protected onAwake(): void; + protected onEnable(): void; + protected onDisable(): void; + protected onDestroy(): void; + onConstruct(): void; + onAfterDeserialize(): void; + } + interface IWidgetExtra { + } + class WidgetPool { + private _items; + private _count; + private _defaultRes; + private _defaultRuntime; + private _createOptions; + constructor(); + clear(): void; + get count(): number; + get defaultRes(): Prefab; + set defaultRes(value: Prefab); + get defaultRuntime(): Function; + set defaultRuntime(value: Function); + getObject(url?: string): Widget; + returnObject(obj: Widget): void; + } + class WidgetRef { + p: Widget; + private _callback; + static create(oldVal: WidgetRef, target: Widget, callback: () => void): WidgetRef; + constructor(val: Widget, callback: () => void); + destroy(): void; + private _reload; + } + class Window extends Widget { + bringToFontOnClick: boolean; + private _contentPane; + private _modalWaitPane; + private _closeButton; + private _dragArea; + private _contentArea; + private _frame; + private _modal; + private _inited; + private _loading; + private _requestingCmd; + constructor(); + set contentPane(val: Widget); + get contentPane(): Widget; + get frame(): Widget; + get closeButton(): Widget; + set closeButton(value: Widget); + get dragArea(): Widget; + set dragArea(value: Widget); + get contentArea(): Widget; + set contentArea(value: Widget); + show(groot?: GRoot): void; + hide(): void; + hideImmediately(): void; + toggleStatus(): void; + get isShowing(): boolean; + get isTop(): boolean; + get modal(): boolean; + set modal(val: boolean); + bringToFront(): void; + showModalWait(requestingCmd?: number): void; + protected layoutModalWaitPane(): void; + closeModalWait(requestingCmd?: number): boolean; + get modalWaiting(): boolean; + protected onInit(): Promise; + protected onShown(): void; + protected onHide(): void; + protected doShowAnimation(): void; + protected doHideAnimation(): void; + destroy(): void; + protected closeEventHandler(): void; + private _onShown; + private _onHidden; + private _winTouchBegin; + private _dragStart; + } + class Gear { + protected _owner: Widget; + protected _controller: ControllerRef; + protected _propPath: string; + protected _tween: GearTweenConfig; + protected _tweener: Tweener; + values: Record; + static disableAllTweenEffect: boolean; + constructor(); + get owner(): Widget; + set owner(value: Widget); + get controller(): ControllerRef; + set controller(value: ControllerRef); + get propPath(): string; + set propPath(value: string); + get tween(): GearTweenConfig; + set tween(value: GearTweenConfig); + protected onChanged(disableTween?: boolean): void; + protected getValue(page: number): T; + protected doTween(obj: any, key: string, oldValue: T, newValue: T): void; + private runGear; + } + class GearString extends Gear { + } + class GearBool extends Gear { + } + class GearColor extends Gear { + protected doTween(obj: any, key: string, oldValue: Color, newValue: Color): void; + } + class GearDisplay extends Gear { + private _pages; + private _flag; + private _condition; + constructor(); + get pages(): Array; + set pages(value: Array); + get condition(): number; + set condition(value: number); + get delay(): number; + set delay(value: number); + protected doTween(obj: any, key: string, oldValue: boolean, newValue: boolean): void; + protected getValue(page: number): boolean; + static check(owner: Widget): boolean; + } + class GearNumber extends Gear { + protected _isColor: boolean; + protected doTween(obj: any, key: string, oldValue: number, newValue: number): void; + } + class GearHexColor extends GearNumber { + constructor(); + } + class GearTweenConfig { + enabled: boolean; + easeType: EaseType; + duration: number; + delay: number; + } + interface ILayout { + get type(): LayoutType; + set type(value: LayoutType); + get rows(): number; + set rows(value: number); + get columns(): number; + set columns(value: number); + get rowGap(): number; + set rowGap(value: number); + get columnGap(): number; + set columnGap(value: number); + /** + * [UP,RIGHT,DOWN,LEFT] + */ + get padding(): Array; + set padding(value: Array); + get align(): AlignType; + set align(value: AlignType); + get valign(): VAlignType; + set valign(value: VAlignType); + get stretchX(): StretchMode; + set stretchX(value: StretchMode); + get stretchY(): StretchMode; + set stretchY(value: StretchMode); + get stretchParamsX(): Array; + get stretchParamsY(): Array; + get foldInvisibles(): boolean; + set foldInvisibles(value: boolean); + get minChildSize(): number; + set minChildSize(value: number); + get pageMode(): boolean; + set pageMode(value: boolean); + get viewWidth(): number; + set viewWidth(value: number); + get viewHeight(): number; + set viewHeight(value: number); + get contentWidth(): number; + set contentWidth(value: number); + get contentHeight(): number; + set contentHeight(value: number); + /** + * dir正数表示右移或者下移,负数表示左移或者上移 + */ + getSnappingPosition(xValue: number, yValue: number, xDir: number, yDir: number, resultPoint?: Vec2): Vec2; + resizeToFit(childCount?: number, minSize?: number): void; + setChangedFlag(reason?: LayoutChangedReason): void; + refresh(force?: boolean): void; + } + interface IListLayout extends ILayout { + get numItems(): number; + set numItems(value: number); + get itemSize(): Vec2; + set itemSize(value: Vec2); + childIndexToItemIndex(index: number): number; + itemIndexToChildIndex(index: number): number; + getRectByItemIndex(index: number): Rect; + refreshVirtualList(): void; + } + class Layout implements ILayout { + protected _owner: Box; + protected _type: LayoutType; + protected _rows: number; + protected _columns: number; + protected _rowGap: number; + protected _columnGap: number; + protected _stretchX: StretchMode; + protected _stretchY: StretchMode; + protected _pageMode: boolean; + protected _layoutChanged: boolean; + protected _padding: Array; + protected _align: AlignType; + protected _valign: VAlignType; + protected _foldInvisibles: boolean; + protected _stretchParamsX: Array; + protected _stretchParamsY: Array; + protected _minChildSize: number; + protected _childSizeChangedFlag: boolean; + protected _contentWidth: number; + protected _contentHeight: number; + protected _refreshing: boolean; + _disabled: boolean; + constructor(owner: Box); + get type(): LayoutType; + set type(value: LayoutType); + get rows(): number; + set rows(value: number); + get columns(): number; + set columns(value: number); + get rowGap(): number; + set rowGap(value: number); + get columnGap(): number; + set columnGap(value: number); + get padding(): Array; + set padding(value: Array); + get align(): AlignType; + set align(value: AlignType); + get valign(): VAlignType; + set valign(value: VAlignType); + get stretchX(): StretchMode; + set stretchX(value: StretchMode); + get stretchY(): StretchMode; + set stretchY(value: StretchMode); + get stretchParamsX(): Array; + get stretchParamsY(): Array; + get foldInvisibles(): boolean; + set foldInvisibles(value: boolean); + get minChildSize(): number; + set minChildSize(value: number); + get pageMode(): boolean; + set pageMode(value: boolean); + /** + * dir正数表示右移或者下移,负数表示左移或者上移 + */ + getSnappingPosition(xValue: number, yValue: number, xDir: number, yDir: number, resultPoint?: Vec2): Vec2; + setChangedFlag(reason?: LayoutChangedReason): void; + refresh(force?: boolean): void; + get viewWidth(): number; + set viewWidth(value: number); + get viewHeight(): number; + set viewHeight(value: number); + get contentWidth(): number; + get contentHeight(): number; + setContentSize(aw: number, ah: number): void; + resizeToFit(childCount?: number, minSize?: number): void; + protected applyNone(): void; + private applyFlowX; + private applyFlowY; + protected getLayoutChildren(data: TempData): number; + protected checkStretchParams(src: Array, data: TempData): StretchParam[]; + protected handleStrecth(size: number, count: number, gap: number, params: Array, sourceSizes: Array, outSizes?: Array): void; + protected static refreshAllLayouts(caller?: Widget): void; + } + class TempData { + children: Array; + invisibles: Array; + invisibleCnt: number; + stretchParams: Array; + posx: Array; + posy: Array; + width: Array; + swidth: Array; + height: Array; + sheight: Array; + } + class ListLayout extends Layout { + _owner: List; + _virtual: boolean; + _loop: boolean; + _realNumItems: number; + _lineItemCnt: number; + _lineItemCnt2: number; + _items: Array; + private _numItems; + private _itemSize; + private _firstIndex; + private _changed; + private _eventLocked; + private _itemInfoVer; + private _itemSizes; + private _offsetX; + private _offsetY; + get numItems(): number; + set numItems(value: number); + get itemSize(): Vec2; + set itemSize(value: Vec2); + childIndexToItemIndex(index: number): number; + itemIndexToChildIndex(index: number): number; + private shouldSnapToNext; + getSnappingPosition(xValue: number, yValue: number, xDir: number, yDir: number, resultPoint?: Vec2): Vec2; + getRectByItemIndex(index: number): Rect; + setChangedFlag(reason?: LayoutChangedReason): void; + refresh(force?: boolean): void; + refreshVirtualList(): void; + private getColumns; + private getRows; + private _refreshVirtualList; + private _scrolled; + private getIndexOnPos1; + private getIndexOnPos2; + private getIndexOnPos3; + private getIndexOnPos4; + private handleScroll; + private handleScroll1; + private handleScroll2; + private handleScroll3; + private handleScroll4; + } + interface ItemInfo { + width: number; + height: number; + obj?: Widget; + flag: number; + selected?: boolean; + } + interface ISelection { + mode: SelectionMode; + scrollItemToViewOnClick: boolean; + allowSelectByRightClick: boolean; + index: number; + get(out?: number[]): number[]; + add(index: number, scrollItToView?: boolean): void; + remove(index: number): void; + clear(): void; + selectAll(): void; + selectReverse(): void; + enableFocusEvents(enabled: boolean): void; + handleClick(item: Widget, evt: Event): void; + enableArrowKeyNavigation(enabled: boolean, keySelectEvent?: string): void; + handleArrowKey(dir: number): number; + destroy(): void; + } + interface ITreeSelection extends ISelection { + get clickToExpand(): TreeClickToExpandType; + set clickToExpand(value: TreeClickToExpandType); + getSelectedNode(): TreeNode; + getSelectedNodes(out?: Array): Array; + selectNode(node: TreeNode, scrollItToView?: boolean): void; + unselectNode(node: TreeNode): void; + } + class ListSelection extends Selection { + _owner: List; + _layout: ListLayout; + constructor(owner: List); + get index(): number; + set index(value: number); + get(out?: number[]): number[]; + add(index: number, scrollItToView?: boolean): void; + remove(index: number): void; + clear(): void; + protected clearExcept(g: Widget): void; + selectAll(): void; + selectReverse(): void; + handleClick(item: Button, evt: Event): void; + handleArrowKey(dir: number): number; + } + class Selection implements ISelection { + scrollItemToViewOnClick: boolean; + allowSelectByRightClick: boolean; + protected _owner: Panel; + protected _mode: SelectionMode; + protected _lastIndex: number; + protected _triggerFocusEvents: boolean; + protected _keyEvent: string; + protected _controller: ControllerRef; + constructor(owner: Panel); + get mode(): SelectionMode; + set mode(value: SelectionMode); + get index(): number; + set index(value: number); + get controller(): ControllerRef; + set controller(value: ControllerRef); + get(out?: number[]): number[]; + add(index: number, scrollItToView?: boolean): void; + remove(index: number): void; + clear(): void; + protected clearExcept(g: Widget): void; + selectAll(): void; + selectReverse(): void; + enableFocusEvents(enabled: boolean): void; + private handleFocus; + handleClick(item: Button, evt: Event): void; + enableArrowKeyNavigation(enabled: boolean, keySelectEvent?: string): void; + private _keydown; + handleArrowKey(dir: number): number; + private selectChanged; + private syncController; + _refresh(): void; + destroy(): void; + } + class TreeSelection extends Selection implements ITreeSelection { + _owner: Tree; + private _clickToExpand; + get clickToExpand(): TreeClickToExpandType; + set clickToExpand(value: TreeClickToExpandType); + getSelectedNode(): TreeNode; + getSelectedNodes(out?: Array): Array; + selectNode(node: TreeNode, scrollItToView?: boolean): void; + unselectNode(node: TreeNode): void; + handleClick(item: Button, evt: Event): void; + handleArrowKey(dir: number): number; + } + class Delegate { + private _flag; + private _items; + constructor(); + add(callback: Function, target?: any, args?: any[]): void; + once(callback: Function, target?: any, args?: any[]): void; + remove(callback: Function, target?: any): void; + clear(): void; + clearForTarget(target: any): void; + get count(): number; + invoke(...args: any[]): void; + } + class Pool { + pool: Array; + _init: (arg0: T, ...argArray: any[]) => void; + _reset: (arg0: T) => void; + _ct: new () => T; + constructor(type: new () => T, init?: (arg0: T) => void, reset?: (arg0: T) => void); + borrow(...argArray: any[]): T; + returns(element: T | Array): void; + } + class Timers { + static deltaTime: number; + static time: number; + static frameCount: number; + static add(delayInMiniseconds: number, repeat: number, callback: Function, target?: any, callbackParam?: any): void; + static callLater(callback: Function, target?: any, callbackParam?: any): void; + static callDelay(delay: number, callback: Function, target?: any, callbackParam?: any): void; + static addUpdate(callback: Function, target?: any, callbackParam?: any): void; + static has(callback: Function, target?: any): boolean; + static remove(callback: Function, target?: any): boolean; + static runCallLater(callback: Function, target?: any): void; + } + type Constructor = new (...args: any[]) => T; + function clamp(value: number, min: number, max: number): number; + function clamp01(value: number): number; + function lerp(start: number, end: number, percent: number): number; + function repeat(t: number, length: number): number; + function distance(x1: number, y1: number, x2: number, y2: number): number; + function getBaseName(path: string): string; + function getPath(url: string): string; + /** + * 获取文件名的扩展名,并转换为小写字母。例如"1.abc"将返回abc。 + */ + function getFileExtension(path: string): string; + /** + * 更改文件名的扩展名。 + */ + function replaceFileExtension(path: string, newExt: string, excludeDot?: boolean): string; + /** + * 格式化相对路径。主要是处理.和..这些情况。 + */ + function normalizeURL(url: string): string; + function getResURLByUUID(url: string, basePath?: string): string; + /** + * 组合相对路径并格式化 + * @param base + * @param path + */ + function joinURL(base: string, path: string): string; + function hookSetter(obj: any, callback: Function, target?: any, ...args: any[]): any; + function hookSetterAsync(obj: any, callback: Function, target: Widget): any; + type TagHandler = (tagName: string, end: boolean, attr: string) => string; + type UBBParserOptions = { + linkClass?: string; + imageWidth?: number; + imageHeight?: number; + }; + class UBBParser { + private _text; + private _readPos; + private _options; + protected _handlers: Record; + lastColor: string; + lastSize: string; + private static _inst; + static get inst(): UBBParser; + constructor(); + protected onTag_URL(tagName: string, end: boolean, attr: string): string; + protected onTag_IMG(tagName: string, end: boolean, attr: string): string; + protected onTag_B(tagName: string, end: boolean, attr: string): string; + protected onTag_I(tagName: string, end: boolean, attr: string): string; + protected onTag_U(tagName: string, end: boolean, attr: string): string; + protected onTag_Simple(tagName: string, end: boolean, attr: string): string; + protected onTag_COLOR(tagName: string, end: boolean, attr: string): string; + protected onTag_FONT(tagName: string, end: boolean, attr: string): string; + protected onTag_SIZE(tagName: string, end: boolean, attr: string): string; + protected getTagText(remove?: boolean): string; + parse(text: string, remove?: boolean, options?: UBBParserOptions): string; + } + class XML { + name: string; + text: string; + private _attrs; + private _children; + constructor(XmlString?: string); + get attributes(): Record; + getAttrString(attrName: string, defValue?: string): string; + getAttrInt(attrName: string, defValue?: number): number; + getAttrFloat(attrName: string, defValue?: number): number; + getAttrBool(attrName: string, defValue?: boolean): boolean; + setAttribute(attrName: string, attrValue: string): void; + getNode(selector: string): XML; + elements(selector?: string): Array; + parse(aSource: string): void; + reset(): void; + stringify(includeHeader?: boolean): string; + private encode; + } + enum XMLTagType { + Start = 0, + End = 1, + Void = 2, + CDATA = 3, + Comment = 4, + Instruction = 5 + } + class XMLIterator { + static tagName: string; + static tagType: XMLTagType; + static lastTagName: string; + static source: string; + static sourceLen: number; + static parsePos: number; + static tagPos: number; + static tagLength: number; + static lastTagEnd: number; + static attrParsed: boolean; + static lowerCaseName: boolean; + private static _attrs; + static begin(source: string, lowerCaseName?: boolean): void; + static nextTag(): boolean; + static getTagSource(): string; + static getRawText(trim?: boolean): string; + static getText(trim?: boolean): string; + static get attributes(): any; + static getAttribute(attrName: string): string; + static parseAttributes(attrs: any): void; + } + class XMLUtils { + static decodeString(aSource: string): string; + static encodeString(str: string): string; + static getString(attrs: any, attrName: string, defValue?: string): string; + static getInt(attrs: any, attrName: string, defValue?: number): number; + static getFloat(attrs: any, attrName: string, defValue?: number): number; + static getBool(attrs: any, attrName: string, defValue?: boolean): boolean; + } +} diff --git a/shudu/engine/types/editor.d.ts b/shudu/engine/types/editor.d.ts new file mode 100644 index 0000000..fd51505 --- /dev/null +++ b/shudu/engine/types/editor.d.ts @@ -0,0 +1,9497 @@ +export { }; +declare global { + /** + * Namespace containing various editor-related classes and functions. + * + * All classes and functions in this namespace are running in the UI process. + */ + export namespace IEditor { + /** + * Zip file writer. + */ + export interface IZipFileW { + /** + * When adding files, if the file path matches any of the names in this list, it will be excluded. + * + * This is useful when you want to exclude some files from the zip file. + * @example + * ``` + * excludeNames: ["*.tmp", ".*"] + * ``` + */ + excludeNames: Array; + + /** + * Add a file to the zip file. + * @param realPath Path to the file in the file system. + * @param entryPath Path in the zip file. If not specified, the entry path will use the relative path from realPath to the basePath value of this object. + * @example + * ``` + * let zip = new IEditor.ZipFileW("C:/temp"); + * zip.addFile("C:/temp/abc/test.txt"); // The entry path will be "abc/test.txt" + * zip.addFile("D:/test.txt", "def/test.txt"); // The entry path will be "def/test.txt" + * ``` + */ + addFile(realPath: string, entryPath?: string): void; + + /** + * Add a folder to the zip file. Files in the folder will be added recursively based on the pattern and ignore parameters. + * @param realPath Path to the folder in the file system. + * @param entryPath Path in the zip file. If not specified, the entry path will use the relative path from realPath to the basePath value of this object. + * @param pattern Glob pattern to match files in the folder. If not specified, all files will be added. + * @param ignore Glob pattern to exclude files in the folder. If not specified, no files will be excluded. + * @example + * ``` + * let zip = new IEditor.ZipFileW("C:/temp"); + * zip.addFolder("C:/temp/abc"); // All files in the "abc" folder will be added. + * zip.addFolder("C:/temp/abc", "def", "*.txt", ["*.tmp"]); // Only .txt files in the "abc" folder will be added, and .tmp files will be excluded. + * ``` + */ + addFolder(realPath: string, entryPath?: string, pattern?: string, ignore?: string[]): void; + + /** + * Add a buffer to the zip file. + * @param entryPath Path in the zip file. + * @param buf Buffer to add. + * @param encoding Encoding of the buffer. Default is "utf8". + * @example + * ``` + * let zip = new IEditor.ZipFileW("C:/temp"); + * zip.addBuffer("abc/test.txt", "Hello, world!", "utf8"); + * ``` + */ + addBuffer(entryPath: string, buf: string | NodeJS.ArrayBufferView | Iterable | AsyncIterable, encoding?: string): void; + + /** + * Write the zip file to the file system. + * @param filePath Path to the zip file. + * @param progressCallback Callback function to report the progress of the operation. The progress value is between 0 and 100. + * @param abortToken Abort token. If you want to abort the operation on some conditions, you can pass an abort token here. Call abortToken.signal() to abort the operation. + */ + save(filePath: string, progressCallback?: (progress: number) => void, abortToken?: IAbortToken): Promise; + } + + /** + * Zip file reader. + */ + export interface IZipFileR { + + /** + * Open a zip file. + * @param filePath File path of the zip file. + */ + open(filePath: string): Promise; + + /** + * Open a zip file in memory. + * @param buf Buffer of the zip file. + */ + open(buf: ArrayBuffer): Promise; + + /** + * Get the entries in the zip file. + */ + getEntries(): Array; + + /** + * Test whether the zip file contains the specified entry. + * @param entryName The name of the entry. + * @returns True if the zip file contains the entry; otherwise, false. + */ + hasEntry(entryName: string): boolean; + + /** + * Extract the specified entry to the file system. + * @param entryName The name of the entry. + * @param savePath The path to save the extracted file. + */ + extract(entryName: string, savePath: string): Promise; + + /** + * Unzip the entire zip file to the file system. + * @param savePath The path to save the extracted files. + * @param progressCallback Callback function to report the progress of the operation. The progress value is between 0 and 100. + * @param abortToken Abort token. If you want to abort the operation on some conditions, you can pass an abort token here. Call abortToken.signal() to abort the operation. + */ + extractAll(savePath: string, progressCallback?: (progress: number) => void, abortToken?: IAbortToken): Promise; + + /** + * Close the zip file. Remember to call this method after you finish using the zip file. + */ + close(): void; + } + export interface IWebview extends IWebFrameBase { + /** + * Communication port to the process running in the webview. + */ + readonly port: IMyMessagePort; + + /** + * Electron webContents ID of the webview. + */ + readonly webContentsId: number; + + /** + * Load a URL in the webview. + * @param url The URL to load. + * @param preload The preload script to use. + */ + load(url: string, preload?: string): void; + + /** + * Load a URL in the webview and wait until it is ready. + * @param url The URL to load. + * @param preload The preload script to use. + */ + loadUntilReady(url: string, preload?: string): Promise; + + /** + * Reload the webview. + */ + reload(): void; + } + export interface IWebIFrame extends IWebFrameBase { + /** + * HTML element of the iframe. + */ + readonly element: HTMLIFrameElement; + + /** + * Communication port to the window of the iframe. + */ + readonly port: IMyMessagePort; + + /** + * Event that is triggered when the iframe is loaded. + */ + readonly onLoad: IDelegate<() => void>; + + /** + * Whether the iframe is ready. After the iframe is ready, it is safe to use contentDocument. + */ + readonly loaded: boolean; + + /** + * Whether the iframe is loading. + */ + readonly loading: boolean; + + /** + * Load a URL in the iframe. + * @param url URL to load. + */ + load(url: string): void; + + /** + * Load a URL in the iframe and wait until the iframe is ready. + * @param url URL to load. + */ + loadUntilReady(url: string): Promise; + + /** + * Set document content of the iframe. + * @param html HTML content to set. + */ + setContent(html: string): void; + } + export interface IWebFrameBase { + /** + * HTML element of the frame. + */ + readonly element: HTMLElement; + + /** + * Width of the frame. + */ + readonly width: number; + + /** + * Height of the frame. + */ + readonly height: number; + + /** + * Attach the frame to a placeholder widget. The frame will be visible when attached. + * @param placeHolder The placeholder widget to attach the frame to. + */ + show(placeHolder: gui.Widget): void; + + /** + * Set the size of the frame. + * @param width The width of the frame. + * @param height The height of the frame. + */ + setViewSize(width: number, height: number): void; + + /** + * Set the scroll position of the frame. + * @param x The x position of the scroll. + * @param y The y position of the scroll. + */ + setScrollPos(x: number, y: number): void; + + /** + * Set the scale of the frame. + * @param x The x scale of the frame. + * @param y The y scale of the frame. + */ + setScale(x: number, y: number): void; + + /** + * Destroy the frame. + */ + dispose(): void; + } + export interface IUtils { + /** + * Parse string content from a file to a JSON object. + * @param filePath The path of the file. + * @param silent Whether to suppress the error message. The default is false, meaning the error message will be output to the console. + * @returns The JSON object. + */ + readJson(filePath: string, silent?: boolean): any; + + /** + * Parse string content from a file to a JSON object. + * + * This is the promise version of `readJson`. + * @param filePath The path of the file. + * @param silent Whether to suppress the error message. The default is false, meaning the error message will be output to the console. + * @returns The JSON object. + */ + readJsonAsync(filePath: string, silent?: boolean): Promise; + + /** + * Parse string content from a file to a JSON object, enabling JSON5 support. + * @param filePath The path of the file. + * @param silent Whether to suppress the error message. The default is false, meaning the error message will be output to the console. + * @returns The JSON object. + */ + readJson5(filePath: string, silent?: boolean): any; + + /** + * Parse string content from a file to a JSON object, enabling JSON5 support. + * + * This is the promise version of `readJson5`. + * @param filePath The path of the file. + * @param silent Whether to suppress the error message. The default is false, meaning the error message will be output to the console. + * @returns The JSON object. + */ + readJson5Async(filePath: string, silent?: boolean): Promise; + + /** + * Stringify a JSON object and write it to a file. + * @param filePath The path of the file. + * @param content The JSON object. + * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read. Default is 2. + */ + writeJson(filePath: string, content: any, space?: string | number): void; + + /** + * Stringify a JSON object and write it to a file. + * + * This is the promise version of `writeJson`. + * @param filePath The path of the file. + * @param content The JSON object. + * @param space Adds indentation, white space, and line break characters to the return-value JSON text to make it easier to read. Default is 2. + */ + writeJsonAsync(filePath: string, content: any, space?: string | number): Promise; + + /** + * Read the first N bytes of a file. This is useful for reading the file signature. + * @param filePath The path of the file. + * @param bytesCount The number of bytes to read. + * @returns The buffer containing the first N bytes. + */ + readFirstNBytes(filePath: string, bytesCount: number): Promise; + + /** + * Test whether a value is an object. It is equivalent to `type === 'function' || typeof obj === 'object' && obj !== null`. + * @param value The value to test. + * @returns Whether the value is an object. + */ + isObject(value: any): boolean; + + /** + * Parse a string with format `key1=value1,key2=value2,...` to a key-value object. + * @param features The string to parse. + * @returns The key-value object. + */ + parseFeatures(features: string): Record; + + /** + * Convert a number to a string with a fixed number of decimal places. Trailing zeros are removed. + * @param n The number to convert. + * @param fractionDigits The number of decimal places. + * @returns The string representation of the number. + * @example + * ``` + * toFixedPro(1.2345, 2) // "1.23" + * toFixedPro(1.01, 1) // "1" + * ``` + */ + toFixedPro(n: number, fractionDigits: number): string; + + /** + * Splits a camelCase string into words and capitalizes the first letter of each word. + * @param str The string to convert. + * @returns The result. + * @example + * ``` + * splitCamelCase("helloWorld") // "Hello World" + * ``` + */ + splitCamelCase(str: string): string; + + /** + * Get the base directory for temporary files. It is the `library/temp` folder in the project. The API ensures that this folder exists. + * @returns The base directory for temporary files. + */ + getTempBaseDir(): string; + + /** + * Create a subdirectory in the temporary directory. The temporary directory is returned by `getTempBaseDir`. + * @param subDir The name of the subdirectory. If not specified, a subdirectory with a random name is created. + * @returns The absolute path of the subdirectory. + */ + mkTempDir(subDir?: string): string; + + /** + * It is equivalent to `path.join`. Only for the purpose of without importing `path`. + * @param paths The paths to join. + * @returns The joined path. + */ + joinPaths(...paths: string[]): string; + + /** + * It is equivalent to `fs.copyFile`. Only for the purpose of without importing `fs`. + * @param src The source file path. + * @param dest The destination file path. + */ + copyFile(src: string, dest: string): Promise; + + /** + * Delete a folder recursively. + * @param path The path of the folder. + */ + rmDirSync(path: string): void; + + /** + * Delete a file or an empty folder. + * @param path The path of the file. + */ + rmSync(path: string): void; + + /** + * Copy all files and subfolders recursively from a folder to another folder. + * @param src The source folder path. + * @param destDir The destination folder path. + * @param options The options. + * - autoRename: Whether to automatically rename the file when a file with the same name exists in the destination folder. The default is false, meaning the file will be overwritten. + * - regenerateUUID: Whether to regenerate the UUID of the file. The default is false. + */ + copyDir(source: string, destDir: string, options?: { autoRename?: boolean, regenerateUUID?: boolean }): Promise; + + /* + * Move all files and subfolders recursively from a folder to another folder. + * @param src The source folder path. + * @param destDir The destination folder path. + * @param options The options. + * - autoRename: Whether to automatically rename the file when a file with the same name exists in the destination folder. The default is false, meaning the file will be overwritten. + */ + moveDir(source: string, destDir: string, options?: { autoRename?: boolean }): Promise; + + /** + * If source is a file, copy it to destDir; if source is a folder path, copy all files and subfolders recursively from it to destination. + * @param source The source file or folder path. + * @param destDir The destination folder path. + * @param options The options. + * - autoRename: Whether to automatically rename the file when a file with the same name exists in the destination folder. The default is false, meaning the file will be overwritten. + */ + copyFileOrDir(source: string, destDir: string, options?: { autoRename?: boolean }): Promise; + + /** + * Copy all files and subfolders that match the pattern from a folder to another folder. + * @param source The source folder path. + * @param pattern The glob pattern. + * @param destDir The destination folder path. + * @param options The options. + * - dot: Whether to include files and subfolders starting with a dot. The default is false. + * - ignore: The glob pattern to exclude files and subfolders. + */ + copyFiles(source: string, pattern: string, destDir: string, options?: { dot?: boolean, ignore?: string | Array }): Promise; + + /** + * Delete all files in a folder except for the specified files. + * @param folder The folder path. + * @param ignores The files to ignore. The elements are the filenames, exactly matching the filenames in the folder. + */ + deleteFiles(folder: string, ignores?: Iterable): Promise; + + /** + * Check if the file exists. It is promise version of `fs.existsSync`. + * @param filePath The path of the file. + * @returns Whether the file exists. + */ + fileExists(filePath: string): Promise; + + /** + * Check if a filename conflicts in the specified folder. If there is a conflict, add a numeric suffix to the filename and continue checking until there is no conflict. + * @param path The folder path. + * @param name The filename. + * @returns The new filename. + */ + getNewFilePath(path: string, name: string): string; + + /** + * Check if a filename conflicts in the specified folder. If there is a conflict, add a numeric suffix to the filename and continue checking until there is no conflict. + * + * The difference with `getNewFilePath` is that it allows specifying a delimiter to connect the filename and the numeric suffix. + * @param path The folder path. + * @param name The filename. + * @param connectorSymbol The delimiter to connect the filename and the numeric suffix. The default is "_". + * @returns The new filename. + */ + resolveConflictFileName(path: string, name: string, connectorSymbol?: string): Promise; + + /** + * Check if a filename conflicts in the specified folder. If there is a conflict, add a numeric suffix to the filename and continue checking until there is no conflict. + * + * The difference with `getNewFilePath` is that it allows specifying a delimiter to connect the filename and the numeric suffix. + * + * This is the synchronous version of `resolveConflictFileName`. + * @param path The folder path. + * @param name The filename. + * @param connectorSymbol The delimiter to connect the filename and the numeric suffix. The default is "_". + * @returns The new filename. + */ + resolveConflictFileNameSync(path: string, name: string, connectorSymbol?: string): string; + + /** + * Replace invalid filename characters in a string (compatible with both Windows and Mac) + * @param fileName The filename. + * @param replaceChar The character to replace the invalid characters. The default is "_". + * @returns The sanitized filename. + */ + sanitizeFileName(fileName: string, replaceChar?: string): string; + + /** + * Add a hash to the filename. The hash is added before the extension. + * @param filename The filename. + * @param hash The hash string. + * @param ext The extension. If not specified, the extension of the filename is used. + * @returns The new filename. + */ + addHashToFileName(filename: string, hash: string, ext?: string): string; + + /** + * Handle . and .. in the path, converting it to an absolute path and returning an array of path segments. + * @param filePath The path to normalize. + * @returns The normalized path. + * @example + * ``` + * normalizePath("a/b/../c") // ["a", "c"] + * ``` + */ + normalizePath(filePath: string): Array; + + /** + * Create a promise that resolves after a specified amount of time, implementing a sleep function. + * @param ms The number of milliseconds to sleep. + * @example + * ``` + * await sleep(1000); // sleep for 1 second + * ``` + */ + sleep(ms: number): Promise; + + /** + * Create a promise that resolves until the predicate returns true, or the timeout is reached. + * @param predicate The predicate function. + * @param timeoutInMs The timeout in milliseconds. If not specified, there is no timeout. + * @example + * ``` + * await until(() => document.querySelector("div") !== null); // wait until the div element is loaded + * ``` + */ + until(predicate: () => boolean, timeoutInMs?: number): Promise; + + /** + * Escape special characters in a string to be used in a regular expression. + * @param str The string to escape. + * @returns The escaped string. + * @example + * ``` + * escapeRegExp("hello.world") // "hello\.world" + * ``` + */ + escapeRegExp(str: string): string; + + /** + * Load a script file through script tag injection. + * @param src The URL of the script file. + * @param async Whether to load the script asynchronously. The default is false. + * @param onScriptError The error handler when the script fails to load. + * @returns The script element. + */ + loadLib(src: string, async?: boolean, onScriptError?: (err: ErrorEvent) => void): Promise; + + /** + * Execute arithmetic expressions. + * @param str The arithmetic expression. + * @returns The result of the arithmetic expression. + * @example + * ``` + * calculate("1+2*3") // 7 + * ``` + */ + calculate(str: string): number; + + /** + * Remove unsupported tags from HTML content. + * + * Supported tags: `b`, `i`, `u`, `strike`, `font`, `img`, `a`. + * @param source The HTML content. + * @param removeWhiteSpace Whether to remove white spaces between tags. The default is false if no or tag is found, otherwise true. + * @returns The simplified HTML content. + */ + simplifyHtml(source: string, removeWhiteSpace?: boolean): string; + + /** + * Serialize an XML document to a string. + * @param xmlDoc The XML document. + * @returns The XML string. + */ + serializeXML(xmlDoc: XMLDocument): string; + + /** + * Find an XML element in a collection that satisfies the predicate. + * @param col The collection of XML elements. + * @param predicate The predicate function. + * @returns The XML element that satisfies the predicate. + * @example + * ``` + * findXMLElement(xmlDoc.getElementsByTagName("a"), node => node.getAttribute("href") === "https://www.example.com") + * ``` + */ + findXMLElement(col: NodeListOf | HTMLCollection, predicate: (node: Element) => boolean): Element; + + /** + * Add elements to a set. + * @param set The set to add elements to. + * @param elements The elements to add. + */ + addToSet(set: Set, elements: Iterable): void; + + /** + * Convert a number representing bytes into a string with units. + * @param bytes The number of bytes. + * @returns The formatted string with appropriate units. + * @example + * ``` + * formatBytes(1024) // "1 KB" + * formatBytes(1024 * 1024) // "1 MB" + * formatBytes(1024 * 1024 * 1024) // "1 GB" + * formatBytes(12345) // "12.06 KB" + * ``` + */ + formatBytes(bytes: number): string; + + /** + * Convert a timestamp to a time string relative to now. + * @param time The timestamp to convert. + * @param includeTime Whether to include the time in the output string. If false, only the date is included. The default is true. + * @returns The time string. + * @example + * ``` + * getTimeAgo(1620000000000) // "2021-05-03 12:00:00" + * getTimeAgo(1620000000000, false) // "2021-05-03" + * ``` + */ + getTimeAgo(time: number, includeTime?: boolean): string; + + /** + * Get the current time as a string. + * @returns The current time string. + * @example + * ``` + * getNowStr() // "2021-05-03 12:00:00" + * ``` + */ + getNowStr(): string; + + /** + * Format a string as a JavaScript variable name. + * @param str The string to format. + * @returns The formatted string. + * @example + * ``` + * formatAsJsVariable("private") // "private_" + * formatAsJsVariable("1abc") // "_1abc" + * formatAsJsVariable("a$b") // "a_b" + * ``` + */ + formatAsJsVariable(str: string): string; + + /** + * Run a batch of tasks in parallel. Rejects if any task fails. + * @param datas The data to process. + * @param numParallelTasks The number of parallel tasks. If it is a function, it is called with the number of concurrent tasks and returns whether to continue running more tasks. + * @param taskFunc The task function. + * @param abortToken The abort token. If you want to abort the execution on some conditions, you can pass an abort token here. Call abortToken.signal() to abort the execution. + * @returns The results of the tasks. + * @example + * ``` + * let result = await runTasks([1, 2, 3], 2, async (data, index) => { + * await sleep(1000); + * return data * 2; + * }); + * // result: [2, 4, 6] + * ``` + */ + runTasks(datas: Array | Iterable & { size?: number }, numParallelTasks: number | ((numTasks: number) => boolean), taskFunc: (data: T2, index: number) => T | Promise, abortToken?: IAbortToken): Promise; + + /** + * Run a batch of tasks in parallel. Resolves even if some tasks fail. + * @param datas The data to process. + * @param numParallelTasks The number of parallel tasks. If it is a function, it is called with the number of concurrent tasks and returns whether to continue running more tasks. + * @param taskFunc The task function. + * @param abortToken The abort token. If you want to abort the execution on some conditions, you can pass an abort token here. Call abortToken.signal() to abort the execution. + * @returns The promise results of the tasks. + * @example + * ``` + * let result = await runAllTasks([1, 2, 3], 2, async (data, index) => { + * await sleep(1000); + * if (data === 2) { + * throw new Error("error"); + * } + * return data * 2; + * }); + * // result: [ { status: "fulfilled", value: 2 }, { status: "rejected", reason: Error: error }, { status: "fulfilled", value: 6 } ] + * ``` + */ + runAllTasks(datas: Array | Iterable & { size?: number }, numParallelTasks: number | ((numTasks: number) => boolean), taskFunc: (data: T2, index: number) => T | Promise, abortToken?: IAbortToken): Promise[]>; + + /** + * Print the results of a promise. + * @param rets The results of the promises. + * @param group The optinal group name of console messages. + */ + printPromiseResult(rets: Iterable>, group?: string): void; + + /** + * Create a function that wrap the execution of another function. The wrapped function will only be executed once. The result is cached and returned directly for subsequent calls. + * @param fn The function to execute. + * @param errorHandler The error handler when the function fails. If not specified, the error will be reported to the console. + * @returns The wrapped function. + * @example + * ``` + * let fn = makeExecuteOnceFunction(async () => { + * await sleep(1000); + * return 1; + * }); + * let result = await fn(); // 1, return after 1 second + * let result2 = await fn(); // 1, return immediately + * ``` + */ + makeExecuteOnceFunction(fn: () => Promise, errorHandler?: (err: any) => T): () => Promise; + } + export interface IUUIDUtils { + /** + * Generate a UUID. UUID is a 36-character string with 4 dashes. + * @example + * ``` + * genUUID(); // "550e8400-e29b-41d4-a716-446655440000" + * ``` + */ + genUUID(): string; + + /** + * Generate a short ID. A short ID is a string of a specified length, composed of numbers and lowercase letters, and does not start with a number. + * @param size Size of the short ID. Default is 8. + * @example + * ``` + * genShortId(); // "a550e840" + * genShortId(6); // "a550e8" + * ``` + */ + genShortId(size?: number): string; + + /** + * Check if a string is a UUID. + * @param str String to check. + * @return Whether the string is a UUID. + * @example + * ``` + * isUUID("550e8400-e29b-41d4-a716-446655440000"); // true + * isUUID("550e8400-e29b-41d4-a716-44665544000"); // false + * ``` + */ + isUUID(str: string): boolean; + + /** + * Compress a UUID. Compressed UUID is a string of 22 characters without dashes. + * @param uuid UUID to compress. + * @return Compressed UUID. + * @example + * ``` + * compressUUID("550e8400-e29b-41d4-a716-446655440000"); // "VQ6EBiW0QaFHRmVUZAAB" + * ``` + */ + compressUUID(uuid: string): string; + + /** + * Decompress a compressed UUID. + * @param str Compressed UUID. + * @return Decompressed UUID. + * @example + * ``` + * decompressUUID("VQ6EBiW0QaFHRmVUZAAB"); // "550e8400-e29b-41d4-a716-446655440000" + * ``` + */ + decompressUUID(str: string): string; + } + export const ShaderTypePrefix = "Shader."; + /** + * A callback function that is used to determine whether a value is equal to the default value. + * @param value The value to compare. + * @param overridedDefaultValue By default, the `default` property of the property descriptor is used as the default value. You can override it by passing in this parameter. + */ + export type DefaultValueComparator = (value: any, overridedDefaultValue?: any) => boolean; + export type TypeMenuItem = { type: FTypeDescriptor, label: string, icon: string, order: number }; + export type TypeMenuItems = Array & { menuLabel: string }; + export type PropertyTestFunctions = { hiddenTest: Function, readonlyTest: Function, validator: Function, requiredTest: Function }; + + export interface ITypeRegistry { + /** + * All types. Key is the name of the type. + */ + readonly types: Readonly>; + + /** + * A version number that is incremented when the type list is changed. + */ + readonly version: number; + + /** + * Triggered when the types those are defined in the typescript code are changed. + */ + readonly onUserTypesChanged: IDelegate<() => void>; + + /** + * Node type name, it is "Node". + */ + nodeTypeName: string; + + /** + * Component type name, it is "Component". + */ + componentTypeName: string; + + /** + * Add some types to the registry. If the type already exists, it will be overwritten. + * @param types Types to add. + * @param bindClasses Whether to bind the types to premapped engine classes. This option is available only in the scene process. Default is false. + */ + addTypes(types: ReadonlyArray, bindClasses?: boolean): void; + + /** + * Remove some types from the registry. + * @param names Names of the types to remove. + */ + removeTypes(names: ReadonlyArray): void; + + /** + * Notify the registry that the user types are changed. User types are types that are defined in the typescript code. + */ + setUserTypesChanged(): void; + + /** + * Get derived types of a type. + * @param type The type to get derived types. + * @returns Derived types of the type. + */ + getDerivedTypes(type: FTypeDescriptor): Array; + + /** + * Get all component types that need to be added when a component type is added to a node. + * + * This is determined by the requireComponents property of the type. + * @param type The component type. + * @returns A collection of component types, including the type itself. + * @see FTypeDescriptor.requireComponents + */ + getRequireComponents(type: string): Array; + + /** + * Get all engine libraries that need to be enabled when a component type is added to a node. + * + * This is determined by the requireEngineLibs property of the type. + * @param type The component type. + * @returns A collection of engine libraries. + * @see FTypeDescriptor.requireEngineLibs + */ + getRequireEngineLibs(type: string): Array; + + /** + * Get whether a component type can be added multiple times to a node. + * + * This is determined by the allowMultipleComponent property of the type and its base types. + * @param type The component type. + * @returns Whether the component type can be added multiple times to a node. + * @see FTypeDescriptor.allowMultipleComponent + */ + getAllowMultipleComponent(type: FTypeDescriptor): boolean; + + /** + * Get node menu items. + * @param type The world type. + * @param inHierarchyMenu Whether to include the component types that are allowed to be added in the hierarchy menu. This is determined by the inHierarchyMenu option of the type. + * @returns Node menu items. Key is the category name, value is the menu items. + * @see FTypeDescriptor.inHierarchyMenu + */ + getNodeMenuItems(type: WorldType, inHierarchyMenu?: boolean): Readonly>; + + /** + * Get component menu items. + * @param type The world type. + * @returns Component menu items. Key is the category name, value is the menu items. + */ + getComponentMenuItems(type: WorldType): Readonly>; + + /** + * Find a type defined in the typescript code by its path. + * @param path A path relative to the assets folder. + */ + findScriptByPath(path: string): FTypeDescriptor; + + /** + * Whether a type is a 3D type. + * @param type The type name. + * @returns Whether the type is a 3D type. + */ + isType3d(type: string): boolean; + + /** + * Check whether a type is derived from another type. + * @param type The type name. + * @param baseType The base type name. + * @returns Whether the type is derived from the base type. + */ + isDerivedOf(type: string, baseType: string | ReadonlyArray): boolean; + + /** + * Whether a type is a node type. In other words, this type is derived from Node. + * @param type The type name. + * @returns Whether the type is a node type. + */ + isNodeType(type: string): boolean; + + /** + * If a type is derived from Node, return Node; if it is derived from Component, return Component; otherwise return null. + * @param type The type name. + * @returns The base type name or null. + */ + getNodeBaseType(type: string): string; + + /** + * Whether a type is deprecated. If an new type descriptor is registered with the same name, the original type descriptor will be marked as deprecated. + * @param type The type descriptor. + * @returns Whether the type is deprecated. + */ + isTypeDeprecated(type: FTypeDescriptor): boolean; + + /** + * Get caption of a type. + * @param type The type name or the type descriptor. + * @param noSplit Whether to tokenize the results. The default is false, meaning the results will be tokenized. + * @param noLocalize Whether to localize the results. The default is null, meaning the results will be processed according to the localization settings. + * @returns The caption of the type. + */ + getTypeCaption(type: string | FTypeDescriptor, noSplit?: boolean, noLocalize?: boolean): string; + + /** + * Get icon of a type. + * @param type The type name or the type descriptor. + * @returns The icon of the type. + */ + getTypeIcon(type: string | FTypeDescriptor): string; + + /** + * @en Get property of a type, if the property is not found, look for it in the base types. + * @param type The type descriptor. + * @param propName The property name. + * @returns The property value. + * @zh 获取类型的属性,如果属性未找到,则在基类中查找。 + * @param type 类型描述符。 + * @param propName 属性名称。 + * @returns 属性值。 + */ + findTypePropertyInChain(typeDef: FTypeDescriptor, propName: string): string; + + /** + * Get caption of a property. + * @param type The type descriptor. + * @param prop The property descriptor. + * @param noSplit Whether to tokenize the results. The default is false, meaning the results will be tokenized. + * @param noLocalize Whether to localize the results. The default is null, meaning the results will be processed according to the localization settings. + * @returns The caption of the property. + */ + getPropCaption(type: FTypeDescriptor, prop: FPropertyDescriptor, noSplit?: boolean, noLocalize?: boolean): string; + + /** + * Get tips of a property. + * @param type The type descriptor. + * @param prop The property descriptor. + * @param showPropertyName Whether to add a banner to the tips to indicate the property name. The default is false. + * @returns The tips of the property. + */ + getPropTips(type: FTypeDescriptor, prop: FPropertyDescriptor, showPropertyName?: boolean): string; + + /** + * Get the caption of the catalog. + * @param type The type descriptor. + * @param prop The property descriptor. + * @returns The caption of the catalog. + */ + getCatalogCaption(type: FTypeDescriptor, prop: FPropertyDescriptor): string; + + /** + * Get all properties of a type in a map. Key is the property name. + * @param type The type descriptor. + * @returns Result map. + */ + getAllPropsOfType(type: FTypeDescriptor): Readonly>; + + /** + * Get an object that contains the initial values of the type. + * + * This initial value only takes effect when the object is manually created from the UI. + * @param typeDef The type descriptor. + * @returns The initial values of the type. + */ + getInitProps(typeDef: FTypeDescriptor): any; + + /** + * Get an object that contains the default values of the type. + * @param typeDef The type descriptor. + * @param includePrivate Whether to include private properties. The default is false. + * @param data The object data. + * @returns The default values of the type. + */ + getDefaultValue(typeDef: FTypeDescriptor, includePrivate?: boolean, data?: any): any; + + /** + * Get the default value of a property. + * @param prop The property descriptor. + * @param realType If the type is a polymorphic reference type, use this parameter to specify the actual type. + * @param includePrivate Whether to include private properties. The default is false. + * @param data The property data. + * @returns The default value of the property. + */ + getPropDefaultValue(prop: FPropertyDescriptor, realType?: string, includePrivate?: boolean, data?: any): any; + + /** + * Get the test functions of a property. + * @param prop The property descriptor. + * @returns The test functions of the property. + */ + getPropTestFunctions(prop: FPropertyDescriptor): PropertyTestFunctions; + + /** + * Get all default value comparator functions of a type. This function is used to determine whether a value is equal to the default value. The key is the property name. + * @param typeDef The type descriptor. + * @returns Functions map. + */ + getDefaultValueComparators(typeDef: FTypeDescriptor): Readonly>; + + /** + * Find a property by path. + * @param type The type descriptor. + * @param datapath The path of the property. + * @param out The result array. If it is not null, the result will be added to this array, otherwise a new array will be created. + * @returns The result array. + */ + getPropertyByPath(type: FTypeDescriptor, datapath: ReadonlyArray, out?: FPropertyDescriptor[]): FPropertyDescriptor[]; + + /** + * Get the type descriptor of an object. Null will be returned if the prototype of the object is not registered. + * @param obj The object. + * @returns The type descriptor of the object. + */ + getTypeOfObj(obj: any): FTypeDescriptor; + + /** + * Get the type descriptor of a class. Null will be returned if the class is not registered. + * @param cls The class. + * @returns The type descriptor of the class. + */ + getTypeOfClass(cls: Function): FTypeDescriptor; + + /** + * Sort properties. The order is determined by the position property and the catalog property of the property descriptor. + * @param props The properties to sort. + * @param considerCatalog Whether to consider the catalog property. The default is false. + */ + sortProps(props: Array, considerCatalog?: boolean): void; + } + export interface ITypeParser { + getClassMeta(constructor: Function, forceCreate?: boolean): any; + parsePropType(ptype: any): Partial; + } + export type RenderTemplateOptions = { + /** + * Whether to escape html characters. Default is false. + * @example + * ``` + * renderTemplate("{{name}}", { name: "" }, { escape: true }); + * // Output: <script>alert('hello')</script> + * + * renderTemplate("{{name}}", { name: "" }, { escape: false }); + * // Output: + * ``` + */ + escape?: boolean; + + /** + * Use single bracket as the template tag. Default is false. + * @example + * ``` + * renderTemplate("{{name}}", { name: "world" }, { useSingleBracket: false }); + * // Output: world + * + * renderTemplate("{name}", { name: "world" }, { useSingleBracket: true }); + * // Output: world + * ``` + */ + useSingleBracket?: boolean; + }; + + export interface ITemplateUtils { + /** + * Render a template string. + * @param content Source template string. + * @param templateArgs Template arguments. + * @param options Options. + * @returns Rendered string. + */ + renderTemplate(content: string, templateArgs?: Record, options?: RenderTemplateOptions): string; + + /** + * Render a template string read from a file and write the result back to the file. + * @param filePath Path to the template file. + * @param templateArgs Template arguments. + * @param options Options. + */ + renderTemplateFile(filePath: string, templateArgs?: Record, options?: RenderTemplateOptions): void; + + /** + * Render a template string read from a file and write the result back to the file. + * + * This is the promise version of `renderTemplateFile`. + * @param filePath Path to the template file. + * @param templateArgs Template arguments. + * @param options Options. + */ + renderTemplateFileAsync(filePath: string, templateArgs?: Record, options?: RenderTemplateOptions): Promise; + } + + export interface IShell { + // Docs: https://electronjs.org/docs/api/shell + + /** + * Play the beep sound. + */ + beep(): void; + /** + * Open the given external protocol URL in the desktop's default manner. (For + * example, mailto: URLs in the user's default mail agent). + */ + openExternal(url: string, options?: OpenExternalOptions): Promise; + /** + * Resolves with a string containing the error message corresponding to the failure + * if a failure occurred, otherwise "". + * + * Open the given file in the desktop's default manner. + */ + openPath(path: string): Promise; + /** + * Resolves the shortcut link at `shortcutPath`. + * + * An exception will be thrown when any error happens. + * + * @platform win32 + */ + readShortcutLink(shortcutPath: string): ShortcutDetails; + /** + * Show the given file in a file manager. If possible, select the file. + */ + showItemInFolder(fullPath: string): void; + /** + * Resolves when the operation has been completed. Rejects if there was an error + * while deleting the requested item. + * + * This moves a path to the OS-specific trash location (Trash on macOS, Recycle Bin + * on Windows, and a desktop-environment-specific location on Linux). + */ + trashItem(path: string): Promise; + /** + * Whether the shortcut was created successfully. + * + * Creates or updates a shortcut link at `shortcutPath`. + * + * @platform win32 + */ + writeShortcutLink(shortcutPath: string, operation: 'create' | 'update' | 'replace', options: ShortcutDetails): boolean; + /** + * Whether the shortcut was created successfully. + * + * Creates or updates a shortcut link at `shortcutPath`. + * + * @platform win32 + */ + writeShortcutLink(shortcutPath: string, options: ShortcutDetails): boolean; + } + + export interface OpenExternalOptions { + /** + * `true` to bring the opened application to the foreground. The default is `true`. + * + * @platform darwin + */ + activate?: boolean; + /** + * The working directory. + * + * @platform win32 + */ + workingDirectory?: string; + /** + * Indicates a user initiated launch that enables tracking of frequently used + * programs and other behaviors. The default is `false`. + * + * @platform win32 + */ + logUsage?: boolean; + } + + export interface ShortcutDetails { + + // Docs: https://electronjs.org/docs/api/structures/shortcut-details + + /** + * The Application User Model ID. Default is empty. + */ + appUserModelId?: string; + /** + * The arguments to be applied to `target` when launching from this shortcut. + * Default is empty. + */ + args?: string; + /** + * The working directory. Default is empty. + */ + cwd?: string; + /** + * The description of the shortcut. Default is empty. + */ + description?: string; + /** + * The path to the icon, can be a DLL or EXE. `icon` and `iconIndex` have to be set + * together. Default is empty, which uses the target's icon. + */ + icon?: string; + /** + * The resource ID of icon when `icon` is a DLL or EXE. Default is 0. + */ + iconIndex?: number; + /** + * The target to launch from this shortcut. + */ + target: string; + /** + * The Application Toast Activator CLSID. Needed for participating in Action + * Center. + */ + toastActivatorClsid?: string; + } + export interface IShaderInfo { + /** + * Name of the shader. + */ + name: string; + + /** + * ID of the asset of the shader. + */ + assetId: string; + } + + export interface IShaderDb { + + /** + * All shaders. Key is the name of the shader. + */ + readonly shaders: Record; + + /** + * A version number that is incremented when the shader list is changed. + */ + readonly version: number; + } + export type SettingsLocation = "application" | "project" | "local" | "memory"; + + export interface ISettings { + /** + * Data of the settings. + */ + readonly data: IConfigObject; + + /** + * Triggered when the settings are changed. + */ + readonly onChanged: IDelegate<(sender: ISettings) => void>; + + /** + * Update the settings from the UI process. Only meaningful when the settings are queried from the process other than the UI process. + */ + sync(): Promise; + + /** + * Push local changes to the UI process. Only meaningful when the settings are queried from the process other than the UI process. + * @param keys The keys of the settings to push. If not specified, all settings are pushed. + */ + push?(keys?: ReadonlyArray): Promise; + } + + export interface ISettingsService { + /** + * Create a built-in configuration file. This method is only available in the UI process. User should call this method directly. + * @param name The name of the settings. + * @param location The location of the configuration file. The default is "project". + * - application: Saved to the user data directory of the application. On Windows, it is generally C:\Users\{user}\AppData\Local\{appname}, and on Mac, it is generally ~/Library/Application Support/{appname}. This means that this configuration needs to be shared across different projects. + * - project: Saved to the `settings` directory of the project. This means that this configuration is specific to the current project. + * - local: Saved to the `local` directory of the project. This means that this configuration is specific to the current project but does not need to be tracked by the version control system. + * - memory: Maintained only in memory and not saved to a file. + * @param typeName The data type corresponding to the configuration. + */ + enableSettings(name: string, location?: SettingsLocation, typeName?: string): void; + + /** + * Create a built-in configuration file. This method is only available in the UI process. User should call this method directly. + * @param name The name of the configuration. It should be unique within the editor and use characters that conform to file name specifications. + * @param pathToAsset The path to the configuration file. It is a relative path to the assets directory. + * @param typeName The data type corresponding to the configuration. + */ + enableSettings(name: string, pathToAsset: string, typeName?: string): void; + /** + * Query the settings by name. + * @param name The name of the settings. + * @returns The settings. + */ + getSettings(name: string): ISettings; + } + export interface IServiceProvider { + /** + * Start the service. + */ + start(): Promise; + + /** + * Stop the service. + */ + stop(): void; + + /** + * Whether the service is started. + */ + get started(): boolean; + + /** + * Get all clients. + */ + get clients(): ReadonlyArray; + + /** + * Register a handler for a channel. + * @param channel Channel name. + * @param func Handler function. + * @param thisArg This object of the handler function. + * @param passClientParam Whether to pass the client object as the first parameter to the handler function. + */ + handle(channel: string, func: Function, thisArg?: any, passClientParam?: boolean): void; + + /** + * Broadcast a message to all clients those have `subscribe` flag setted to true. + * @param channel Channel name. + * @param args Message arguments. + */ + notifyAll(channel: string, ...args: any[]): void; + } + export interface IEncodeObjOptions { + /** + * If a property value is same as the default value, it will be eliminated during serialization. Default is true. + */ + eliminateDefaults?: boolean; + } + + export interface IDecodeObjOptions { + /** + * An array to receive the errors during deserialization. + */ + outErrors?: Array; + + /** + * Validate the type of the deserialized object strictly. Default is false. + * + * A debug message will be output to console if the type of a property is not matched. + */ + strictTypeCheck?: boolean; + } + + export namespace ISerializeUtil { + /** + * Whether deserialization is in progress. + */ + const isDeserializing: boolean; + + /** + * Serialize an object to a plain object. + * @param data Object to serialize. + * @param typeDef Type descriptor of the object. + * @param options Serialization options. + * @returns The serialized object. + */ + function encodeObj(data: any, typeDef: FTypeDescriptor, options?: IEncodeObjOptions): any; + + /** + * Deserialize a plain object to an object. + * @param data Plain object to deserialize. + * @param receiver Use this instance as the result object. If null, a new object will be created. + * @param type Type of the object. + * @param options Deserialization options. + * @returns The deserialized object. + */ + function decodeObj(data: any, receiver?: any, type?: string, options?: IDecodeObjOptions): any; + } + + export interface ISerializeNotification { + /** + * This method is called after the object is deserialized. + * @example + * ``` + * class MyClass { + * onAfterDeserialize() { + * // Do something after deserialization. + * } + * } + * ``` + */ + onAfterDeserialize(): void; + } + + export interface ISelectResourceDialog extends IDialog { + /** + * Show the dialog. + * @param popupOwner If the dialog is a popup window, it is used to calculate the popup position. + * @param initialValue The id of the asset to select initially. + * @param assetTypeFilter The asset type filter. Default is null, which means all types. + * @param allowInternalAssets Whether to allow internal assets. Default is false. + * @param customFilter The custom filter. Developers can register custom filters by calling the `IEditorEnv.assetMgr.customAssetFilters` method in scene process. + * @param allowInternalGUIAssets Whether to allow internal GUI assets. Default is false. + */ + show(popupOwner?: gui.Widget, initialValue?: string, assetTypeFilter?: AssetType[], allowInternalAssets?: boolean, customFilter?: string, allowInternalGUIAssets?: boolean): Promise; + } + export interface ISelectNodeDialog extends IDialog { + /** + * Show the dialog. + * @param popupOwner If the dialog is a popup window, it is used to calculate the popup position. + * @param typeName The type name of the node. Default is "Node". + */ + show(popupOwner: gui.Widget, typeName?: string): Promise; + } + export interface ISceneManager extends gui.EventDispatcher { + /** + * Scene process is running in a webview. This is the webview instance. + */ + readonly sceneView: IWebview; + + /** + * Triggered when properties of a node is changed. + */ + readonly onNodeChanged: IDelegate<(node: IMyNode, datapath: ReadonlyArray, value: any, oldValue: any) => void>; + + /** + * Multiple scenes can be opened at the same time, but only one scene is active. + */ + readonly activeScene: IMyScene; + + /** + * If the editor is currently in play mode, this property returns the scene that is being played. + */ + readonly playingScene: IMyScene; + + /** + * This will be true after the scene is loaded and ready. + */ + readonly sceneReady: boolean; + + /** + * Open a scene. + * @param sceneId The scene id. + * @param assetId The asset id. + */ + openScene(sceneId: string, assetId: string): Promise; + + /** + * Close a scene. If the scene is not opened, this method does nothing. + * @param sceneId The scene id. + */ + closeScene(sceneId: string): Promise; + + /** + * Save the scene. + * @param sceneId The scene id. + * @param filePath The file path, it is a relative path to the asset path of the scene. Default is the asset path of the scene. + */ + saveScene(sceneId: string, filePath?: string): Promise; + + /** + * Change the active scene. + * @param sceneId The scene id. + */ + setActiveScene(sceneId: string): Promise; + + /** + * Reload the scene. + * @param sceneId The scene id. + */ + reloadScene(sceneId: string): Promise; + + /** + * Get all scenes. + */ + getScenes(): Readonly>; + /** + * Start playing the scene. + * + * Dont call this method directly, use the play button in the editor or `Editor.panelManager.postMessage("GamePanel", "startGame")` + */ + setPlaying(playing: boolean): boolean; + + /** + * Whether any scene is playing. + */ + readonly playing: boolean; + + /** + * Execute a script in the Scene process. It can execute static functions of classes decorated with @Laya.regClass or @EditorEnv.regClass. + * @param command Class name and function name separated by a dot. e.g. "MyClass.myFunction". + * @param params Parameters of the function. + * @return The return value of the function. + */ + runSceneScript(command: string, ...params: any[]): Promise; + } + export interface IResourceManager { + /** + * Get the cached resource properties. 只有曾经对相同ID调用过getResourceProps,这个方法才会返回上次的结果。 + * @param resId The resource id. + * @returns The resource data. + */ + getCachedResourceProps(resId: string): any; + + /** + * Get the resource properties. 这个方法会在场景查询资源对象,如果资源已载入,则返回资源的属性,否则返回null。 + * @param resId The resource id. + * @returns The resource data. + */ + getResourceProps(resId: string): Promise; + + /** + * Save all dirty resources. + */ + save(): Promise; + /** + * Clone the material. + * @param asset The asset to clone. + * @returns The cloned asset. + */ + cloneMaterial(asset: IAssetInfo): Promise; + } + + export interface IRendererInfo { + /** + * Root path of the project. + */ + projectPath: string; + + /** + * Project name. + */ + projectName: string; + + /** + * Project type. + */ + projectType: string; + + /** + * The current application directory. + */ + appPath: string; + + /** + * The path of the user data. + * + * On Windows, it is c:/Users/username/AppData/Roaming/LayaAirIDE + * + * On MacOS, it is ~/Library/Application Support/LayaAirIDE + */ + userDataPath: string; + + /** + * Application name. + */ + appName: string; + + /** + * In LayaAirIDE, each module is assigned a specific ID, + * such as the scene editor is sceneEditor, the blueprint editor is blueprintEditor, and the shader blueprint editor is shaderEditor. + */ + moduleName: string; + + /** + * The path of the packed resources. + * + * On Windows, it is path/to/LayaAirIDE/resources/app.asar + * + * On MacOS, it is path/to/LayaAirIDE.app/Contents/Resources/app.asar + */ + webRootPath: string; + + /** + * The path of the unpacked resources. + * + * On Windows, it is path/to/LayaAirIDE/resources + * + * On MacOS, it is path/to/LayaAirIDE.app/Contents/Resources + */ + unpackedWebRootPath: string; + + /** + * If the app is packaged. It is only false in the development mode. + */ + isPackaged: boolean; + + /** + * LayaAirIDE has a built-in HTTP server for previewing. This is the server address. + * + * Typically, it is http://ipaddress:18090, and if HTTPS is enabled, it is https://ipaddress:18091. + * + * The ipaddress is the local machine's IP address. 18090/18091 are the default ports, which can be modified in "Project Settings -> Edit". + */ + serverURL: string; + + /** + * Detailed information about the server. + * - host: The host of the server. + * - port: The port of the server. + * - securePort: The secure port of the server. Used when HTTPS is enabled. + */ + serverInfo: { host: string, port: number, securePort: number }; + + /** + * If the app is in the cli mode. A cli mode is a mode that runs the app in the command line. + */ + cliMode: boolean; + } + + export interface IRendererStartupAction { + /** + * Open a file after the renderer is started. + */ + openFile?: string; + + /** + * Open a URL after the renderer is started. + */ + openURL?: string; + + /** + * Run a script after the renderer is started. + */ + runScript?: string; + + /** + * Arguments for the script. + */ + scriptArgs?: string[]; + + /** + * Any other options. + */ + [index: string]: any; + } + + export interface IRender3DCanvas extends gui.Widget { + /** + * Whether createObject has been called. + */ + readonly ready: boolean; + + /** + * Create an 3D object. + * @param scriptName The script name of the object. The script must be registered in the scene process by using `@IEditorEnv.regClass`. + * @param initMethod The method to initialize the object. + * @param initMethodArgs The arguments of the init method. + * @see IEditorEnv.AssetPreview + * @example + * ``` + * await this.createObject("MaterialPreview", "setAssetById", asset.id); + * ``` + */ + createObject(scriptName: string, initMethod?: string, ...initMethodArgs: Array): Promise; + + /** + * Release the 3D object. If no object has been created by calling `createObject`, this method does nothing. + */ + releaseObject(): Promise; + + /** + * Call a method of the 3D object. + * @param method The method name. + * @param args The arguments of the method. + * @return The return value of the method. + */ + call(method: string, ...args: any[]): Promise; + + /** + * Refresh the canvas. + */ + refresh(): void; + } + export namespace IReflectUtils { + /** + * Define metadata for a target. + * @param key Metadata key. + * @param value Metadata value. + * @param target Target object. + * @param propertyName Optional property name. + */ + function defineMetadata(key: string, value: any, target: any, propertyName?: string): void; + + /** + * Get metadata for a target. + * @param key Metadata key. + * @param target Target object. + * @param propertyName Optional property name. + * @returns Metadata value or undefined if not found. + */ + function getMetadata(key: string, target: any, propertyName?: string): any; + + /** + * Get own metadata for a target. + * @param key Metadata key. + * @param target Target object. + * @param propertyName Optional property name. + * @returns Metadata value or undefined if not found. + */ + function getOwnMetadata(key: string, target: any, propertyName?: string): any; + } + + export interface IQRCodeDialog extends IDialog { + /** + * Show the dialog. + * @param popupOwner If the dialog is a popup window, it is used to calculate the popup position. + * @param url The URL to generate the QR code. + */ + show(popupOwner: gui.Widget, url: string): Promise; + } + export interface IPropertyFieldCreateResult { + /** + * Display widget of the property field. + */ + ui: gui.Widget; + + /** + * Whether the width of the widget should be stretched according to the inspector panel. Default is true. + */ + stretchWidth?: boolean; + + /** + * Caption display option. Default is "normal". + * - "normal": Display the caption. + * - "hidden": Hide the caption but keep the space. + * - "none": Hide the caption and remove the space. + */ + captionDisplay?: "normal" | "hidden" | "none"; + + /** + * By default, the widget will be indented according to the level of the property field. Set this to true to disable the indent. + */ + noIndent?: boolean; + + /** + * By default, the widget will have a minimum height. Set this to true to disable the minimum height. + */ + noMinHeight?: boolean; + } + + export interface IPropertyField extends gui.TreeNode { + /** + * Parent field. + */ + get parent(): IPropertyField; + + /** + * Owner inspector. + */ + readonly inspector: IDataInspector; + + /** + * The owner type of the property. + */ + readonly objType: Readonly; + + /** + * The property descriptor. + */ + readonly property: Readonly; + + /** + * The inspecting target. It it used to get or set the value of the property. + */ + readonly target: IInspectingTarget; + + /** + * Properties that are watched by this field. A single field may watch multiple properties, not just the property it represents. + * + * By default, the array is filled with the name of the property that the field represents. You may push more property names to this array. + * + * Or if the field does not care about the property change, you can set this array to empty. + */ + watchProps: Array; + + /** + * Properties that are affected by this field. A single field may affect multiple properties, not just the property it represents. + * + * By default, the array is filled with the the property that the field represents. You may push more properties to this array. + * + * Or if the field does not affect any property, you can set this array to empty. + * + * The difference between watchProps and affectProps is that watchProps is used to listen to the change of the property, while memberProps is used to display overriden hint of the property. + */ + memberProps: Array; + + /** + * In this method, you should create the widget of the property field. + * @return The create result. + */ + create(): IPropertyFieldCreateResult; + + /** + * Set the field to be readonly or not. + * @param value + */ + makeReadonly(value: boolean): void; + + /** + * Set the field to be hidden or not. + * @param hidden + */ + setHidden(hidden: boolean): void; + + /** + * If this method is provided, it indicates that this field supports drag-and-drop operations. In this method, you can decide whether to accept the drag based on the dragged data. + * @param evt Event object. get the dragged data from evt.data. + * @example + * ``` + * onNativeDragOver(evt: gui.Event): void { + * let dt: DataTransfer = evt.data; + * if (dt.types.includes("asset")) { + * //below two lines are necessary to make the drop event work + * dt.dropEffect = "move"; + * evt.preventDefault(); + * } + * } + * ``` + */ + onNativeDragOver?(evt: gui.Event): void; + + /** + * If this method is provided, it indicates that this field supports drag-and-drop operations. In this method, you can handle the dragged data. + * @param evt Event object. get the dragged data from evt.data. + * @example + * ``` + * async onNativeDrop(evt: gui.Event): void { + * let itemIds = evt.data.getData("asset"); + * if (!itemIds) + * return; + * //we handle the drop event, so we should stop the event from propagating + * evt.stopPropagation(); + * } + * ``` + */ + onNativeDrop?(evt: gui.Event): void; + + /** + * Called when the reset menu item is clicked. You should reset the data of the field to the default value. + */ + onResetData?(): void; + + /** + * Get child fields. + * @param result An array to store the result. If not provided, a new array will be created. + * @return The result array. The owner of the array is transferred to the caller. + */ + getChildFields(result?: Array): Array; + + /** + * Find a brother field by name. Brother fields are fields that have the same parent. + * @param name The name of the property. + * @return The field found, or null if not found. + */ + findBrotherField(name: string): IPropertyField; + + /** + * Find a child field by name. + * @param name The name of the property. + * @return The field found, or null if not found. + */ + findChildField(name: string): IPropertyField; + + /** + * Get the status of the field. + * @param name The key of the status. + * @return The value of the status. + */ + getStatus(name: string): any; + + /** + * Set the status of the field. You can save some UI-related states here, such as whether it is expanded, selected, etc. + * @param name The key of the status. + * @param value The value of the status. + */ + setStatus(name: string, value: any): void; + + /** + * Display an error message below the field. This is commonly used to display validation error. + * @param msg The error message. + */ + displayError(msg: string): void; + + /** + * Update the UI according to the data. This method is called when the data is changed. + */ + refresh(): void; + } + + export interface IProjectPanel extends IEditorPanel { + /** + * Select an asset. + * @param assetId The asset id. + * @param setFocus Whether to set focus to the asset. + * @param disableEvent Whether to disable the selection event. + */ + select(assetId: string, setFocus?: boolean, disableEvent?: boolean): void; + + /** + * Get the selected asset. + * @returns The selected asset. + */ + getSelectedResource(): IAssetInfo; + + /** + * Get the selected assets. + * @param result The result array. If provided, the result will be pushed into it, otherwise a new array will be created. + * @returns The selected assets. + */ + getSelectedResources(result?: Array): Array; + + /** + * Get the selected folder. + * @returns The selected folder. + */ + getSelectedFolder(): IAssetInfo; + + /** + * Get current expanded folders. + * @param result The result array. If provided, the result will be pushed into it, otherwise a new array will be created. + * @returns The expanded folders. + */ + getExpandedFolders(result?: Array): Array; + + /** + * Expand the specified folders. + * @param arr The expanded folders. + */ + setExpandedFolders(arr: Array): Promise; + + /** + * Expand the specified folder. + * @param asset The folder to expand. + */ + expand(asset: IAssetInfo): void; + + /** + * Start a rename operation on the specified asset. + * @param asset The asset to rename. + */ + rename(asset: IAssetInfo): Promise; + + /** + * Start a new operation on the specified folder. + * @param folder The folder to add new asset. + * @param fileName The file name. + * @param callback The callback function called when the new asset is created. + */ + addNew(folder: IAssetInfo, fileName: string, callback: (fileName: string) => void): void; + + /** + * Create a new asset. + * @param fileName The file name. + * @param templateName The template name. It can be a absolute path or a file name. If it is a file name, the default template path will be used. + * @param args The template arguments. + * @example + * ``` + * this.createAsset("Scene.ls", "Scene.json"); + * ``` + */ + createAsset(fileName: string, templateName: string, args?: Record): Promise; + + /** + * Create a new folder. + * @param folderName The folder name. + */ + createFolder(folderName?: string): void; + } + export interface IPreviewPanel extends IEditorPanel { + /** + * Toolbar widget. If provided, it will be added to the toolbar holder. + */ + toolbar?: gui.Widget; + + /** + * Test if the panel can accept the asset. + */ + accept(asset: IAssetInfo): boolean; + + /** + * Called when the preview is needed to be refreshed. + * @param asset The asset. + * @param render3DCanvas A 3D canvas for rendering 3D objects. If you don't need it, you can ignore it. + * @param resData The resource data. If you don't need it, you can ignore it. + */ + refresh(asset: IAssetInfo, render3DCanvas: IRender3DCanvas, resData: any | null): Promise; + + /** + * Called when the preview is cleared. + */ + clearPreview?(): void; + + /** + * Called when a rotation operation is performed on the object. + */ + rotateObject?(x: number, y: number): void; + } + export interface IPlist { + /** + * Parse a plist format string to an object. + * @param content The plist format string. + * @returns The object. + * @example + * ``` + * let content = ` + * + * + * + * key1 + * value1 + * key2 + * 2 + * + * `; + * let obj = parsePlist(content); + * //Output: { key1: 'value1', key2: 2 } + * ``` + */ + parsePlist(content: string): Record; + + /** + * Build a plist format string from an object. + * @param obj The object. + * @returns The plist format string. + */ + buildPlist(obj: Record): string; + } + export interface IPanelManagerOptions { + /** + * Layout file path. + */ + filePath: string, + + /** + * Create a Panel menu in the main menu bar. + */ + createMenu?: boolean, + + /** + * Manager can have multiple groups of panels. The group with name 'default' is the default group, and it is required. + * + * mainPanelId: The main panel id of the group. This panel will always be shown, as empty layout is not allowed. + */ + layouts: Record + } + + export interface IPanelManager { + /** + * All registered panel ids. + */ + readonly panelIds: string[]; + + /** + * Last focused panel. + */ + readonly lastFocusedPanel: IEditorPanel; + + /** + * Register a panel. + * + * This method generally does not need to be used directly. Use @IEditor.panel instead. + * @param panelId The panel id. + * @param classType The class type of the panel. + * @param options The options of the panel. + * @returns A promise that resolves to the panel instance. + */ + registerPanel(panelId: string, classType: gui.Constructor, options: IPanelOptions): Promise; + + /** + * Unregister a panel. + * @param panelId The panel id. + */ + unregisterPanel(panelId: string): void; + + /** + * Get a panel by id. + * @param panelId The panel id. + * @param classType The class type of the panel. + * @returns The panel instance. + */ + getPanel(panelId: string, classType?: gui.Constructor): T; + + /** + * Get all panels by usage. + * @param usage The usage of the panels. + * @returns The panels. The ownership of the result array is transferred. + */ + getPanelsByUsage(usage: EditorPanelUsage): Array; + + /** + * Set the title of a panel. + * @param panel The panel. + * @param title The title. + */ + setPanelTitle(panelId: string, title: string): void; + + /** + * Show a panel. + * @param panel The panel. + */ + showPanel(panel: IEditorPanel): void; + + /** + * Show a panel by id. + * @param panelId The panel id. + */ + showPanel(panelId: string): void; + + /** + * Hide a panel. + * @param panel The panel. + */ + hidePanel(panel: IEditorPanel): void; + + /** + * Hide a panel by id. + * @param panelId The panel id. + */ + hidePanel(panelId: string): void; + + /** + * Whether a panel is showing. + * @param panelId The panel id. + * @returns True if the panel is showing, otherwise false. + */ + isPanelShowing(panelId: string): boolean; + + /** + * Get the active panel in a grid wich contains the sepecified panel. + * @param panelId The panel id. + * @return The active panel id. + */ + getActivePanelInGroup(panelId: string): string; + + /** + * Start the panel manager. + */ + start(): void; + + /** + * Destroy the panel manager. + */ + dispose(): void; + + /** + * Save the layout. + * @param filePath The file path. Defaults to the file path specified in the construction options. + */ + saveLayout(filePath?: string): Promise; + + /** + * Load the layout. + * @param filePath The file path. Defaults to the file path specified in the construction options. + */ + loadLayout(filePath?: string): Promise; + + /** + * Reset the layout. + */ + resetLayout(): Promise; + + /** + * Switch to a group. + * @param groupName The group name. + */ + switchGroup(groupName: string): void; + + /** + * Send message to a panel. + * @param panelId The panel id. + * @param cmd The command. Generally, the command is the method name of the panel. + * @param args The arguments. + * @returns A promise that resolves to the result of the command. + */ + sendMessage(panelId: string, cmd: string, ...args: Array): Promise; + + /** + * Post message to a panel. It will wait for the response. + * @param panelId The panel id. + * @param cmd The command. Generally, the command is the method name of the panel. + * @param args The arguments. + */ + postMessage(panelId: string, cmd: string, ...args: Array): void; + } + + export interface IObjectUtils { + + /** + * Clears an object by deleting all its properties. + * + * Since it might be a proxy and could be referenced elsewhere, it cannot be directly assigned. + * @param obj The object to clear. + */ + clearObj(obj: any): void; + + /** + * Deep clones an object. + * @param obj The object to clone. + * @returns The cloned object. + */ + deepCloneObj(obj: any): any; + + /** + * Merge two objects. + * + * If a property with the same name exists in both objects, and the value of it is an object, the two objects will be merged recursively. + * + * If a property with the same name exists in both objects, and the value of it is primitive, the value of the source object will only be used when override is true. + * + * If a property exists in the source object but not in the target object, it will be added to the target object. + * + * @param target The target object. + * @param source The source object. + * @param override Override option. Default is true. + * @example + * ``` + * let target = { b: { x: 1 } }; + * let source = { a: 1, b: { y: 1 }, c: 2}; + * let result = mergeObjs(target, source); + * //Output: { a: 1, b: { x:1, y:1 }, c: 2} + * ``` + */ + mergeObjs(target: any, source: any, override?: boolean): void; + + /** + * Set the value of a property in an object by a path. + * @param obj The object to set the property. + * @param datapath The path of the property. + * @param pathIndex The start index of datapath. Default is 0. + * @param value The value to set. + * @param forceCreate If true, the path will be created if it does not exist. Default is false. + * @example + * ``` + * let obj = { a: { b: { c: 1 } } }; + * setDataByPath(obj, ['a', 'b', 'c'], 0, 2); + * //Output: { a: { b: { c: 2 } } } + * + * let obj = { a: { b: { c: 1 } } }; + * setDataByPath(obj, ['a', 'd', 'c'], 0, 2, true); + * //Output: { a: { b: { c: 1 }, d: { c: 2 } } } + * + * let obj = { a: { b: { c: 1 } } }; + * setDataByPath(obj, ['a', 'd', 'c'], 0, 2, false); + * //Output: { a: { b: { c: 1 } } + * ``` + */ + setDataByPath(obj: any, datapath: ReadonlyArray, pathIndex: number, value: any, forceCreate?: boolean): boolean; + + /** + * Delete a property in an object by a path. + * @param obj The object to delete the property. + * @param datapath The path of the property. + * @param pathIndex The start index of datapath. Default is 0. + */ + deleteDataByPath(obj: any, datapath: ReadonlyArray, pathIndex: number): boolean; + + /** + * Get the value of a property in an object by a path. + * @param obj The object to get the property. + * @param datapath The path of the property. + * @param pathLen The length of the path. Default is the length of datapath. + * @return The value of the property. + * @example + * ``` + * let obj = { a: { b: { c: 1 } } }; + * let result = getDataByPath(obj, ['a', 'b', 'c']); + * //Output: 1 + * ``` + */ + getDataByPath(obj: any, datapath: ReadonlyArray, pathLen?: number): any; + + /** + * Whether an object is empty. A empty object has no properties. + * @param obj The object to check. + * @returns True if the object is empty, otherwise false. + */ + isEmptyObj(obj: any): boolean; + + /** + * Compares whether two arrays are equal. Two arrays are equal if they have the same length and all their elements are equal by comparing them using ===. + * @param a The first array. + * @param b The second array. + * @returns True if the two arrays are equal, otherwise false. + */ + arrayEquals(a: ReadonlyArray, b: ReadonlyArray): boolean; + + /** + * Whether the first array starts with the second array. + * @param a The first array. + * @param b The second array. + * @returns True if the first array starts with the second array, otherwise false. + */ + arrayStartsWith(a: ReadonlyArray, b: ReadonlyArray): boolean; + + /** + * Compares whether two objects are equal. Two objects are equal if they have the same properties and the values of the properties are equal by comparing them using ===. + */ + objEquals(a: any, b: any): boolean; + + /** + * Copies the properties of one object to another, making the two objects have exactly the same properties. + * Unlike Object.assign, it will first delete properties in the target object that do not exist in the source. + * @param target The target object. + * @param source The source object. + * @returns The target object. + */ + assignObject(target: any, source: any): any; + } + export interface IFetchResponseTypeMap { + "text": string; + "json": any; + "arraybuffer": ArrayBuffer; + } + + export interface IFetchOptions { + /** + * post, get, put, delete, etc. + */ + method?: string; + + /** + * Query parameters. These will be appended to the URL by a '?' and joined by '&'. + */ + query?: Record; + + /** + * Upload data. This can be a JSON object, URLSearchParams, FormData, or ArrayBuffer. + */ + body?: Record | URLSearchParams | FormData | ArrayBuffer; + + /** + * Http headers. + */ + headers?: Record; + + /** + * Response type. + * - text: The response is a string. + * - json: The response is a JSON object. + * - arraybuffer: The response is an ArrayBuffer. + */ + responseType?: K, + + /** + * Username for basic authentication. + */ + username?: string, + + /** + * Password for basic authentication. + */ + password?: string, + + /** + * This callback will be called with the download progress. + * @param loaded Loaded bytes. + * @param total Total bytes. + */ + downloadProgress?: (loaded: number, total: number) => void; + + /** + * This callback will be called with the upload progress. + * @param loaded + * @param total + * @returns + */ + uploadProgress?: (loaded: number, total: number) => void; + + /** + * Abort token. If you want to abort the http request on some conditions, you can pass an abort token here. Call abortToken.signal() to abort the requset. + */ + abortToken?: IAbortToken; + } + + export interface INetUtils { + /** + * Issues an http request. + * @param url URL. + * @param options Options. + * @returns A promise that resolves to the response. + */ + httpRequest(url: string, options?: IFetchOptions): Promise; + + /** + * Downloads a file to a buffer. + * @param url URL. + * @param progress Progress callback. + * @param abortToken Abort token. If you want to abort the http request on some conditions, you can pass an abort token here. Call abortToken.signal() to abort the requset. + * @returns A promise that resolves to the file buffer. + */ + downloadFileToBuffer(url: string, progress?: (receivedLength: number, contentLength: number) => void, abortToken?: IAbortToken): Promise; + + /** + * Downloads a file. + * @param url URL. + * @param localPath Local path to save the file. + * @param progress Progress callback. + */ + downloadFile(url: string, localPath: string, progress?: (receivedLength: number, contentLength: number) => void): Promise; + + /** + * Gets the IP address of the local machine. + */ + getIPAddress(): string; + } + export type ExecResult = { code: number, error: string, output: string }; + export type ExecProgressCallback = (output: string, part: string) => void; + + export interface IExecOptions { + /** + * Current working directory. + */ + cwd?: string; + + /** + * Progress callback. + * - output: The full output of the command. + * - part: The current part of the output. + */ + progressCallback?: ExecProgressCallback; + + /** + * Abort token. If you want to abort the command on some conditions, you can pass an abort token here. Call abortToken.signal() to abort the command. + */ + abortToken?: IAbortToken; + + /** + * If true, runs command inside of a shell. Uses '/bin/sh' on Unix, and process.env.ComSpec on Windows. A different shell can be specified as a string. See Shell requirements and Default Windows shell. Default: false (no shell). + */ + shell?: boolean | string; + + /** + * Environment key-value pairs. Default: process.env + */ + env?: Record; + + /** + * The encoding used for all stdio inputs and outputs. On MacOs and Linux, the default is 'utf8'. On Windows, we will try to detect the encoding of the console, and use that encoding. + */ + stringEncoding?: string; + + /** + * Whether to throw an error If the process exits with a non-zero exit code. Default: false. + */ + throwIfNonZeroExitCode?: boolean; + + /** + * Whether to throw an error If AbortToken is signaled. Default: false. + */ + throwIfAborted?: boolean; + } + + /** + * + */ + export interface INativeTools { + /** + * Executes a command. + * @param command The command to execute. + * @param args The command arguments. + * @param options The execution options. + * @returns A promise that resolves to the execution result. + */ + exec(command: string, args: ReadonlyArray, options: IExecOptions): Promise; + + /** + * Executes a command. + * @param command The command to execute + * @param args The command arguments. + * @param progressCallback The progress callback. + * @param abortToken The abort token. If you want to abort the execution on some conditions, you can pass an abort token here. Call abortToken.signal() to abort the execution. + * @returns A promise that resolves to the execution result. + */ + exec(command: string, args: ReadonlyArray, progressCallback?: ExecProgressCallback, abortToken?: IAbortToken): Promise; + + /** + * Run a built-in tool. All tools are installed in the IDE's nativetools directory. + * @param toolName The tool name. + * @param args The command arguments. + * @param options The execution options. + * @returns A promise that resolves to the execution result. + */ + runTool(toolName: string, args: ReadonlyArray, options: IExecOptions): Promise; + + /** + * Run a built-in tool. All tools are installed in the IDE's nativetools directory. + * @param toolName The tool name. + * @param args The command arguments. + * @param progressCallback The progress callback. + * @param abortToken The abort token. If you want to abort the execution on some conditions, you can pass an abort token here. Call abortToken.signal() to abort the execution. + * @returns A promise that resolves to the execution result. + */ + runTool(toolName: string, args: ReadonlyArray, progressCallback?: ExecProgressCallback, abortToken?: IAbortToken): Promise; + + /** + * Runs a npm cli command. CliName can be “npm” or “npx”. If it is another command, it needs to be installed first using installCli(). + * @param cliName The cli name. "npm", "npx", or a custom cli name. + * @param args The command arguments. + * @param options The execution options. + * @returns A promise that resolves to the execution result. + */ + execCli(cliName: string, args: ReadonlyArray, options?: IExecOptions): Promise; + + /** + * Install a npm package. The pacakge will install to the project's library/cli-package directory. + * @param pkgName The package name. e.g. "typescript" or ["typescript", "eslint"] + * @param options The execution options. + * @returns A promise that resolves to the execution result. + */ + installCli(pkgName: string | string[], options?: IExecOptions): Promise; + + /** + * Converts an absolute path to a path relative to the project root directory. + * + * The main purpose of this is to avoid issues with command-line tools that may not work properly if the project path contains Chinese characters or spaces. + * @param path The path to convert. + * @returns The converted path. + */ + formatOutpathArg(path: string): string; + + /** + * Converts an absolute path to a path relative to the project root directory. If the input path contains Chinese characters, a temporary file will be created, and the content of the input path will be written to the temporary file. The path of the temporary file will be returned. + * + * The main purpose of this is to avoid issues with command-line tools that may not work properly if the file name contains Chinese characters. + * @param path The path to convert. + * @param tempPath The directory for the temporary file. Default is library/temp/mbcNameFiles. + * @returns The converted path. + */ + formatInFileArg(path: string, tempPath?: string): Promise; + + /** + * Opens the code editor. + * @param filePath The file path. + */ + openCodeEditor(filePath: string): void; + + /** + * Opens the browser. + * @param url The URL address. + */ + openBrowser(url: string): void; + + /** + * Gets the string encoding of the console. Only effective on Windows systems, returns 'utf8' on other platforms. + * @returns The string encoding. + */ + getStringEncoding(): Promise; + + /** + * Gets the machine identification code. + * @returns The machine identification code. + */ + getMachineId(): Promise; + + /** + * Opens the terminal and runs a command. + * @param command The command to run. + * @param workingDirectory The working directory. Default is the project root directory. + */ + runCommandInTerminal(command: string, workingDirectory?: string): Promise; + } + export interface ICreateNodeOptions { + /** + * When creating a node, a reasonable position will be set for the node if this option is true. Default is true. + */ + setDefaultPos?: boolean; + + /** + * When creating a node, name conflict will be resolved if this option is true. Default is true. + */ + fixDupName?: boolean; + } + + export interface IMyScene { + /** + * History support for the scene. + */ + readonly history: IDataHistory; + + /** + * Selection history support for the scene. It is used to undo or redo the selection changes. + */ + readonly selectionHistory: IDataHistory; + + /** + * Root node of the scene. It is a dummy node which has no parent. + */ + readonly rootNode: IMyNode; + + /** + * Scene2D node. + */ + readonly rootNode2D: IMyNode; + + /** + * Scene3D node. + */ + readonly rootNode3D: IMyNode; + + /** + * If the scene is a prefab, this is the root node of the prefab. + */ + readonly prefabRootNode: IMyNode; + + /** + * ID of the scene. + */ + readonly sceneId: string; + + /** + * World type of the scene. + */ + readonly worldType: WorldType; + + /** + * Which asset the scene is from. + */ + readonly asset: IAssetInfo; + + /** + * Communication port to the scene process. + */ + readonly port: IMyMessagePort; + + /** + * Scene status is used to store temporary data about the scene. + */ + readonly status: IConfigObject; + + /** + * Scene status is used for UI to store data about the scene. It will be persisted while the scene is being saved. + */ + readonly persistStatus: IConfigObject; + + /** + * Whether the scene is loading. + */ + readonly loading: boolean; + + /** + * Whether the scene is read-only. Default is false. + */ + readonly viewerMode: boolean; + + /** + * If it is a PlayingScene, this property will point to the source scene. + */ + readonly sourceScene?: IMyScene; + + /** + * Whether the scene is modified. + */ + readonly isModified: boolean; + + /** + * Set the modified flag of the scene. + */ + setModified(): void; + + /** + * Get selection. + * @param type The type of the selection, "node" or "asset" or other types. If not specified, the default type is "node". + * @return The selection. + */ + getSelection(type?: string): ReadonlyArray; + + /** + * Set selection. + * @param objs Selection objects. + * @param type The type of the selection, "node" or "asset" or other types. If not specified, the default type is "node". + */ + setSelection(objs: any | any[], type?: string): void; + + /** + * Type of current selection. "node" or "asset" or other types. + */ + readonly selectionType: string; + + /** + * Set the selection changed flag manually. + * Commonly the flag is set automatically when the selection is changed. + * But in some cases, you may need to set it manually if you want to notify the listeners to update the UI. + */ + setSelectionChangedFlag(): void; + + /** + * Get a node by id. The node must have been queried before. + * @param id The id of the node. + * @return The node if found; otherwise, null. + */ + getNode(id: string): IMyNode; + + /** + * Get a node by id asynchronously. + * @param id The id of the node. + * @return The node if found; otherwise, null. + */ + getNodeAsync(id: string): Promise; + + /** + * Get top prefab of a node. Top prefab is the prefab which is not nested in another prefab. + * @param node The node. + * @return The top prefab if found; otherwise, null. + */ + getTopPrefab(node: IMyNode): Promise; + + /** + * Get prefab id of a node. + * @param node The node. + * @return The prefab id if found; otherwise, null. + */ + getPrefabId(node: IMyNode): Promise; + + /** + * Create a new node. + * + * Be aware that the node is only created in the scene process, and it is not added to the scene yet. Use IMyNode.addNode or IMyScene.addNode to add the node to the scene. + * @param nodeType The type of the node. e.g. "Sprite", "Sprite3D", etc. + * @param props Initial properties of the node. + * @param parentNode The parent node of the new node. If not specified, the new node will be a root node. Be aware that the new node will not be added to this node. + * @param options Options for creating the node. + * @return The new node if created successfully; otherwise, null. + */ + createNode(nodeType: string, props?: Record, parentNode?: IMyNode, options?: ICreateNodeOptions): Promise; + + /** + * Create a new node by asset. + * + * Be aware that the node is only created in the scene process, and it is not added to the scene yet. Use IMyNode.addNode or IMyScene.addNode to add the node to the scene. + * @param assetId The id of the asset. + * @param props Initial properties of the node. + * @param parentNode The parent node of the new node. If not specified, the new node will be a root node. Be aware that the new node will not be added to this node. + * @param options Options for creating the node. + */ + createNodeByAsset(assetId: string, props?: Record, parentNode?: IMyNode, options?: ICreateNodeOptions): Promise; + + /** + * Instantiate a prefab. + * @param assetId The id of the prefab asset. + * @param props Initial properties of the node. + * @param parentNode The parent node of the new node. If not specified, the new node will be a root node. Be aware that the new node will not be added to this node. + * @param options Options for creating the node. + * @return The new node if instantiated successfully; otherwise, null. + */ + instantiatePrefab(assetId: string, props?: Record, parentNode?: IMyNode, options?: ICreateNodeOptions): Promise; + + /** + * Delete a node. + * @param node The node to delete. + */ + deleteNode(node: IMyNode): void; + + /** + * Add a node to another node's hierarchy. + * @param parentNode The parent node. + * @param node The node to add. + * @param index The index to add the node. If not specified, the node will be added to the end. + * @param worldPositionStays If true, the world position of the node will not change. Default is false. + */ + addNode(parentNode: IMyNode, node: IMyNode, index?: number, worldPositionStays?: boolean): Promise; + + /** + * Execute a script in the Scene process. It can execute static functions of classes decorated with @Laya.regClass or @EditorEnv.regClass. + * @param command Class name and function name separated by a dot. e.g. "MyClass.myFunction". + * @param params Parameters of the function. + * @return The return value of the function. + */ + runScript(command: string, ...params: any[]): Promise; + + /** + * Almost the same as runScript, but it will send the command to the playing scene process first. If the scene is not in the playing state, it will behave the same as runScript. + * @param command Class name and function name separated by a dot. e.g. "MyClass.myFunction". + * @param params Parameters of the function. + * @return The return value of the function. + * @see runScript + */ + runScriptMax(command: string, ...params: any[]): Promise; + + /** + * Execute a function on a node or component. + * @param nodeId The ID of the node. + * @param componentId The ID of the component. + * @param functionName The name of the function to execute. + * @param args The arguments to pass to the function. + * @return The return value of the function. + */ + runNodeScript(nodeId: string, componentId: string, functionName: string, ...args: any[]): Promise; + + /** + * Run a callback function, and batch the changes to the scene. It is useful when you want to make multiple changes to the scene efficiently. + * @param func Callback function to run. + * @param options Options for running the batch. + * - noHistory: If true, the changes will not be recorded in the history. Default is false. + * - noPush: If true, the changes will not be sent to the scene process. Default is false. + */ + runBatch(func: () => void, options?: { noHistory?: boolean, noPush?: boolean }): void; + + /** + * Find nodes by keyword. + * @param keyword The keyword to search. + * @param maxResults The maximum number of results. Default is 200. + * @return The nodes found. + */ + findNodes(keyword: string, maxResults?: number): Promise>; + + /** + * Add a component to a node. + * @param node The node. + * @param componentType The type of the component. e.g. "PhysicsCollider", "BoxCollider", etc. + * @param props Initial properties of the component. + * @return The new component if added successfully; otherwise, null. + */ + addComponent(node: IMyNode, componentType: string, props?: Record): Promise; + + /** + * Remove a component from a node. + * @param node The node. + * @param compId The id of the component. + */ + removeComponent(node: IMyNode, compId: string): Promise; + + /** + * Change the type of a node or multiple nodes. + * @param nodes a node or an array of nodes. + * @param nodeType The new type of the node. + */ + changeNodesType(nodes: IMyNode | ReadonlyArray, nodeType: string): Promise; + + /** + * Get the children of a node. + * @param parentNode The parent node. + * @return The children of the node. + */ + getNodeChildren(parentNode: IMyNode): Promise>; + + /** + * Get all decendants of a node. + * @param parentNode The parent node. + * @param out If specified, the result will be stored in this array, otherwise, a new array will be created. + * @return The decendants of the node. + */ + getNodeDescendants(parentNode: IMyNode, out?: Array): Promise; + + /** + * Synchronize the node props with the scene process. + * @param node The node. + */ + syncNode(node: IMyNode): Promise; + + /** + * Move the node to the focus position. + * @param node The node. + */ + focusNode(node: IMyNode): void; + + /** + * Synchronize the nodes with the scene process. + * @param nodes The nodes. If not specified, selected nodes will be synchronized. + */ + syncNodes(nodes?: ReadonlyArray): Promise; + + /** + * Copy the selected nodes. + */ + copyNodes(): Promise; + + /** + * Paste the copied nodes. + * @return The new nodes. + */ + pasteNodes(): Promise>; + + /** + * Duplicate the selected nodes. + * @return The new nodes. + */ + duplicateNodes(): Promise>; + + /** + * Delete the selected nodes. + */ + deleteNodes(): void; + + /** + * Move the selected nodes. + * @param action The action to move the nodes. + */ + changeNodesOrder(action: "bringForward" | "sendBackward" | "sendToBack" | "bringToFront"): void; + + /** + * Create a new prefab asset from the specified node. + * @param nodeId Node id. + * @param savePath The path to save the prefab asset. It is a relative path to the asset root. + * @param fileName If specified, the name of the prefab asset. If not specified, the name of the node will be used. + * @return The new asset and the new node. + */ + createPrefab(nodeId: string, savePath: string, fileName?: string): Promise<{ asset: IAssetInfo, newNode: IMyNode }>; + + /** + * Add a component to all selected nodes. + * @param componentType The type of the component. e.g. "PhysicsCollider", "BoxCollider", etc. + */ + addComponentToNodes(componentType: string): Promise; + + /** + * Get the properties of a resource. + * @param resId The id of the resource. + * @return The properties of the resource. + */ + getResourceProps(resId: string): Promise; + + /** + * Send a message to the scene process. + * @param channel The channel of the message. + * @param args The arguments of the message. + */ + send(channel: string, ...args: any[]): void; + + /** + * Send a message to the scene process and wait for the response. + * @param channel The channel of the message. + * @param args The arguments of the message. + * @return The response of the message. + */ + invoke(channel: string, ...args: any[]): Promise; + } + export var PrefabOverridesKey: symbol; + + export enum NodeFeatures { + HasChild = 1, + RootNode = 2, + Inactive = 4, + InPrefab = 8, + IsPrefab = 16, + IsPrefabNewAdded = 32, + IsTopPrefab = 64, + IsPrefabReadonly = 128, + Missing = 256, + HideByEditor = 1024, + LockByEditor = 2048, + PrefabMissing = 4096, + } + + export interface IMyNode { + /** + * ID of the node. + */ + readonly id: string; + + /** + * Props of the node. + */ + readonly props: Record; + + /** + * ID of the node. + */ + readonly icon: string; + + /** + * Type of the node. It is a type which is defined in the typeRegistry. + */ + readonly type: string; + + /** + * Whether the node is a 3D node. + */ + readonly is3d: boolean; + + /** + * Parent node. + */ + readonly parent: IMyNode; + + /** + * Children nodes. Empty array if the node has no children. + */ + readonly children: Array; + + /** + * Index of the node in the parent's children array. + */ + readonly childIndex: number; + + /** + * Name of the node. + */ + readonly name: string; + + /** + * A number version is designed to track the changes of the node. It will be increased when the props of the node is changed, or the children of the node is changed. + */ + ver: number; + + /** + * The tree version is used to determine if the node tree has changed. + */ + treeVer: number; + + /** + * A number version is designed to track the changes of the props of the node. It will be increased when the props of the node is changed. + */ + propsVer: number; + + /** + * A number version is designed to track the changes of the status of the node. It will be increased when the status of the node is changed. + * + * Status of the node includes the label, the lock status, the hide status, etc. + */ + statusVer: number; + + /** + * Features of the node. + * @see NodeFeatures + */ + features: number; + + /** + * If true, the node is not allowed to be deleted. + */ + readonly dontDestroy?: boolean; + + /** + * If true, the node is not allowed to add child or remove child or change the order of the children. + */ + readonly dontChangeChildren?: boolean; + + /** + * If true, the node is not allowed to add component. + */ + readonly noAddComponent?: boolean; + + /** + * Add a child node to the node. + * @param node The child node to add. + */ + addChild(node: IMyNode): void; + + /** + * Change the index of the node in the parent's children array. + * @param index The new index of the node. + */ + setChildIndex(index: number): void; + + /** + * Whether the node is a decendant of the node. + * @param node The node to check. + * @returns True if the node is a decendant of the node, false otherwise. + */ + isAncestorOf(node: IMyNode): boolean; + + /** + * All the component ids of the node. + */ + readonly componentIds: ReadonlyArray; + + /** + * All the components of the node by id. + */ + readonly components: Record; + + /** + * Get the component by type. + * @param type The type of the component. + * @param allowDerives If true, the returned component type must be exactly the same as the type; otherwise, the returned component type can be a derived class of the type. Default is false. + * @returns The component if found; otherwise, null. + */ + getComponent(type: string, allowDerives?: boolean): IMyComponent; + /** + * Prefab overrides of the node. + */ + readonly [PrefabOverridesKey]?: Array>; + + /** + * Prefab overrides of the node or the component. + * @param key If key is specified, the prefab overrides of the component with the key will be returned; otherwise, the prefab overrides of the node will be returned. + * @returns The prefab overrides of the node or the component. + */ + getPrefabOverrides(key?: string): Array>; + + /** + * Whether the node is Scene3D node or Scene2D node. + */ + readonly isRoot: boolean; + + /** + * Whether the node is the root node of a prefab, and the prefab is not nested in another prefab. + */ + readonly isTopPrefab: boolean; + + /** + * Whether the node is in a prefab. + */ + readonly inPrefab: boolean; + + /** + * Test if the node has the specified feature. + * @param feature The feature to test. + * @returns True if the node has the specified feature; otherwise, false. + * @see NodeFeatures + */ + hasFeature(feature: number): boolean; + } + + export interface IMyComponent { + /** + * Owner node of the component. + */ + readonly owner: string; + + /** + * ID of the component. + */ + readonly id: string; + + /** + * Type of the component. It is a type which is defined in the typeRegistry. + */ + readonly type: string; + + /** + * Props of the component. + */ + readonly props: Record; + + /** + * If true, the owner of the component is a node in a prefab, and the component is not a new added component. + */ + readonly inPrefab?: boolean; + + /** + * Prefab overrides of the node. + */ + readonly [PrefabOverridesKey]?: Array>; + } + export namespace MyMessagePortStatic { + /** + * It is used inside the webview or iframe to create a communication channel with the host. + * @param queueTask Whether to queue the task. If true, the received messages will be queued and processed sequentially. Defaults to false. + * @returns The message port. + */ + function requestFromHost(queueTask?: boolean): Promise; + + /** + * Connect to a named service. + * @param serviceName Service name. + * @param subscribe Whether to receive broadcast messages from the service. Defaults to false. + * @param args Arguments to pass to the service. + * @returns The message port. + */ + function connectService(serviceName: string, subscribe?: boolean, ...args: any[]): IMyMessagePort; + } + + export interface IMyMessagePort { + /** + * A delegate that is called when the port is closed. + */ + readonly onClose: IDelegate<() => void>; + + /** + * Whether to log an error to the console when a received message does not have a corresponding handler function. + */ + logHandlerMissing: boolean; + + /** + * Start the message port. + * + * This function only needs to be called when manually constructing a MyMessagePort object. In other cases, such as the object returned by connectService, it does not need to be called. + */ + start(): void; + + /** + * Close the message port. + */ + close(): void; + + /** + * Register a handler function for a channel. + * @param channel Channel name. + * @param func Handler function. + * @param thisArg The this object to bind the handler function to. + * @param noAwait If true, the handler function will not be awaited. Defaults to false. + */ + handle(channel: string, func: (...args: any[]) => Promise | any, thisArg?: any, noAwait?: boolean): void; + + /** + * Send a message to the other side. + * @param channel Channel name. + * @param args Arguments. + */ + send(channel: string, ...args: any[]): void; + + /** + * Send a message to the other side and transfer some Transferable objects. + * @param channel Channel name. + * @param transfer Transferable objects. + * @param args Arguments. + */ + transfer(channel: string, transfer: Transferable[], ...args: any[]): void; + + /** + * Send a message to the other side and expect a response. + * @param channel Channel name. + * @param args Arguments. + * @returns The response. + */ + invoke(channel: string, ...args: any[]): Promise; + + /** + * Manually call a handler function. + * @param channel Channel name. + * @param args Arguments. + * @returns The response. + */ + callHandler(channel: string, ...args: any[]): Promise; + } + export interface IModuleInfo { + /** + * Identifier of the module. + */ + id: string; + + /** + * Name of the module. + */ + name: string; + + /** + * Whether the module is visible to users. + */ + visible: boolean; + + /** + * Description of the module. + */ + description: string; + + /** + * Dependencies of the module. + */ + dependencies: Array; + + /** + * Download URLs of the module. + */ + downloadUrls: Array<{ + url: string, + destination: string + }>; + + /** + * Category of the module. + */ + category: string; + + /** + * Download size of the module. + */ + downloadSize: number; + + /** + * Installed size of the module. + */ + installedSize: number; + + /** + * Whether the module is self-installed. + */ + selfInstalled: boolean; + + /** + * Whether the module and all its dependencies are installed. + */ + installed: boolean; + + /** + * Installation path of the module. + */ + path: string; + + /** + * Original data of the module. + */ + data: any; + } + + export interface IModulesManager { + /** + * All modules. + */ + allModules: Array; + + /** + * Installation base path. + */ + homePath: string; + + /** + * Get a module by its identifier. + * @param id Identifier of the module. + * @returns The module. + */ + getModule(id: string): Readonly; + /** + * Show module installation dialog if any of the modules is not installed. + * @param modules Identifiers of the modules. + * @param alert Whether to show alert messages before displaying the dialog. + * @param waitForComplete Whether to wait for the installation to complete. + * @returns Whether the installation is successful. + */ + installModules(modules: Array, alert?: boolean, waitForComplete?: boolean): Promise; + } + export interface IMenuItem { + /** + * Will be called with `click(menuItemId)` when the menu item + * is clicked. + * @param menuItemId Menu item ID. + * @param userData User data. This is the same as the `userData` parameter passed in the show method. + */ + click?: (menuItemId: string, userData?: any) => void; + + /** + * Can be `undo`, `redo`, `cut`, `copy`, `paste`, `pasteAndMatchStyle`, `delete`, + * `selectAll`, `reload`, `forceReload`, `toggleDevTools`, `resetZoom`, `zoomIn`, + * `zoomOut`, `toggleSpellChecker`, `togglefullscreen`, `window`, `minimize`, + * `close`, `help`, `about`, `services`, `hide`, `hideOthers`, `unhide`, `quit`, + * 'showSubstitutions', 'toggleSmartQuotes', 'toggleSmartDashes', + * 'toggleTextReplacement', `startSpeaking`, `stopSpeaking`, `zoom`, `front`, + * `appMenu`, `fileMenu`, `editMenu`, `viewMenu`, `shareMenu`, `recentDocuments`, + * `toggleTabBar`, `selectNextTab`, `selectPreviousTab`, `mergeAllWindows`, + * `clearRecentDocuments`, `moveTabToNewWindow` or `windowMenu` - Define the action + * of the menu item, when specified the `click` property will be ignored. See + * roles. + */ + role?: ('undo' | 'redo' | 'cut' | 'copy' | 'paste' | 'pasteAndMatchStyle' | 'delete' | 'selectAll' | 'reload' | 'forceReload' | 'toggleDevTools' | 'resetZoom' | 'zoomIn' | 'zoomOut' | 'toggleSpellChecker' | 'togglefullscreen' | 'window' | 'minimize' | 'close' | 'help' | 'about' | 'services' | 'hide' | 'hideOthers' | 'unhide' | 'quit' | 'showSubstitutions' | 'toggleSmartQuotes' | 'toggleSmartDashes' | 'toggleTextReplacement' | 'startSpeaking' | 'stopSpeaking' | 'zoom' | 'front' | 'appMenu' | 'fileMenu' | 'editMenu' | 'viewMenu' | 'shareMenu' | 'recentDocuments' | 'toggleTabBar' | 'selectNextTab' | 'selectPreviousTab' | 'mergeAllWindows' | 'clearRecentDocuments' | 'moveTabToNewWindow' | 'windowMenu'); + + /** + * Can be `normal`, `separator`, `submenu`, `checkbox` or `radio`. + */ + type?: ('normal' | 'separator' | 'submenu' | 'checkbox' | 'radio'); + + /** + * Display title of the menu item. It could be omitted if `type` is `separator` or `role` is specified. + * + * Use "i18n:<key>" or "i18n:<file-id>:<key>" to specify the key of the internationalization string. + */ + label?: string; + + /** + * Keyboard shortcut for the menu item. + */ + accelerator?: string; + + /** + * If false, the menu item will be greyed out and unclickable. + */ + enabled?: boolean; + + /** + * If false, the menu item will be entirely hidden. + */ + visible?: boolean; + + /** + * Should only be specified for `checkbox` or `radio` type menu items. + */ + checked?: boolean; + + /** + * Should be specified for `submenu` type menu items. If `submenu` is specified, + * the `type: 'submenu'` can be omitted. + */ + submenu?: IMenuItem[]; + + /** + * Unique within a single menu. If defined then it can be used as a reference to + * this item by the position attribute. + */ + id?: string; + + /** + * Sets the position of the menu item. + * + * Supported syntax: "first" / "last" / "before ids" / "after ids" / "beforeGroup ids" / "afterGroup ids". + * + * The difference between "before" and "beforeGroup" is that "before" inserts before the reference menu item, while "beforeGroup" inserts before the nearest separator before the reference menu item. + * + * The difference between "after" and "afterGroup" is that "after" inserts after the reference menu item, while "afterGroup" inserts after the nearest separator after the reference menu item. + * + * Within the same class extension definition, the default is to add after the previous menu item. If not in the same class, the default is to add to the end of the menu if position is not specified. + * + * Multiple reference menu item ids are separated by commas. + */ + position?: string; + } + + export interface ICustomMenuItemOptions extends Pick { + /** + * Whether the menu item is a checkbox. Same as `type: 'checkbox'`. + */ + checkbox?: boolean; + + /** + * Insert a separator before the menu item. + */ + sepBefore?: boolean; + + /** + * Insert a separator after the menu item. + */ + sepAfter?: boolean; + + /** + * A function to test whether the menu item should be enabled. + * + * It is only effective for context menu items, but not for main menu items. + */ + enableTest?: () => boolean; + + /** + * A function to test whether the menu item should be visible. + * + * It is only effective for context menu items, but not for main menu items. + */ + visibleTest?: () => boolean; + + /** + * A function to test whether the menu item should be checked. + * + * It is only effective for context menu items, but not for main menu items. + */ + checkedTest?: () => boolean; + } + + export interface IMenuPopupOptions { + /** + * Default is the current mouse cursor position. Must be declared if `y` is + * declared. + */ + x?: number; + /** + * Default is the current mouse cursor position. Must be declared if `x` is + * declared. + */ + y?: number; + + /** + * Optionally, a submenu can be popped up. + */ + submenu?: string; + } + + export interface IMenu { + /** + * Identifier of the menu. + */ + readonly id: string; + + /** + * Name of the menu. + */ + name: string; + + /** + * A property for users to conveniently store data. + */ + data: any; + + /** + * This callback function is called when a menu item is clicked and the menu item does not have a click handler bound. + * @param itemId Menu item ID. + * @param userData User data. This is the same as the `userData` parameter passed in the show method. + */ + onClickItem: IMenuItem["click"]; + + /** + * Destroy the menu. + */ + dispose(): void; + + /** + * Set enabled state of a menu item. + * @param itemId Menu item ID. + * @param enabled Whether the menu item is enabled. + */ + setItemEnabled(itemId: string, enabled: boolean): void; + + /** + * Get enabled state of a menu item. + * @param itemId Menu item ID. + * @returns Whether the menu item is enabled. + */ + isItemEnabled(itemId: string): boolean; + + /** + * Set visible state of a menu item. + * @param itemId Menu item ID. + * @param visible Whether the menu item is visible. + */ + setItemVisible(itemId: string, visible: boolean): void; + + /** + * Set checked state of a menu item. + * @param itemId Menu item ID. + * @param checked Whether the menu item is checked. + */ + setItemChecked(itemId: string, checked: boolean): void; + + /** + * Get checked state of a menu item. + * @param itemId Menu item ID. + * @returns Whether the menu item is checked. + */ + isItemChecked(itemId: string): boolean; + + /** + * Set label of a menu item. + * @param itemId Menu item ID. + * @param label Label of the menu item. + */ + setItemLabel(itemId: string, label: string): void; + + /** + * Get label of a menu item. + * @param itemId Menu item ID. + * @returns Label of the menu item. + */ + getItemLabel(itemId: string): string; + /** + * Update the menu. + * @param template Menu template. + */ + setItems(template: Array): void; + + /** + * Display the menu. + * @param callbackThisObj The `this` object of the callback function. + * @param popupOptions Popup options. + */ + show(callbackThisObj?: any, popupOptions?: IMenuPopupOptions): void; + + /** + * Simulate a click on a menu item. + * @param itemId Menu item ID. + * @param callbackThisObj The `this` object of the callback function. + */ + simulateClick(itemId: string, callbackThisObj?: any): void; + } + + export namespace MenuStatic { + /** + * Get a menu by ID. + * @param id Menu ID. + * @returns The menu. + */ + function getById(id: string): IMenu; + + /** + * Create a menu. + * @param template Menu template. + * @returns The menu. + */ + function create(template?: Array): IMenu; + + /** + * Create a menu. + * @param id Menu ID. + * @param template Menu template. + * @returns The menu. + */ + function create(id: string, template?: Array): IMenu; + } + + /** + * Interface for logging messages + */ + export interface ILogger { + + /** + * Logs an informational message to the console. + * @param message - The message to log. + * @param optionalParams - Additional parameters to log. + */ + log(message?: any, ...optionalParams: any[]): void; + + /** + * Logs a warning message to the console. + * @param message - The message to log. + * @param optionalParams - Additional parameters to log. + */ + warn(message?: any, ...optionalParams: any[]): void; + + /** + * Logs an error message to the console. + * @param message - The message to log. + * @param optionalParams - Additional parameters to log. + */ + error(message?: any, ...optionalParams: any[]): void; + + /** + * Logs a debug message to the console. + * @param message - The message to log. + * @param optionalParams - Additional parameters to log. + */ + debug(message?: any, ...optionalParams: any[]): void; + } + + export interface IListInsertionHelper { + /** + * Get insertion information. + * @returns obj is the reference object to insert by, it could be null if no object is selected. + * - 'in': add as a child of the object. + * - 'above': Insert above the object. + * - 'below': Insert below the object. + */ + getInsertPos(): { obj: gui.Widget, pos: 'in' | 'above' | 'below' }; + } + + export interface IListHelper { + /** + * Called when an item is added to the list. + * @param index Insertion index. + * @param item The item that was added. + */ + readonly onInsert: (index: number, item: any) => void; + + /** + * Called when an item is removed from the list. + * @param index The index of the item that was removed. + */ + readonly onRemove: (index: number) => void; + + /** + * Called when two items are swapped. + * @param index1 Index of the first item. + * @param index2 Index of the second item. + */ + readonly onSwap: (index1: number, index2: number) => void; + + /** + * Trigger add operation. + */ + add(): void; + + /** + * Trigger insert operation. + */ + insert(): void; + + /** + * Trigger remove operation. + */ + remove(): void; + + /** + * Trigger move up operation. + */ + moveUp(): void; + + /** + * Trigger move down operation. + */ + moveDown(): void; + + /** + * Trigger swap operation. + * @param index1 Index of the first item. + * @param index2 Index of the second item. + */ + swapItem(index1: number, index2: number): void; + + /** + * Update the text of the index column. + * @param from Start index. + * @param to End index. End index is exclusive. + */ + updateIndexColumn(from: number, to: number): void; + } + + export interface ILanguageModule { + /** + * Current language. Currently two possible values: 'en' and 'zh-CN'. + */ + readonly language: string; + + /** + * Translation function. + * @param name Key name in the language file. + * @param defaultValue You can provide a default value if the key does not exist in the language file. + */ + t(name: string, defaultValue?: string): string; + + /** + * Translation function. + * @param name Key name in the language file. + * @param options Key-value pairs for string interpolation. + * @example + * ``` + * //en.json + * { + * "key" : "{{what}} is {{how}}" + * } + * + * //test.ts + * console.log(i18n.t("key", { what: "LayaAir", how: "great" })); + * //Output: "LayaAir is great" + * ``` + */ + t(name: string, options: Record): string; + + /** + * Translation function. + * @param name Key name in the language file. + * @param defaultValue You can provide a default value if the key does not exist in the language file. + * @param options Key-value pairs for string interpolation. + * @example + * ``` + * //en.json + * { + * "key" : "{{what}} is {{how}}" + * } + * + * //test.ts + * console.log(i18n.t("key", { what: "LayaAir", how: "great" })); + * //Output: "LayaAir is great" + * ``` + */ + t(name: string, defaultValue: string, options: Record): string; + } + export type CommonPathName = 'home' | 'appData' | 'userData' | 'cache' | 'temp' | 'exe' + | 'module' | 'desktop' | 'documents' | 'downloads' | 'music' | 'pictures' | 'videos' | 'recent' | 'logs' | 'crashDumps'; + + /** + * Interface for ipc + */ + export interface IIpc { + /** + * Resolves with the response from the main process. + * + * Send a message to the main process via `channel` and expect a result + * asynchronously. Arguments will be serialized with the Structured Clone + * Algorithm, just like `window.postMessage`, so prototype chains will not be + * included. Sending Functions, Promises, Symbols, WeakMaps, or WeakSets will throw + * an exception. + * + * The main process should listen for `channel` with `ipcMain.handle()`. + * + * For example: + * + * If you need to transfer a `MessagePort` to the main process, use + * `ipcRenderer.postMessage`. + * + * If you do not need a response to the message, consider using `ipcRenderer.send`. + * + * > **Note** Sending non-standard JavaScript types such as DOM objects or special + * Electron objects will throw an exception. + * + * Since the main process does not have support for DOM objects such as + * `ImageBitmap`, `File`, `DOMMatrix` and so on, such objects cannot be sent over + * Electron's IPC to the main process, as the main process would have no way to + * decode them. Attempting to send such objects over IPC will result in an error. + * + * > **Note** If the handler in the main process throws an error, the promise + * returned by `invoke` will reject. However, the `Error` object in the renderer + * process will not be the same as the one thrown in the main process. + */ + invoke(channel: string, ...args: any[]): Promise; + + /** + * Listens to `channel`, when a new message arrives `listener` would be called with + * `listener(event, args...)`. + */ + on(channel: string, listener: (event: Event, ...args: any[]) => void): void; + + /** + * Adds a one time `listener` function for the event. This `listener` is invoked + * only the next time a message is sent to `channel`, after which it is removed. + */ + once(channel: string, listener: (event: Event, ...args: any[]) => void): void; + + /** + * Send a message to the main process, optionally transferring ownership of zero or + * more `MessagePort` objects. + * + * The transferred `MessagePort` objects will be available in the main process as + * `MessagePortMain` objects by accessing the `ports` property of the emitted + * event. + * + * For example: + * + * For more information on using `MessagePort` and `MessageChannel`, see the MDN + * documentation. + */ + postMessage(channel: string, message: any, transfer?: MessagePort[]): void; + + /** + * Removes all listeners, or those of the specified `channel`. + */ + removeAllListeners(channel: string): void; + + /** + * Removes the specified `listener` from the listener array for the specified + * `channel`. + */ + removeListener(channel: string, listener: (...args: any[]) => void): void; + + /** + * Send an asynchronous message to the main process via `channel`, along with + * arguments. Arguments will be serialized with the Structured Clone Algorithm, + * just like `window.postMessage`, so prototype chains will not be included. + * Sending Functions, Promises, Symbols, WeakMaps, or WeakSets will throw an + * exception. + * + * > **NOTE:** Sending non-standard JavaScript types such as DOM objects or special + * Electron objects will throw an exception. + * + * Since the main process does not have support for DOM objects such as + * `ImageBitmap`, `File`, `DOMMatrix` and so on, such objects cannot be sent over + * Electron's IPC to the main process, as the main process would have no way to + * decode them. Attempting to send such objects over IPC will result in an error. + * + * The main process handles it by listening for `channel` with the `ipcMain` + * module. + * + * If you need to transfer a `MessagePort` to the main process, use + * `ipcRenderer.postMessage`. + * + * If you want to receive a single response from the main process, like the result + * of a method call, consider using `ipcRenderer.invoke`. + */ + send(channel: string, ...args: any[]): void; + + /** + * The value sent back by the `ipcMain` handler. + * + * Send a message to the main process via `channel` and expect a result + * synchronously. Arguments will be serialized with the Structured Clone Algorithm, + * just like `window.postMessage`, so prototype chains will not be included. + * Sending Functions, Promises, Symbols, WeakMaps, or WeakSets will throw an + * exception. + * + * > **NOTE:** Sending non-standard JavaScript types such as DOM objects or special + * Electron objects will throw an exception. + * + * Since the main process does not have support for DOM objects such as + * `ImageBitmap`, `File`, `DOMMatrix` and so on, such objects cannot be sent over + * Electron's IPC to the main process, as the main process would have no way to + * decode them. Attempting to send such objects over IPC will result in an error. + * + * The main process handles it by listening for `channel` with `ipcMain` module, + * and replies by setting `event.returnValue`. + * + * > :warning: **WARNING**: Sending a synchronous message will block the whole + * renderer process until the reply is received, so use this method only as a last + * resort. It's much better to use the asynchronous version, `invoke()`. + */ + sendSync(channel: string, ...args: any[]): any; + + /** + * Like `ipcRenderer.send` but the event will be sent to the `` element in + * the host page instead of the main process. + */ + sendToHost(channel: string, ...args: any[]): void; + } + export namespace IInspectorRegistry { + /** + * A version number will be increased by 1 every time the inspector registry is updated. + */ + const version: number; + + /** + * Register a field class. Should not be called directly but through @IEditor.inspectorField instead. + * @param name Field name. It should be unique within the registry. + * @param cls Field class. + */ + function registerFieldClass(name: string, cls: new () => IPropertyField): void; + + /** + * Get a field class by name. + * @param name Field name. + * @returns Field class. + */ + function getFieldClass(name: string): new () => IPropertyField; + + /** + * Register a layout class. Should not be called directly but through @IEditor.inspectorLayout instead. + * @param type 'asset' or 'node' or any other type. + * @param cls Layout class. + * @param displayOrder The display order of the layout. The smaller the value, The display position is more forward. Defaults to 10. + */ + function registerLayout(type: string, cls: new () => IInspectorLayout, displayOrder?: number): void; + + /** + * Create layout instances for the specified type and targets. Layout instances are cached and reused, so don't forget to call returnLayouts when you are done with them. + * @param type 'asset' or 'node' or any other type. + * @param targets The objects to render. + * @returns Layout instances. + */ + function createLayouts(type: string, targets: ReadonlyArray): Array; + + /** + * Put layout instances back to the cache. + * @param type 'asset' or 'node' or any other type. + * @param items Layout instances. + */ + function returnLayouts(type: string, items: Array): void; + } + export interface IInspectorLayout { + /** + * Tests whether the specified object is accepted for rendering. + * @param item The object to test. It is usually a IAssetInfo object, or a IMyNode object, or any other object. + */ + accept(item: any): boolean; + + /** + * Render the inspector layout. + * + * outTracables is an array that the implementer can fill in the data that needs to be traced, so that the manager can understand whether the "Apply" and "Undo" buttons need to be displayed when these Inspectors are displayed, and decide the availability of these buttons based on the changes in the data. + * + * @param items Multiple objects to render. Each object is usually a IAssetInfo object, or a IMyNode object, or any other object. + * @param inspectors The inspector helper. + * @param outTracables A in array that the implementer can fill in the data that needs to be traced. + */ + onRender(items: ReadonlyArray, inspectors: IInspectorHelper, outTracables: Array): Promise; + + /** + * If some data is tracing, this method will be called when the "Apply" button is clicked. + */ + onApply?(): Promise; + } + export interface IInspectorOptions { + /** + * Title of the inspector. + */ + title?: string; + + /** + * Whether the inspector is read-only. + */ + readonly?: boolean; + + /** + * statusStore is a object that contains the status of the inspector, such as the selected tab, the expanded state of the tree, etc. + */ + statusStore?: any; + + /** + * If this is set, a sub-object with the key of statusStoreSubId will be created in the statusStore object, which will be really used to store the status. + */ + statusStoreSubId?: string; + + /** + * Catalog bar style. Use `Hidden` to hide the catalog bar. Default is `normal`. + * - `normal`: Normal style. + * - `hidden`: Hide the catalog bar. + * - `transparent`: Show the catalog bar without the background. + */ + catalogBarStyle?: CatalogBarStyle; + } + + export interface IInspectorHelper { + + /** + * Whether to join the properties of multiple objects. Default is false. + * + * Suppose two objects are currently selected: A and B, and their data types are A' and B'. The data type of the Pa property of object A is T, and the data type of the Pb property of object B is also T: + * + * If joinProps is true, Pa and Pb will be displayed as a single property for editing, regardless of whether A' and B' are the same. Other properties with different types will be hidden. + * + * If joinProps is false, only if A' and B' are exactly the same, the properties of A (which are also the properties of B) will be displayed for editing. + */ + joinProps: boolean; + + /** + * Add a object to the inspector. `add` can be called multiple times to add multiple objects. + * @param target The target. + * @param type The type of the data. + * @param data The data. + * @param options Options. + */ + add(target: any, type: string, data: any, options?: IInspectorOptions): void; + + /** + * If we have multiple selections, we can call this method to start adding objects of the next selection. + */ + next(): void; + + /** + * Whether we have added any objects. + */ + get isEmpty(): boolean; + + /** + * Get the inspector nodes that we have generated. + */ + getNodes(): ReadonlyArray; + + /** + * Get the inspectors that we have created. + */ + getInspectors(): ReadonlyArray; + + /** + * Handy method to get all AssetField objects. + * @param result If provided, the result will be added to this array. Otherwise, a new array will be created. + * @returns All AssetField objects. + */ + getAllResourceInspectors(result?: Array): Array; + + /** + * Display all inspectors. + * @param parent The parent node. + * @param expanded Whether to expand all top-level nodes. Default is true. + */ + show(parent: gui.TreeNode, expanded?: boolean): void; + + /** + * Hide all inspectors. + */ + hide(): void; + + /** + * Clear all inspectors. + */ + reset(): void; + } + /** + * Inspecting target interface. + */ + export interface IInspectingTarget { + /** + * Array of data. As selection can be multiple, this array contains all selected data. + */ + readonly datas: Array; + + /** + * The first data in the datas array. + */ + readonly data: any; + + /** + * Owner property field of this target. + */ + readonly owner: IPropertyField; + + /** + * Get the value of the target. It is equivalent to: data[owner.property.name] + */ + getValue(): any; + + /** + * Set the value of the target. It is equivalent to: datas.forEach(data => data[owner.property.name] = value) + * + * Before setting the value, the value is validated by validators including the `required` value and the `validator` value of the property. + * @param value Value to set. + * @returns True if the value is set successfully, false if the value is invalid. + */ + setValue(value: any): boolean; + + /** + * Validate a value. The validators include the `required` value and the `validator` value of the property. + * @param data The data object to set the value. + * @param value Value to set. + * @param prop The property descriptor. By default, it is the owner's property descriptor. + * @returns True if the value is valid, false if the value is invalid. + */ + validate(data: any, value: any, prop?: FPropertyDescriptor): boolean; + + /** + * Get the value of a property other than the owner's property. + * @param propName The property name. + * @returns The value of the property. + */ + getPropertyValue(propName: string): any; + + /** + * Set the value of a property other than the owner's property. + * @param propName The property name. + * @param value The value to set. + */ + setPropertyValue(propName: string, value: any): void; + + /** + * Get the property descriptor of a property other than the owner's property. + * @param propName + */ + getProperty(propName: string): Readonly; + } + + /** + * Interface for a dialog that prompts the user for a text input. + */ + export interface IInputTextDialog extends IDialog { + /** + * Show the dialog. + * @param popupOwner If the dialog is a popup window, it is used to calculate the popup position. + * @param msg Prompt message. + * @param text Default text. + * @param multiline Whether the input text is multiline. + */ + show(popupOwner: gui.Widget, msg?: string, text?: string, multiline?: boolean): Promise; + } + export interface IHotkeyManager { + /** + * Install the hotkey manager to the given groot. + * @param groot The groot to install the hotkey manager to. + */ + install(groot: gui.GRoot): void; + + /** + * Initialize the key map from preferences. + */ + initKeyMap(): void; + + /** + * Check if a key combination is registered. + * @param combo The key combination to check. + * @returns True if the key combination is registered, false otherwise. + */ + isComboRegistered(combo: string): boolean; + + /** + * Manually invoke the underlying keyboard event handler to produce a specific key combination effect. + * @param character The actual character that was pressed. + * @param modifiers An array of modifiers that were held down when the key was pressed. + * @param eventType The type of the event (e.g., keydown, keyup). + */ + handleKey(character: string, modifiers: string[], eventType: string): void; + + /** + * Manually trigger a key combination + * @param combo The key combination to trigger. + */ + emit(combo: string): void; + } + /** + * Interface for the hierarchy panel + */ + export interface IHierarchyPanel extends IEditorPanel { + /** + * Get current selected node. Null if no node is selected. Return the first selected node if multiple nodes are selected. + * @returns The selected node. + */ + getSelectedNode(): IMyNode; + + /** + * Get current selected nodes. Empty array if no node is selected. + * @returns The selected nodes. The owner of the returned array is transferred to the caller. + */ + getSelectedNodes(): Array; + + /** + * Get current expanded nodes. Empty array if no node is expanded. + * @returns The expanded nodes. The owner of the returned array is transferred to the caller. + */ + getExpandedNodes(): Array; + + /** + * Expand the specified nodes. + * @param arr The expanded nodes. + */ + setExpandedNodes(arr: ReadonlyArray): void; + + /** + * Expand the specified node. + * @param sceneNode The node to expand. + */ + expand(sceneNode: IMyNode): void; + + /** + * Highlight the specified node. + * @param sceneNode The node to highlight. + */ + highlight(sceneNode: IMyNode): void; + } + /** + * Interface for GUI utils + */ + export interface IGUIUtils { + /** + * The default background color。 + */ + bgColor: gui.Color; + /** + * The default color of separator lines。 + */ + lineColor: gui.Color; + /** + * The default color of text。 + */ + textColor: gui.Color; + + /** + * Create a button. + * @param autoSize Whether the button should automatically adjust its size to fit its title. + */ + createButton(autoSize?: boolean): gui.Button; + + /** + * Create a button with an icon. + * @param flat Whether the button is flat style. + */ + createIconButton(flat?: boolean): gui.Button; + + /** + * Create a checkbox. + * @param autoSize Whether the checkbox should automatically adjust its size to fit its title. + */ + createCheckbox(autoSize?: boolean): gui.Button; + + /** + * Create a checkbox with an icon. + * @param flat Whether the checkbox is flat style. + */ + createIconCheckbox(flat?: boolean): gui.Button; + + /** + * Create a radio button. + */ + createRadio(): gui.Button; + + /** + * Create a combo box. + */ + createComboBox(): gui.ComboBox; + + /** + * Create a input text. + */ + createTextInput(): TextInput; + + /** + * Create a text area. + */ + createTextArea(): TextArea; + + /** + * Create a input text for search. + */ + createSearchInput(): SearchInput; + + /** + * Create a numeric input. + */ + createNumericInput(): NumericInput; + + /** + * Create a color input. + */ + createColorInput(): ColorInput; + + /** + * Create a gradient input. + */ + createGradientInput(): GradientInput; + + /** + * Create a curve input. + */ + createCurveInput(): CurveInput; + + /** + * Create a resource input. + */ + createResourceInput(): ResourceInput; + + /** + * Create a node reference input. + */ + createNodeRefInput(): NodeRefInput; + + /** + * Create a progress bar. + */ + createProgressBar(): gui.ProgressBar; + + /** + * Create a slider. + */ + createSlider(): gui.Slider; + + /** + * Create a list item. + */ + createListItem(): ListItem; + + /** + * Create a list item with an icon. + */ + createIconListItem(): ListItem; + + /** + * Create a list item with a checkbox. + */ + createCheckboxListItem(): ListItem; + + /** + * Create a list item with a checkbox and an icon. + */ + createCheckboxIconListItem(): ListItem; + + /** + * Create a inspector panel. + */ + createInspectorPanel(): InspectorPanel; + } + /** + * File tab information + */ + export interface IFileTabInfo { + /** + * Tab id. It is internal used. + */ + id: string; + + /** + * The id of the asset associated with this tab. + */ + assetId: string; + + /** + * The type of the asset associated with this tab. + */ + fileType: AssetType; + + /** + * The modified flag of the asset associated with this tab. + */ + isModified: boolean; + + /** + * Last active time. + */ + activeTime?: number; + + /** + * Closable flag. If it is true, the tab can not be closed. + */ + noClose?: boolean; + } + + /** + * File tab bar interface + */ + export interface IFileTabBar { + /** + * Add a tab. + * @param tabInfo Information of the tab. + * @param insertIndex The index to insert the tab. + * @param activate If true, the tab will be activated. Default is true. + */ + addTab(tabInfo: IFileTabInfo, insertIndex?: number, activate?: boolean): void; + + /** + * Remove a tab. + * @param tabId The id of the tab to remove. + */ + removeTab(tabId: string): void; + + /** + * Get a tab by id. + * @param tabId The id of the tab. + * @returns The tab. + */ + getTab(tabId: string): IFileTabInfo; + + /** + * Get a tab by index. + * @param index The index of the tab. + * @returns The tab. + */ + getTabAt(index: number): IFileTabInfo; + + /** + * Find a tab by predicate. + * @param predicate The predicate function. Return true if the tab is found. + * @returns The tab. + */ + findTab(predicate: (tab: IFileTabInfo) => boolean): IFileTabInfo; + + /** + * Get all tabs. + * @returns All tabs. + */ + getTabs(): Array; + + /** + * Count of tabs. + */ + readonly tabCount: number; + + /** + * Selected tab. + */ + selectedTab: IFileTabInfo; + + /** + * Index of the selected tab. + */ + selectedIndex: number; + + /** + * Allow to show a context menu. Default is true. + */ + enableMenu: boolean; + + /** + * Query to close all tabs. + * @param includeScene Allow to include scene tabs. Default is false. + * @returns A promise that resolves with a boolean indicating whether the tabs are allowed to be closed. + */ + queryToCloseAllTabs(includeScene?: boolean): Promise; + + /** + * Query to save all tabs. + * @returns A promise that resolves with a boolean indicating whether the tabs are allowed to be saved. + */ + queryToSaveAllTabs(): Promise; + } + /** + * File actions + */ + export type IFileActions = { + /** + * Called when a file is double-clicked in the asset library or when Editor.openFile() is called. + * @param asset The asset object being operated on. + */ + onOpen?: (asset: IAssetInfo) => Promise; + + /** + * Called in Editor.scene.createNodeByAsset() to create a node. This can be triggered in several scenarios, such as when a asset is dragged into the hierarchy list, or when a asset is dragged into the scene, or when the user calls Editor.scene.createNodeByAsset() through a script. + * + * If the asset can create a node object, it returns a node object; otherwise, it returns null, indicating that creating a node is not supported. + * + * In the implementation, you can use the Editor.scene.createNode() method to create a node object. + * + * @param asset The asset object being operated on. + * @param props The properties of the new node. + * @param parentNode The parent node. + * @param options The options for creating the node. + * @returns A new node object, null if creating a node is not supported. + */ + onCreateNode?: (asset: IAssetInfo, props: any, parentNode?: IMyNode, options?: ICreateNodeOptions) => Promise; + + /** + * Called when an asset is dragged into the scene. + * @param asset The asset object being operated on. + * @param is3D Indicates whether the target scene is in 3D mode or 2D mode. True means 3D mode, false means 2D mode. + * @param pt The position where the asset is dropped. It is a screen coordinate. + * @param selectedNode The top-level node in the scene, usually the root node. However, in 2D mode, it might be inside a Box or Panel, so the top-level node would be the Box or Panel. + * @returns If it returns true, it means the drag-and-drop operation was successfully handled; otherwise, it will continue to try calling the onCreateNode method to create a node. + */ + onDropToScene?: (asset: IAssetInfo, is3D: boolean, pt: gui.Vec2, selectedNode?: IMyNode) => Promise; + + /** + * Called when an asset is dropped onto a node in the hierarchy panel. Usually, this is used to add a component or set a property to the node. + * @param asset The asset object being operated on. + * @param node The drop target node. + */ + onDropToNode?: (asset: IAssetInfo, node: IMyNode) => Promise; + + /** + * Called during the double-click operation of the AssetField in the inspector panel, generally used to create a new file, and then assign the file url to the property field. + * @param field The property field object being operated on. + */ + onCreateInField?: (field: IPropertyField) => Promise; + + /** + * Called in Editor.scene.createNodeByAsset() to create a node. This can be triggered in several scenarios, such as when a asset is dragged into the hierarchy list, or when a asset is dragged into the scene, or when the user calls Editor.scene.createNodeByAsset() through a script. + * + * The difference between this method and onCreateNode is that this method is called when the scene is a GUI prefab. + * + * If the asset can create a node object, it returns a node object; otherwise, it returns null, indicating that creating a node is not supported. + * + * In the implementation, you can use the Editor.scene.createNode() method to create a node object. + * + * @param asset The asset object being operated on. + * @param props The properties of the new node. + * @param parentNode The parent node. + * @param options The options for creating the node. + * @returns A new node object, null if creating a node is not supported. + */ + onCreateNode_GUI?: (asset: IAssetInfo, props: any, parentNode?: IMyNode, options?: ICreateNodeOptions) => Promise; + + /** + * Called when an asset is dragged into the scene. + * + * The difference between this method and onDropToScene is that this method is called when the scene is a GUI prefab. + * + * @param asset The asset object being operated on. + * @param pt The position where the asset is dropped. It is a screen coordinate. + * @param selectedNode The top-level node in the scene, usually the root node. However, in 2D mode, it might be inside a Box or Panel, so the top-level node would be the Box or Panel. + * @returns If it returns true, it means the drag-and-drop operation was successfully handled; otherwise, it will continue to try calling the onCreateNode method to create a node. + */ + onDropToScene_GUI?: (asset: IAssetInfo, pt: gui.Vec2, selectedNode?: IMyNode) => Promise; + + /** + * Called when an asset is dropped onto a node in the hierarchy panel. Usually, this is used to add a component or set a property to the node. + * + * The difference between this method and onDropToNode is that this method is called when the scene is a GUI prefab. + * + * @param asset The asset object being operated on. + * @param node The drop target node. + */ + onDropToNode_GUI?: (asset: IAssetInfo, node: IMyNode) => Promise; + + /** + * Called during the double-click operation of the AssetField in the inspector panel, generally used to create a new file, and then assign the file url to the property field. + * + * The difference between this method and onCreateInField is that this method is called when the scene is a GUI prefab. + * + * @param field The property field object being operated on. + */ + onCreateInField_GUI?: (field: IPropertyField) => Promise; + } + /** + * Extension manager interface + */ + export interface IExtensionManager { + /** + * Whether the extension manager is reloading + */ + readonly reloading: boolean; + + /** + * Issue a reload request + * @param forced Whether to force reload, even if no changes are detected + */ + reload(forced?: boolean): void; + /** + * Create a new settings. It usually corresponds to a configuration file and may be saved to different locations depending on the value of location. + * + * In different processes, developers can access the configuration data through Editor.getSettings. If you want to modify the configuration data, it is generally done in the UI process. The data will be automatically saved to the file after modification. + * + * Each configuration has a corresponding data type, which can be manually written and registered through typeRegistry, or it can be a class decorated with @IEditor.regClass. + * + * This method is only allowed to be called in @IEditor.onLoad. + * + * @param name The name of the configuration. It should be unique within the editor and use characters that conform to file name specifications. The file name of the configuration file will automatically be prefixed with "plugin-" to help users understand that this is a configuration file created by a plugin. + * @param location The location of the configuration file. The default is "project". + * - application: Saved to the user data directory of the application. On Windows, it is generally C:\Users\{user}\AppData\Local\{appname}, and on Mac, it is generally ~/Library/Application Support/{appname}. This means that this configuration needs to be shared across different projects. + * - project: Saved to the `settings` directory of the project. This means that this configuration is specific to the current project. + * - local: Saved to the `local` directory of the project. This means that this configuration is specific to the current project but does not need to be tracked by the version control system. + * - memory: Maintained only in memory and not saved to a file. + * @param type The data type corresponding to the configuration. If it is a string, it means that this type has been registered through typeRegistry. If it is FTypeDescriptor, it will be automatically registered when created. If it is a Function, it means that this is a class decorated with @IEditor.regClass. + */ + createSettings(name: string, location?: SettingsLocation, type?: string | FTypeDescriptor | Function): void; + + /** + * Create a new settings. It usually corresponds to a configuration file and may be saved to different locations depending on the value of location. + * + * In different processes, developers can access the configuration data through Editor.getSettings. If you want to modify the configuration data, it is generally done in the UI process. The data will be automatically saved to the file after modification. + * + * Each configuration has a corresponding data type, which can be manually written and registered through typeRegistry, or it can be a class decorated with @IEditor.regClass. + * + * This method is only allowed to be called in @IEditor.onLoad. + * + * @param name The name of the configuration. It should be unique within the editor and use characters that conform to file name specifications. The file name of the configuration file will automatically be prefixed with "plugin-" to help users understand that this is a configuration file created by a plugin. + * @param pathToAsset The path to the configuration file. It is a relative path to the assets directory. + * @param type The data type corresponding to the configuration. If it is a string, it means that this type has been registered through typeRegistry. If it is FTypeDescriptor, it will be automatically registered when created. If it is a Function, it means that this is a class decorated with @IEditor.regClass. + */ + createSettings(name: string, pathToAsset: string, type?: string | FTypeDescriptor | Function): void; + + /** + * Create a custom build target. + * + * This method is only allowed to be called in @IEditor.onLoad. + * + * @param name Build target name, it should be unique within the editor. + * @param options Build target info. + */ + createBuildTarget(name: string, options: IBuildTargetInfo): void; + + /** + * Set the file type of the specified file extension. The file type is used for resource filtering, such as only allowing the selection of specified types of resources in the resource input box. + * + * This method is only allowed to be called in @IEditor.onLoad. + * + * @param fileExtensions File extensions, such as ["png", "jpg"]. + * @param type Asset type, such as AssetType.Image or a custom string. If it is a custom string, it should be unique within the editor. + */ + setFileType(fileExtensions: ReadonlyArray, type: AssetType | string): void; + + /** + * Set the file icon of the specified file extension. Images are generally placed in the editorResources directory or its subdirectories, and then referenced using a path starting from editorResources, such as "editorResources/my-plugin/icon.png". + * + * This method is only allowed to be called in @IEditor.onLoad. + * + * @param fileExtensions File extensions, such as ["png", "jpg"]. + * @param icon Icon path. + */ + setFileIcon(fileExtensions: ReadonlyArray, icon?: string): void; + + /** + * Set the file thumbnail of the specified file extension. The thumbnail is used to display the preview of the file in the file list. + * + * You need to use a script running in the scene process to help generate thumbnails. Refer to the example below. + * + * This method is only allowed to be called in @IEditor.onLoad. + * + * @param fileExtensions File extensions, such as ["png", "jpg"]. + * @param sceneScriptName The name of the class that generates the thumbnail. + * @param fast If it is true, the original icon will not be displayed, and the thumbnail will be displayed after it is generated. Which means there will be a blank area before the thumbnail is generated. + * If it is false, the original icon will be displayed first, and the thumbnail will be displayed after it is generated. Default is false. + * @see IEditorEnv.AssetThumbnail + * @example + * ``` + * class AssetHelper { + * @IEditor.onLoad + * onLoad() { + * Editor.extensionManager.setFileThumbnail(["abc"], "DemoThumbnailPlugin"); + * } + * } + * ``` + */ + setFileThumbnail(fileExtensions: ReadonlyArray, sceneScriptName: string, fast?: boolean): void; + + /** + * Add file actions for the specified asset type or file extensions. + * + * This method is only allowed to be called in @IEditor.onLoad. + * + * @param assetTypeOrFileExts Asset type or file extensions, such as [AssetType.Image] or ["png", "jpg"]. + * @param actions File actions. + */ + addFileActions(assetTypeOrFileExts: ReadonlyArray, actions: IFileActions): void; + + /** + * Register a new menu item. + * + * This method is only allowed to be called in @IEditor.onLoad. + * + * @param name menu item name of path. Paths are separated by "/", "App/tool/test" represents the test item under the tool submenu of the App menu. + * + * Note that the path here uses IDs, not the text displayed in the menu. All menu names and their submenus supported by the editor can be printed out for reference using the menu Developer > Print All Menu IDs. + * + * i18n is supported in the menu name, and the format is `i18n:xxx`, where `xxx` is the key of the i18n string. + * e.g. `App/tool/i18n:module:test`. + * Note that a string with or without `i18n:` prefix is treated as the same menu item name. + * e.g. `App/tool/i18n:module:group/a` and `App/tool/group/a:` will be in the same submenu. + * @param callback The callback function for the menu item. It will be called when the menu item is clicked. Can be omitted if the menu has a default handler. + * @param options The options for the menu. + */ + addMenuItem(name: string, callback?: IMenuItem['click'], options?: ICustomMenuItemOptions): void; + + /** + * Find a function by name. The name is in the form of "className.staticMethodName". + * A className must be registered with @IEditorEnv.regClass. + * @param name objectName.methodName + * @returns The function found. Null if not found. + */ + findFunction(name: string): Function; + } + /** + * Interface for event tracking + */ + export interface IEventTracking { + /** + * Start the tracking. + */ + start(): void; + + /** + * Login with the id. + * @param id + */ + login(id: string): void; + + /** + * Logout. + */ + logout(): void; + + /** + * Set public event properties + * @param data + */ + setSuperProperties(data: any): void; + + /** + * Upload custom event + * @param key + * @param data + */ + track(key: string, data: any): void; + + /** + * Set user properties + * @param data + */ + userSet(data: any): void; + } + export interface IEditorSingleton { + /** + * The path of the project + */ + readonly projectPath: string; + + /** + * The name of the project + */ + readonly projectName: string; + + /** + * The type of the project + */ + readonly projectType: string; + + /** + * The current application directory. + */ + readonly appPath: string; + + /** + * The path of the user data. + * + * On Windows, it is c:/Users/username/AppData/Roaming/LayaAirIDE + * + * On MacOS, it is ~/Library/Application Support/LayaAirIDE + */ + readonly userDataPath: string; + + /** + * The path of the assets. + */ + readonly assetsPath: string; + + /** + * The path of the packed resources. + * + * On Windows, it is path/to/LayaAirIDE/resources/app.asar + * + * On MacOS, it is path/to/LayaAirIDE.app/Contents/Resources/app.asar + */ + readonly webRootPath: string; + + /** + * The path of the unpacked resources. + * + * On Windows, it is path/to/LayaAirIDE/resources + * + * On MacOS, it is path/to/LayaAirIDE.app/Contents/Resources + */ + readonly unpackedWebRootPath: string; + + /** + * Whether the app is packaged. It is only false in the development mode. + */ + readonly isPackaged: boolean; + + /** + * Whether the app is in the foreground. + */ + readonly isForeground: boolean; + + /** + * Whether current window is in the foreground. + */ + readonly isSelfForeground: boolean; + + /** + * In LayaAirIDE, each module is assigned a specific ID, + * such as the scene editor is sceneEditor, the blueprint editor is blueprintEditor, and the shader blueprint editor is shaderEditor. + */ + readonly moduleName: string; + + /** + * LayaAirIDE has a built-in HTTP server for previewing. This is the server address. + * + * Typically, it is http://ipaddress:18090, and if HTTPS is enabled, it is https://ipaddress:18091. + * + * The ipaddress is the local machine's IP address. 18090/18091 are the default ports, which can be modified in "Project Settings -> Edit". + */ + readonly serverURL: string; + + /** + * Whether the app is in the cli mode. A cli mode is a mode that runs the app in the command line. + */ + readonly cliMode: boolean; + + /** + * The type registry of the editor. + */ + readonly typeRegistry: ITypeRegistry; + + /** + * The electron ipc service. + */ + readonly ipc: IIpc; + + /** + * The asset database of the editor. + * + * The asset database is used to manage the assets in the project. You can query, create, update, and delete assets through the asset database. + */ + readonly assetDb: IAssetDb; + + /** + * The shader database of the editor. + */ + readonly shaderDb: IShaderDb; + + /** + * The hotkey manager of the editor. + */ + readonly hotkeyManager: IHotkeyManager; + + /** + * The panel manager of the editor. + */ + readonly panelManager: IPanelManager; + + /** + * The scene manager of the editor. + */ + readonly sceneManager: ISceneManager; + + /** + * The resource manager of the editor. + */ + readonly resourceManager: IResourceManager; + + /** + * The extension manager of the editor. + */ + readonly extensionManager: IExtensionManager; + + /** + * The account manager of the editor. + */ + readonly accountManager: IAccountManager; + + /** + * The settings service of the editor. + */ + readonly settingsService: ISettingsService; + + /** + * The modules manager of the editor. + */ + readonly modulesManager: IModulesManager; + + /** + * The scene currently being edited. The editor can open multiple scenes and prefabs (the editing environment of prefabs is also considered a scene), but only one scene can be edited at a time. + */ + readonly scene: IMyScene; + + /** + * The app menu of the editor. + */ + readonly appMenu: IMenu; + + /** + * Used to save and read the current workspace configuration information. + */ + readonly workspaceConf: ISettings; + + /** + * This is a port object used for communication with the scene process. + * + * Generally not used directly. + */ + readonly sceneViewPort: IMyMessagePort; + + /** + * Flag indicating whether the editor is being closed. + */ + readonly beingQuit: boolean; + + /** + * The shell object of the editor. + */ + readonly shell: IShell; + + /** + * The clipboard object of the editor. + */ + readonly clipboard: IClipboard; + + /** + * Create the panel manager. + * @param options + * @param placeHolder + * @return The panel manager object. + */ + createPanelManager(options: IPanelManagerOptions, placeHolder?: gui.Widget): IPanelManager; + + /** + * Create the scene manager. + * @param program + * @return The scene manager object. + */ + createSceneManager(program?: string): Promise; + + /** + * Create the hotkey manager. + * @return The hotkey manager object. + */ + createHotkeyManager(): IHotkeyManager; + + /** + * Create the extension manager. + * @return The extension manager object. + */ + createExtensionManager(): Promise; + + /** + * Create the modules manager. + * @return The modules manager object. + */ + createModulesManager(): Promise; + + /** + * Create the asset database. + * @return The asset database object. + */ + connectAssetDb(): Promise; + + /** + * Create the shader database. + * @return The shader database object. + */ + connectShaderDb(): Promise; + + /** + * Create the settings service. + * @return The settings service object. + */ + createSettingsService(): Promise; + + /** + * Create the application menu. + * @param items + * @return The menu object. + */ + createAppMenu(items: Array): IMenu; + + /** + * A path to a special directory or file associated with `name`. On failure, an + * `Error` is thrown. + * @param name The name of the path to retrieve. + * @return The path to the directory or file associated with `name`. + */ + getPath(name: CommonPathName): Promise; + + /** + * Settings are editor configuration information. It can be a configuration file or an in-memory table. Settings are defined in the sceneEditor module, and other modules can read the data but generally do not modify it directly. + * + * Therefore, in the sceneEditor module, Settings can be used synchronously, but in other modules, Settings can only be used asynchronously. In other words, if you need to read the latest data, you need to call the sync method first. + * @param name The name of the configuration information. The default supported configuration information includes: PlayerSettings, EditorSettings, CompilerSettings, BuildSettings, SceneSettings, SceneViewSettings, Preferences, DimensionsSettings. + * @param autoSync If true, when the data changes in the sceneEditor module, it will automatically sync to this module. The default is false. + * @return The settings object. + */ + getSettings(name: string, autoSync?: boolean): ISettings; + + /** + * Get the dialog object according to the class. + * @param cls A class that implements the IDialog interface. + * @return The dialog object. + */ + getDialog(cls: gui.Constructor): Promise; + + /** + * Get the dialog object according to the class synchronously. + * @param cls A class that implements the IDialog interface. + * @return The dialog object. + */ + getDialogSync(cls: gui.Constructor): T; + + /** + * Show a dialog. + * @param cls A class that implements the IDialog interface. + * @param popupOwner The owner of the dialog. The dialog will be displayed on top of the owner. If not provided, the main window is used by default. + * Also, if the dialog's showType is `dropdown`, the dialog will be displayed according to the position of the popupOwner. + * @param args The arguments of the dialog. The arguments are passed to the onShown method of the dialog. + * @return The dialog object. + */ + showDialog(cls: gui.Constructor, popupOwner?: gui.Widget, ...args: any[]): Promise; + + /** + * Get the menu object by ID. Same as IEditor.Menu.getById function. + * @param id menu ID. + * @return The menu object. + */ + getMenuById(id: string): IMenu; + + /** + * Puts the editor window in a waiting state, not responding to user operations. + * @param view An optional UI component reference used to determine the window that needs to enter the waiting state. If not provided, the main window is used by default. + */ + showModalWait(view?: gui.Widget): void; + + /** + * Let the editor window exit the waiting state. + * @param view An optional UI component reference used to determine the window that needs to exit the waiting state. If not provided, the main window is used by default. + */ + closeModalWait(view?: gui.Widget): void; + + /** + * Show a error message as a tooltip on the specified widget. + * @param widget The widget to show the error message. + * @param str The error message. + */ + showErrorTips(widget: gui.Widget, str: string): void; + + /** + * Open a file for editing. Depending on the file type, different editors will be opened. For example, opening a xx.ls file will open the scene editor, and opening a **.bp will open the blueprint editor. + * @param filePath The file path relative to the project's assets directory. Specifically, "?.ls" can open a new unnamed scene. + */ + openFile(filePath: string): void; + + /** + * Close the editor immediately. + */ + shutdown(): void; + + /** + * Show a message box. Message boxes are used to display messages to the user and get a response. + * @param options The options of the message box. + * @return The result of the message box. + */ + showMessageBox(options: MessageBoxOptions): Promise; + + /** + * Resolve with an object containing the following: + * * `canceled` boolean - whether or not the dialog was canceled. + * * `filePaths` string[] - An array of file paths chosen by the user. If the + * dialog is cancelled this will be an empty array. + * @param title The title of the dialog. + * @param extensionTypeName The name of the file type. e.g. "Scene File". + * @param fileExtension The file extension. e.g. "ls". + * @param defaultPath The default path to use. If not provided, the last path used will be used. + * @return The result of the dialog. + */ + showOpenDialog(title: string, extensionTypeName: string, fileExtension: string, defaultPath?: string): Promise; + + /** + * Resolve with an object containing the following: + * * `canceled` boolean - whether or not the dialog was canceled. + * * `filePaths` string[] - An array of file paths chosen by the user. If the + * dialog is cancelled this will be an empty array. + * @param options The options of the dialog. + * @return The result of the dialog. + */ + showOpenDialog(options: OpenDialogOptions): Promise; + + /** + * Resolve with an object containing the following: + * * `canceled` boolean - whether or not the dialog was canceled. + * * `filePaths` string[] - An array of file paths chosen by the user. If the + * dialog is cancelled this will be an empty array. + * @param title The title of the dialog. + * @param defaultPath The default path to use. If not provided, the last path used will be used. + * @return The result of the dialog. + */ + showOpenFolderDialog(title: string, defaultPath?: string): Promise; + + /** + * Resolve with an object containing the following: + * * `canceled` boolean - whether or not the dialog was canceled. + * * `filePaths` string[] - An array of file paths chosen by the user. The paths are relative to the project's assets directory. + * If the dialog is cancelled this will be an empty array. + * @param title The title of the dialog. + * @param defaultPath The default path to use. If not provided, the last path used will be used. + * @return The result of the dialog. + */ + showOpenAssetsFolderDialog(title: string, defaultPath?: string): Promise; + + /** + * Resolve with an object containing the following: + * * `canceled` boolean - whether or not the dialog was canceled. + * * `filePath` string - If the dialog is canceled, this will be an empty string. + * @param title The title of the dialog. + * @param extensionTypeName The name of the file type. e.g. "Scene File". + * @param fileExtension The file extension. e.g. "ls". + * @param defaultPath The default path to use. If not provided, the last path used will be used. + */ + showSaveDialog(title: string, extensionTypeName: string, fileExtension: string, defaultPath?: string): Promise; + + /** + * Resolve with an object containing the following: + * * `canceled` boolean - whether or not the dialog was canceled. + * * `filePath` string - If the dialog is canceled, this will be an empty string. + * @param options The options of the dialog. + * @return The result of the dialog. + */ + showSaveDialog(options: SaveDialogOptions): Promise; + + /** + * Show a message box with the given message. + * @param msg The message to display. + * @param type The type of the message box. The default is "info". + */ + alert(msg: string, type?: "none" | "info" | "error" | "question" | "warning"): Promise; + + /** + * Show a confirm message box. The user can choose to confirm or cancel. + * @param msg The message to display. + * @return If user confirms, return true, otherwise return false. + */ + confirm(msg: string): Promise; + + /** + * Show a prompt message box. The user can input a string. + * @param title The title of the message box. + * @param text The text of the message box. + * @param multiline If true, the input box is multiline. + * @return The string input by the user. + */ + prompt(title?: string, text?: string, multiline?: boolean): Promise; + + /** + * Show a loading view. It is only used during the editor startup phase. + * @return The loading view. + */ + showLoading(): Promise<{ label: gui.Widget, pb: gui.ProgressBar }>; + + /** + * Activate a hotkey. After activation, this hotkey can be handled in the onHotkey or onGlobalHotkey of the EditorPanel. + * @param combos Shortcut keys. The format of shortcut keys is "ctrl+a", "cmd+shift+z", "mod+shift+p", etc. For modifier keys you can use shift, ctrl, alt, or meta. + * You can substitute option for alt and command for meta. + * Other special keys are backspace, tab, enter, return, capslock, esc, escape, space, pageup, pagedown, end, home, left, up, right, down, ins, del, and plus. + * Any other key you should be able to reference by name like a, /, $, *, or =. + * @example + * ``` + * Editor.enableHotkey("mod+shift+a"); + * ``` + */ + enableHotkey(...combos: string[]): void; + + /** + * Check for updates. If there is a new version, a dialog will pop up to prompt the user to update. + * @param manually If true, the update is triggered manually. The default is false. + */ + checkUpdate(manually?: boolean): void; + + /** + * Opens the devtools with specified dock state, can be `left`, `right`, `bottom`, + * `undocked`, `detach`. Defaults to last used dock state. In `undocked` mode it's + * possible to dock back. In `detach` mode it's not. + * @param mode The dock state of the developer tools, can be `left`, `right`, `bottom`, `undocked`, `detach`. + * @param view The view of the current window, It can be `scene`, `game`, or a webContents id. + */ + openDevTools(mode?: string, view?: string): void; + + /** + * Set the title of the editor window. + * @param title The title of the editor window. + */ + setWindowTitle(title: string): void; + + /** + * Move the editor window to the top. + */ + moveWindowTop(): void; + + /** + * Reload the editor. + */ + reload(): void; + + /** + * Display a reload prompt and reload the editor if the user confirms. + * @param msg The message to display. + */ + queryToReload(msg?: string): Promise; + + /** + * Undo the last operation. + */ + undo(): void; + + /** + * Redo the last operation. + */ + redo(): void; + + /** + * Clear the console message of the specified group. + * @param group The group of the console message. + */ + clearConsoleMessage(group?: string): void; + + /** + * Get the history documents. The history documents are the files that have been opened in the editor. + * @param moduleName @see IEditorSingleton.moduleName + * @return The history documents. + */ + getHistoryDocuments(moduleName?: string): { files: Array, active: number }; + + /** + * Set the history documents. The history documents are the files that have been opened in the editor. + * @param files List of file paths. + * @param active Specifies the index of the active file. + */ + setHistoryDocuments(files: Array, active: number): Promise; + + /** + * This is called internally by the editor to update the server URL. + * @param useHttps If true, use HTTPS, otherwise use HTTP. + */ + updateServerURL(useHttps: boolean): void; + + /** + * Frame update event. + */ + readonly onUpdate: IDelegate<() => void>; + + /** + * Application activate event. + */ + readonly onAppActivate: IDelegate<() => void>; + + /** + * Console message event. + */ + readonly onConsoleMessage: IDelegate<(message: string, level: number, group: string) => void>; + } + + /** + * The editor front end interface. + */ + export interface IEditorFrontEnd { + /** + * When the editor is started, this method is called to initialize the editor. + * @param startupAction The startup action of the renderer. + */ + onBeginPlay(startupAction: IRendererStartupAction): Promise; + + /** + * When the editor is closing, this method is called to check if the editor can be closed. + * @return If the editor can be closed, return true, otherwise return false. + */ + onBeforeEndPlay?(): Promise; + + /** + * When the editor is closed, this method is called to clean up the editor. + */ + onEndPlay(passive: boolean): Promise; + + /** + * When the editor is requested to open a file, this method is called to open the file. + * @param filePath file path. + */ + onOpenFile?(filePath: string): void; + } + export type EditorPanelUsage = "common" | "project-settings" | "build-settings" | "preference" | "preview"; + /** + * Options for the panel. + */ + export interface IPanelOptions { + /** + * The display title of the panel. + * + * Use "i18n:<key>" or "i18n:<file-id>:<key>" to specify the key of the internationalization string. + */ + title?: string; + /** + * The icon of the panel. Images are generally placed in the editorResources directory or its subdirectories, and then referenced using a path starting from editorResources, such as "editorResources/my-plugin/icon.png". + */ + icon?: string; + /** + * When usage is set to values like project-settings/build-settings/preference, it determines the display order of the panel in a specific window. + */ + order?: number; + /** + * The stretch priority of the panel width. Values can be 1/0/-1. The larger the value, the higher the priority for stretching the panel horizontally among panels at the same level. + */ + stretchPriorityX?: number; + /** + * The stretch priority of the panel height. Values can be 1/0/-1. The larger the value, the higher the priority for stretching the panel vertically among panels at the same level. + */ + stretchPriorityY?: number; + /** + * Whether to show the tab above the panel. Default is true. If false, the panel is always displayed independently and cannot be combined with other panels. + */ + allowTabs?: boolean; + /** + * Whether the panel can be closed. Default is true. + */ + allowClose?: boolean; + /** + * Whether to show the menu item to open this panel in the Panel menu. Default is true. + */ + showInMenu?: boolean; + /** + * Whether the panel can be displayed in a popup window. Default is true. + */ + allowPopup?: boolean; + /** + * Whether to start automatically. Default is true. + */ + autoStart?: boolean; + /** + * The location of the panel. Relative to locationBase (default is ScenePanel). If set to popup, a new window will pop up. + */ + location?: "left" | "right" | "top" | "bottom" | "embed" | "popup"; + /** + * The panel ID that the location (positioning) property refers to. Default is ScenePanel. + */ + locationBase?: string; + /** + * The hotkey to open the panel. For example: mod+1 (mod is ctrl on Windows and cmd on Mac). Default is empty. + */ + hotkey?: string; + /** + * Whether the panel is transparent. Default is false. + */ + transparent?: boolean; + /** + * Whether to display a help button in the panel title bar, which opens a specified URL when clicked. + */ + help?: string; + /** + * The usage of the panel. Default is common. + * - common: Common panel. + * - project-settings: Displayed in the project settings panel. + * - build-settings: Displayed in the build settings panel. + * - preference: Displayed in the preference panel. + * - preview: Displayed in the preview area of the inspector panel. + */ + usage?: EditorPanelUsage; + } + + /** + * Editor panel interface. + */ + export interface IEditorPanel { + /** + * id of the panel. + */ + readonly panelId: string; + + /** + * Options for the panel. + */ + readonly panelOptions: IPanelOptions; + + /** + * The main display widget of the panel. + */ + readonly contentPane: gui.Widget; + + /** + * Complete the construction of the panel in this method. You must create the UI and assign it to the EditorPanel._panel property. + */ + create(): Promise; + + /** + * Called when the panel is activated. + */ + onStart?(): void; + + /** + * Called every frame if the panel is active. + */ + onUpdate?(): void; + + /** + * Called when the panel is being destroyed. + */ + onDestroy?(): void; + + /** + * Called when selection changes in the editor, including node, asset and other types of selection. + */ + onSelectionChanged?(): void; + + /** + * Called when the scene is activated. + * @param scene The activated scene. + */ + onSceneActivate?(scene: IMyScene): void; + + /** + * Called when the scene is deactivated. + * @param scene The deactivated scene. + */ + onSceneDeactivate?(scene: IMyScene): void; + + /** + * Called when a hotkey is pressed if the panel gains focus. + * @param combo The hotkey combo. + * @returns Whether the hotkey is consumed. + */ + onHotkey?(combo: string): boolean; + + /** + * Called when a hotkey is pressed globally. + * @param combo The hotkey combo. + * @returns Whether the hotkey is consumed. + */ + onGlobalHotkey?(combo: string): boolean; + + /** + * Called when the panel gains focus and the user consecutively presses English character keys on the keyboard. + * @param searchKey The search key. + */ + onSearch?(searchKey: string): void; + + /** + * Called when the plugins is reloaded. + * @returns + */ + onExtensionReload?(): void; + } + export interface MessageBoxOptions { + /** + * Content of the message box. + */ + message: string; + /** + * Can be `"none"`, `"info"`, `"error"`, `"question"` or `"warning"`. On Windows, + * `"question"` displays the same icon as `"info"`, unless you set an icon using + * the `"icon"` option. On macOS, both `"warning"` and `"error"` display the same + * warning icon. + */ + type?: string; + /** + * Array of texts for buttons. On Windows, an empty array will result in one button + * labeled "OK". + */ + buttons?: string[]; + /** + * Index of the button in the buttons array which will be selected by default when + * the message box opens. + */ + defaultId?: number; + /** + * Pass an instance of AbortSignal to optionally close the message box, the message + * box will behave as if it was cancelled by the user. On macOS, `signal` does not + * work with message boxes that do not have a parent window, since those message + * boxes run synchronously due to platform limitations. + */ + signal?: AbortSignal; + /** + * Title of the message box, some platforms will not show it. + */ + title?: string; + /** + * Extra information of the message. + */ + detail?: string; + /** + * If provided, the message box will include a checkbox with the given label. + */ + checkboxLabel?: string; + /** + * Initial checked state of the checkbox. `false` by default. + */ + checkboxChecked?: boolean; + /** + * Custom width of the text in the message box. + * + * @platform darwin + */ + textWidth?: number; + /** + * The index of the button to be used to cancel the dialog, via the `Esc` key. By + * default this is assigned to the first button with "cancel" or "no" as the label. + * If no such labeled buttons exist and this option is not set, `0` will be used as + * the return value. + */ + cancelId?: number; + /** + * On Windows Electron will try to figure out which one of the `buttons` are common + * buttons (like "Cancel" or "Yes"), and show the others as command links in the + * dialog. This can make the dialog appear in the style of modern Windows apps. If + * you don't like this behavior, you can set `noLink` to `true`. + */ + noLink?: boolean; + /** + * Normalize the keyboard access keys across platforms. Default is `false`. + * Enabling this assumes `&` is used in the button labels for the placement of the + * keyboard shortcut access key and labels will be converted so they work correctly + * on each platform, `&` characters are removed on macOS, converted to `_` on + * Linux, and left untouched on Windows. For example, a button label of `Vie&w` + * will be converted to `Vie_w` on Linux and `View` on macOS and can be selected + * via `Alt-W` on Windows and Linux. + */ + normalizeAccessKeys?: boolean; + } + + export interface MessageBoxReturnValue { + /** + * The index of the clicked button. + */ + response: number; + /** + * The checked state of the checkbox if `checkboxLabel` was set. Otherwise `false`. + */ + checkboxChecked: boolean; + } + + export interface FileFilter { + + // Docs: https://electronjs.org/docs/api/structures/file-filter + + extensions: string[]; + name: string; + } + + export interface OpenDialogOptions { + title?: string; + defaultPath?: string; + /** + * Custom label for the confirmation button, when left empty the default label will + * be used. + */ + buttonLabel?: string; + filters?: FileFilter[]; + /** + * Contains which features the dialog should use. The following values are + * supported: + */ + properties?: Array<'openFile' | 'openDirectory' | 'multiSelections' | 'showHiddenFiles' | 'createDirectory' | 'promptToCreate' | 'noResolveAliases' | 'treatPackageAsDirectory' | 'dontAddToRecent'>; + /** + * Message to display above input boxes. + * + * @platform darwin + */ + message?: string; + /** + * Create security scoped bookmarks when packaged for the Mac App Store. + * + * @platform darwin,mas + */ + securityScopedBookmarks?: boolean; + } + + export interface OpenDialogReturnValue { + /** + * whether or not the dialog was canceled. + */ + canceled: boolean; + /** + * An array of file paths chosen by the user. If the dialog is cancelled this will + * be an empty array. + */ + filePaths: string[]; + /** + * An array matching the `filePaths` array of base64 encoded strings which contains + * security scoped bookmark data. `securityScopedBookmarks` must be enabled for + * this to be populated. (For return values, see table here.) + * + * @platform darwin,mas + */ + bookmarks?: string[]; + } + + export interface SaveDialogOptions { + /** + * The dialog title. Cannot be displayed on some _Linux_ desktop environments. + */ + title?: string; + /** + * Absolute directory path, absolute file path, or file name to use by default. + */ + defaultPath?: string; + /** + * Custom label for the confirmation button, when left empty the default label will + * be used. + */ + buttonLabel?: string; + filters?: FileFilter[]; + /** + * Message to display above text fields. + * + * @platform darwin + */ + message?: string; + /** + * Custom label for the text displayed in front of the filename text field. + * + * @platform darwin + */ + nameFieldLabel?: string; + /** + * Show the tags input box, defaults to `true`. + * + * @platform darwin + */ + showsTagField?: boolean; + properties?: Array<'showHiddenFiles' | 'createDirectory' | 'treatPackageAsDirectory' | 'showOverwriteConfirmation' | 'dontAddToRecent'>; + /** + * Create a security scoped bookmark when packaged for the Mac App Store. If this + * option is enabled and the file doesn't already exist a blank file will be + * created at the chosen path. + * + * @platform darwin,mas + */ + securityScopedBookmarks?: boolean; + } + + export interface SaveDialogReturnValue { + /** + * whether or not the dialog was canceled. + */ + canceled: boolean; + /** + * If the dialog is canceled, this will be `undefined`. + */ + filePath?: string; + /** + * Base64 encoded string which contains the security scoped bookmark data for the + * saved file. `securityScopedBookmarks` must be enabled for this to be present. + * (For return values, see table here.) + * + * @platform darwin,mas + */ + bookmark?: string; + } + /** + * Dialog interface. A dialog is a window that can be shown to the user. + */ + export interface IDialog { + /** + * The id of the dialog. It is internally used to manage the dialog. + */ + readonly id: string; + + /** + * The name of the dialog. It is internally used to persist the status of the dialog. + */ + name: string; + + /** + * Whether to save the bounds of the dialog. If true, the dialog will remember its position and size. Default is false. + */ + saveBounds: boolean; + + /** + * Whether the dialog is resizable. Default is true. + */ + resizable: boolean; + + /** + * Whether the dialog is modal. If true, the dialog will block the user from interacting with other windows. Default is false. + * If it is not really necessary, it is not recommended to enable this option, as modal dialogs will block the entire editor's operations, including other windows. + */ + modal: boolean; + + /** + * Whether the dialog is closable. If false, the dialog will not have a close button. Default is true. + */ + closable: boolean; + + /** + * Whether the dialog has a frame. If false, the dialog will not have a frame. Default is true. + */ + frame: boolean; + + /** + * Whether the dialog is transparent. If true, the dialog will have a transparent background. Default is false. + */ + transparent: boolean; + + /** + * An option to show the dialog. Default is "none". + * - "none": The dialog will be shown as a normal window. + * - "popup": The dialog will be shown as a popup. The popup window will adjust its position based on the location of the popupOwner when it appears, unless the user manually moves the window. The popup window will automatically close when clicking outside the area. + * - "dropdown": The dialog will be shown as a dropdown. Each time the dropdown window pops up, it will adjust its coordinates to be below the popupOwner, creating a dropdown effect. Clicking outside the window will automatically close it. + */ + showType: "none" | "popup" | "dropdown"; + + /** + * Whether the dialog is always in front of the main window. Note that this does not mean the dialog is in front of all windows. If set to false, the dialog can be obscured by the main window. The default is true. + */ + alwaysInFront: boolean; + + /** + * The title of the dialog. + */ + title: string; + + /** + * Additional features of the dialog. + */ + readonly features: Record; + + /** + * The main display widget of the dialog. + */ + get contentPane(): T; + + /** + * Set the main display widget of the dialog. + */ + set contentPane(value: T); + + /** + * Popup owner of the dialog, which is passed in show() method. + */ + get popupOwner(): gui.Widget; + + /** + * Whether the dialog is showing. + */ + get isShowing(): boolean; + + /** + * Show the dialog. + * @param popupOwner If the dialog is a popup window, it is used to calculate the popup position. + * @param args Arguments passed to the onShown() method. + */ + show(popupOwner?: gui.Widget, ...args: any[]): Promise; + + /** + * Hide the dialog. + */ + hide(): void; + + /** + * You can use this method to wait for the dialog to close and get the return value. The return value refers to the value set through Dialog.result. + */ + getResult(): Promise; + + /** + * Destroy the dialog. + */ + dispose(): void; + + /** + * Get window position x. + */ + get winX(): number; + + /** + * Get window position y. + */ + get winY(): number; + + /** + * Get window width. + */ + get winWidth(): number; + + /** + * Get window height. + */ + get winHeight(): number; + + /** + * + * @param x + * @param y + */ + setPos(x: number, y: number): void; + + /** + * Set window size. + * @param w width. + * @param h height. + */ + setSize(w: number, h: number): void; + } + + /** + * A delegate that can be used to manage multiple callbacks. + */ + export interface IDelegate any> { + /** + * By default, callbacks will be executed directly. Unless this property is set, the delegate will use this method to execute the callback. + * @param method The method to execute. + * @param thisArg The this argument of the method. + * @param args The arguments of the method. + */ + executor: (method: Function, thisArg: any, ...args: any[]) => void; + + /** + * Add a callback. + * @param callback The callback to add. + * @param target The this argument of the callback. + */ + add(callback: T, target?: any): void; + + /** + * Add a run-once callback. + * @param callback The callback to add. + * @param target The this argument of the callback. + */ + once(callback: T, target?: any): void; + + /** + * Remove a callback. + * @param callback The callback to remove. + * @param target The this argument of the callback. + */ + remove(callback: T, target?: any): void; + + /** + * Clear all callbacks. + */ + clear(): void; + + /** + * Clear callbacks for a specific target. + * @param target The this argument of the callbacks to clear. + */ + clearForTarget(target: any): void; + + /** + * Clear callbacks that meet a specific condition. + * @param test The test function. Return true to clear the callback. + */ + clearFor(test: (target: any, callback: T) => boolean): void; + + /** + * Count of the callbacks. + */ + readonly count: number; + + /** + * Execute the callbacks immediately. + * @param args Arguments of the callbacks. + */ + invoke(...args: Parameters): void; + } + /** + * Data Change Callback + */ + export interface DataChangeCallback { + /** + * Callback function prototype when the object is modified + * @param sender The watched object + * @param target The object being modified. It may not necessarily be the watched object, but could be a sub-object. + * @param key The name of the property being modified. + * @param value The new value of the property. + * @param oldvalue The old value of the property. + * @param extInfo Additional information. If this is an array, it indicates the truncated content of the array; if this is the string "add", it indicates that the modification is a newly added property to the object. + */ + (sender: any, target: any, key: string, value: any, oldvalue: any, extInfo?: any): void; + } + + /** + * Data Watcher Interface + */ + export namespace IDataWatcher { + /** + * Set monitoring options for a type. + * + * @param type The type. + * @param isRoot Observing a = { children: [b] } (both a and b are of the same type) in this case, modifications to b will notify a, and if b.parent = a, then modifications to a will be passed to b, causing a loop. + * In this case, you need to set the type of a to isRoot=true, indicating that modifications of this type should not be propagated upwards. + * @param whiteList By default, all property modifications are monitored, but if a whiteList is provided, only the properties in the whiteList are monitored. + */ + function setOptions(type: any, isRoot?: boolean, whiteList?: Array): void; + + /** + * Convert the entire object into a watchable object. + * Returns a proxy that can be used to perform watch. + * @param obj The object to be converted. + * @param deep Whether to automatically watch sub-objects, default is true. + * @returns The watchable object. + */ + function watch(obj: T, deep?: boolean): T; + + /** + * Whether the object is being watched. + * @param obj The object to be checked. + * @returns Whether the object is being watched. + */ + function isWatching(obj: any): boolean; + + /** + * Get the original object of the watchable object. + * @param obj The watchable object. + * @returns The original object. + */ + function getOriginalObj(obj: any): any; + + /** + * A number version is designated for each watchable object. When the object is modified, the version number is incremented by 1. + * @param obj The watchable object. + * @returns The version number. + */ + function getVersion(obj: any): number; + + /** + * Add a listener to the object. + * @param obj The watchable object. + * @param cb The callback function. + * @param target The this object of the callback function. + */ + function addListener(obj: any, cb: DataChangeCallback, target?: any): void; + + /** + * Remove a listener from the object. + * @param obj The watchable object. + * @param cb The callback function. + * @param target The this object of the callback function. + */ + function removeListener(obj: any, cb: DataChangeCallback, target?: any): void; + + /** + * Remove all watchers from an object. You can choose whether to recursively remove watchers from all members. + * @param obj The watchable object. + * @param target The this object of the callback function. If not provided, all listeners will be removed. + * @param recursive Whether to recursively remove watchers from all members. Default is false. + */ + function clearListeners(obj: any, target?: any, recursive?: boolean): void; + + /** + * Returns the path from fromObj to toObj. For example, if toObj is {a: { b: { c: 1 }}}, and fromObj is {c: 1}, the result is ["a", "b"]. + * Note that there may be multiple references (links) to the object, but we only return one of them. + * Returns null if it fails. + * @param fromObj The source object. + * @param toObj The target object. + * @param result The result array. If provided, the result will be pushed into this array, otherwise a new array will be created. + * @returns The path from fromObj to toObj. + */ + function getPath(fromObj: Object, toObj: Object, result?: Array): Array; + + /** + * Execute a function, and any modifications to watched objects within this function will not trigger change callback functions. + * @param callback The function to execute. + */ + function runUntrace(callback: () => void): void; + } + + /** + * Interface for data utilities. + */ + export interface IDataUtils { + /** + * Transforms a complex object into a new pure data object based on the data type. + * A complex object refers to an object that contains methods, getters/setters, etc., usually instantiated from a class. A pure data object refers to an object that only contains basic data types, with its prototype chain directly being Object.prototype. + * @param source The source object. + * @param typeDef The data type. + * @param eliminateDefaults Whether to eliminate default values. If a property on the object has the same value as the default value in the data type, that property will not be included in the returned data. + * @returns The transformed data. + */ + transformDataByType(source: any, typeDef: FTypeDescriptor, eliminateDefaults?: boolean): any; + + /** + * Fill the data object with default values based on the data type. i.e, if the data object does not have a property, the default value of the data type will be used. + * @param source The source data. + * @param typeDef The data type. + * @returns The formatted data. + */ + formatDataByType(source: any, typeDef: FTypeDescriptor): any; + + /** + * Check if two property types are equal. + * @param type1 The first property type. + * @param type2 The second property type. + * @returns Whether the two property types are equal. + */ + propTypeEquals(type1: FPropertyType, type2: FPropertyType): boolean; + + /** + * Check if the value matches the type, and throw an error if it does not match. + * @param type The property type. + * @param value The value to check. + * @returns The original value, or a new value that matches the type. e.g. if the type is boolean, the value will be converted to a boolean by using !!value. + */ + checkTypeMatch(type: FPropertyType, value: any): any; + } + /** + * Interface for data inspector. + */ + export interface IDataInspector { + /** + * The id of the inspector. + */ + readonly id: string; + + /** + * All catalog fields. + */ + readonly catalogs: ReadonlyArray; + + /** + * The object being inspected. If there are multiple objects being inspected, this will be the first one. + */ + readonly target: any; + + /** + * List of objects being inspected. In the case of multiple selection, there will be multiple objects. + */ + readonly targets: ReadonlyArray; + + /** + * The type of the object being inspected. + */ + readonly targetType: FTypeDescriptor; + + /** + * Whether the inspector is being updated by setData. If false, the inspector is being updated by data change notification. + */ + readonly fullUpdating: boolean; + + /** + * The owner widget of the inspector. + */ + get ownerWidget(): gui.Tree; + + /** + * Get the inspection data. It is an array of objects, because the inspector can inspect multiple objects at the same time. + */ + getData(): ReadonlyArray; + + /** + * Set the inspection target and data. + * The `target` and `data` are both arrays of objects, because the inspector can inspect multiple objects at the same time. + * `target` and `data` should have the same length. If `data` is not provided, the inspector will use the `target` as the data. + * `data` is the real data to be inspected, while `target` is the object that the data belongs to. + * For convenience, `target` and `data` can also be single objects, in which case they will be converted to arrays. + * `status` is an object used to read and write certain UI display states, such as whether a group is expanded, the current index of a Tab component, etc. + * @param target A single object or a array objects. + * @param data A single data or a array of datas. + * @param status The status of the inspection. + */ + setData(target: any, data?: any, status?: any): void; + + /** + * Refresh the inspector. You dont need to call this method if the inspector is updated by setData. + */ + refresh(): void; + + /** + * The Inspector will use the name of the data type as the title by default. If you need to customize the title, you can call this method. + * @param value The title to be set. + */ + setTitle(value: string): void; + + /** + * Set the read-only state of the inspector. + * @param value Whether the inspector is read-only. + */ + setReadonly(value: boolean): void; + + /** + * Get a catalog field by name. + * @param name The name of the catalog field. + * @returns The catalog field. + */ + getCatalogField(name: string): IPropertyField; + + /** + * Set the style of the catalog bar. + * @param style The style to be set. + */ + setCatalogBarStyle(style: CatalogBarStyle): void; + + /** + * Execute the validators of all decendants of the specified field. + * @param parentField The parent field. If not provided, all fields will be validated. + * @returns Whether the validation is successful. + * @see FPropertyDescriptor.validator + */ + runValidators(parentField?: IPropertyField): boolean; + + /** + * Scroll to the specified node. + * @param node The node to scroll to. + * @param ani Whether to animate the scrolling. + * @param setFirst Whether to display the node at the top of the view area if possible. + */ + scrollTo(node: gui.TreeNode, ani?: boolean, setFirst?: boolean): void; + + /** + * Scroll to the specified node. + * @param node The node to scroll to. + * @param ani Whether to animate the scrolling. + * @param secondNode The second node is commonly displayed before the specified node. + * When we try to scroll to the specified node to make it visible, we will also make sure the second node is visible. + * If it is not possible to make both nodes visible, the second node will be displayed at the top of the view area. + */ + scrollTo(node: gui.TreeNode, ani?: boolean, secondNode?: gui.TreeNode): void; + + /** + * Set a flag for the specified field. + * @param field The field to set the flag for. + * @param flag The flag to set. + * @param value The value to set. + * @param inheritedValue The inherited value to set. + * @see FieldStatusFlags + */ + setFlag(field: IPropertyField, flag: number, value: boolean, inheritedValue?: boolean): void; + + /** + * Release resources. + */ + dispose(): void; + } + /** + * Interface for version tracking + */ + export interface IVersionTracker { + /** + * A number that represents the current version. + */ + savePoint: number; + + /** + * If the data is modified. + */ + isModified: boolean; + + /** + * Set the modified state. + * @param value The modified state. + */ + setModified(value: boolean): void; + } + + /** + * Interface for data history. + */ + export interface IDataHistory { + /** + * The changed event. It will be triggered when the data is changed, undone or redone. + */ + readonly onChanged: IDelegate<() => void>; + + /** + * If the undo/redo is processing. + */ + readonly processing: boolean; + + /** + * Whether undo operation can be performed currently. + */ + readonly canUndo: boolean; + + /** + * Whether redo operation can be performed currently. + */ + readonly canRedo: boolean; + + /** + * Get or set the pause state of the history. If the history is paused, no change will be recorded. + */ + paused: boolean; + + /** + * Reset the history. All change records will be cleared. + */ + reset(): void; + + /** + * Undo the last change. + */ + undo(): boolean; + + /** + * Redo the last undone change. + */ + redo(): boolean; + + /** + * Add a change record. + * This record will not be added to the history immediately, but will be delayed for a short period of time, and only if there is no dragging operation and text input is not in progress. If these conditions are not met, the delay will continue until they are. + * During this process, if the same operation records are added, they will be merged. For example, if a property of an object continuously changes during mouse dragging, only the last value will be recorded. + * @param target The target object. + * @param datapath The data path. + * @param value The new value. + * @param oldvalue The old value. + * @param extInfo Additional information. It is internally used by the editor to record array changes. + * @param transient Whether the change is transient. A transient change will not affect the versionTracker. + * @param batchId The batch ID. If this ID is provided, the change will attempt to merge or add to the undo stack's queue with the same batch ID. + * @param group The group ID. If this ID is provided, the change will be added to the specified group. A DataHistory can be seperated into multiple groups, and undo/redo operations can be performed in each group separately. + */ + addChange(target: any, datapath: string | string[], value: any, oldvalue: any, extInfo?: any, transient?: boolean, batchId?: number, group?: number): number; + + /** + * If there are changes pending, flush them immediately. + */ + flush(): void; + + /** + * Handy function to mount a DataHistory to an object. + * @param obj + */ + trace(obj: any): any; + + /** + * Handy function to unmount a DataHistory from an object. + * @param obj + */ + untrace(obj: any): void; + + /** + * Get the undo targets of the specified group. + * @param group The group ID. + * @returns The undo targets as an array. + */ + getUndoTargets(group?: number): Array; + + /** + * Get the undo targets of the specified group. + * @param group The group ID. + * @returns The undo targets as a set. + */ + getUndoTargetSet(group?: number): ReadonlySet; + + /** + * Run a callback, all change records generated in the callback will be added to the same batch. + * @param callback The callback function. + */ + runInSingleBatch(callback: () => Promise): Promise; + + /** + * Run a callback, all change records generated in the callback will be ignored. + * @param callback The callback function. + */ + runUntrace(callback: () => void): void; + + /** + * Check if the specified group can undo. + * @param group The group ID. + * @returns Whether the group can undo. + */ + canUndoWithGroup(group: number): boolean; + + /** + * Check if the specified group can redo. + * @param group The group ID. + * @returns Whether the group can redo. + */ + canRedoWithGroup(group: number): boolean; + + /** + * Clear the change records of the specified group. + * @param group The group ID. + * @returns Any change records are cleared. + */ + clearGroup(group: number): boolean; + } + /** + * Interface for data components. + */ + export interface IDataComponent { + /** + * The data of the component. + */ + readonly props: any; + + /** + * The script object of the component. + */ + readonly scriptObj: any; + + /** + * The type name of the component. + */ + readonly typeName: string; + + /** + * Update the data of the component. + * @param data The new data. + */ + load(data: any): void; + + /** + * Mark the data changed + */ + markChanged(): void; + + /** + * Serialize the component. + * @param eliminateDefaults Whether to eliminate the default values. When true, if a property is equal to the default value, it will not be serialized. + * @returns The serialized data. + */ + export(eliminateDefaults?: boolean): any; + + /** + * Destroy the component. + */ + destroy(): void; + } + /** + * Interface for the crypto utils + */ + export interface ICryptoUtils { + /** + * Create a MD5 hash. + * @param data The data to create hash. + * @param algorithm The algorithm to use. Default is md5. + * @returns The hash. + */ + createHash(data: string, algorithm?: 'md5' | 'sha1' | 'sha256' | 'sha512'): string; + + /** + * Create a MD5 hash for a file. + * @param path file absolute path. + * @param algorithm The algorithm to use. Default is md5. + * @returns The hash. + */ + createFileHash(path: string, algorithm?: 'md5' | 'sha1' | 'sha256' | 'sha512'): Promise; + + /** + * Encrypt data with AES. + * @param data data to encrypt. + * @param key The key. + * @returns The encrypted data. + */ + encryptAES(data: string, key: string): string; + + /** + * Decrypt data with AES. + * @param encrypted The encrypted data. + * @param key The key + * @returns The decrypted data. + */ + decryptAES(encrypted: string, key: string): string; + } + /** + * Console panel interface. + */ + export interface IConsolePanel extends IEditorPanel { + /** + * Output a log message. + * @param msg text of the log message. + * @param level level of the log message. 0-debug,1-info,2-warning,3-error + * @param group optional group name of the log message. e.g. "Compile" means the log message is related to compile. + */ + log(msg: string, level?: number, group?: string): void; + + /** + * Clear all log messages. + */ + clear(): void; + + /** + * Clear log messages of a specific group. + * @param group group name. + */ + clearGroup(group: string): void; + } + /** + * Interface for configuration objects. + */ + export interface IConfigObject { + [index: string]: any, + + /** + * Get the value of the key. + * @param key key. + * @param defaultValue If the key does not exist, return the default value. + * @returns The value of the key. + */ + get(key: string, defaultValue?: any): any; + + /** + * Get the number value of the key. + * @param key key. + * @param defaultValue If the key does not exist, return the default value. + * @returns The number value of the key. + */ + getNumber(key: string, defaultValue?: number): number; + + /** + * Get the boolean value of the key. + * @param key key. + * @param defaultValue If the key does not exist, return the default value. + * @returns The boolean value of the key. + */ + getBool(key: string, defaultValue?: boolean): boolean; + + /** + * Get a section. + * @param key name of the section. + * @returns The section. + */ + getSection(key: string): IConfigObject; + + /** + * Set the value of the key. + * @param key key. + * @param value value. + */ + set(key: string, value: any): void; + + /** + * Delete the key. + * @param key key. + */ + delete(key: string): void; + + /** + * Clear all keys. + */ + clear(): void; + + /** + * Copy data from another object. + * @param data The data to copy from. + */ + copyFrom(data: any): void; + } + /** + * Interface for the configuration file. + */ + export interface IConf { + /** + * Set the value of the key. + * @param key + * @param value + */ + set(key: string, value: any): void; + + /** + * Get the value of the key. + * @param key + * @param defaultValue + */ + get(key: string, defaultValue?: any): any; + + /** + * Release the resources. + */ + dispose(): void; + + /** + * Save the configuration. + */ + save(): void; + } + + export interface IClipboard { + // Docs: https://electronjs.org/docs/api/clipboard + + /** + * An array of supported formats for the clipboard `type`. + */ + availableFormats(type?: 'selection' | 'clipboard'): string[]; + /** + * Clears the clipboard content. + */ + clear(type?: 'selection' | 'clipboard'): void; + /** + * Whether the clipboard supports the specified `format`. + * + * @experimental + */ + has(format: string, type?: 'selection' | 'clipboard'): boolean; + /** + * Reads `format` type from the clipboard. + * + * `format` should contain valid ASCII characters and have `/` separator. `a/c`, + * `a/bc` are valid formats while `/abc`, `abc/`, `a/`, `/a`, `a` are not valid. + * + * @experimental + */ + read(format: string): string; + /** + * * `title` string + * * `url` string + * + * Returns an Object containing `title` and `url` keys representing the bookmark in + * the clipboard. The `title` and `url` values will be empty strings when the + * bookmark is unavailable. The `title` value will always be empty on Windows. + * + * @platform darwin,win32 + */ + readBookmark(): any; + /** + * Reads `format` type from the clipboard. + * + * @experimental + */ + readBuffer(format: string): Buffer; + /** + * The text on the find pasteboard, which is the pasteboard that holds information + * about the current state of the active application’s find panel. + * + * This method uses synchronous IPC when called from the renderer process. The + * cached value is reread from the find pasteboard whenever the application is + * activated. + * + * @platform darwin + */ + readFindText(): string; + /** + * The content in the clipboard as markup. + */ + readHTML(type?: 'selection' | 'clipboard'): string; + /** + * The image content in the clipboard. + */ + readImage(type?: 'selection' | 'clipboard'): any; + /** + * The content in the clipboard as RTF. + */ + readRTF(type?: 'selection' | 'clipboard'): string; + /** + * The content in the clipboard as plain text. + */ + readText(type?: 'selection' | 'clipboard'): string; + /** + * Writes `data` to the clipboard. + */ + write(data: any, type?: 'selection' | 'clipboard'): void; + /** + * Writes the `title` (macOS only) and `url` into the clipboard as a bookmark. + * + * **Note:** Most apps on Windows don't support pasting bookmarks into them so you + * can use `clipboard.write` to write both a bookmark and fallback text to the + * clipboard. + * + * @platform darwin,win32 + */ + writeBookmark(title: string, url: string, type?: 'selection' | 'clipboard'): void; + /** + * Writes the `buffer` into the clipboard as `format`. + * + * @experimental + */ + writeBuffer(format: string, buffer: Buffer, type?: 'selection' | 'clipboard'): void; + /** + * Writes the `text` into the find pasteboard (the pasteboard that holds + * information about the current state of the active application’s find panel) as + * plain text. This method uses synchronous IPC when called from the renderer + * process. + * + * @platform darwin + */ + writeFindText(text: string): void; + /** + * Writes `markup` to the clipboard. + */ + writeHTML(markup: string, type?: 'selection' | 'clipboard'): void; + /** + * Writes `image` to the clipboard. + */ + writeImage(image: any, type?: 'selection' | 'clipboard'): void; + /** + * Writes the `text` into the clipboard in RTF. + */ + writeRTF(text: string, type?: 'selection' | 'clipboard'): void; + /** + * Writes the `text` into the clipboard as plain text. + */ + writeText(text: string, type?: 'selection' | 'clipboard'): void; + } + /** + * Class registry for editor. It is internally used by editor. + */ + export namespace IClassRegistry { + /** + * Class map. + */ + const classMap: Record; + + /** + * User class map. + */ + const userClassMap: Record; + + /** + * Register a class. + * @param className class name. + * @param cls class. + */ + function regClass(className: string, cls: any): void; + + /** + * Get a class by name. + * @param className class name. + * @returns The class. + */ + function getClass(className: string): any; + + } + /** + * Build target info interface + */ + export interface IBuildTargetInfo { + /** + * The display name of the build target. + */ + caption?: string; + + /** + * The settings panel id of the build target. The panel will be integrated into the build settings panel. + * Be aware that the panel usage should be "build-settings". + * @example + * ``` + * //The settings panel id is "TestBuildSettings", which can be used in this field. + * @IEditor.panel("TestBuildSettings", { usage: "build-settings", title: "My Test" }) + * export class TestBuildSettings extends IEditor.EditorPanel { + * } + * ``` + */ + inspector?: string; + + /** + * The build template path. It is a absolute path to the directory that contains the build template files. + * Contents in the directory will be copied to the build output directory during the build process. + */ + templatePath?: string; + + /** + * The settings id of the build target. It needs to be registered first using Editio.extensionManager.createSettings. + * During the build process, you can use BuildTask.platformConfig to get a copy of this setting. + */ + settingsName?: string; + + /** + * The real platform type of the build target. It is meaningful for native platform build, but not for web or mini game build. + */ + runningPlatforms?: Array; + + /** + * The dependent modules that are required by the build target. Modules are external packages that managed by the editor. + */ + requireModules?: Array; + + /** + * Whether the build target is a mini-game platform, e.g. WeChat Mini Game, Oppo Mini Game, etc. + */ + isMiniGame?: boolean; + } + + /** + * Runtime platform type + */ + export enum RuntimePlatformType { + PC = 0, + Android = 1, + IOS = 2, + } + /** + * Tools for asset store + */ + export namespace IAssetStoreTools { + /** + * Subscribe a resource. + * @param resourceId The resource id. + * @returns A promise that resolves with a boolean indicating whether the resource is subscribed successfully. + */ + function subscribe(resourceId: string): Promise; + + /** + * Upload a package to the asset store. + * @param resourceId The resource id. + * @param filePath The local absolute path of the package. + * @param uploadProgress A callback function that will be called when the upload progress changes. + * @param abortToken The abort token. + */ + function uploadPackage(resourceId: string, filePath: string, uploadProgress?: (loaded: number, total: number) => void, abortToken?: IAbortToken): Promise; + + /** + * Call plugin backend. + * @param action The action to perform, currently fixed as "call". + * @param resourceId The resource ID. + * @param billingMethod The billing method: 1 for time-based billing, 2 for per-use billing. + * @param data The data to be passed. + * @returns A promise that resolves with the result. + */ + function callPluginBackend(action: string, resourceId: string, billingMethod: number, data: any): Promise; + } + /** + * Asset Panel Interface + */ + export interface IAssetPanel { + /** + * Get the selected resource. + */ + getSelectedResource(): IAssetInfo; + /** + * Get the selected resources. + * @param result Optional result array, if provided, the result will be pushed into this array, otherwise a new array will be created. + * @returns The selected resources. + */ + getSelectedResources(result?: Array): Array; + + /** + * Get the selected folder. + * @returns The selected folder. + */ + getSelectedFolder(): IAssetInfo; + + /** + * Get all expanded folders in the tree view. + * @param result Optional result array, if provided, the result will be pushed into this array, otherwise a new array will be created. + * @returns All expanded folders in the tree view. + */ + getExpandedFolders(result?: Array): Array; + + /** + * Set the expanded folders in the tree view. + * @param arr The expanded folders + */ + setExpandedFolders(arr: ReadonlyArray): void; + + /** + * Set the selected asset. + * @param assetId The asset id. + * @returns A promise that resolves with a boolean indicating whether the asset is selected successfully. + */ + select(assetId: string): Promise; + + /** + * Expand the asset. If the asset is a folder, expand it. + * @param asset The asset to expand. + */ + expand(asset: IAssetInfo): void; + + /** + * Start renaming the asset. The asset will enter renaming mode. + * @param asset The asset to rename. + */ + rename(asset: IAssetInfo): void; + + /** + * A temporary asset will be created in the folder, and the asset will enter renaming mode. + * @param folderAsset The folder asset. + * @param fileName The file name. + * @param callback The callback function that will be called when user finish renaming the asset. + */ + addNew(folderAsset: IAssetInfo, fileName: string, callback: (fileName: string) => void): void; + + /** + * Delete the assets in the selection. + */ + deleteSelection(): void; + + /** + * Notify the asset panel that the selection has changed. + */ + onSelectionChanged(): void; + + /** + * When the asset panel is in two column mode, this is the icon scale of the detail list item in the right column. + */ + iconScale: number; + } + /** + * Asset type + */ + export enum AssetType { + Unknown = 0, + Folder, + Image, + Scene, + Prefab, + Material, + Mesh, + Model, + TypeScript, + JavaScript, + ShaderScript, + WebAssembly, + ScriptBundleDefinition, + Json, + Text, + XML, + Binary, + BitmapFont, + TTFFont, + Audio, + Video, + Shader, + ShaderBlueprint, + ShaderBlueprintFunction, + Blueprint, + Blackboard, + BlueprintTree, + AnimationClip, + AnimationClip2D, + AnimationController, + AnimationController2D, + Cubemap, + AvatarMask, + LightingSettings, + RenderTexture, + Atlas, + AtlasConfig, + Skeleton, + Spine, + GUIPrefab, + + FairyGUIPackage, + LensFlareData, + Texture2DArray, + + SVGImage, + I18nSettings + } + + /** + * Asset flags + */ + export enum AssetFlags { + /** + * Readonly asset + */ + Readonly = 0x1, + /** + * Sub asset. Sub assets are assets that are part of another asset. Such as a fbx file that contains multiple meshes or materials. + */ + SubAsset = 0x2, + /** + * Internal asset. Internal assets are stored in the IDE's internal installation directory and are read-only. + */ + Internal = 0x100, + /** + * Memory asset. Memory assets are not stored on disk and are only available in memory. + */ + Memory = 0x200, + /** + * No database cache. The asset is not cached in the database. + */ + NoDbCache = 0x400, + /** + * The asset is not visible to the user. + */ + Hidden = 0x800, + /** + * The asset is a temporary asset. Temporary assets are not saved to disk. + */ + Temp = 0x1000, + /** + * The asset is inside the `packages` folder. + */ + Packages = 0x2000, + /** + * The asset is top level asset of the project. + */ + ProjectLayoutFolder = 0x4000, + /** + * The asset is hidden in all assets view. + */ + InternalGUI = 0x8000, + /** + * The asset is a built-in asset. + */ + BuiltIn = 0x10000, + } + + /** + * Asset changed flag + */ + export enum AssetChangedFlag { + Modified = 0, + New = 1, + Deleted = 2, + Moved = 3 + } + + /** + * Asset script type + */ + export enum AssetScriptType { + /** + * Not a special script. The asset is not a typescript file or a typescript file that has no special decorators. + */ + None = 0, + /** + * A script that has Laya's `@regClass` decorators. + */ + Runtime = 1, + /** + * A script that has decorators with prefix `@IEditorEnv`. + */ + Scene = 2, + /** + * A script that has decorators with prefix `@IEditor`. + */ + Editor = 4, + /** + * A script is a javascript file. + */ + Javascript = 8 + } + + /** + * Asset Infomation + */ + export interface IAssetInfo { + /** + * Asset id + */ + id: string; + /** + * Asset name + */ + name: string; + /** + * Asset file name, including extension. + */ + fileName: string; + /** + * Asset file path, relative to the assets folder. + */ + file: string; + /** + * Asset extension, excluding the dot. + */ + ext: string; + /** + * Asset type + */ + type: AssetType; + /** + * Asset sub type. Some assets have a type and a sub type. Such as a json asset has a type of `Json` and a sub type of `Spine` if it is a description file of spine. + */ + subType: string; + /** + * Asset version + */ + ver: number; + /** + * Parent asset id + */ + parentId: string; + /** + * If the asset has children, only meaningful for folders and some special assets like fbx. + */ + hasChild: boolean; + /** + * Asset flags + */ + flags: number; + /** + * Asset script type + */ + scriptType: AssetScriptType; + /** + * Children assets. + */ + children: ReadonlyArray; + } + + /** + * Sub asset information. Sub assets are assets that are part of another asset. Such as a fbx file that contains multiple meshes or materials. + */ + export interface ISubAssetInfo { + /** + * Sub asset id + */ + readonly id: string; + /** + * Sub asset name + */ + readonly fileName: string; + /** + * Sub asset absolute path + */ + readonly fullPath: string; + } + + /** + * Custom asset filter. Can be used to register custom asset filters through the `IEditorEnv.assetMgr.customAssetFilters` method. + */ + export interface IAssetFilter { + /** + * Check if the asset should be included in the asset list. + * @param asset The asset to check. + * @returns `true` if the asset should be included, `false` otherwise. + */ + (asset: IAssetInfo): boolean; + } + + export interface IFindAssetsOptions { + /** + * Whether to match the sub type. Some assets have a type and a sub type. Such as a json asset has a type of `Json` and a sub type of `Spine` if it is a description file of spine. + */ + matchSubType?: boolean; + + /** + * The custom filter. Developers can register custom filters by calling the `IEditorEnv.assetMgr.customAssetFilters` method in scene process. + */ + customFilter?: string; + + /** + * Whether to ignore the internal assets. The default value is true. + */ + ignoreInternalAssets?: boolean; + + /** + * Whether to ignore the internal GUI assets. The default value is true. + */ + ignoreInternalGUIAssets?: boolean; + + /** + * The maximum number of assets to return. The default value is 5000. + */ + limit?: number; + } + /** + * Interface for an asset database. + */ + export interface IAssetDb { + /** + * Triggered when an asset is changed. + * @param assetId The id of the asset. + * @param assetPath The path of the asset. + * @param assetType The type of the asset. + * @param flag The flag of the change. + */ + readonly onAssetChanged: IDelegate<(assetId: string, assetPath: string, assetType: AssetType, flag: AssetChangedFlag) => void>; + + /** + * Triggered when the package list is changed. + */ + readonly onPackagesChanged: IDelegate<() => void>; + + /** + * Communication port to the AssetManager which is running in the scene process. + */ + readonly port: IMyMessagePort; + + /** + * Get the version of the specified type. The version is increased when the assets of the specified type are added, removed or renamed. + * @param type The type of the asset. + * @returns The version of the specified type. + */ + getVersionOfType(type: AssetType): number; + + /** + * Get the assets in the specified folder. + * @param folderAssetId The id of the folder asset. + * @param types The types of the assets. + * @param matchSubType Whether to match the sub type. Some assets have a type and a sub type. Such as a json asset has a type of `Json` and a sub type of `Spine` if it is a description file of spine. + * @param customFilter The custom filter. Developers can register custom filters by calling the `IEditorEnv.assetMgr.customAssetFilters` method in scene process. + * @returns The assets in the specified folder. + */ + getFolderContent(folderAssetId: string, types?: ReadonlyArray, matchSubType?: boolean, customFilter?: string): Promise; + + /** + * Get the asset by the id or path. + * @param assetIdOrPath The id or path of the asset. + * @param allowResourcesSearch Whether to allow searching in the resources folder. + * @returns The asset. + */ + getAsset(assetIdOrPath: string, allowResourcesSearch?: boolean): Promise; + + /** + * Get the asset by the id or path synchronously. Can only be used if the asset is already queried. + * @param assetIdOrPath The id or path of the asset. + * @returns The asset. + */ + getAssetSync(assetIdOrPath: string): IAssetInfo; + + /** + * Get all parent assets of the specified asset id (including itself), arranged in order from the root directory to itself. + * @param assetId The id of the asset. + * @returns An array of all parent assets. + * @example + * ``` + * let parents = await IEditor.assetDb.getAssetsInPath('GUID'); + * // parents: [assets, folder, asset] + * ``` + */ + getAssetsInPath(assetId: string): Promise>; + + /** + * Set the meta data of the asset. The meta data is stored in the meta file of the asset. + * Developers can store custom data in the meta file. 'importer' is a reserved key in the meta file, which is used to store the importer information of the asset. + * This operation is the same as developers manually using IO operations to read and write meta files, except that this operation is performed by the editor. + * @param assetId The id of the asset. + * @param data The data to be stored in the meta file. It is an object or string. If it is a string, it is stringified from an object. + * @example + * ``` + * await IEditor.assetDb.setMetaData('GUID', { importer: { textureType: 2 } }); + * + * await IEditor.assetDb.setMetaData('GUID', { customData: 'Hello World!' }); + * ``` + */ + setMetaData(assetId: string, data: any): Promise; + + /** + * Set the meta data of the assets. The meta data is stored in the meta file of the asset. + * Developers can store custom data in the meta file. 'importer' is a reserved key in the meta file, which is used to store the importer information of the asset. + * This operation is the same as developers manually using IO operations to read and write meta files, except that this operation is performed by the editor. + * @param idAndDataArray The array of the id and data to be stored in the meta file. The data is an object or string. If it is a string, it is stringified from an object. + * @example + * ``` + * await IEditor.assetDb.setMetaData('GUID1', { importer: { textureType: 2 } }, 'GUID2', { importer: { textureType: 2 } }); + * + * await IEditor.assetDb.setMetaData('GUID1', { customData: 'Hello World!' }, 'GUID2', { customData: 'Hello World!' }); + * ``` + */ + setMetaData(...idAndDataArray: any[]): Promise; + + /** + * Write the file to the specified path. Create a new asset if the file does not exist, and return existing assets if the file exists. + * @param filePath The path of the file. The path is relative to the assets folder. + * @param source If sourceIsPath is true, the source is the path of the source file, and the file is created by copying the source file. Otherwise, the source is the content of the file. + * @param sourceIsPath Whether the source is a path. + * @param allowOverwrite Whether to allow overwriting the file. If the file already exists, the file is overwritten. Default is true. + * @returns The asset information of the file. + */ + writeFile(filePath: string, source?: string, sourceIsPath?: boolean, allowOverwrite?: boolean): Promise; + + /** + * Write the file with a template to the specified path. Create a new asset if the file does not exist, and return existing assets if the file exists. + * @param filePath The path of the file. The path is relative to the assets folder. + * @param templateName The name of the template. It can be a absolute path or a file name. If it is a file name, the default template path will be used. + * @param templateArgs The arguments of the template. + * @param allowOverwrite Whether to allow overwriting the file. If the file already exists, the file is overwritten. Default is true. + * @returns The asset information of the file. + * @example + * ``` + * await IEditor.assetDb.createFileFromTemplate('test.lmat', 'templateName', { key: 'value' }); + * ``` + */ + createFileFromTemplate(filePath: string, templateName: string, templateArgs?: Record, allowOverwrite?: boolean): Promise; + + /** + * Create a folder at the specified path. + * @param folderPath The path of the folder. The path is relative to the assets folder. + * @returns The asset information of the folder. + */ + createFolder(folderPath: string): Promise; + + /** + * Get the path of the source file of the prefab asset. For prefab assets like fbx/gltf, their scene files are generated in the library folder. This method can get the path of the scene file. + * @param asset The prefab asset. + * @returns The path of the source file. + */ + getPrefabSourcePath(asset: IAssetInfo): string; + + /** + * Get the absolute path of the asset. + * @param asset The asset. + * @returns The absolute path of the asset. + */ + getFullPath(asset: IAssetInfo): string; + + /** + * Get the URL of the asset. Usually in the form of `file:///path/to/asset`. + * @param asset The asset. + * @returns The URL of the asset. + */ + getURL(asset: IAssetInfo): string; + + /** + * Convert the path to the absolute path. + * @param path The path, which is relative to the assets folder. + * @returns The absolute path. + */ + toFullPath(path: string): string; + + /** + * Convert the path to the relative path. + * @param path The path, which is absolute. + * @returns The relative path to the assets folder, or if it is in internal folders, prefix with `~/`. + */ + toRelativePath(path: string): string; + + /** + * Convert the path to the URL. Usually in the form of `file:///path/to/asset`. + * @param path The path, which is relative to the assets folder. + * @returns The URL. + */ + toURL(path: string): string; + + /** + * Get the initials of the asset. The initials are the first letters of the asset name. + * @param asset The asset. + * @returns The initials of the asset. + */ + getAssetInitials(asset: IAssetInfo): string; + + /** + * Get the icon of the asset. The icon is the image of the asset. + * @param asset The asset. + * @param opened It is meaningful for the folder asset. Whether the folder is opened. + * @param preferBig Whether to prefer a big icon. + * @returns The icon of the asset. + */ + getAssetIcon(asset: IAssetInfo, opened?: boolean, preferBig?: boolean): string; + + /** + * Get the icon of the file. The icon is the image of the file. + * @param ext The extension of the file, e.g. `png`. + * @param subType The sub type of the file. + * @returns The icon of the file. + */ + getFileIcon(ext: string, subType?: string): string; + + /** + * Get the icon of the folder. The icon is the image of the folder. + * @param name The name of the folder. + * @returns The icon of the folder. The first element is the icon in normal state, and the second element is the icon in opened state. + */ + getFolderIcon(name: string): [string, string]; + + /** + * Clear the thumbnail cache of the asset. It is internally called when the asset is changed. + * @param assetId The id of the asset. + */ + clearAssetThumbnailCache(assetId: string): void; + + /** + * Request to reimport the assets. The assets are reimported according to the importer settings with the specified arguments. + * @param assets The assets to be reimported. + * @param args The arguments of the reimport. It is optional. + */ + reimport(assets: ReadonlyArray, args?: ReadonlyArray): void; + + /** + * Unpack the assets to a folder which name is the asset name with a suffix `-unpacked`. + * For assets like fbx/gltf, you can unpack the scene files, materials, textures, etc., contained in them to the specified folder. + * @param assets The assets to be unpacked. + */ + unpack(assets: ReadonlyArray): void; + + /** + * Search the assets by the keyword. + * @param keyword The keyword. + * @param types The types of the assets. + * @param matchSubType Whether to match the sub type. Some assets have a type and a sub type. Such as a json asset has a type of `Json` and a sub type of `Spine` if it is a description file of spine. + * @param customFilter The custom filter. Developers can register custom filters by calling the `IEditorEnv.assetMgr.customAssetFilters` method in scene process. + * @returns The assets that match the keyword. + */ + search(keyword: string, types?: ReadonlyArray, matchSubType?: boolean, customFilter?: string): Promise>; + + /** + * Search the assets by the keyword. + * @param keyword The keyword. + * @param types The types of the assets. + * @param options The options of the search. + * @returns The assets that match the keyword. + */ + search(keyword: string, types?: ReadonlyArray, options?: IFindAssetsOptions): Promise>; + + /** + * Filter the assets by the asset ids. + * @param assetIds The asset ids. + * @param types The types of the assets. + * @param matchSubType Whether to match the sub type. Some assets have a type and a sub type. Such as a json asset has a type of `Json` and a sub type of `Spine` if it is a description file of spine. + * @param customFilter The custom filter. Developers can register custom filters by calling the `IEditorEnv.assetMgr.customAssetFilters` method in scene process. + * @returns The assets that match the asset ids and other conditions. + */ + filter(assetIds: ReadonlyArray, types?: ReadonlyArray, matchSubType?: boolean, customFilter?: string): Promise>; + + /** + * Rename the asset. + * @param assetId The id of the asset. + * @param newName The new name of the asset. + * @returns The result of the operation. If the operation is successful, the result is 0. Otherwise, the result is an error code. + * -1 - The asset does not exist. + * 1 - The target file is already existed. + * 2 - Some io error occurred. + */ + rename(assetId: string, newName: string): Promise; + + /** + * Move the assets to the specified folder. + * @param sourceAssetIds The ids of the assets to be moved. + * @param targetFolderId The id of the target folder. + * @param conflictResolution The conflict resolution. It is optional. The default value is `replace`. + */ + move(sourceAssetIds: ReadonlyArray, targetFolderId: string, conflictResolution?: "keepBoth" | "replace"): Promise; + + /** + * Copy the assets to the specified folder. + * @param sourceAssetIds The ids of the assets to be copied. + * @param targetFolderId The id of the target folder. + * @param conflictResolution The conflict resolution. It is optional. The default value is `replace`. + */ + copy(sourceAssetIds: ReadonlyArray, targetFolderId: string, conflictResolution?: "keepBoth" | "replace"): Promise; + + /** + * Delete the assets. + * @param assets The assets to be deleted. + */ + delete(assets: ReadonlyArray): Promise; + + /** + * Create a temporary asset. The temporary asset is not saved to the disk. It is internally used by AssetsPanel to create a new asset. + * @param fileName The name of the temporary asset. + * @returns The temporary asset. + */ + createTempAsset(fileName: string): Promise; + + /** + * Refresh the `ver` property of the asset and the `treeVer` property of the parent asset. + * Some UI interfaces will detect the `ver` and `treeVer` properties of the asset, which makes them refresh the asset list of the specified folder. + * @param folderAsset The folder asset. + */ + refreshFolder(folderAsset: IAssetInfo): void; + + /** + * Sync the i18n settings with AssetManager. + */ + syncI18nSettings(): Promise; + + /** + * Check if the asset type matches the specified types. + * @param assetId The id of the asset. + * @param types The types to be matched. + * @returns Whether the asset type matches the specified types. + */ + matchType(assetId: string, types: Array): Promise; + + /** + * Get the file actions of the asset. + * @param asset The asset. + * @returns The file actions of the asset. + */ + getFileActions(asset: IAssetInfo): IFileActions; + + /** + * Get the file actions by the asset type or the file extension. + * @param assetTypeOrFileExt The type of the asset or the file extension. + * @returns The file actions of the asset. + */ + getFileActionsByType(assetTypeOrFileExt: AssetType | string): IFileActions; + /** + * If there are any changes in the asset database, this function can be called to apply the changes. + */ + flushChanges(): Promise; + } + /** + * Interface for the Add Modules dialog. + */ + export interface IAddModulesDialog extends IDialog { + /** + * Show the dialog. + * @param popupOwner Popup owner. + * @param selectedModules Selected modules. + */ + show(popupOwner: gui.Widget, selectedModules?: Array): Promise; + } + /** + * Information about the current user. + */ + export interface IUserInfo { + /** + * The nickname of the user. + */ + nickname: string; + + /** + * The avatar of the user. + */ + headimg: string; + + /** + * The first letter of the nickname. + */ + headletter: string; + + /** + * The channel of the user. + */ + channel: string; + + /** + * The user id. + */ + userId: string; + + /** + * The developer id. + */ + developerId: string; + + /** + * Whether the user is an enterprise user. + */ + enterprise?: boolean; + } + + /** + * Interface for an account manager. + */ + export interface IAccountManager { + /** + * Triggered when the logged-in user changes. + */ + readonly onAccountChanged: IDelegate<() => void>; + + /** + * The information of the current user. + */ + readonly userInfo: IUserInfo; + + /** + * The token used to visit the store. + */ + readonly storeToken: string; + + /** + * Log in. + */ + login(): Promise; + + /** + * Log out. + */ + logout(): Promise; + } + /** + * Interface for an abort token. + */ + export interface IAbortToken { + /** + * Whether the token has been aborted. + */ + readonly aborted: boolean; + + /** + * Signal the token. This will cause the `aborted` property to become `true`. + */ + signal(): void; + + /** + * Check if the token has been aborted. If it has, an `aborted` string will be thrown. + */ + check(): void; + + /** + * Reset the token. This will cause the `aborted` property to become `false`. + */ + reset(): void; + } + export type FEnumDescriptor = { + name: string, + value: any, + extend?: FEnumDescriptor, + [index: string]: any, + }[] | any[] | string; + + export type WorldType = "2d" | "3d" | "gui" | null; + export type FPropertyType = string | [FPropertyType] | ["Record", FPropertyType]; + + /** + * Property descriptor. + */ + export interface FPropertyDescriptor { + /** + * Property name + */ + name: string; + /** + * Property type. + * Basic types include: number, string, boolean, any. + * Composite types include: arrays, expressed as [number]; dictionaries, expressed as ["Record", number], where the first element is fixed as "Record" and the second element is the actual type. + * Other names are types registered in the typeRegistry. + * If type is not provided, it means it is only used for UI display and does not correspond to actual data. + */ + type?: FPropertyType; + + /** + * The initial value of this property in the prototype. This value is also used for comparison during serialization; if they are the same, this property will not be serialized. Therefore, it is essential to ensure that the value set here is the initial value of the variable in the class. + */ + default?: any; + + /** + * Dislay title. If not provided, the name will be used. + * + * Use "i18n:<key>" or "i18n:<file-id>:<key>" to specify the key of the internationalization string. + */ + caption?: string; + + /** + * Whether to hide the title. Default is "normal". + * - normal: display the title. + * - hidden: hide the title, but the title will still occupy space. + * - none: hide the title and the space it occupies. + */ + captionDisplay?: "normal" | "hidden" | "none"; + + /** + * Tooltip text. + */ + tips?: string; + + /** + * A catalog is a composite display control in the Inspector, featuring a title bar and a content area that can be collapsed by clicking the title bar. + * + * Setting the same catalog value for multiple properties will display them within the same catalog. + */ + catalog?: string; + + /** + * This is a URL value. When set, a help button will appear on the right side of the Catalog's title bar, which opens this URL when clicked. + */ + catalogHelp?: string; + + /** + * Text displayed on the catalog title bar. Defaults to using the catalog name. + * + * Use "i18n:<key>" or "i18n:<file-id>:<key>" to specify the key of the internationalization string. + */ + catalogCaption?: string; + + /** + * Display order of the catalog. The smaller the value, the earlier it is displayed. If not provided, it follows the order of the properties. + */ + catalogOrder?: number; + + /** + * Inspector for editing this property. Built-in inspectors include: + * - number : Number input. + * - string : String input. Defaults to single-line input; if multiline is needed, activate the multiline option. + * - boolean : Checkbox. + * - color : A color box + color palette + color picker. + * - vec2 : Combination of XY inputs. + * - vec3 : Combination of XYZ inputs. + * - vec4 : Combination of XYZW inputs. + * - asset : Resource selector. + * - gradient : Gradient editor. + * - curve : Curve editor. + * - matrix3 : 3x3 matrix inputs. + * - matrix4 : 4x4 matrix inputs. + * - TabBar : Tab control. Display properties grouped in different Tab pages. + * - Group : Make a group of properties with an indent and collapsible. + * - RadioGroup : Display the captions of multiple properties using a dropdown box and select the property whose current value is true. The property value is converted to a boolean using `!!`. + * - Info : Display a text block, useful for displaying help information. + * - Buttons : Display a button or several buttons. + * - File : File or directory selector. + * + * Generally, this option does not need to be set, as the editor will automatically choose the appropriate control based on the property type. However, in some cases, it may be necessary to forcefully specify it. + * For example, if the data type is Vector4 but it actually represents a color, using the default control for editing Vector4 is not suitable, and it needs to be set to "color" here. + * + * Explicitly setting inspector to null will not construct an inspector for the property. This is different from setting hidden to true. Hidden being true means the inspector is created but not visible, + * while inspector being null means it is not created at all. + */ + inspector?: string; + + /** + * A boolean value or a function or an expression that determines whether this property is hidden. + * + * boolean: True means hidden, false means visible. + * + * string: For example, "!data.a && !data.b" means that this property is hidden when both properties a and b are empty. There are two implicit variables: data, which is the current data, and field, which is the IPropertyField interface. + * + * function: A function to do the test. + */ + hidden?: boolean | string | ((data: any, field: IPropertyField) => boolean); + + /** + * A boolean value or a function or an expression that determines whether this property is read-only. + * + * boolean: True means read-only, false means writable. + * + * string: For example, "!data.a && !data.b" means that this property is read-only when both properties a and b are empty. There are two implicit variables: data, which is the current data, and field, which is the IPropertyField interface. + * + * function: A function to do the test. + */ + readonly?: boolean | string | ((data: any, field: IPropertyField) => boolean); + + /** + * A function or an expression that validates the property value. + * + * string: For example, "data.a". If data.a is a string, it indicates validation failure, and this string is displayed as an error message; if it is not a string, it indicates validation success. + * There are three implicit variables: data, which is the current data; value, which is the current user input value; and field, which is the IPropertyField interface. + * + * function: A function to do the test. If the return value is a string, it indicates validation failure, and this string is displayed as an error message; if it is not a string, it indicates validation success. + */ + validator?: string | ((data: any, value: any, field: IPropertyField) => any); + + /** + * A boolean value or a function or an expression that determines whether this property is required. + * + * boolean: True means required, false means optional. + * + * string: For example, "!!data.a". If !!data.a is true, it indicates that this property is required. + * + * function: A function to do the test. + */ + required?: boolean | string | ((data: any, value: any, field: IPropertyField) => boolean); + + /** + * Whether the property is serializable. If false, the property will not be serialized. Default is true. + */ + serializable?: boolean; + /** + * When the property does not participate in serialization, if its data may be affected by another serializable property, fill in the name of other property here. + * + * This is usually used to determine whether the prefab property is overridden. + */ + affectBy?: string; + + /** + * Whether the text input is multiline. Default is false. + */ + multiline?: boolean; + + /** + * Whether the input is a password. Default is false. + */ + password?: boolean; + + /** + * If true, the text input will trigger a submit event with each character typed; otherwise, it will only submit when it loses focus. Default is false. + */ + submitOnTyping?: boolean; + + /** + * If the property is of type string, this is the placeholder text for the input field; if it is of type boolean, this is the title for the checkbox. Default is empty. + */ + prompt?: string; + + /** + * Applicable to string type, indicating that the text supports multiple languages. In this case, the text input box will add the function of selecting the language key value. Default is false. + */ + multiLanguage?: boolean; + + /** + * The property will be displayed as a dropdown for the user to select from, and this is the data source for the dropdown. + * + * The property can be of type number or string. If it is of type number, it represents the index of the data source; if it is of type string, it represents the value of the data source. + * + * The data source can take various forms: + * - An array of strings: e.g., ["a", "b", "c"]. + * - An array of objects: e.g., [{name: "A", value: "a"}, {name: "B", value: "b"}]. + * - A string: This represents the name of another property, whose value is an array of strings or objects. Using this method, cascading dropdowns can also be achieved. + * + * Example of cascading dropdowns 1: + * ``` + * { + * name: "province", + * type: "string", + * enumSource: [ + * { name: "Guangdong", value: "gd", extend: [ + * { name: "Guangzhou", value: "gz" }, + * { name: "Shenzhen", value: "sz" } + * ]}, + * + * { name: "Hunan", value: "hn", extend: [ + * { name: "Changsha", value: "cs" }, + * { name: "Xiangtan", value: "xt" } + * ]} + * ] + * }, + * + * { + * name: "city", + * type: "string", + * enumSource: "province" + * }, + * ``` + * In this way, when Guangdong is selected for province, the dropdown for city will only have Guangzhou and Shenzhen. + * + * Example of cascading dropdowns 2: + * ``` + * { + * name: "province", + * type: "string", + * enumSource: [ + * { name: "Guangdong", value: "gd", + * city: [ + * { name: "Guangzhou", value: "gz" }, + * { name: "Shenzhen", value: "sz" } + * ], + * river: [ + * { name: "Pearl River", value: "pr" }, + * { name: "Dongjiang River", value: "dj" } + * ] + * }, + * + * { name: "Hunan", value: "hn", + * city: [ + * { name: "Changsha", value: "cs" }, + * { name: "Xiangtan", value: "xt" } + * ], + * river: [ + * { name: "Xiangjiang River", value: "xj" }, + * { name: "Zijiang River", value: "zj" } + * ] + * } + * ] + * }, + * + * { + * name: "city", + * type: "string", + * enumSource: "province" + * }, + * + * { + * name: "river", + * type: "string", + * enumSource: "province" + * } + * ``` + * In this way, when Guangdong is selected for province, the dropdown for city will only have Guangzhou and Shenzhen, and the dropdown for river will only have Pearl River and Dongjiang River. + */ + enumSource?: FEnumDescriptor; + + /** + * Hide this property when the data source is empty. + */ + hideIfEnumSourceEmpty?: boolean; + + /** + * Whether to reverse the boolean value. For example, when the property value is true, the UI renders it as false. + */ + reverseBool?: boolean; + + /** + * Whether null values are allowed. Default is true. Sometimes it is necessary to explicitly set it to true, e.g. to display a checkbox for a color/vec2/vec3/vec4 inspector to determine whether the property value is null. + */ + nullable?: boolean; + + /** + * For a property that can switch between null and non-null, when switching from a null value to a non-null value, the value here will be used. + */ + nonNullDefault?: any; + + /** + * Minimum value for numbers. Default is -Infinity. + */ + min?: number; + + /** + * Maximum value for numbers. Default is Infinity. + */ + max?: number; + + /** + * Range of values, equivalent to setting min and max at once. + */ + range?: [number, number]; + + /** + * The amount by which the value changes each time when changing the value by dragging. Default is 0.01. + * + * If fractionDigits is set, the step will be adjusted to 1 / 10 ^ fractionDigits if it is less than that value. + */ + step?: number; + + /** + * Number of decimal places. Default is 3. + */ + fractionDigits?: number; + + /** + * Display the number as a percentage, for example, 0.01 will be displayed as 1%. Default is false. + */ + percentage?: boolean; + + /** + * Applicable to array type properties. Indicates that the array is of fixed length. Default is false. + */ + fixedLength?: boolean; + + /** + * Applicable to array type properties. If not provided, it means all operations are allowed on the array; if provided, only the listed operations are allowed. + * - append: Add an element to the end of the array. + * - insert: Insert an element at a specified position. + * - delete: Delete an element. + * - move: Move an element to a specified position. + */ + arrayActions?: Array<"append" | "insert" | "delete" | "move">; + + /** + * Applicable to array or dictionary type properties. Here you can define the properties of array/dictionary elements. + */ + elementProps?: Partial; + + /** + * Applicable to dictionary type properties. Indicates that the dictionary uses a specified set of fixed key values. + */ + fixedKeys?: Array; + + /** + * Applicable to color type properties. Indicates whether to provide transparency (alpha) value modification. For properties of type string or Color, the default is true; for properties of type number, the default is false. + */ + showAlpha?: boolean; + + /** + * @deprecated Use 'nonNullDefault' instead. + */ + defaultColor?: any; + + /** + * @deprecated Explicitly set 'nullable' to true to display a checkbox. + */ + colorNullable?: boolean; + + /** + * Applicable to color type properties. When storing hexadecimal color values, this property determines the position of each channel. If the color value does not include an alpha channel, the default value is 'rgb'; if it does, the default value is 'argb'. + */ + colorFormat?: 'rgb' | 'argb' | 'abgr'; + + /** + * Applicable to object type properties. If true, hides the object's title, and the display indentation of the object's properties will be reduced by one level. + * + * ``` + * UI demonstration when hideHeader is false: + * + Object + * Property1 + * Property2 + * + * UI demonstration when hideHeader is true: + * Property1 + * Property2 + * ``` + */ + hideHeader?: boolean; + + /** + * Applicable to object type properties. Allows selecting a type from a dropdown menu when creating an object. + * + * If explicitly set to null, the menu is disabled. By default, a menu for creating the base class is displayed. + * + * There are two ways to customize the menu: + * - Array: The array contains the names of the types that can be created. If any type name ends with "*"", the array will include all derived classes of that type. + * - Function: The function is responsible to do anything you want. + */ + createObjectMenu?: Array | ((sender: gui.Widget, field: IPropertyField, insertIndex?: number) => void); + + /** + * Applicable to object type properties. Indicates that this property type has struct-like behavior, meaning it is always used as a whole. + * For example, if the value of property b of object obj is a1, and a1 is an instance of type T with structLike set to true, then when a1's properties change, the editor will simultaneously call obj.b = a1. + * The default is false. + */ + structLike?: boolean; + + /** + * Indicates that this property references an asset. + */ + isAsset?: boolean; + + /** + * Applicable to asset type properties. Multiple asset types are separated by commas, such as "Image,Audio". Refer to IEditor.AssetType for available values. + */ + assetTypeFilter?: string; + + /** + * If isAsset is true and property is of type string, this option determines whether the property value is the original path of the asset or in the format res://uuid. If true, it is the original path of the asset. The default is false. + */ + useAssetPath?: boolean; + + /** + * Applicable to asset type properties. Indicates whether internal assets can be selected. Default is true. + */ + allowInternalAssets?: boolean; + + /** + * Applicable to asset type properties. Indicates whether GUI assets can be selected. Default is false. + */ + allowInternalGUIAssets?: boolean; + + /** + * Applicable to asset type properties. Allows setting a custom filter. The filter needs to be registered through EditorEnv.assetMgr.customAssetFilters. + */ + customAssetFilter?: string; + + /** + * Applicable to properties of type Node or Component. It sets an alternative property name. During serialization, the node's serialized data will be saved to the specified property, and the node itself will no longer be serialized into its parent node tree. During deserialization, the opposite operation is performed. + * + * @example + * ``` + * { + * name: "itemNode", + * type: "Sprite", + * toTemplate: "itemNodeData" + * }, + * + * { + * name : "itemNodeData", + * type : "any", + * } + * + * ``` + */ + toTemplate?: string; + + /** + * Indicates whether the property is writable. The default is true. If set to false, the property is read-only. + * + * This usually refers to a property that has only a getter and no setter. + */ + writable?: boolean; + + /** + * By default, properties are arranged in the order they are defined, but this can be adjusted through this option. + * - first: The property is displayed at the beginning. + * - last: The property is displayed at the end. + * - before xxx: The property is displayed before the specified property. + * - after xxx: The property is displayed after the specified property. + */ + position?: string; + + /** + * Adds indentation, measured in levels, not pixels. + */ + addIndent?: number; + + /** + * Default collapsed state of child properties. + */ + collapsed?: boolean; + + /** + * Indicates that the property is private. Private properties are not displayed in the Inspector but are serialized. Unlike inspector=null, private data is not transferred from the scene process to the UI process. + */ + "private"?: boolean; + + /** + * If true, the property is always written during serialization. Otherwise, it is compared with the default value, and if they are the same, it is not written. Default is false. + */ + forceWriteDefault?: boolean; + + /** + * If true, the root node of the prefab instance will always write this property during serialization, regardless of whether it is overridden. This also means that this property will not appear in the override list. Default is false. + */ + forceWriteInPrefabRoot?: boolean; + + /** + * Indicates that this property is not written to the prefab file when it is the root node of the prefab template. Default is false. + */ + forInstanceOnly?: boolean; + + /** + * Indicates whether the property can be edited in multi-selection mode. Default is true. + */ + allowMultipleObjects?: boolean; + + /** + * Indicates that the property is not displayed in the property list of derived classes. Default is false. + */ + hideInDeriveType?: boolean; + + /** + * Indicates that the property is not allowed to reset to default by the "Reset Default" menu. Default is false. + */ + disableReset?: boolean; + + /** + * Calls an additional function of the object when the property changes. This is the function name. + * The function prototype is func(key?:string):void. The key is passed when changing internal properties of a member. + * For example, when changing an element of an array, the key is the index of the element, and when changing a element of a dictionary, the key is the key of the element. + */ + onChange?: string; + + /** + * Additional options. The meaning of these options depends on the inspector used. + */ + options?: Record; + } + + export type CatalogBarStyle = "normal" | "hidden" | "transparent"; + + /** + * Type descriptor. + */ + export interface FTypeDescriptor { + /** + * Type name. + */ + name: string; + + /** + * Help document URL. + */ + help?: string; + + /** + * Title. If not provided, the name will be used. + */ + caption?: string; + + /** + * If provided, the type will be displayed as a menu item in the specified menu. + * + * If the type is a component, the type will be displayed in the "Add Component" dialog. + * + * If the type is a node, the type will be displayed in the context menu of the hierarchy panel. + * + * If the type is a component and the inHierarchyMenu option is set to true, the type will be displayed in the context menu of the hierarchy panel. + * + * Use a comma and a number to specify the position of the menu item. For example, "2D,0" means the first item in the "2D" menu. + * + * It can also be an i18n key, such as "i18n:MyKey", in this case, the menu id will be the value of the key, and the menu label will be the translation of the key. + * + * @example + * ``` + * menu: "2D" + * menu: "2D,0" + * menu: "i18n:MyKey" + * ``` + */ + menu?: string; + + /** + * When this type is clicked in the menu to create a new node, the name of the new node. + */ + newNodeName?: string; + + /** + * Icon of the type. Images are generally placed in the editorResources directory or its subdirectories, and then referenced using a path starting from editorResources, such as "editorResources/my-plugin/icon.png". + */ + icon?: string; + + /** + * Script path. The value if not empty only if the type is registered by a typescript file. + */ + scriptPath?: string; + + /** + * Indicates that this type has struct-like behavior, meaning it is always used as a whole. + * + * For example, if the value of property b of object obj is a1, and a1 is an instance of type T with structLike set to true, then when a1's properties change, the editor will simultaneously call obj.b = a1. + * + * The default is false. + */ + structLike?: boolean; + + /** + * Base class name. It must be a type in the typeRegistry. + */ + base?: string; + + /** + * An object that contains the initial values of the properties. + * + * This initial value only takes effect when the object is manually created from the UI. + */ + init?: any; + + /** + * Property definitions. + */ + properties: Array; + + /** + * Inspector for editing this type. + * + * Generally, this option does not need to be set, as the editor will automatically choose the appropriate control based on the type. However, in some cases, it may be necessary to forcefully specify it. + */ + inspector?: string; + + /** + * Whether it is an engine symbol. Default is false. + * + * In the language settings of the preferences, if "Do not translate engine symbols" is checked, types with this option set to true will not be localized. + */ + isEngineSymbol?: boolean; + + /** + * Whether it is an asset reference. Default is false. + */ + isAsset?: boolean; + + /** + * Effective when isAsset is true. Multiple asset types are separated by commas, such as "Image,Audio". Refer to IEditor.AssetType for available values. + */ + assetTypeFilter?: string; + + /** + * Effective when isAsset is true. When an instance of the asset is referenced by a field in the inspector, setting it to true allows the properties of the resource to be displayed inline. Similar to the display effect of materials. Default is false. + */ + allowInpectInline?: boolean; + + /** + * Applicable to Component, whether it is allowed to execute in the Editor. Default is false. + */ + runInEditor?: boolean; + + /** + * Applicable to Component, whether it is allowed to add this type of component multiple times to the same node. Default is false. + */ + allowMultipleComponent?: boolean; + + /** + * Applicable to Component, when AddComponent is used, it also adds dependent Components. + */ + requireComponents?: Array; + + /** + * Applicable to Component, when true, it hides the enable checkbox and disables the "Remove Component" menu item. + */ + noRemoveComponent?: boolean; + + /** + * Indicates whether this type belongs to 3D or 2D. For example, if it is a 3D type, it will not be displayed in the menu of a 2D scene. + * - 2d: 2D type. + * - 3d: 3D type. + * - gui: Editor GUI type. + * - null: No restrictions. + */ + worldType?: WorldType; + + /** + * If true, and the menu attribute is defined, this component will also appear in the new object menu of the hierarchy panel. + */ + inHierarchyMenu?: boolean; + + /** + * For use with Node and Component. When creating a new Node or adding a Component, automatically add the dependent engine libraries. For example: ["laya.physics3D"] + */ + requireEngineLibs?: Array; + + /** + * Catalog bar style. Use `Hidden` to hide the catalog bar. Default is `normal`. + * - `normal`: Normal style. + * - `hidden`: Hide the catalog bar. + * - `transparent`: Show the catalog bar without the background. + */ + catalogBarStyle?: CatalogBarStyle; + + /** + * A translation strings collection for localization of the captions. + */ + captionTranslation?: Record; + + /** + * A translation strings collection for localization of the tips. + */ + tipsTranslation?: Record; + + /** + * Additional options. The meaning of these options depends on the inspector used. + */ + options?: Record; + } + + export interface IPropertyButtonsOptions { + /** + * Whether to display the caption of property buttons. Default is "hidden". + */ + showCaption?: boolean | "normal" | "hidden" | "none"; + /** + * Alignment of the button list. Default is "left". + */ + align?: "left" | "center" | "right" | gui.AlignType; + /** + * Padding of the button list. The order is [top, right, bottom, left]. + */ + padding?: [number, number, number, number]; + /** + * Additional space between buttons. Default is 0. + */ + spacing?: number; + /** + * Button list. + */ + buttons: Array; + } + + export interface IPropertyButtonInfo { + /** + * Button name. + */ + name?: string; + + /** + * Button caption. If not provided, the name will be used. + * + * Use "i18n:<key>" or "i18n:<file-id>:<key>" to specify the key of the internationalization string. + */ + caption?: string; + + /** + * Button tips. + */ + tips?: string; + + /** + * If this is defined, a event with this name will be emitted when the button is clicked. + * + * The event is bubbling, and you can get the button object through event.initiator. + */ + event?: string; + + /** + * If this is defined, a scene script will be executed when the button is clicked. + * + * The script is executed by Editor.scene.runScript. + */ + runScript?: string; + + /** + * If this is defined, a node script will be executed when the button is clicked. + * + * The script is executed by Editor.scene.runnNodeScript. + */ + runNodeScript?: string; + + /** + * Bind a hotkey to the button. + */ + sceneHotkey?: string; + } + export interface ISceneEditor extends IEditorFrontEnd { + /** + * Data analysis support. + */ + readonly eventTracking: IEventTracking; + + /** + * Play controls. + */ + readonly playControls: IPlayControls; + + /** + * Save the current scene. + * @param forced Save even if the scene is not modified. + * @returns Returns true if the scene is saved successfully. Returns false if the scene is not saved. + */ + save(forced?: boolean): Promise; + + /** + * Save the current scene as a new file. + * @returns Returns true if the scene is saved successfully. Returns false if the scene is not saved. + */ + saveAs(): Promise; + + /** + * Save all scenes. + */ + saveAll(): void; + + /** + * Save all scenes with confirmation. + * @returns Returns true if all scenes are saved successfully. Returns false if any scene is not saved. + */ + queryToSaveAll(): Promise; + } + export interface IPlayControls extends gui.Widget { + /** + * An behavior of the play button. If true, the play button will play the current scene. If false, the play button will play the startup scene. + */ + playCurrentScene: boolean; + + /** + * Whether to use HTTPS when playing the scene. + */ + useHttps: boolean; + + /** + * The URL parameters to play the scene. + */ + readonly playParams: URLSearchParams; + + /** + * Starts playing the scene. + * @param currentOrStartup If true, play the current scene. If false, play the startup scene. + * @param player Where to play the scene. + * - "editor": Play the scene in the editor. + * - "browser": Play the scene in the browser. + * - "emulator": Play the scene in the emulator. + * @returns Returns true if the scene is played successfully. Returns false if the scene is not played. + */ + play(currentOrStartup: boolean, player?: "browser" | "editor" | "emulator"): boolean; + + /** + * Gets the URL to play the scene. + * @param currentOrStartup If true, get the URL to play the current scene. If false, get the URL to play the startup scene. + * @param additionParams Additional parameters to add to the URL. + * @param player The URL is for where to play the scene. Default is "browser". + * - "browser": Play the scene in the browser. + * - "game-view": Play the scene in the game view. + * - "emulator": Play the scene in the emulator. + * @returns Returns the URL to play the scene. + */ + getPlayURL(currentOrStartup?: boolean, additionParams?: Record, player?: "browser" | "editor" | "emulator"): string; + } + export class Dialog implements IDialog { + resizable: boolean; + modal: boolean; + closable: boolean; + frame: boolean; + transparent: boolean; + showType: "none" | "popup" | "dropdown"; + alwaysInFront: boolean; + readonly features: Record; + readonly id: string; + name: string; + saveBounds: boolean; + protected _win: Window; + protected _groot: gui.GRoot; + protected _modalWaitLayer: gui.Widget; + protected result: any; + private _contentPane; + private _popupOwner; + private _x; + private _y; + private _width; + private _height; + private _titleStr; + private _showing; + private _creatingWin; + private _blockLayer; + constructor(); + get contentPane(): T; + set contentPane(value: T); + get popupOwner(): gui.Widget; + get isShowing(): boolean; + create(): Promise; + show(popupOwner?: gui.Widget, ...args: any[]): Promise; + hide(): void; + getResult(): Promise; + dispose(): void; + private createWindow; + get title(): string; + set title(value: string); + get winX(): number; + get winY(): number; + get winWidth(): number; + get winHeight(): number; + setPos(x: number, y: number): void; + setSize(width: number, height: number): void; + protected showModalWait(msg?: string): void; + protected closeModalWait(): void; + protected setupModalLayer(color?: gui.Color, msg?: string): void; + private createModalLayer; + protected onInit(): void; + protected onShown(...args: any[]): void; + protected onHide(): void; + protected onAction(): void; + protected onCancel(): void; + protected handleKeyEvent(evt: gui.Event): void; + private fixXY; + private fixSize; + private fixResize; + } + + export class EditorPanel implements IEditorPanel { + panelOptions: IPanelOptions; + panelId: string; + protected _panel: gui.Widget; + protected _modalWaitLayer: gui.Widget; + create(): Promise; + get contentPane(): gui.Widget; + protected showModalWait(msg?: string): void; + protected closeModalWait(): void; + protected setupModalLayer(color?: gui.Color, msg?: string): void; + private createModalLayer; + onStart?(): void; + onUpdate?(): void; + onDestroy?(): void; + onSelectionChanged?(): void; + onSceneActivate?(scene: IMyScene): void; + onSceneDeactivate?(scene: IMyScene): void; + onHotkey?(combo: string): boolean; + onGlobalHotkey?(combo: string): boolean; + onSearch?(searchKey: string): void; + onExtensionReload?(): void; + } + + export class NodeRefInput extends gui.Label { + protected _c1: gui.Controller; + protected _value: IMyNode; + protected _editable: boolean; + protected _btnSelect: gui.Widget; + protected _titleObject: gui.Widget; + protected _typeFilter: string[]; + protected _prompText: string; + constructor(); + get value(): IMyNode; + set value(value: IMyNode); + get typeName(): string; + set typeName(value: string); + get typeFilter(): string[]; + set typeFilter(value: string[]); + setValue(data: any): Promise; + get editable(): boolean; + set editable(value: boolean); + private refresh; + onConstruct(): void; + private __focusIn; + private __focusOut; + private onDragOver; + private onDrop; + protected __click(evt: gui.Event): Promise; + private onHotkey; + private submit; + } + + export class NumericInput extends gui.Label { + /** + * Minimum value. Default is -Infinity. + */ + min: number; + /** + * Maximum value. Default is Infinity. + */ + max: number; + private _value; + private _holder; + private _lastHolderPos; + private _textField; + private _lastScroll; + private _fractionDigits; + private _step; + private _suffix; + private _prevTabStop; + private _savedText; + constructor(); + /** + * Number of decimal places. Default is 3; + */ + get fractionDigits(): number; + set fractionDigits(value: number); + /** + * The amount by which the value changes each time when changing the value by dragging. Default is 0.01. + * + * If fractionDigits is set, the step will be adjusted to 1 / 10 ^ fractionDigits if it is less than that value. + */ + get step(): number; + set step(value: number); + /** + * Whether the input is editable. Default is true. + */ + get editable(): boolean; + set editable(value: boolean); + /** + * The suffix of the number. Default is "". For example, if the suffix is "%", the displayed value will be "100%". + */ + get suffix(): string; + set suffix(value: string); + get value(): number; + set value(val: number); + get text(): string; + set text(value: string); + onConstruct(): void; + private __onKeydown; + private _holderDragStart; + private _holderDragEnd; + private _holderDragMove; + private __click; + private __focusIn; + private __focusOut; + private __onSubmit; + private __mouseWheel; + } + + export class NumericInputWithSlider extends gui.Label { + private _slider; + private _input; + constructor(); + get min(): number; + set min(value: number); + get max(): number; + set max(value: number); + get fractionDigits(): number; + set fractionDigits(value: number); + get step(): number; + set step(value: number); + get editable(): boolean; + set editable(value: boolean); + get suffix(): string; + set suffix(value: string); + get value(): number; + set value(value: number); + get text(): string; + set text(value: string); + onConstruct(): void; + } + + export class ResourceInput extends gui.Label { + protected _text: string; + protected _c1: gui.Controller; + protected _asset: IAssetInfo; + protected _editable: boolean; + protected _btnSelect: gui.Widget; + protected _typeFilter: Array; + protected _promtText: string; + protected _titleObject: gui.Widget; + /** + * Whether to allow internal assets. Default is true. + */ + allowInternalAssets: boolean; + /** + * Whether to allow internal GUI assets. Default is false. + */ + allowInternalGUIAssets: boolean; + /** + * The filter needs to be registered through EditorEnv.assetMgr.customAssetFilters. + */ + customFilter: string; + constructor(); + get text(): string; + set text(value: string); + private setAssetId; + get assetValue(): IAssetInfo; + set assetValue(value: IAssetInfo); + get editable(): boolean; + set editable(value: boolean); + /** + * Multiple asset types are separated by commas, such as "Image,Audio". Refer to IEditor.AssetType for available values. + */ + get typeFilter(): Array; + set typeFilter(value: Array); + hasTypeFilter(type: AssetType): boolean; + private refresh; + onConstruct(): void; + private __focusIn; + private __focusOut; + private onDragOver; + private onDrop; + protected __click(evt: gui.Event): void; + private onHotkey; + private submit; + } + + export class ColorInput extends gui.Widget { + private _colorValue; + private _color; + private _color2; + private _shapeColor; + private _shapeAlpha; + private _hasValue; + private _checkable; + /** + * Whether to hide the alpha channel. Default is false. + */ + hideAlpha: boolean; + constructor(); + /** + * The color value. The returned value is a reference to the internal object, so it is forbidden to modify it. + */ + get colorValue(): gui.Color; + set colorValue(value: gui.Color); + /** + * Show a check box to control whether the color value is null. Default is false. + */ + get checkable(): boolean; + set checkable(value: boolean); + /** + * Whether the null value check box is selected. + */ + get hasValue(): boolean; + set hasValue(value: boolean); + private drawColor; + onConstruct(): void; + private onClickShape; + } + + export class GradientInput extends gui.Widget { + private _gradientValue; + private _shape; + private _hasValue; + private _checkable; + constructor(); + get value(): GradientValue; + set value(value: GradientValue); + get checkable(): boolean; + set checkable(value: boolean); + get hasValue(): boolean; + set hasValue(value: boolean); + onConstruct(): void; + } + + export interface GradientRGBElement { + pos: number; + color: gui.Color; + } + export interface GradientAlphaElement { + pos: number; + alpha: number; + } + export class GradientValue { + mode: number; + rgbElements: Array; + rgbCount: number; + alphaElements: Array; + alphaCount: number; + maxColorNum: number; + maxAlphaNum: number; + constructor(); + toData(value?: any): any; + fromData(value: any): void; + initDefault(): void; + cloneTo(target: GradientValue): void; + } + + export class CurveInput extends gui.Widget { + private _canvas; + private _hasValue; + private _checkable; + private _points; + private _curPoints; + private _path; + curveMin: number; + curveMax: number; + maxValue: number; + minValue: number; + /** + * Whether to normalize the curve data + */ + isNormalization: boolean; + maxKeyFrame: number; + isCurve: boolean; + isWeight: boolean; + /** + * Whether to fill the key frame data according to the maximum key frame + */ + isAutoFillKeyFrame: boolean; + hideAlpha: boolean; + constructor(); + get checkable(): boolean; + set checkable(value: boolean); + get hasValue(): boolean; + set hasValue(value: boolean); + get points(): ReadonlyArray; + clearPoints(): void; + addPoint(): PathPoint; + setDefaultPoints(): void; + applyChange(): void; + private drawCurve; + onConstruct(): void; + } + + export enum TangentMode { + Free = 0, + Linear = 1, + Constant = 2 + } + export class PathPoint { + px: number; + py: number; + c0x: number; + c0y: number; + c1x: number; + c1y: number; + inTangent: number; + outTangent: number; + inWeight: number; + outWeight: number; + smooth: boolean; + inTangentMode: TangentMode; + outTangentMode: TangentMode; + cloneTo(pt: PathPoint): PathPoint; + setInTangentLinear(prev: PathPoint): void; + setOutTangentLinear(next: PathPoint): void; + makeSmooth(baseIn: boolean): void; + } + + export class EditableListItem extends ListItem { + toggleClickCount: number; + _input: ListItemInput; + _justGotFocus: boolean; + _titleObj: gui.TextField; + private _savedScrollPos; + constructor(); + get editable(): boolean; + set editable(value: boolean); + get textForEdit(): string; + set textForEdit(value: string); + get editWithoutFileExt(): boolean; + set editWithoutFileExt(value: boolean); + startEditing(): void; + cancelEditing(): void; + onConstruct(): void; + private onClickHandler; + getFullWidth(): number; + } + + export class EditableTreeItem extends EditableListItem { + } + + export class ListItem extends gui.Button { + private _selectionBar; + constructor(); + onConstruct(): void; + } + + export class ListItemInput extends gui.Label { + toggleClickCount: number; + textForEdit?: string; + editWithoutFileExt?: boolean; + private _c1; + private _input; + private _savedText; + private _savedFileExt; + private _prevTabStop; + constructor(); + get editable(): boolean; + set editable(value: boolean); + get editing(): boolean; + startEditing(): void; + cancelEditing(): void; + onConstruct(): void; + private onFocusInHandler; + private onClickHandler; + private onFocusOutHandler; + private onKeydown; + } + + export class TextInput extends gui.Label { + protected _savedText: string; + protected _textField: gui.TextInput; + protected _clear: gui.Widget; + protected _lang: gui.Widget; + protected _key: gui.TextField; + protected _textInfo: gui.I18nTextInfo; + get text(): string; + set text(value: string); + get editable(): boolean; + set editable(value: boolean); + onConstruct(): void; + private __keyDown; + private __focusIn; + private __focusOut; + private __textChanged; + private __clickClear; + private __clickLang; + private __clickLangRemove; + } + + export class TextArea extends gui.Label { + private _savedText; + private _textField; + private _lang; + private _key; + private _textInfo; + get editable(): boolean; + set editable(value: boolean); + get text(): string; + set text(value: string); + onConstruct(): void; + private __keyDown; + private __focusIn; + private __focusOut; + private __clickLang; + private __clickLangRemove; + } + + export class SearchInput extends TextInput { + resultList: gui.List; + onConstruct(): void; + } + + export class ModalProgress extends gui.Label { + titleObj: gui.TextField; + progressBar: gui.ProgressBar; + cancelButton: gui.Button; + onConstruct(): void; + show(parent: gui.Widget): void; + } + + export class InspectorPanel extends gui.Widget { + private _tree; + private _inspectorHelper; + private _watchDatas; + private _history; + private _changes; + /** + * Whether to allow undo. If true, the history will be recorded and can be undone. + */ + allowUndo: boolean; + /** + * Whether to stop tracing data changes. If true, the data change notification will not be sent. + */ + stopTrace: boolean; + /** + * A delegate that is called when the data changes. + */ + readonly onDataChanged: IDelegate<(sender: any, datapath: string[], value: any, oldvalue: any) => void>; + constructor(); + /** + * Data history. It is used to record the data changes and can be undone. + */ + get history(): IDataHistory; + /** + * Clear all inspectors and reset the inspector panel. + */ + resetInspectors(): void; + /** + * Reset data to default values. This method will reset all inspectors to their default values. + */ + resetDefault(): void; + /** + * Add an inspector to the inspector panel. The inspector will be used to inspect the data. + * @param data The data to inspect. + * @param type The type of the data. It can be a string, a type descriptor, or a class which is registered using IEditor.regClass. + * @param options The options for the inspector. It can be used to set the catalog bar style, whether to show the catalog bar, etc. + */ + inspect(data: any, type: string | FTypeDescriptor | Function, options?: IInspectorOptions): void; + /** + * Get all inspectors. + * @returns An array of inspectors. + */ + getInspectors(): ReadonlyArray; + /** + * Scroll the panel to ensure the specified catalog is visible. + * @param catalog Catalog name. + */ + showCatalog(catalog: string): void; + private _onDataChanged; + private emitChanges; + private onHotkey; + } + + export enum FieldStatusFlags { + Hidden = 0, + Hidden_UserCall = 1, + Hidden_MultipleTypes = 2, + Hidden_MultipleObjects = 3, + Hidden_NullObject = 4, + Hidden_Tab = 5, + Readonly = 6, + Readonly2 = 7, + _Max = 8 + } + export class PropertyField extends gui.TreeNode implements IPropertyField { + inspector: IDataInspector; + objType: Readonly; + property: Readonly; + target: IInspectingTarget; + watchProps: Array; + memberProps: Array; + _inheritedFlag: number; + _flag: number; + _readonlyFlag: boolean; + _hotUpdateTime: number; + _statusKey: string; + _stayInvisible: boolean; + get parent(): IPropertyField; + create(): IPropertyFieldCreateResult; + makeReadonly(value: boolean): void; + refresh(): void; + getStatus(name: string): any; + setStatus(name: string, value: any): void; + setHidden(hidden: boolean): void; + onNativeDragOver?(evt: gui.Event): void; + onNativeDrop?(evt: gui.Event): void; + onResetData?(): void; + isFlagSet(flag: number): boolean; + findBrotherField(name: string): IPropertyField; + findChildField(name: string): IPropertyField; + getChildFields(result?: Array): Array; + displayError(msg: string): void; + } + + export class ButtonsField extends PropertyField { + protected list: gui.List; + private _hasHotkey; + create(): IPropertyFieldCreateResult; + protected addButton(info: string | IPropertyButtonInfo): gui.Widget; + private onClickButton; + private handleHotkey; + refresh(): void; + } + + export class VecField extends PropertyField { + protected _input: gui.Widget; + protected _inputs: Array; + protected _members: Array; + protected _axes: Array; + private _hasValue; + private _checkable; + create(res?: "Vec2Field" | "Vec3Field" | "Vec4Field"): IPropertyFieldCreateResult; + protected onSubmit(index: number, num: number): void; + refresh(): void; + } + export class Vec2Field extends VecField { + create(): IPropertyFieldCreateResult; + } + export class Vec3Field extends VecField { + create(): IPropertyFieldCreateResult; + } + export class Vec4Field extends VecField { + create(): IPropertyFieldCreateResult; + } + + export class DictionaryField extends PropertyField { + protected _input: gui.Widget; + protected _buttons: gui.Box; + protected _editModeButton: gui.Widget; + protected _showNewInput: gui.Controller; + protected _keyInput: TextInput; + private _readOnly; + private _elementProp; + private _elementCaptionFunc; + private _elementTipsFunc; + private _hideEditMode; + create(): IPropertyFieldCreateResult; + get elementPropTemplate(): FPropertyDescriptor; + getElementCaption(key: string): string; + getElementTips(key: string): string; + refresh(): void; + protected onClickEditMode(): void; + protected onShowAddInput(evt: gui.Event): void; + protected onClickAdd(evt: gui.Event): void; + private onClickDestroyDict; + } + + export class ArrayField extends PropertyField { + protected _input: gui.Widget; + protected _buttons: gui.Box; + protected _editModeButton: gui.Widget; + private _elementProp; + private _elementIsAsset; + private _elementAssetTypeFilter; + private _elementCaptionFunc; + private _elementTipsFunc; + private _editMode; + private _arrayActions; + private _hideEditMode; + private _insertingIndex; + create(): IPropertyFieldCreateResult; + get editMode(): number; + get elementPropTemplate(): FPropertyDescriptor; + getElementCaption(index: number): string; + getElementTips(index: number): string; + refresh(): void; + private onClickEditMode; + private changeEditMode; + private onClickAdd; + private onAdd; + onClickCreateInstance(typeName: string): void; + private onClickDestroyArray; + onNativeDragOver(evt: gui.Event): void; + onNativeDrop(evt: gui.Event): Promise; + } + + export class ObjectField extends PropertyField { + enabledButton: gui.Button; + includeProps: Array; + selfType: FTypeDescriptor; + selfTypeBase: FTypeDescriptor; + familyFields: Record; + defaultCatalogBarStyle: CatalogBarStyle; + protected _input: gui.Widget; + protected _buttons: gui.Box; + protected _actionButton: gui.Widget; + private _typeName; + private _isCatalog; + private _prefabNewAddedSign; + create(): IPropertyFieldCreateResult; + refresh(): void; + private onClickAction; + onClickCreateInstance(typeName: string): void; + onClickSetNull(): void; + setupCatalogBar(isComponent: boolean, removable?: boolean): void; + setCatalogBarStyle(style: CatalogBarStyle): void; + private getData; + private setData; + private resetData; + copyData(): void; + pasteData(): void; + resetComponentDefault(): Promise; + removeComponent(): void; + resetDefault(): void; + copyComponent(): void; + pasteComponent(): Promise; + } + + export class FileInspectorLayout implements IInspectorLayout { + protected _type: string | Function; + protected _assets: ReadonlyArray; + protected _components: Array; + /** + * Whether to eliminate default values. Default is false. If true, a value that is equal to the default value will not be written to the file. + */ + protected _eliminateDefaults: boolean; + constructor(type: string | Function); + accept(asset: IAssetInfo): boolean; + onApply(): Promise; + onRender(assets: ReadonlyArray, inspectors: IInspectorHelper, outTracables: Array): Promise; + protected readFile(asset: IAssetInfo): Promise; + protected writeFile(asset: IAssetInfo, dc: IDataComponent): Promise; + } + + export class MetaDataInspectorLayout implements IInspectorLayout { + protected _type: string | Function; + protected _assets: ReadonlyArray; + protected _components: Array; + protected _sectionName: string; + /** + * @param type The type of the data component. + * @param sectionName The name of the section in the meta file. Default is "importer", meaning that the import configuration of the asset. + */ + constructor(type: string | Function, sectionName?: string); + accept(asset: IAssetInfo): boolean; + onApply(): Promise; + onRender(assets: ReadonlyArray, inspectors: IInspectorHelper, outTracables: Array): Promise; + protected readMeta(asset: IAssetInfo): Promise; + protected writeMeta(asset: IAssetInfo, dc: IDataComponent): Promise; + } + + export class ResourceInspectorLayout implements IInspectorLayout { + accept(asset: IAssetInfo): boolean; + onRender(assets: ReadonlyArray, inspectors: IInspectorHelper): Promise; + } + + export class ServiceProvider implements IServiceProvider { + private _name; + private _handlers; + protected _listenPort: MessagePort; + protected _clients: Array; + protected _subscribedClients: Array; + constructor(name: string); + start(): Promise; + stop(): void; + get started(): boolean; + /** + * Get all clients. + */ + get clients(): ReadonlyArray; + private registerClient; + protected onNewClient(client: IMyMessagePort, ...args: any[]): Promise; + /** + * Register a handler for a channel. + * @param channel Channel name. + * @param func Handler function. + * @param thisArg This object of the handler function. + * @param passClientParam Whether to pass the client object as the first parameter to the handler function. + * @param noAwait If true, the handler function will not be awaited. Defaults to false. + */ + handle(channel: string, func: Function, thisArg?: any, passClientParam?: boolean, noAwait?: boolean): void; + /** + * Broadcast a message to all clients those have `subscribe` flag setted to true. + * @param channel Channel name. + * @param args Message arguments. + */ + notifyAll(channel: string, ...args: any[]): void; + } + + export class ShaderWatcher extends gui.Component { + private _shaderName; + private _shaderInfo; + private _asset; + private _assetVer; + private _assetId; + callback: () => void; + subscribe(shaderName: string): void; + unsubscribe(): void; + private setShaderInfo; + onDisable(): void; + onUpdate(): void; + } + + + /** + * The `DataWatcher` class is used to monitor changes to the specified object. + */ + const DataWatcher: typeof IDataWatcher; + + /** + * The `DataHistory` class is used to manage the history of the specified object. + * + * It is used to implement undo and redo functionality. When the data changes, call the addChange method to add a new history record, and then you can use the undo and redo methods to perform undo and redo operations. + * @param versionTracker The version tracker. It is optional. + * @param maxItems The maximum number of items to store in the history. Defaults to 100. + */ + const DataHistory: new (versionTracker?: IVersionTracker, maxItems?: number) => IDataHistory; + + /** + * The `ClassRegistry` class is used to register class names and class mappings. + */ + const ClassRegistry: typeof IClassRegistry; + + /** + * The `ListHelper` class is used to help manage lists. + * @param list The list to manage. + * @param indexColumn The column name of the index. + */ + const ListHelper: new (list: gui.List, indexColumn?: string) => IListHelper; + + /** + * The `ListInsertionHelper` class is used to help insert items into the list. + * + * This class can highlight the insertion position when a scene node or asset is dragged and dropped into the list, + * and emit notification events after the drag-and-drop operation is completed. + * @param owner The owner of the list. + * @param transferType The type of the item to be inserted. e.g. "node", "asset", etc. + * @returns The helper object. + */ + const ListInsertionHelper: new (owner: gui.List, transferType: string) => IListInsertionHelper; + + /** + * The `DataInspector` class is used to inspect the data of the specified type. + * @param outputType The type of the data to inspect. + * @param widgetItem The widget type used for each row in the interface, usually not needed unless there are customization requirements. + * @returns The inspector object. + */ + const DataInspector: new (outputType: string, widgetItem?: string) => IDataInspector; + + /** + * The `InspectorHelper` class is used to help create inspector interfaces. + */ + const InspectorHelper: new () => IInspectorHelper; + + /** + * The `Menu` class is used to create custom menu items. + */ + const Menu: typeof MenuStatic; + + /** + * The `Webview` class is used to create a webview. + * + * A webview is a web page embedded in the editor, which can be used to display web pages. + * + * The webview runs in a separate process, and this class encapsulates a series of communication methods for ease of use. + * + * @param backgroundThrottling Whether to enable background throttling. Defaults to true. + * @param nodeintegration Whether to enable node integration. Defaults to false. + */ + const Webview: new (backgroundThrottling?: boolean, nodeintegration?: boolean) => IWebview; + + /** + * The `WebIFrame` class is used to create an iframe. + * + * An iframe is an inline frame that can be used to embed another document within the current HTML document. + */ + const WebIFrame: new () => IWebIFrame; + + /** + * The `Conf` class is used to read and write configuration files. + * @param path The path to the configuration file. The path is the absolute path. + * @param fileName The name of the configuration file. + */ + const Conf: new (path: string, fileName?: string) => IConf; + + /** + * The `Delegate` class is used to create a delegate object. + * + * It can be used to manage multiple callback functions and call them in sequence. + */ + const Delegate: new any>() => IDelegate; + + /** + * The `MyMessagePort` class is used to create a message port object. + * + * A message port is a communication channel that allows two different processes to communicate with each other. + * @param port The native message port. + * @param queueTask Whether to queue the task. If true, the received messages will be queued and processed sequentially. Defaults to false. + * @see IMyMessagePort + * @see MyMessagePortStatic + */ + const MyMessagePort: (new (port: MessagePort, queueTask?: boolean) => IMyMessagePort) & typeof MyMessagePortStatic; + + /** + * The `ZipFileW` class is used to create a writable zip file. + * @param basePath The base path of the zip file. + * @see IZipFileW + */ + const ZipFileW: new (basePath: string) => IZipFileW; + + /** + * The `ZipFileR` class is used to create a readable zip file. + * @see IZipFileR + */ + const ZipFileR: new () => IZipFileR; + + /** + * The `InspectorItem` class is used to create an inspector item. + */ + const InspectorItem: new () => gui.Button; + + /** + * The `AssetStoreTools` class is used to manage asset store tools. + */ + const AssetStoreTools: typeof IAssetStoreTools; + + /** + * The `EventTracking` class is used to track events. + * @param appId The application ID. + * @param pageShow Whether to track the page show event. Defaults to true. + * @param pageHide Whether to track the page hide event. Defaults to true. + * @param showLog Whether to show log information. Defaults to false. + */ + const EventTracking: new (appId: string, pageShow?: boolean, pageHide?: boolean, showLog?: boolean) => IEventTracking; + + /** + * The `AbortToken` class is used to create an abort token. + * Abort tokens are used to cancel asynchronous operations. + * @see IAbortToken + */ + const AbortToken: new () => IAbortToken; + + /** + * The `BuildTask` class is used to start a build task. + * @param platform The platform to build. e.g. "web", "android", "ios", etc. + * @param destPath The destination path of the build. Defaults to null. + */ + const BuildTask: { start(platform: string, destPath?: string): void }; + + /** + * The `DataComponent` class is used to create a data component. + * @param type The type of the data component. + * @param data The data of the component. + * @example + * ``` + * @IEditor.regClass() + * class TestDataComponent { + * private _name: string; + * + * @IEditor.property(String) + * get name() { + * return this._name; + * } + * + * set name(value: string) { + * console.log("Set name: " + value); + * this._name = value; + * } + * } + * + * let dc = new IEditor.DataComponent(TestDataComponent); + * dc.props.name = "Test"; //Output: Set name: Test + * ``` + */ + const DataComponent: new (type: string | Function, data?: any) => IDataComponent; + + /** + * The `InspectorRegistry` class is used to register inspector fields. + */ + const InspectorRegistry: typeof IInspectorRegistry; + + /** + * The `Render3DCanvas` class is a custom widget type for displaying 3D content which is rendered in the scene process and transferred to a canvas in the UI process. + */ + const Render3DCanvas: new () => IRender3DCanvas; + + /** + * The `SelectResourceDialog` class is used to create a dialog for selecting resources. + */ + const SelectResourceDialog: new () => ISelectResourceDialog; + + /** + * The `SelectNodeDialog` class is used to create a dialog for selecting nodes. + */ + const SelectNodeDialog: new () => ISelectNodeDialog; + + /** + * The `ColorPickerDialog` class is used to create a color picker dialog. + */ + const ColorPickerDialog: new () => IDialog; + + /** + * The `InputTextDialog` class is used to create a dialog for entering text. + * @example + * ``` + * let dialog = await Editor.getDialog(IEditor.InputTextDialog); + * await dialog.show(null, "title", "text"); + * let text = await dialog.getResult(); + * console.log(text); + * ``` + */ + const InputTextDialog: new () => IInputTextDialog; + + /** + * The `ChooseUploadTargetDialog` class is used to create a dialog for selecting the upload target. + */ + const ChooseUploadTargetDialog: new () => IDialog; + + /** + * The `QRCodeDialog` class is used to create a dialog for displaying a QR code. + */ + const QRCodeDialog: new () => IQRCodeDialog; + + /** + * The `AddModulesDialog` class is used to create a dialog for adding modules. + */ + const AddModulesDialog: new () => IAddModulesDialog; + /** + * The `utils` object provides various utility functions. + */ + const utils: ICryptoUtils & INativeTools & IUUIDUtils & IObjectUtils & IUtils & INetUtils & IDataUtils & ITemplateUtils & IPlist & ITypeParser; + + /** + * The `GUIUtils` object provides various GUI utility functions. + */ + const GUIUtils: IGUIUtils; + + /** + * The `SerializeUtil` class is used to serialize and deserialize objects. + */ + const SerializeUtil: typeof ISerializeUtil; + + /** + * The `RelectUtils` class is used to manage metadata. + */ + const ReflectUtils: typeof IReflectUtils; + + /** + * References a commonjs module. You can import built-in Node.js modules such as: path, fs, child_process, etc. + * The IDE also includes some third-party modules, including: electron, @svgdotjs, sharp, glob, qrcode, typescript, etc. + * @param id The identifier of the module. For example: "path", "fs", "electron", etc. + * @returns The module object. + */ + function require(id: string): any; + + /** + * Decorator function for registering a one-time initialization function. + * @example + * ``` + * class MyClass { + * @IEditor.onLoad + * static onLoad() { + * console.log("Initialization function called."); + * } + * } + * ``` + */ + function onLoad(target: Object, propertyName: string): void; + + /** + * Decorator function for registering a one-time cleanup function. + * @example + * ``` + * class MyClass { + * @IEditor.onUnload + * static onUnload() { + * console.log("Cleanup function called."); + * } + * } + * ``` + */ + function onUnload(target: Object, propertyName: string): void; + + /** + * Decorator function for registering a class. The registered class can be used to automatically generate the editor interface and can be used for serialization. + * @returns The class decorator function. + * @example + * ``` + * @IEditor.regClass() + * class MyClass { + * constructor() { + * console.log("Class created."); + * } + * } + * ``` + */ + function regClass(): Function; + + /** + * Decorator function for set class information. + * + * It needs to be used in conjunction with regClass. + * @param info The class information. + * @example + * ``` + * @IEditor.regClass() + * @IEditor.classInfo({ menu: "MenuItemName", icon: "editorResources/MyClass.svg" }) + * class MyClass { + * constructor() { + * console.log("Class created."); + * } + * } + * ``` + */ + function classInfo(info?: Partial): Function; + + /** + * Decorator function for registering a property. + * + * 'property' is the way a class exposes properties to the editor. The editor will generate the corresponding editor interface based on the type and configuration of the property. + * During serialization, the property will be serialized into the corresponding field. + * + * It needs to be used in conjunction with regClass. + * @param info The property information. + * @returns The property decorator function. + * @example + * ``` + * @IEditor.regClass() + * class MyClass { + * @IEditor.property({ type: Number, caption: "Number" }) + * num: number = 0; + * + * @IEditor.property(String) + * str: string = ""; + * + * @IEditor.property([Number]) + * arr: number[] = []; + * + * @IEditor.property(["Record", String]) + * map: Record = {}; + * + * @IEditor.property(AEnumClass) + * enum: AEnumClass = AEnumClass.A; + * + * @IEditor.property({ type: String, enumSource: ["A", "B", "C"] }) + * enumIndex: number = 0; + * + * @IEditor.property({ type: String, enumSource: [ { name: "A", value: "a" }, { name: "B", value: "b" } ] }) + * enumName: string = "a"; + * } + * ``` + */ + function property(info: FPropertyType | Function | Partial): Function; + + /** + * Decorator function for registering a field. + * + * A Field is the smallest organizational unit of the inspector interface. Each field is used for the input of one or multiple properties. It is usually displayed as a single line, but it can also be a complex custom interface. + * @param name The name of the field. The name is used to identify the field and is unique within the entire runtime. + * @returns The field decorator function. + * @example + * ``` + * //FieldExample.ts + * @IEditor.inspectorField("com.example.MyField") + * class MyField extends PropertyField { + * create() { + * let ui = IEditor.GUIUtils.createTextInput(); + * ui.on("submit", () => { + * this.target.setValue(ui.text); + * }); + * return { ui }; + * } + * + * refresh() { + * this.ui.text = this.target.getValue(); + * } + * } + * ``` + * + * ``` + * //MyScript.ts + * @Laya.regClass() + * export class MyScript extends Laya.Script { + * @IEditor.property({ type: String, inspector: "com.example.MyField" }) + * text: string; + * } + * ``` + */ + function inspectorField(name: string): (func: new () => PropertyField) => void; + + /** + * Decorator function for registering a inspector layout. + * + * An inspector layout is a management class responsible for reading data and organizing the rendering of the Inspector interface. + * And it has an optional implementation of the onApply method, which is used to perform some actions when applied, such as saving data. + * @param type The type of the target,e.g. "node", "asset". + * @param displayOrder The display order of the layout. The smaller the value, The display position is more forward. Defaults to 100. + * @returns The layout decorator function. + * @example + * ``` + * @IEditor.regClass() + * class DataType { + * @IEditor.property(String) + * name: string = ""; + * + * @IEditor.property(Number) + * age: number = 18; + * + * @IEditor.property(Number) + * gender: number = 1; + * } + * + * @IEditor.inspectorLayout("asset") + * export class DemoInspectorLayout extends IEditor.ResourceInspectorLayout { + * constructor() { + * super(DataType); + * } + * + * accept(asset: IEditor.IAssetInfo) { + * return asset.ext == "abc"; + * } + * } + * ``` + */ + function inspectorLayout(type: string, displayOrder?: number): (func: new () => IInspectorLayout) => void; + + /** + * Decorator function for registering a panel. + * + * A panel is a floating window that can be docked in the editor interface. + * @param id The identifier of the panel. The identifier is used to identify the panel and is unique within the entire runtime. + * @param options The options for the panel. + * @returns The panel decorator function. + * @example + * ``` + * @IEditor.panel("com.example.MyPanel", { title: "My Panel", icon: "editorResources/MyPanel.svg" }) + * class MyPanel extends EditorPanel { + * create() { + * this._panel = IEditor.GUIUtils.createInspectorPanel(); + * this._panel.inspect({}, DataType); + * } + * } + * ``` + */ + function panel(id: string, options?: IPanelOptions): (func: new () => EditorPanel) => void; + + /** + * Decorator function for registering a menu. + * @param name menu item name of path. Paths are separated by "/", "App/tool/test" represents the test item under the tool submenu of the App menu. + * + * Note that the path here uses IDs, not the text displayed in the menu. All menu names and their submenus supported by the editor can be printed out for reference using the menu Developer > Print All Menu IDs. + * + * i18n is supported in the menu name, and the format is `i18n:xxx`, where `xxx` is the key of the i18n string. + * e.g. `App/tool/i18n:module:test`. + * Note that a string with or without `i18n:` prefix is treated as the same menu item name. + * e.g. `App/tool/i18n:module:group/a` and `App/tool/group/a:` will be in the same submenu. + * @param options The options for the menu. + * @returns The menu decorator function. + * @example + * ``` + * @IEditor.menu("App/tool/test") + * function onTest() { + * console.log("Test menu item clicked."); + * } + * ``` + */ + function menu(name: string, options?: ICustomMenuItemOptions): Function; + } + + /** + * Editor is a global object used to access various functions of the editor. + */ + var Editor: IEditor.IEditorSingleton; + var SceneEditor: IEditor.ISceneEditor; + + /** + * The `i18n` object is a global object used to access the multilingual module. + */ + var i18n: IEditor.ILanguageModule; +} diff --git a/shudu/engine/types/glsl.d.ts b/shudu/engine/types/glsl.d.ts new file mode 100644 index 0000000..cc460af --- /dev/null +++ b/shudu/engine/types/glsl.d.ts @@ -0,0 +1,19 @@ +declare module '*.glsl' { + const value: string + export default value +} + +declare module '*.vs' { + const value: string + export default value +} + +declare module '*.fs' { + const value: string + export default value +} + +declare module '*.wgsl' { + const value: string + export default value +} \ No newline at end of file diff --git a/shudu/engine/types/layaAir.minigame.d.ts b/shudu/engine/types/layaAir.minigame.d.ts new file mode 100644 index 0000000..5292b83 --- /dev/null +++ b/shudu/engine/types/layaAir.minigame.d.ts @@ -0,0 +1,1320 @@ +declare module laya.wx.mini { + class MiniAdpter { + /**@private 包装对象**/ + static EnvConfig: any; + /**@private **/ + /**全局window对象**/ + static window: any; + /**@private **/ + private static _preCreateElement; + /**@private 适配库是否初始化**/ + private static _inited; + /**@private 获取手机系统信息**/ + static systemInfo: any; + /**@private 是否是子域,默认为false**/ + static isZiYu: boolean; + /**@private 是否需要在主域中自动将加载的文本数据自动传递到子域,默认 false**/ + static isPosMsgYu: boolean; + /**是否自动缓存下载的图片跟声音文件,默认为true**/ + static autoCacheFile: boolean; + /**缓存容量满时每次清理容量值,默认每次清理5M**/ + static minClearSize: number; + /** 最大缓存 */ + static sizeLimit: number; + /**本地资源列表**/ + static nativefiles: any[]; + /** 本地zip资源列表 **/ + static nativezipfiles: any[]; + /**zip资源外网请求头*/ + static zipRequestHead: string; + /**zip请求头和本地路径映射表*/ + static zipHeadFiles: any; + /**本地分包资源表**/ + static subNativeFiles: any; + /**本地分包文件目录数组**/ + static subNativeheads: any[]; + /**本地分包文件目录映射表**/ + static subMaps: any[]; + /**@private 是否自动缓存非图片声音文件(这里要确保文件编码最好一致)**/ + static AutoCacheDownFile: boolean; + static preDownloadFiles: any; + /**@private **/ + static getJson(data: string): any; + /**激活微信小游戏适配器*/ + static enable(): void; + /** + * 初始化回调 + * @param isPosMsg 是否需要在主域中自动将加载的文本数据自动传递到子域,默认 false + * @param isSon 是否是子域,默认为false + */ + static init(isPosMsg?: boolean, isSon?: boolean): void; + /** + * 微信wasm适配加载 + * @param wasmFile 要加载的wasm文件 + * @returns + */ + private static _onMessage; + /** + * 获取url对应的encoding值 + * @param zipurl 压缩文件路径 + * @param nativeurl 压缩文件路径白名单路径 + * @param callBack 回调地址,返回参数{errCode,errMsg,wxData} errCode:0 解压成功 1解压失败 2 解压接口不存在;errMsg:报错信息;wxData:微信返回的数据信息 + * @param proCallBack 返回进度回调方法 + * @param isUpdateType 0 目录存在返回成功回调;1,覆盖;2增量更新 + * @return + */ + static loadZip( + zipurl: string, + nativeurl: string, + callBack: Handler, + proCallBack: Handler, + isUpdateType?: number, + ): void; + /** + * 下载zip包 + * @param zipurl 压缩文件路径 + * @param path 压缩文件路径 + * @param fs 文件系统实例 + * @param callBack 回调地址,返回参数{errCode,errMsg,wxData} errCode:0 解压成功 1解压失败 2 解压接口不存在;errMsg:报错信息;wxData:微信返回的数据信息 + * @param proCallBack 返回进度回调方法 + * @return + */ + static downZip( + zipurl: string, + path: string, + fs: any, + callBack: Handler, + proCallBack: Handler, + ): void; + /** + * 获取url对应的encoding值 + * @param url 文件路径 + * @param type 文件类型 + * @return + */ + static getUrlEncode(url: string, type: string): string; + /** + * 下载文件 + * @param fileUrl 文件地址(全路径) + * @param fileType 文件类型(image、text、json、xml、arraybuffer、sound、atlas、font) + * @param callBack 文件加载回调,回调内容[errorCode码(0成功,1失败,2加载进度) + * @param encoding 文件编码默认utf8,非图片文件加载需要设置相应的编码,二进制编码为空字符串 + */ + static downLoadFile( + fileUrl: string, + fileType?: string, + callBack?: Handler, + encoding?: string, + ): void; + /** + * 从本地删除文件 + * @param fileUrl 文件地址(全路径) + * @param callBack 回调处理,在存储图片时用到 + */ + static remove(fileUrl: string, callBack?: Handler): void; + /** + * 清空缓存空间文件内容 + */ + static removeAll(): void; + /** + * 判断是否是4M包文件 + * @param fileUrl 文件地址(全路径) + * @return + */ + static hasNativeFile(fileUrl: string): boolean; + /** + * 判断缓存里是否存在文件 + * @param fileUrl 文件地址(全路径) + * @return + */ + static getFileInfo(fileUrl: string): any; + /** + * 获取缓存文件列表 + * @return + */ + static getFileList(): any; + /**@private 退出小游戏**/ + static exitMiniProgram(): void; + /**@private **/ + private static onMkdirCallBack; + /**@private 设备像素比。*/ + static pixelRatio(): number; + /** + * @private + * 将字符串解析成 XML 对象。 + * @param value 需要解析的字符串。 + * @return js原生的XML对象。 + */ + private static parseXMLFromString; + /**@private **/ + private static idx; + /**@private **/ + static createElement(type: string): any; + /**@private **/ + private static onCreateInput; + /**@private **/ + static createShaderCondition(conditionScript: string): Function; + /** + * 传递图集url地址到 + * @param url 为绝对地址 + */ + static sendAtlasToOpenDataContext(url: string): void; + private static postInfoToContext; + /** + * 发送单张图片到开放数据域 + * @param url + */ + static sendSinglePicToOpenDataContext(url: string): void; + /** + * 传递json配置数据到开放数据域 + * @param url 为绝对地址 + */ + static sendJsonDataToDataContext(url: string): void; + } +} + +declare module laya.tt.mini { + class TTMiniAdapter { + static IGNORE: RegExp; + static safeEncodeURI: (str: string) => string; + /**@private 包装对象**/ + static EnvConfig: any; + /**@private **/ + /**全局window对象**/ + static window: any; + /**@private **/ + private static _preCreateElement; + /**@private 适配库是否初始化**/ + private static _inited; + /**@private 获取手机系统信息**/ + static systemInfo: any; + /**@private 是否是子域,默认为false**/ + static isZiYu: boolean; + /**@private 是否需要在主域中自动将加载的文本数据自动传递到子域,默认 false**/ + static isPosMsgYu: boolean; + /**是否自动缓存下载的图片跟声音文件,默认为true**/ + static autoCacheFile: boolean; + /**缓存容量满时每次清理容量值,默认每次清理5M**/ + static minClearSize: number; + /** 最大缓存 */ + static sizeLimit: number; + /**本地资源列表**/ + static nativefiles: any[]; + /**本地分包资源表**/ + static subNativeFiles: any; + /**本地分包文件目录数组**/ + static subNativeheads: any[]; + /**本地分包文件目录映射表**/ + static subMaps: any[]; + /**@private 是否自动缓存非图片声音文件(这里要确保文件编码最好一致)**/ + static AutoCacheDownFile: boolean; + /** 开放域 */ + static openCtx: any; + /**@private **/ + static getJson(data: string): any; + /**激活微信小游戏适配器*/ + static enable(): void; + /** + * 初始化回调 + * @param isPosMsg 是否需要在主域中自动将加载的文本数据自动传递到子域,默认 false + * @param isSon 是否是子域,默认为false + */ + static init(isPosMsg?: boolean, isSon?: boolean): void; + /** + * 抖音的wasm适配加载 + * @param wasmFile 要加载的wasm文件 + * @returns + */ + private static _onMessage; + /** + * 获取url对应的encoding值 + * @param url 文件路径 + * @param type 文件类型 + * @return + */ + static getUrlEncode(url: string, type: string): string; + /** + * 下载文件 + * @param fileUrl 文件地址(全路径) + * @param fileType 文件类型(image、text、json、xml、arraybuffer、sound、atlas、font) + * @param callBack 文件加载回调,回调内容[errorCode码(0成功,1失败,2加载进度) + * @param encoding 文件编码默认utf8,非图片文件加载需要设置相应的编码,二进制编码为空字符串 + */ + static downLoadFile( + fileUrl: string, + fileType?: string, + callBack?: Handler, + encoding?: string, + ): void; + /** + * 从本地删除文件 + * @param fileUrl 文件地址(全路径) + * @param callBack 回调处理,在存储图片时用到 + */ + static remove(fileUrl: string, callBack?: Handler): void; + /** + * 清空缓存空间文件内容 + */ + static removeAll(): void; + /** + * 判断是否是4M包文件 + * @param fileUrl 文件地址(全路径) + * @return + */ + static hasNativeFile(fileUrl: string): boolean; + /** + * 判断缓存里是否存在文件 + * @param fileUrl 文件地址(全路径) + * @return + */ + static getFileInfo(fileUrl: string): any; + /** + * 获取缓存文件列表 + * @return + */ + static getFileList(): any; + /**@private 退出小游戏**/ + static exitMiniProgram(): void; + /**@private **/ + private static onMkdirCallBack; + /**@private 设备像素比。*/ + static pixelRatio(): number; + /** + * @private + * 将字符串解析成 XML 对象。 + * @param value 需要解析的字符串。 + * @return js原生的XML对象。 + */ + private static parseXMLFromString; + /**@private **/ + private static idx; + /**@private **/ + static createElement(type: string): any; + /**@private **/ + private static onCreateInput; + /**@private **/ + static createShaderCondition(conditionScript: string): Function; + /** + * 传递图集url地址到 + * @param url 为绝对地址 + */ + static sendAtlasToOpenDataContext(url: string): void; + private static postInfoToContext; + /** + * 发送单张图片到开放数据域 + * @param url + */ + static sendSinglePicToOpenDataContext(url: string): void; + /** + * 传递json配置数据到开放数据域 + * @param url 为绝对地址 + */ + static sendJsonDataToDataContext(url: string): void; + } +} + +declare module laya.ali.mini { + class ALIMiniAdapter { + /**@private 包装对象**/ + static EnvConfig: any; + /**@private **/ + /**全局window对象**/ + static window: any; + /**@private **/ + private static _preCreateElement; + /**@private 适配库是否初始化**/ + private static _inited; + /**@private 获取手机系统信息**/ + static systemInfo: any; + /**@private 是否是子域,默认为false**/ + static isZiYu: boolean; + /**@private 是否需要在主域中自动将加载的文本数据自动传递到子域,默认 false**/ + static isPosMsgYu: boolean; + /**是否自动缓存下载的图片跟声音文件,默认为true**/ + static autoCacheFile: boolean; + /**缓存容量满时每次清理容量值,默认每次清理5M**/ + static minClearSize: number; + /** 最大缓存 */ + static sizeLimit: number; + /**本地资源列表**/ + static nativefiles: any[]; + /** 本地zip资源列表 **/ + static nativezipfiles: any[]; + /**zip资源外网请求头*/ + static zipRequestHead: string; + /**zip请求头和本地路径映射表*/ + static zipHeadFiles: any; + /**本地分包资源表**/ + static subNativeFiles: any; + /**本地分包文件目录数组**/ + static subNativeheads: any[]; + /**本地分包文件目录映射表**/ + static subMaps: any[]; + /**@private 是否自动缓存非图片声音文件(这里要确保文件编码最好一致)**/ + static AutoCacheDownFile: boolean; + /**@private **/ + static getJson(data: string): any; + /**激活微信小游戏适配器*/ + static enable(): void; + /** + * 初始化回调 + * @param isPosMsg 是否需要在主域中自动将加载的文本数据自动传递到子域,默认 false + * @param isSon 是否是子域,默认为false + */ + static init(isPosMsg?: boolean, isSon?: boolean): void; + /** + * 支付宝wasm适配加载 + * @param wasmFile 要加载的wasm文件 + * @returns + */ + static aliPayCreateRender(): any; + private static _onMessage; + /** + * 获取url对应的encoding值 + * @param zipurl 压缩文件路径 + * @param nativeurl 压缩文件路径白名单路径 + * @param callBack 回调地址,返回参数{errCode,errMsg,wxData} errCode:0 解压成功 1解压失败 2 解压接口不存在;errMsg:报错信息;wxData:微信返回的数据信息 + * @param proCallBack 返回进度回调方法 + * @param isUpdateType 0 目录存在返回成功回调;1,覆盖;2增量更新 + * @return + */ + static loadZip( + zipurl: string, + nativeurl: string, + callBack: Handler, + proCallBack: Handler, + isUpdateType?: number, + ): void; + /** + * 下载zip包 + * @param zipurl 压缩文件路径 + * @param path 压缩文件路径 + * @param fs 文件系统实例 + * @param callBack 回调地址,返回参数{errCode,errMsg,wxData} errCode:0 解压成功 1解压失败 2 解压接口不存在;errMsg:报错信息;wxData:微信返回的数据信息 + * @param proCallBack 返回进度回调方法 + * @return + */ + static downZip( + zipurl: string, + path: string, + fs: any, + callBack: Handler, + proCallBack: Handler, + ): void; + /** + * 获取url对应的encoding值 + * @param url 文件路径 + * @param type 文件类型 + * @return + */ + static getUrlEncode(url: string, type: string): string; + /** + * 下载文件 + * @param fileUrl 文件地址(全路径) + * @param fileType 文件类型(image、text、json、xml、arraybuffer、sound、atlas、font) + * @param callBack 文件加载回调,回调内容[errorCode码(0成功,1失败,2加载进度) + * @param encoding 文件编码默认utf8,非图片文件加载需要设置相应的编码,二进制编码为空字符串 + */ + static downLoadFile( + fileUrl: string, + fileType?: string, + callBack?: Handler, + encoding?: string, + ): void; + /** + * 从本地删除文件 + * @param fileUrl 文件地址(全路径) + * @param callBack 回调处理,在存储图片时用到 + */ + static remove(fileUrl: string, callBack?: Handler): void; + /** + * 清空缓存空间文件内容 + */ + static removeAll(): void; + /** + * 判断是否是4M包文件 + * @param fileUrl 文件地址(全路径) + * @return + */ + static hasNativeFile(fileUrl: string): boolean; + /** + * 判断缓存里是否存在文件 + * @param fileUrl 文件地址(全路径) + * @return + */ + static getFileInfo(fileUrl: string): any; + /** + * 获取缓存文件列表 + * @return + */ + static getFileList(): any; + /**@private **/ + private static onMkdirCallBack; + /**@private 设备像素比。*/ + static pixelRatio(): number; + /** + * @private + * 将字符串解析成 XML 对象。 + * @param value 需要解析的字符串。 + * @return js原生的XML对象。 + */ + private static parseXMLFromString; + /**@private **/ + private static idx; + /**@private **/ + static createElement(type: string): any; + /**@private **/ + private static onCreateInput; + /**@private **/ + static createShaderCondition(conditionScript: string): Function; + /** + * 传递图集url地址到 + * @param url 为绝对地址 + */ + static sendAtlasToOpenDataContext(url: string): void; + private static postInfoToContext; + /** + * 发送单张图片到开放数据域 + * @param url + */ + static sendSinglePicToOpenDataContext(url: string): void; + /** + * 传递json配置数据到开放数据域 + * @param url 为绝对地址 + */ + static sendJsonDataToDataContext(url: string): void; + } +} + +declare module laya.mi.mini { + class KGMiniAdapter { + static IGNORE: RegExp; + static safeEncodeURI: (str: string) => string; + /**@private 包装对象**/ + static EnvConfig: any; + /**@private **/ + /**全局window对象**/ + static window: any; + /**@private **/ + private static _preCreateElement; + /**@private 适配库是否初始化**/ + private static _inited; + /**@private 获取手机系统信息**/ + static systemInfo: any; + /**@private 是否是子域,默认为false**/ + static isZiYu: boolean; + /**@private 是否需要在主域中自动将加载的文本数据自动传递到子域,默认 false**/ + static isPosMsgYu: boolean; + /**是否自动缓存下载的图片跟声音文件,默认为true**/ + static autoCacheFile: boolean; + /**50M缓存容量满时每次清理容量值,默认每次清理5M**/ + static minClearSize: number; + /** 最大缓存 */ + static sizeLimit: number; + /**本地资源列表**/ + static nativefiles: any[]; + /**本地分包资源表**/ + static subNativeFiles: any; + /**本地分包文件目录数组**/ + static subNativeheads: any[]; + /**本地分包文件目录映射表**/ + static subMaps: any[]; + /**@private 是否自动缓存非图片声音文件(这里要确保文件编码最好一致)**/ + static AutoCacheDownFile: boolean; + /**@private **/ + static getJson(data: string): any; + /**激活微信小游戏适配器*/ + static enable(): void; + /** + * 初始化回调 + * @param isPosMsg 是否需要在主域中自动将加载的文本数据自动传递到子域,默认 false + * @param isSon 是否是子域,默认为false + */ + static init(isPosMsg?: boolean, isSon?: boolean): void; + /** + * XiaoMi快游戏的wasm适配加载 + * @param wasmFile 要加载的wasm文件 + * @returns + */ + private static _onMessage; + /** + * 获取url对应的encoding值 + * @param url 文件路径 + * @param type 文件类型 + * @return + */ + static getUrlEncode(url: string, type: string): string; + /** + * 下载文件 + * @param fileUrl 文件地址(全路径) + * @param fileType 文件类型(image、text、json、xml、arraybuffer、sound、atlas、font) + * @param callBack 文件加载回调,回调内容[errorCode码(0成功,1失败,2加载进度) + * @param encoding 文件编码默认utf8,非图片文件加载需要设置相应的编码,二进制编码为空字符串 + */ + static downLoadFile( + fileUrl: string, + fileType?: string, + callBack?: Handler, + encoding?: string, + ): void; + /** + * 从本地删除文件 + * @param fileUrl 文件地址(全路径) + * @param callBack 回调处理,在存储图片时用到 + */ + static remove(fileUrl: string, callBack?: Handler): void; + /** + * 清空缓存空间文件内容 + */ + static removeAll(): void; + /** + * 判断是否是4M包文件 + * @param fileUrl 文件地址(全路径) + * @return + */ + static hasNativeFile(fileUrl: string): boolean; + /** + * 判断缓存里是否存在文件 + * @param fileUrl 文件地址(全路径) + * @return + */ + static getFileInfo(fileUrl: string): any; + /** + * 获取缓存文件列表 + * @return + */ + static getFileList(): any; + /**@private 退出小游戏**/ + static exitMiniProgram(): void; + /**@private **/ + private static onMkdirCallBack; + /**@private 设备像素比。*/ + static pixelRatio(): number; + /** + * @private + * 将字符串解析成 XML 对象。 + * @param value 需要解析的字符串。 + * @return js原生的XML对象。 + */ + private static parseXMLFromString; + /**@private **/ + private static idx; + /**@private **/ + static createElement(type: string): any; + /**@private **/ + private static onCreateInput; + /**@private **/ + static createShaderCondition(conditionScript: string): Function; + /** + * 传递图集url地址到 + * @param url 为绝对地址 + */ + static sendAtlasToOpenDataContext(url: string): void; + private static postInfoToContext; + /** + * 发送单张图片到开放数据域 + * @param url + */ + static sendSinglePicToOpenDataContext(url: string): void; + /** + * 传递json配置数据到开放数据域 + * @param url 为绝对地址 + */ + static sendJsonDataToDataContext(url: string): void; + } +} + +declare module laya.vv.mini { + class VVMiniAdapter { + static IGNORE: RegExp; + static safeEncodeURI: (str: string) => string; + /**@private 包装对象**/ + static EnvConfig: any; + /**@private **/ + /**全局window对象**/ + static window: any; + /**@private **/ + private static _preCreateElement; + /**@private 适配库是否初始化**/ + private static _inited; + /**@private 获取手机系统信息**/ + static systemInfo: any; + /**@private 是否是子域,默认为false**/ + static isZiYu: boolean; + /**@private 是否需要在主域中自动将加载的文本数据自动传递到子域,默认 false**/ + static isPosMsgYu: boolean; + /**是否自动缓存下载的图片跟声音文件,默认为true**/ + static autoCacheFile: boolean; + /**50M缓存容量满时每次清理容量值,默认每次清理5M**/ + static minClearSize: number; + /** 最大缓存 */ + static sizeLimit: number; + /**本地资源列表**/ + static nativefiles: any[]; + /**本地分包资源表**/ + static subNativeFiles: any; + /**本地分包文件目录数组**/ + static subNativeheads: any[]; + /**本地分包文件目录映射表**/ + static subMaps: any[]; + /**@private 是否自动缓存非图片声音文件(这里要确保文件编码最好一致)**/ + static AutoCacheDownFile: boolean; + /**@private **/ + static getJson(data: string): any; + /**激活微信小游戏适配器*/ + static enable(): void; + /** + * 初始化回调 + * @param isPosMsg 是否需要在主域中自动将加载的文本数据自动传递到子域,默认 false + * @param isSon 是否是子域,默认为false + */ + static init(isPosMsg?: boolean, isSon?: boolean): void; + /** + * ViVOminigame的wasm适配加载 + * @param wasmFile 要加载的wasm文件 + * @returns + */ + private static _onMessage; + /** + * 获取url对应的encoding值 + * @param url 文件路径 + * @param type 文件类型 + * @return + */ + static getUrlEncode(url: string, type: string): string; + /** + * 下载文件 + * @param fileUrl 文件地址(全路径) + * @param fileType 文件类型(image、text、json、xml、arraybuffer、sound、atlas、font) + * @param callBack 文件加载回调,回调内容[errorCode码(0成功,1失败,2加载进度) + * @param encoding 文件编码默认utf8,非图片文件加载需要设置相应的编码,二进制编码为空字符串 + */ + static downLoadFile( + fileUrl: string, + fileType?: string, + callBack?: Handler, + encoding?: string, + ): void; + /** + * 从本地删除文件 + * @param fileUrl 文件地址(全路径) + * @param callBack 回调处理,在存储图片时用到 + */ + static remove(fileUrl: string, callBack?: Handler): void; + /** + * 清空缓存空间文件内容 + */ + static removeAll(): void; + /** + * 判断是否是4M包文件 + * @param fileUrl 文件地址(全路径) + * @return + */ + static hasNativeFile(fileUrl: string): boolean; + /** + * 判断缓存里是否存在文件 + * @param fileUrl 文件地址(全路径) + * @return + */ + static getFileInfo(fileUrl: string): any; + /** + * 获取缓存文件列表 + * @return + */ + static getFileList(): any; + /**@private 退出小游戏**/ + static exitMiniProgram(): void; + /**@private **/ + private static onMkdirCallBack; + /**@private 设备像素比。*/ + static pixelRatio(): number; + /** + * @private + * 将字符串解析成 XML 对象。 + * @param value 需要解析的字符串。 + * @return js原生的XML对象。 + */ + private static parseXMLFromString; + /**@private **/ + private static idx; + /**@private **/ + static createElement(type: string): any; + /**@private **/ + private static onCreateInput; + /**@private **/ + static createShaderCondition(conditionScript: string): Function; + /** + * 传递图集url地址到 + * @param url 为绝对地址 + */ + static sendAtlasToOpenDataContext(url: string): void; + private static postInfoToContext; + /** + * 发送单张图片到开放数据域 + * @param url + */ + static sendSinglePicToOpenDataContext(url: string): void; + /** + * 传递json配置数据到开放数据域 + * @param url 为绝对地址 + */ + static sendJsonDataToDataContext(url: string): void; + } +} + +declare module laya.qg.mini { + class QGMiniAdapter { + static IGNORE: RegExp; + static safeEncodeURI: (str: string) => string; + /**@private 包装对象**/ + static EnvConfig: any; + /**@private **/ + /**全局window对象**/ + static window: any; + /**@private **/ + private static _preCreateElement; + /**@private 适配库是否初始化**/ + private static _inited; + /**@private 获取手机系统信息**/ + static systemInfo: any; + /**@private 是否是子域,默认为false**/ + static isZiYu: boolean; + /**@private 是否需要在主域中自动将加载的文本数据自动传递到子域,默认 false**/ + static isPosMsgYu: boolean; + /**是否自动缓存下载的图片跟声音文件,默认为true**/ + static autoCacheFile: boolean; + /**50M缓存容量满时每次清理容量值,默认每次清理5M**/ + static minClearSize: number; + /** 最大缓存 */ + static sizeLimit: number; + /**本地资源列表**/ + static nativefiles: any[]; + /**本地分包资源表**/ + static subNativeFiles: any; + /**本地分包文件目录数组**/ + static subNativeheads: any[]; + /**本地分包文件目录映射表**/ + static subMaps: any[]; + /**@private 是否自动缓存非图片声音文件(这里要确保文件编码最好一致)**/ + static AutoCacheDownFile: boolean; + /**@private **/ + static getJson(data: string): any; + /**激活微信小游戏适配器*/ + static enable(): void; + /** + * 初始化回调 + * @param isPosMsg 是否需要在主域中自动将加载的文本数据自动传递到子域,默认 false + * @param isSon 是否是子域,默认为false + */ + static init(isPosMsg?: boolean, isSon?: boolean): void; + /** + * OPPOMiniGame的wasm适配加载 + * @param wasmFile 要加载的wasm文件 + * @returns + */ + private static _onMessage; + /** + * 获取url对应的encoding值 + * @param url 文件路径 + * @param type 文件类型 + * @return + */ + static getUrlEncode(url: string, type: string): string; + /** + * 下载文件 + * @param fileUrl 文件地址(全路径) + * @param fileType 文件类型(image、text、json、xml、arraybuffer、sound、atlas、font) + * @param callBack 文件加载回调,回调内容[errorCode码(0成功,1失败,2加载进度) + * @param encoding 文件编码默认utf8,非图片文件加载需要设置相应的编码,二进制编码为空字符串 + */ + static downLoadFile( + fileUrl: string, + fileType?: string, + callBack?: Handler, + encoding?: string, + ): void; + /** + * 从本地删除文件 + * @param fileUrl 文件地址(全路径) + * @param callBack 回调处理,在存储图片时用到 + */ + static remove(fileUrl: string, callBack?: Handler): void; + /** + * 清空缓存空间文件内容 + */ + static removeAll(): void; + /** + * 判断是否是4M包文件 + * @param fileUrl 文件地址(全路径) + * @return + */ + static hasNativeFile(fileUrl: string): boolean; + /** + * 判断缓存里是否存在文件 + * @param fileUrl 文件地址(全路径) + * @return + */ + static getFileInfo(fileUrl: string): any; + /** + * 获取缓存文件列表 + * @return + */ + static getFileList(): any; + /**@private 退出小游戏**/ + static exitMiniProgram(): void; + /**@private **/ + private static onMkdirCallBack; + /**@private 设备像素比。*/ + static pixelRatio(): number; + /** + * @private + * 将字符串解析成 XML 对象。 + * @param value 需要解析的字符串。 + * @return js原生的XML对象。 + */ + private static parseXMLFromString; + /**@private **/ + private static idx; + /**@private **/ + static createElement(type: string): any; + /**@private **/ + private static onCreateInput; + /**@private **/ + static createShaderCondition(conditionScript: string): Function; + /** + * 传递图集url地址到 + * @param url 为绝对地址 + */ + static sendAtlasToOpenDataContext(url: string): void; + private static postInfoToContext; + /** + * 发送单张图片到开放数据域 + * @param url + */ + static sendSinglePicToOpenDataContext(url: string): void; + /** + * 传递json配置数据到开放数据域 + * @param url 为绝对地址 + */ + static sendJsonDataToDataContext(url: string): void; + } +} + +declare module laya.tb.mini { + class TBMiniAdapter { + static IGNORE: RegExp; + static safeEncodeURI: (str: string) => string; + /**@private 包装对象**/ + static EnvConfig: any; + /**@private **/ + /**全局window对象**/ + static window: any; + /**@private **/ + private static _preCreateElement; + /**@private 适配库是否初始化**/ + private static _inited; + /**@private 获取手机系统信息**/ + static systemInfo: any; + /**@private 是否是子域,默认为false**/ + static isZiYu: boolean; + /**@private 是否需要在主域中自动将加载的文本数据自动传递到子域,默认 false**/ + static isPosMsgYu: boolean; + /**是否自动缓存下载的图片跟声音文件,默认为true**/ + static autoCacheFile: boolean; + /**50M缓存容量满时每次清理容量值,默认每次清理5M**/ + static minClearSize: number; + /** 最大缓存 */ + static sizeLimit: number; + /**本地资源列表**/ + static nativefiles: any[]; + /** 本地zip资源列表 **/ + static nativezipfiles: any[]; + /**zip资源外网请求头*/ + static zipRequestHead: string; + /**zip请求头和本地路径映射表*/ + static zipHeadFiles: any; + /**本地分包资源表**/ + static subNativeFiles: any; + /**本地分包文件目录数组**/ + static subNativeheads: any[]; + /**本地分包文件目录映射表**/ + static subMaps: any[]; + /**@private 是否自动缓存非图片声音文件(这里要确保文件编码最好一致)**/ + static AutoCacheDownFile: boolean; + /** 项目所在的目录 默认的文件夹 */ + static baseDir: string; + /**@private **/ + static getJson(data: string): any; + /**激活微信小游戏适配器*/ + static enable(): void; + /** + * 初始化回调 + * @param isPosMsg 是否需要在主域中自动将加载的文本数据自动传递到子域,默认 false + * @param isSon 是否是子域,默认为false + */ + static init(isPosMsg?: boolean, isSon?: boolean): void; + static taobaoCreateRender(): any; + static _setVisibleStyle(): void; + static _setStyleBgColor(value: any): void; + static _setStyleInfo(mainCanv: any): void; + static _setStageStyle( + mainCanv: any, + canvasWidth: any, + canvasHeight: any, + mat: any, + ): void; + private static _onMessage; + /** + * 获取url对应的encoding值 + * @param zipurl 压缩文件路径 + * @param nativeurl 压缩文件路径白名单路径 + * @param callBack 回调地址,返回参数{errCode,errMsg,wxData} errCode:0 解压成功 1解压失败 2 解压接口不存在;errMsg:报错信息;wxData:微信返回的数据信息 + * @param proCallBack 返回进度回调方法 + * @param isUpdateType 0 目录存在返回成功回调;1,覆盖;2增量更新 + * @return + */ + static loadZip( + zipurl: string, + nativeurl: string, + callBack: Handler, + proCallBack: Handler, + isUpdateType?: number, + ): void; + /** + * 下载zip包 + * @param zipurl 压缩文件路径 + * @param path 压缩文件路径 + * @param fs 文件系统实例 + * @param callBack 回调地址,返回参数{errCode,errMsg,wxData} errCode:0 解压成功 1解压失败 2 解压接口不存在;errMsg:报错信息;wxData:微信返回的数据信息 + * @param proCallBack 返回进度回调方法 + * @return + */ + static downZip( + zipurl: string, + path: string, + fs: any, + callBack: Handler, + proCallBack: Handler, + ): void; + /** + * 获取url对应的encoding值 + * @param url 文件路径 + * @param type 文件类型 + * @return + */ + static getUrlEncode(url: string, type: string): string; + /** + * 下载文件 + * @param fileUrl 文件地址(全路径) + * @param fileType 文件类型(image、text、json、xml、arraybuffer、sound、atlas、font) + * @param callBack 文件加载回调,回调内容[errorCode码(0成功,1失败,2加载进度) + * @param encoding 文件编码默认utf8,非图片文件加载需要设置相应的编码,二进制编码为空字符串 + */ + static downLoadFile( + fileUrl: string, + fileType?: string, + callBack?: Handler, + encoding?: string, + ): void; + /** + * 从本地删除文件 + * @param fileUrl 文件地址(全路径) + * @param callBack 回调处理,在存储图片时用到 + */ + static remove(fileUrl: string, callBack?: Handler): void; + /** + * 清空缓存空间文件内容 + */ + static removeAll(): void; + /** + * 判断是否是4M包文件 + * @param fileUrl 文件地址(全路径) + * @return + */ + static hasNativeFile(fileUrl: string): boolean; + /** + * 判断缓存里是否存在文件 + * @param fileUrl 文件地址(全路径) + * @return + */ + static getFileInfo(fileUrl: string): any; + /** + * 获取缓存文件列表 + * @return + */ + static getFileList(): any; + /**@private 退出小游戏**/ + static exitMiniProgram(): void; + /**@private **/ + private static onMkdirCallBack; + /**@private 设备像素比。*/ + static pixelRatio(): number; + /** + * @private + * 将字符串解析成 XML 对象。 + * @param value 需要解析的字符串。 + * @return js原生的XML对象。 + */ + private static parseXMLFromString; + /**@private **/ + private static idx; + /**@private **/ + static createElement(type: string): any; + /**@private **/ + private static onCreateInput; + /**@private **/ + static createShaderCondition(conditionScript: string): Function; + } +} + +declare module laya.tb.plugin { + class TBMiniAdapter { + static IGNORE: RegExp; + static safeEncodeURI: (str: string) => string; + /**@private 包装对象**/ + static EnvConfig: any; + /**@private **/ + /**全局window对象**/ + static window: any; + /**@private **/ + private static _preCreateElement; + /**@private 适配库是否初始化**/ + private static _inited; + /**@private 获取手机系统信息**/ + static systemInfo: any; + /**@private 是否是子域,默认为false**/ + static isZiYu: boolean; + /**@private 是否需要在主域中自动将加载的文本数据自动传递到子域,默认 false**/ + static isPosMsgYu: boolean; + /**是否自动缓存下载的图片跟声音文件,默认为true**/ + static autoCacheFile: boolean; + /**50M缓存容量满时每次清理容量值,默认每次清理5M**/ + static minClearSize: number; + /** 最大缓存 */ + static sizeLimit: number; + /**本地资源列表**/ + static nativefiles: any[]; + /**本地分包资源表**/ + static subNativeFiles: any; + /**本地分包文件目录数组**/ + static subNativeheads: any[]; + /**本地分包文件目录映射表**/ + static subMaps: any[]; + /**@private 是否自动缓存非图片声音文件(这里要确保文件编码最好一致)**/ + static AutoCacheDownFile: boolean; + /** 项目所在的目录 默认的文件夹 */ + static baseDir: string; + /**@private **/ + static getJson(data: string): any; + /**激活微信小游戏适配器*/ + static enable(): void; + /** + * 初始化回调 + * @param isPosMsg 是否需要在主域中自动将加载的文本数据自动传递到子域,默认 false + * @param isSon 是否是子域,默认为false + */ + static init(isPosMsg?: boolean, isSon?: boolean): void; + static taobaoCreateRender(): any; + private static _onMessage; + /** + * 获取url对应的encoding值 + * @param url 文件路径 + * @param type 文件类型 + * @return + */ + static getUrlEncode(url: string, type: string): string; + /** + * 下载文件 + * @param fileUrl 文件地址(全路径) + * @param fileType 文件类型(image、text、json、xml、arraybuffer、sound、atlas、font) + * @param callBack 文件加载回调,回调内容[errorCode码(0成功,1失败,2加载进度) + * @param encoding 文件编码默认utf8,非图片文件加载需要设置相应的编码,二进制编码为空字符串 + */ + static downLoadFile( + fileUrl: string, + fileType?: string, + callBack?: Handler, + encoding?: string, + ): void; + /** + * 从本地删除文件 + * @param fileUrl 文件地址(全路径) + * @param callBack 回调处理,在存储图片时用到 + */ + static remove(fileUrl: string, callBack?: Handler): void; + /** + * 清空缓存空间文件内容 + */ + static removeAll(): void; + /** + * 判断是否是4M包文件 + * @param fileUrl 文件地址(全路径) + * @return + */ + static hasNativeFile(fileUrl: string): boolean; + /** + * 判断缓存里是否存在文件 + * @param fileUrl 文件地址(全路径) + * @return + */ + static getFileInfo(fileUrl: string): any; + /** + * 获取缓存文件列表 + * @return + */ + static getFileList(): any; + /**@private 退出小游戏**/ + static exitMiniProgram(): void; + /**@private **/ + private static onMkdirCallBack; + /**@private 设备像素比。*/ + static pixelRatio(): number; + /** + * @private + * 将字符串解析成 XML 对象。 + * @param value 需要解析的字符串。 + * @return js原生的XML对象。 + */ + private static parseXMLFromString; + /**@private **/ + private static idx; + /**@private **/ + static createElement(type: string): any; + /**@private **/ + private static onCreateInput; + /**@private **/ + static createShaderCondition(conditionScript: string): Function; + } +} + +declare module laya.tb.app { + class TBMiniAdapter { + static IGNORE: RegExp; + static safeEncodeURI: (str: string) => string; + /**@private 包装对象**/ + static EnvConfig: any; + /**@private **/ + /**全局window对象**/ + static window: any; + /**@private **/ + private static _preCreateElement; + /**@private 适配库是否初始化**/ + private static _inited; + /**@private 获取手机系统信息**/ + static systemInfo: any; + /**@private 是否是子域,默认为false**/ + static isZiYu: boolean; + /**@private 是否需要在主域中自动将加载的文本数据自动传递到子域,默认 false**/ + static isPosMsgYu: boolean; + /**是否自动缓存下载的图片跟声音文件,默认为true**/ + static autoCacheFile: boolean; + /**50M缓存容量满时每次清理容量值,默认每次清理5M**/ + static minClearSize: number; + /** 最大缓存 */ + static sizeLimit: number; + /**本地资源列表**/ + static nativefiles: any[]; + /**本地分包资源表**/ + static subNativeFiles: any; + /**本地分包文件目录数组**/ + static subNativeheads: any[]; + /**本地分包文件目录映射表**/ + static subMaps: any[]; + /**@private 是否自动缓存非图片声音文件(这里要确保文件编码最好一致)**/ + static AutoCacheDownFile: boolean; + /** 项目所在的目录 默认的文件夹 */ + static baseDir: string; + /**@private **/ + static getJson(data: string): any; + /**激活微信小游戏适配器*/ + static enable(): void; + /** + * 初始化回调 + * @param isPosMsg 是否需要在主域中自动将加载的文本数据自动传递到子域,默认 false + * @param isSon 是否是子域,默认为false + */ + static init(isPosMsg?: boolean, isSon?: boolean): void; + static taobaoCreateRender(): any; + private static _onMessage; + /** + * 获取url对应的encoding值 + * @param url 文件路径 + * @param type 文件类型 + * @return + */ + static getUrlEncode(url: string, type: string): string; + /** + * 下载文件 + * @param fileUrl 文件地址(全路径) + * @param fileType 文件类型(image、text、json、xml、arraybuffer、sound、atlas、font) + * @param callBack 文件加载回调,回调内容[errorCode码(0成功,1失败,2加载进度) + * @param encoding 文件编码默认utf8,非图片文件加载需要设置相应的编码,二进制编码为空字符串 + */ + static downLoadFile( + fileUrl: string, + fileType?: string, + callBack?: Handler, + encoding?: string, + ): void; + /** + * 从本地删除文件 + * @param fileUrl 文件地址(全路径) + * @param callBack 回调处理,在存储图片时用到 + */ + static remove(fileUrl: string, callBack?: Handler): void; + /** + * 清空缓存空间文件内容 + */ + static removeAll(): void; + /** + * 判断是否是4M包文件 + * @param fileUrl 文件地址(全路径) + * @return + */ + static hasNativeFile(fileUrl: string): boolean; + /** + * 判断缓存里是否存在文件 + * @param fileUrl 文件地址(全路径) + * @return + */ + static getFileInfo(fileUrl: string): any; + /** + * 获取缓存文件列表 + * @return + */ + static getFileList(): any; + /**@private 退出小游戏**/ + static exitMiniProgram(): void; + /**@private **/ + private static onMkdirCallBack; + /**@private 设备像素比。*/ + static pixelRatio(): number; + /** + * @private + * 将字符串解析成 XML 对象。 + * @param value 需要解析的字符串。 + * @return js原生的XML对象。 + */ + private static parseXMLFromString; + /**@private **/ + private static idx; + /**@private **/ + static createElement(type: string): any; + /**@private **/ + private static onCreateInput; + /**@private **/ + static createShaderCondition(conditionScript: string): Function; + } +} + +declare module Laya { + class MiniAdpter extends laya.wx.mini.MiniAdpter {} + class TTMiniAdapter extends laya.tt.mini.TTMiniAdapter {} + class ALIMiniAdapter extends laya.ali.mini.ALIMiniAdapter {} + class KGMiniAdapter extends laya.mi.mini.KGMiniAdapter {} + class VVMiniAdapter extends laya.vv.mini.VVMiniAdapter {} + class QGMiniAdapter extends laya.qg.mini.QGMiniAdapter {} + class TBMiniAdapter extends laya.tb.mini.TBMiniAdapter {} + class TBMiniAdapter extends laya.tb.plugin.TBMiniAdapter {} + class TBMiniAdapter extends laya.tb.plugin.TBMiniAdapter {} +} diff --git a/shudu/engine/types/spine.d.ts b/shudu/engine/types/spine.d.ts new file mode 100644 index 0000000..18cd1e9 --- /dev/null +++ b/shudu/engine/types/spine.d.ts @@ -0,0 +1,1269 @@ +// @ts-ignore +declare module spine { + class Animation { + name: string; + timelines: Array; + timelineIds: StringSet; + duration: number; + constructor(name: string, timelines: Array, duration: number); + setTimelines(timelines: Array): void; + hasTimeline(ids: string[]): boolean; + apply(skeleton: Skeleton, lastTime: number, time: number, loop: boolean, events: Array, alpha: number, blend: MixBlend, direction: MixDirection): void; + } + enum MixBlend { + setup = 0, + first = 1, + replace = 2, + add = 3 + } + enum MixDirection { + // @ts-ignore + mixIn = 0, + // @ts-ignore + mixOut = 1 + } + abstract class Timeline { + propertyIds: string[]; + frames: ArrayLike; + constructor(frameCount: number, propertyIds: string[]); + getPropertyIds(): string[]; + getFrameEntries(): number; + getFrameCount(): number; + getDuration(): number; + // @ts-ignore + abstract apply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection): void; + static search1(frames: ArrayLike, time: number): number; + static search(frames: ArrayLike, time: number, step: number): number; + } + interface BoneTimeline { + boneIndex: number; + } + interface SlotTimeline { + slotIndex: number; + } + abstract class CurveTimeline extends Timeline { + protected curves: ArrayLike; + constructor(frameCount: number, bezierCount: number, propertyIds: string[]); + setLinear(frame: number): void; + setStepped(frame: number): void; + shrink(bezierCount: number): void; + setBezier(bezier: number, frame: number, value: number, time1: number, value1: number, cx1: number, cy1: number, cx2: number, cy2: number, time2: number, value2: number): void; + getBezierValue(time: number, frameIndex: number, valueOffset: number, i: number): number; + } + abstract class CurveTimeline1 extends CurveTimeline { + constructor(frameCount: number, bezierCount: number, propertyId: string); + getFrameEntries(): number; + setFrame(frame: number, time: number, value: number): void; + getCurveValue(time: number): number; + } + abstract class CurveTimeline2 extends CurveTimeline { + constructor(frameCount: number, bezierCount: number, propertyId1: string, propertyId2: string); + getFrameEntries(): number; + setFrame(frame: number, time: number, value1: number, value2: number): void; + } + class RotateTimeline extends CurveTimeline1 implements BoneTimeline { + boneIndex: number; + constructor(frameCount: number, bezierCount: number, boneIndex: number); + apply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection): void; + } + class TranslateTimeline extends CurveTimeline2 implements BoneTimeline { + boneIndex: number; + constructor(frameCount: number, bezierCount: number, boneIndex: number); + apply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection): void; + } + class TranslateXTimeline extends CurveTimeline1 implements BoneTimeline { + boneIndex: number; + constructor(frameCount: number, bezierCount: number, boneIndex: number); + apply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection): void; + } + class TranslateYTimeline extends CurveTimeline1 implements BoneTimeline { + boneIndex: number; + constructor(frameCount: number, bezierCount: number, boneIndex: number); + apply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection): void; + } + class ScaleTimeline extends CurveTimeline2 implements BoneTimeline { + boneIndex: number; + constructor(frameCount: number, bezierCount: number, boneIndex: number); + apply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection): void; + } + class ScaleXTimeline extends CurveTimeline1 implements BoneTimeline { + boneIndex: number; + constructor(frameCount: number, bezierCount: number, boneIndex: number); + apply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection): void; + } + class ScaleYTimeline extends CurveTimeline1 implements BoneTimeline { + boneIndex: number; + constructor(frameCount: number, bezierCount: number, boneIndex: number); + apply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection): void; + } + class ShearTimeline extends CurveTimeline2 implements BoneTimeline { + boneIndex: number; + constructor(frameCount: number, bezierCount: number, boneIndex: number); + apply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection): void; + } + class ShearXTimeline extends CurveTimeline1 implements BoneTimeline { + boneIndex: number; + constructor(frameCount: number, bezierCount: number, boneIndex: number); + apply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection): void; + } + class ShearYTimeline extends CurveTimeline1 implements BoneTimeline { + boneIndex: number; + constructor(frameCount: number, bezierCount: number, boneIndex: number); + apply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection): void; + } + class RGBATimeline extends CurveTimeline implements SlotTimeline { + slotIndex: number; + constructor(frameCount: number, bezierCount: number, slotIndex: number); + getFrameEntries(): number; + setFrame(frame: number, time: number, r: number, g: number, b: number, a: number): void; + apply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection): void; + } + class RGBTimeline extends CurveTimeline implements SlotTimeline { + slotIndex: number; + constructor(frameCount: number, bezierCount: number, slotIndex: number); + getFrameEntries(): number; + setFrame(frame: number, time: number, r: number, g: number, b: number): void; + apply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection): void; + } + class AlphaTimeline extends CurveTimeline1 implements SlotTimeline { + slotIndex: number; + constructor(frameCount: number, bezierCount: number, slotIndex: number); + apply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection): void; + } + class RGBA2Timeline extends CurveTimeline implements SlotTimeline { + slotIndex: number; + constructor(frameCount: number, bezierCount: number, slotIndex: number); + getFrameEntries(): number; + setFrame(frame: number, time: number, r: number, g: number, b: number, a: number, r2: number, g2: number, b2: number): void; + apply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection): void; + } + class RGB2Timeline extends CurveTimeline implements SlotTimeline { + slotIndex: number; + constructor(frameCount: number, bezierCount: number, slotIndex: number); + getFrameEntries(): number; + setFrame(frame: number, time: number, r: number, g: number, b: number, r2: number, g2: number, b2: number): void; + apply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection): void; + } + class AttachmentTimeline extends Timeline implements SlotTimeline { + slotIndex: number; + attachmentNames: Array; + constructor(frameCount: number, slotIndex: number); + getFrameCount(): number; + setFrame(frame: number, time: number, attachmentName: string): void; + apply(skeleton: Skeleton, lastTime: number, time: number, events: Array, alpha: number, blend: MixBlend, direction: MixDirection): void; + setAttachment(skeleton: Skeleton, slot: Slot, attachmentName: string): void; + } + class DeformTimeline extends CurveTimeline implements SlotTimeline { + slotIndex: number; + attachment: VertexAttachment; + vertices: Array>; + constructor(frameCount: number, bezierCount: number, slotIndex: number, attachment: VertexAttachment); + getFrameCount(): number; + setFrame(frame: number, time: number, vertices: ArrayLike): void; + setBezier(bezier: number, frame: number, value: number, time1: number, value1: number, cx1: number, cy1: number, cx2: number, cy2: number, time2: number, value2: number): void; + getCurvePercent(time: number, frame: number): number; + apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Array, alpha: number, blend: MixBlend, direction: MixDirection): void; + } + class EventTimeline extends Timeline { + static propertyIds: string[]; + events: Array; + constructor(frameCount: number); + getFrameCount(): number; + setFrame(frame: number, event: Event): void; + apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Array, alpha: number, blend: MixBlend, direction: MixDirection): void; + } + class DrawOrderTimeline extends Timeline { + static propertyIds: string[]; + drawOrders: Array>; + constructor(frameCount: number); + getFrameCount(): number; + setFrame(frame: number, time: number, drawOrder: Array): void; + apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Array, alpha: number, blend: MixBlend, direction: MixDirection): void; + } + class IkConstraintTimeline extends CurveTimeline { + ikConstraintIndex: number; + constructor(frameCount: number, bezierCount: number, ikConstraintIndex: number); + getFrameEntries(): number; + setFrame(frame: number, time: number, mix: number, softness: number, bendDirection: number, compress: boolean, stretch: boolean): void; + apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Array, alpha: number, blend: MixBlend, direction: MixDirection): void; + } + class TransformConstraintTimeline extends CurveTimeline { + transformConstraintIndex: number; + constructor(frameCount: number, bezierCount: number, transformConstraintIndex: number); + getFrameEntries(): number; + setFrame(frame: number, time: number, mixRotate: number, mixX: number, mixY: number, mixScaleX: number, mixScaleY: number, mixShearY: number): void; + apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Array, alpha: number, blend: MixBlend, direction: MixDirection): void; + } + class PathConstraintPositionTimeline extends CurveTimeline1 { + pathConstraintIndex: number; + constructor(frameCount: number, bezierCount: number, pathConstraintIndex: number); + apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Array, alpha: number, blend: MixBlend, direction: MixDirection): void; + } + class PathConstraintSpacingTimeline extends CurveTimeline1 { + pathConstraintIndex: number; + constructor(frameCount: number, bezierCount: number, pathConstraintIndex: number); + apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Array, alpha: number, blend: MixBlend, direction: MixDirection): void; + } + class PathConstraintMixTimeline extends CurveTimeline { + pathConstraintIndex: number; + constructor(frameCount: number, bezierCount: number, pathConstraintIndex: number); + getFrameEntries(): number; + setFrame(frame: number, time: number, mixRotate: number, mixX: number, mixY: number): void; + apply(skeleton: Skeleton, lastTime: number, time: number, firedEvents: Array, alpha: number, blend: MixBlend, direction: MixDirection): void; + } +} +declare module spine { + class AnimationState { + private static emptyAnimation; + data: AnimationStateData; + tracks: TrackEntry[]; + timeScale: number; + unkeyedState: number; + events: Event[]; + listeners: AnimationStateListener[]; + queue: EventQueue; + propertyIDs: StringSet; + animationsChanged: boolean; + trackEntryPool: Pool; + constructor(data: AnimationStateData); + update(delta: number): void; + updateMixingFrom(to: TrackEntry, delta: number): boolean; + apply(skeleton: Skeleton): boolean; + applyMixingFrom(to: TrackEntry, skeleton: Skeleton, blend: MixBlend): number; + applyAttachmentTimeline(timeline: AttachmentTimeline, skeleton: Skeleton, time: number, blend: MixBlend, attachments: boolean): void; + setAttachment(skeleton: Skeleton, slot: Slot, attachmentName: string, attachments: boolean): void; + applyRotateTimeline(timeline: RotateTimeline, skeleton: Skeleton, time: number, alpha: number, blend: MixBlend, timelinesRotation: Array, i: number, firstFrame: boolean): void; + queueEvents(entry: TrackEntry, animationTime: number): void; + clearTracks(): void; + clearTrack(trackIndex: number): void; + setCurrent(index: number, current: TrackEntry, interrupt: boolean): void; + setAnimation(trackIndex: number, animationName: string, loop?: boolean): TrackEntry; + setAnimationWith(trackIndex: number, animation: Animation, loop?: boolean): TrackEntry; + addAnimation(trackIndex: number, animationName: string, loop?: boolean, delay?: number): TrackEntry; + addAnimationWith(trackIndex: number, animation: Animation, loop?: boolean, delay?: number): TrackEntry; + setEmptyAnimation(trackIndex: number, mixDuration?: number): TrackEntry; + addEmptyAnimation(trackIndex: number, mixDuration?: number, delay?: number): TrackEntry; + setEmptyAnimations(mixDuration?: number): void; + expandToIndex(index: number): TrackEntry; + trackEntry(trackIndex: number, animation: Animation, loop: boolean, last: TrackEntry): TrackEntry; + clearNext(entry: TrackEntry): void; + _animationsChanged(): void; + computeHold(entry: TrackEntry): void; + getCurrent(trackIndex: number): TrackEntry; + addListener(listener: AnimationStateListener): void; + removeListener(listener: AnimationStateListener): void; + clearListeners(): void; + clearListenerNotifications(): void; + } + class TrackEntry { + animation: Animation; + previous: TrackEntry; + next: TrackEntry; + mixingFrom: TrackEntry; + mixingTo: TrackEntry; + listener: AnimationStateListener; + trackIndex: number; + loop: boolean; + holdPrevious: boolean; + reverse: boolean; + eventThreshold: number; + attachmentThreshold: number; + drawOrderThreshold: number; + animationStart: number; + animationEnd: number; + animationLast: number; + nextAnimationLast: number; + delay: number; + trackTime: number; + trackLast: number; + nextTrackLast: number; + trackEnd: number; + timeScale: number; + alpha: number; + mixTime: number; + mixDuration: number; + interruptAlpha: number; + totalAlpha: number; + mixBlend: MixBlend; + timelineMode: number[]; + timelineHoldMix: TrackEntry[]; + timelinesRotation: number[]; + reset(): void; + getAnimationTime(): number; + setAnimationLast(animationLast: number): void; + isComplete(): boolean; + resetRotationDirections(): void; + getTrackComplete(): number; + } + class EventQueue { + objects: Array; + drainDisabled: boolean; + animState: AnimationState; + constructor(animState: AnimationState); + start(entry: TrackEntry): void; + interrupt(entry: TrackEntry): void; + end(entry: TrackEntry): void; + dispose(entry: TrackEntry): void; + complete(entry: TrackEntry): void; + event(entry: TrackEntry, event: Event): void; + drain(): void; + clear(): void; + } + enum EventType { + start = 0, + interrupt = 1, + end = 2, + dispose = 3, + complete = 4, + event = 5 + } + interface AnimationStateListener { + start(entry: TrackEntry): void; + interrupt(entry: TrackEntry): void; + end(entry: TrackEntry): void; + dispose(entry: TrackEntry): void; + complete(entry: TrackEntry): void; + event(entry: TrackEntry, event: Event): void; + } + // @ts-ignore + abstract class AnimationStateAdapter implements AnimationStateListener { + start(entry: TrackEntry): void; + interrupt(entry: TrackEntry): void; + end(entry: TrackEntry): void; + dispose(entry: TrackEntry): void; + complete(entry: TrackEntry): void; + event(entry: TrackEntry, event: Event): void; + } +} +declare module spine { + class AnimationStateData { + skeletonData: SkeletonData; + animationToMixTime: Map; + defaultMix: number; + constructor(skeletonData: SkeletonData); + setMix(fromName: string, toName: string, duration: number): void; + setMixWith(from: Animation, to: Animation, duration: number): void; + getMix(from: Animation, to: Animation): number; + } +} +declare module spine { + class AssetManager implements Disposable { + private pathPrefix; + private textureLoader; + private downloader; + private assets; + private errors; + private toLoad; + private loaded; + constructor(textureLoader: (image: HTMLImageElement | ImageBitmap) => Texture, pathPrefix?: string, downloader?: Downloader); + private start; + private success; + private error; + setRawDataURI(path: string, data: string): void; + loadBinary(path: string, success?: (path: string, binary: Uint8Array) => void, error?: (path: string, message: string) => void): void; + loadText(path: string, success?: (path: string, text: string) => void, error?: (path: string, message: string) => void): void; + loadJson(path: string, success?: (path: string, object: object) => void, error?: (path: string, message: string) => void): void; + loadTexture(path: string, success?: (path: string, texture: Texture) => void, error?: (path: string, message: string) => void): void; + loadTextureAtlas(path: string, success?: (path: string, atlas: TextureAtlas) => void, error?: (path: string, message: string) => void): void; + get(path: string): any; + require(path: string): any; + remove(path: string): any; + removeAll(): void; + isLoadingComplete(): boolean; + getToLoad(): number; + getLoaded(): number; + dispose(): void; + hasErrors(): boolean; + getErrors(): Map; + } + class Downloader { + private callbacks; + rawDataUris: Map; + downloadText(url: string, success: (data: string) => void, error: (status: number, responseText: string) => void): void; + downloadJson(url: string, success: (data: object) => void, error: (status: number, responseText: string) => void): void; + downloadBinary(url: string, success: (data: Uint8Array) => void, error: (status: number, responseText: string) => void): void; + private start; + private finish; + } +} +declare module spine { + class AtlasAttachmentLoader implements AttachmentLoader { + atlas: TextureAtlas; + constructor(atlas: TextureAtlas); + newRegionAttachment(skin: Skin, name: string, path: string): RegionAttachment; + newMeshAttachment(skin: Skin, name: string, path: string): MeshAttachment; + newBoundingBoxAttachment(skin: Skin, name: string): BoundingBoxAttachment; + newPathAttachment(skin: Skin, name: string): PathAttachment; + newPointAttachment(skin: Skin, name: string): PointAttachment; + newClippingAttachment(skin: Skin, name: string): ClippingAttachment; + } +} +declare module spine { + class Bone implements Updatable { + data: BoneData; + skeleton: Skeleton; + parent: Bone; + children: Bone[]; + x: number; + y: number; + rotation: number; + scaleX: number; + scaleY: number; + shearX: number; + shearY: number; + ax: number; + ay: number; + arotation: number; + ascaleX: number; + ascaleY: number; + ashearX: number; + ashearY: number; + a: number; + b: number; + c: number; + d: number; + worldY: number; + worldX: number; + sorted: boolean; + active: boolean; + constructor(data: BoneData, skeleton: Skeleton, parent: Bone); + isActive(): boolean; + update(): void; + updateWorldTransform(): void; + updateWorldTransformWith(x: number, y: number, rotation: number, scaleX: number, scaleY: number, shearX: number, shearY: number): void; + setToSetupPose(): void; + getWorldRotationX(): number; + getWorldRotationY(): number; + getWorldScaleX(): number; + getWorldScaleY(): number; + updateAppliedTransform(): void; + worldToLocal(world: Vector2): Vector2; + localToWorld(local: Vector2): Vector2; + worldToLocalRotation(worldRotation: number): number; + localToWorldRotation(localRotation: number): number; + rotateWorld(degrees: number): void; + } +} +declare module spine { + class BoneData { + index: number; + name: string; + parent: BoneData; + length: number; + x: number; + y: number; + rotation: number; + scaleX: number; + scaleY: number; + shearX: number; + shearY: number; + transformMode: TransformMode; + skinRequired: boolean; + color: Color; + constructor(index: number, name: string, parent: BoneData); + } + enum TransformMode { + Normal = 0, + OnlyTranslation = 1, + NoRotationOrReflection = 2, + NoScale = 3, + NoScaleOrReflection = 4 + } +} +declare module spine { + // @ts-ignore + abstract class ConstraintData { + name: string; + order: number; + skinRequired: boolean; + constructor(name: string, order: number, skinRequired: boolean); + } +} +declare module spine { + class Event { + data: EventData; + intValue: number; + floatValue: number; + stringValue: string; + time: number; + volume: number; + balance: number; + constructor(time: number, data: EventData); + } +} +declare module spine { + class EventData { + name: string; + intValue: number; + floatValue: number; + stringValue: string; + audioPath: string; + volume: number; + balance: number; + constructor(name: string); + } +} +declare module spine { + class IkConstraint implements Updatable { + data: IkConstraintData; + bones: Array; + target: Bone; + bendDirection: number; + compress: boolean; + stretch: boolean; + mix: number; + softness: number; + active: boolean; + constructor(data: IkConstraintData, skeleton: Skeleton); + isActive(): boolean; + update(): void; + apply1(bone: Bone, targetX: number, targetY: number, compress: boolean, stretch: boolean, uniform: boolean, alpha: number): void; + apply2(parent: Bone, child: Bone, targetX: number, targetY: number, bendDir: number, stretch: boolean, uniform: boolean, softness: number, alpha: number): void; + } +} +declare module spine { + class IkConstraintData extends ConstraintData { + bones: BoneData[]; + target: BoneData; + bendDirection: number; + compress: boolean; + stretch: boolean; + uniform: boolean; + mix: number; + softness: number; + constructor(name: string); + } +} +declare module spine { + class PathConstraint implements Updatable { + static NONE: number; + static BEFORE: number; + static AFTER: number; + static epsilon: number; + data: PathConstraintData; + bones: Array; + target: Slot; + position: number; + spacing: number; + mixRotate: number; + mixX: number; + mixY: number; + spaces: number[]; + positions: number[]; + world: number[]; + curves: number[]; + lengths: number[]; + segments: number[]; + active: boolean; + constructor(data: PathConstraintData, skeleton: Skeleton); + isActive(): boolean; + update(): void; + computeWorldPositions(path: PathAttachment, spacesCount: number, tangents: boolean): number[]; + addBeforePosition(p: number, temp: Array, i: number, out: Array, o: number): void; + addAfterPosition(p: number, temp: Array, i: number, out: Array, o: number): void; + addCurvePosition(p: number, x1: number, y1: number, cx1: number, cy1: number, cx2: number, cy2: number, x2: number, y2: number, out: Array, o: number, tangents: boolean): void; + } +} +declare module spine { + class PathConstraintData extends ConstraintData { + bones: BoneData[]; + target: SlotData; + positionMode: PositionMode; + spacingMode: SpacingMode; + rotateMode: RotateMode; + offsetRotation: number; + position: number; + spacing: number; + mixRotate: number; + mixX: number; + mixY: number; + constructor(name: string); + } + enum PositionMode { + Fixed = 0, + Percent = 1 + } + enum SpacingMode { + Length = 0, + Fixed = 1, + Percent = 2, + Proportional = 3 + } + enum RotateMode { + Tangent = 0, + Chain = 1, + ChainScale = 2 + } +} +declare module spine { + class Skeleton { + data: SkeletonData; + bones: Array; + slots: Array; + drawOrder: Array; + ikConstraints: Array; + transformConstraints: Array; + pathConstraints: Array; + _updateCache: Updatable[]; + skin: Skin; + color: Color; + time: number; + scaleX: number; + scaleY: number; + x: number; + y: number; + constructor(data: SkeletonData); + updateCache(): void; + sortIkConstraint(constraint: IkConstraint): void; + sortPathConstraint(constraint: PathConstraint): void; + sortTransformConstraint(constraint: TransformConstraint): void; + sortPathConstraintAttachment(skin: Skin, slotIndex: number, slotBone: Bone): void; + sortPathConstraintAttachmentWith(attachment: Attachment, slotBone: Bone): void; + sortBone(bone: Bone): void; + sortReset(bones: Array): void; + updateWorldTransform(): void; + updateWorldTransformWith(parent: Bone): void; + setToSetupPose(): void; + setBonesToSetupPose(): void; + setSlotsToSetupPose(): void; + getRootBone(): Bone; + findBone(boneName: string): Bone; + findBoneIndex(boneName: string): number; + findSlot(slotName: string): Slot; + findSlotIndex(slotName: string): number; + setSkinByName(skinName: string): void; + setSkin(newSkin: Skin): void; + getAttachmentByName(slotName: string, attachmentName: string): Attachment; + getAttachment(slotIndex: number, attachmentName: string): Attachment; + setAttachment(slotName: string, attachmentName: string): void; + findIkConstraint(constraintName: string): IkConstraint; + findTransformConstraint(constraintName: string): TransformConstraint; + findPathConstraint(constraintName: string): PathConstraint; + getBounds(offset: Vector2, size: Vector2, temp?: Array): void; + update(delta: number): void; + } +} +declare module spine { + // @ts-ignore + class SkeletonBinary { + scale: number; + attachmentLoader: AttachmentLoader; + private linkedMeshes; + constructor(attachmentLoader: AttachmentLoader); + readSkeletonData(binary: Uint8Array): SkeletonData; + private readSkin; + private readAttachment; + private readVertices; + private readFloatArray; + private readShortArray; + private readAnimation; + } +} +declare module spine { + class SkeletonBounds { + minX: number; + minY: number; + maxX: number; + maxY: number; + boundingBoxes: BoundingBoxAttachment[]; + polygons: ArrayLike[]; + private polygonPool; + update(skeleton: Skeleton, updateAabb: boolean): void; + aabbCompute(): void; + aabbContainsPoint(x: number, y: number): boolean; + aabbIntersectsSegment(x1: number, y1: number, x2: number, y2: number): boolean; + aabbIntersectsSkeleton(bounds: SkeletonBounds): boolean; + containsPoint(x: number, y: number): BoundingBoxAttachment; + containsPointPolygon(polygon: ArrayLike, x: number, y: number): boolean; + intersectsSegment(x1: number, y1: number, x2: number, y2: number): BoundingBoxAttachment; + intersectsSegmentPolygon(polygon: ArrayLike, x1: number, y1: number, x2: number, y2: number): boolean; + getPolygon(boundingBox: BoundingBoxAttachment): ArrayLike; + getWidth(): number; + getHeight(): number; + } +} +declare module spine { + class SkeletonClipping { + private triangulator; + private clippingPolygon; + private clipOutput; + clippedVertices: number[]; + clippedTriangles: number[]; + private scratch; + private clipAttachment; + private clippingPolygons; + clipStart(slot: Slot, clip: ClippingAttachment): number; + clipEndWithSlot(slot: Slot): void; + clipEnd(): void; + isClipping(): boolean; + clipTriangles(vertices: ArrayLike, verticesLength: number, triangles: ArrayLike, trianglesLength: number, uvs: ArrayLike, light: Color, dark: Color, twoColor: boolean): void; + clip(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, clippingArea: Array, output: Array): boolean; + static makeClockwise(polygon: ArrayLike): void; + } +} +declare module spine { + class SkeletonData { + name: string; + bones: BoneData[]; + slots: SlotData[]; + skins: Skin[]; + defaultSkin: Skin; + events: EventData[]; + animations: Animation[]; + ikConstraints: IkConstraintData[]; + transformConstraints: TransformConstraintData[]; + pathConstraints: PathConstraintData[]; + x: number; + y: number; + width: number; + height: number; + version: string; + hash: string; + fps: number; + imagesPath: string; + audioPath: string; + findBone(boneName: string): BoneData; + findBoneIndex(boneName: string): number; + findSlot(slotName: string): SlotData; + findSlotIndex(slotName: string): number; + findSkin(skinName: string): Skin; + findEvent(eventDataName: string): EventData; + findAnimation(animationName: string): Animation; + findIkConstraint(constraintName: string): IkConstraintData; + findTransformConstraint(constraintName: string): TransformConstraintData; + findPathConstraint(constraintName: string): PathConstraintData; + } +} +declare module spine { + class SkeletonJson { + attachmentLoader: AttachmentLoader; + scale: number; + private linkedMeshes; + constructor(attachmentLoader: AttachmentLoader); + readSkeletonData(json: string | any): SkeletonData; + readAttachment(map: any, skin: Skin, slotIndex: number, name: string, skeletonData: SkeletonData): Attachment; + readVertices(map: any, attachment: VertexAttachment, verticesLength: number): void; + readAnimation(map: any, name: string, skeletonData: SkeletonData): void; + } +} +declare module spine { + // @ts-ignore + class SkinEntry { + slotIndex: number; + name: string; + attachment: Attachment; + constructor(slotIndex: number, name: string, attachment: Attachment); + } + class Skin { + name: string; + attachments: Map[]; + bones: BoneData[]; + constraints: ConstraintData[]; + constructor(name: string); + setAttachment(slotIndex: number, name: string, attachment: Attachment): void; + addSkin(skin: Skin): void; + copySkin(skin: Skin): void; + getAttachment(slotIndex: number, name: string): Attachment; + removeAttachment(slotIndex: number, name: string): void; + getAttachments(): Array; + getAttachmentsForSlot(slotIndex: number, attachments: Array): void; + clear(): void; + attachAll(skeleton: Skeleton, oldSkin: Skin): void; + } +} +declare module spine { + class Slot { + data: SlotData; + bone: Bone; + color: Color; + darkColor: Color; + attachment: Attachment; + private attachmentTime; + attachmentState: number; + deform: number[]; + constructor(data: SlotData, bone: Bone); + getSkeleton(): Skeleton; + getAttachment(): Attachment; + setAttachment(attachment: Attachment): void; + setAttachmentTime(time: number): void; + getAttachmentTime(): number; + setToSetupPose(): void; + } +} +declare module spine { + class SlotData { + index: number; + name: string; + boneData: BoneData; + color: Color; + darkColor: Color; + attachmentName: string; + blendMode: BlendMode; + constructor(index: number, name: string, boneData: BoneData); + } + enum BlendMode { + Normal = 0, + Additive = 1, + Multiply = 2, + Screen = 3 + } +} +declare module spine { + abstract class Texture { + protected _image: HTMLImageElement | ImageBitmap; + constructor(image: HTMLImageElement | ImageBitmap); + getImage(): HTMLImageElement | ImageBitmap; + abstract setFilters(minFilter: TextureFilter, magFilter: TextureFilter): void; + abstract setWraps(uWrap: TextureWrap, vWrap: TextureWrap): void; + abstract dispose(): void; + } + enum TextureFilter { + Nearest = 9728, + Linear = 9729, + MipMap = 9987, + MipMapNearestNearest = 9984, + MipMapLinearNearest = 9985, + MipMapNearestLinear = 9986, + MipMapLinearLinear = 9987 + } + enum TextureWrap { + MirroredRepeat = 33648, + ClampToEdge = 33071, + Repeat = 10497 + } + class TextureRegion { + renderObject: any; + u: number; + v: number; + u2: number; + v2: number; + width: number; + height: number; + degrees: number; + offsetX: number; + offsetY: number; + originalWidth: number; + originalHeight: number; + } + class FakeTexture extends Texture { + setFilters(minFilter: TextureFilter, magFilter: TextureFilter): void; + setWraps(uWrap: TextureWrap, vWrap: TextureWrap): void; + dispose(): void; + } +} +declare module spine { + class TextureAtlas implements Disposable { + pages: TextureAtlasPage[]; + regions: TextureAtlasRegion[]; + constructor(atlasText: string); + findRegion(name: string): TextureAtlasRegion; + setTextures(assetManager: AssetManager, pathPrefix?: string): void; + dispose(): void; + } + class TextureAtlasPage { + name: string; + minFilter: TextureFilter; + magFilter: TextureFilter; + uWrap: TextureWrap; + vWrap: TextureWrap; + texture: Texture; + width: number; + height: number; + pma: boolean; + setTexture(texture: Texture): void; + } + class TextureAtlasRegion extends TextureRegion { + page: TextureAtlasPage; + name: string; + x: number; + y: number; + offsetX: number; + offsetY: number; + originalWidth: number; + originalHeight: number; + index: number; + degrees: number; + names: string[]; + values: number[][]; + } +} +declare module spine { + class TransformConstraint implements Updatable { + data: TransformConstraintData; + bones: Array; + target: Bone; + mixRotate: number; + mixX: number; + mixY: number; + mixScaleX: number; + mixScaleY: number; + mixShearY: number; + temp: Vector2; + active: boolean; + constructor(data: TransformConstraintData, skeleton: Skeleton); + isActive(): boolean; + update(): void; + applyAbsoluteWorld(): void; + applyRelativeWorld(): void; + applyAbsoluteLocal(): void; + applyRelativeLocal(): void; + } +} +declare module spine { + class TransformConstraintData extends ConstraintData { + bones: BoneData[]; + target: BoneData; + mixRotate: number; + mixX: number; + mixY: number; + mixScaleX: number; + mixScaleY: number; + mixShearY: number; + offsetRotation: number; + offsetX: number; + offsetY: number; + offsetScaleX: number; + offsetScaleY: number; + offsetShearY: number; + relative: boolean; + local: boolean; + constructor(name: string); + } +} +declare module spine { + class Triangulator { + private convexPolygons; + private convexPolygonsIndices; + private indicesArray; + private isConcaveArray; + private triangles; + private polygonPool; + private polygonIndicesPool; + triangulate(verticesArray: ArrayLike): Array; + decompose(verticesArray: Array, triangles: Array): Array>; + private static isConcave; + private static positiveArea; + private static winding; + } +} +declare module spine { + interface Updatable { + update(): void; + isActive(): boolean; + } +} +declare module spine { + interface Map { + // @ts-ignore + [key: string]: T; + } + class IntSet { + array: number[]; + add(value: number): boolean; + contains(value: number): boolean; + remove(value: number): void; + clear(): void; + } + class StringSet { + entries: Map; + size: number; + add(value: string): boolean; + addAll(values: string[]): boolean; + contains(value: string): boolean; + clear(): void; + } + interface Disposable { + dispose(): void; + } + interface Restorable { + restore(): void; + } + class Color { + r: number; + g: number; + b: number; + a: number; + static WHITE: Color; + static RED: Color; + static GREEN: Color; + static BLUE: Color; + static MAGENTA: Color; + constructor(r?: number, g?: number, b?: number, a?: number); + set(r: number, g: number, b: number, a: number): this; + setFromColor(c: Color): this; + setFromString(hex: string): this; + add(r: number, g: number, b: number, a: number): this; + clamp(): this; + static rgba8888ToColor(color: Color, value: number): void; + static rgb888ToColor(color: Color, value: number): void; + static fromString(hex: string): Color; + } + class MathUtils { + static PI: number; + static PI2: number; + static radiansToDegrees: number; + static radDeg: number; + static degreesToRadians: number; + static degRad: number; + static clamp(value: number, min: number, max: number): number; + static cosDeg(degrees: number): number; + static sinDeg(degrees: number): number; + static signum(value: number): number; + static toInt(x: number): number; + static cbrt(x: number): number; + static randomTriangular(min: number, max: number): number; + static randomTriangularWith(min: number, max: number, mode: number): number; + static isPowerOfTwo(value: number): boolean; + } + abstract class Interpolation { + protected abstract applyInternal(a: number): number; + apply(start: number, end: number, a: number): number; + } + class Pow extends Interpolation { + protected power: number; + constructor(power: number); + applyInternal(a: number): number; + } + class PowOut extends Pow { + constructor(power: number); + applyInternal(a: number): number; + } + class Utils { + static SUPPORTS_TYPED_ARRAYS: boolean; + static arrayCopy(source: ArrayLike, sourceStart: number, dest: ArrayLike, destStart: number, numElements: number): void; + static arrayFill(array: ArrayLike, fromIndex: number, toIndex: number, value: T): void; + static setArraySize(array: Array, size: number, value?: any): Array; + static ensureArrayCapacity(array: Array, size: number, value?: any): Array; + static newArray(size: number, defaultValue: T): Array; + static newFloatArray(size: number): ArrayLike; + static newShortArray(size: number): ArrayLike; + static toFloatArray(array: Array): number[] | Float32Array; + static toSinglePrecision(value: number): number; + static webkit602BugfixHelper(alpha: number, blend: MixBlend): void; + static contains(array: Array, element: T, identity?: boolean): boolean; + static enumValue(type: any, name: string): any; + } + class DebugUtils { + static logBones(skeleton: Skeleton): void; + } + class Pool { + private items; + private instantiator; + constructor(instantiator: () => T); + obtain(): T; + free(item: T): void; + freeAll(items: ArrayLike): void; + clear(): void; + } + class Vector2 { + x: number; + y: number; + constructor(x?: number, y?: number); + set(x: number, y: number): Vector2; + length(): number; + normalize(): this; + } + class TimeKeeper { + maxDelta: number; + framesPerSecond: number; + delta: number; + totalTime: number; + private lastTime; + private frameCount; + private frameTime; + update(): void; + } + interface ArrayLike { + length: number; + // @ts-ignore + [n: number]: T; + } + class WindowedMean { + values: Array; + addedValues: number; + lastValue: number; + mean: number; + dirty: boolean; + constructor(windowSize?: number); + hasEnoughData(): boolean; + addValue(value: number): void; + getMean(): number; + } +} +declare module spine { + interface VertexEffect { + begin(skeleton: Skeleton): void; + transform(position: Vector2, uv: Vector2, light: Color, dark: Color): void; + end(): void; + } +} +interface Math { + fround(n: number): number; +} +declare module spine { + abstract class Attachment { + name: string; + constructor(name: string); + abstract copy(): Attachment; + } + abstract class VertexAttachment extends Attachment { + private static nextID; + id: number; + bones: Array; + vertices: ArrayLike; + worldVerticesLength: number; + deformAttachment: VertexAttachment; + constructor(name: string); + computeWorldVertices(slot: Slot, start: number, count: number, worldVertices: ArrayLike, offset: number, stride: number): void; + copyTo(attachment: VertexAttachment): void; + } +} +declare module spine { + interface AttachmentLoader { + newRegionAttachment(skin: Skin, name: string, path: string): RegionAttachment; + newMeshAttachment(skin: Skin, name: string, path: string): MeshAttachment; + newBoundingBoxAttachment(skin: Skin, name: string): BoundingBoxAttachment; + newPathAttachment(skin: Skin, name: string): PathAttachment; + newPointAttachment(skin: Skin, name: string): PointAttachment; + newClippingAttachment(skin: Skin, name: string): ClippingAttachment; + } +} +declare module spine { + class BoundingBoxAttachment extends VertexAttachment { + color: Color; + constructor(name: string); + copy(): Attachment; + } +} +declare module spine { + class ClippingAttachment extends VertexAttachment { + endSlot: SlotData; + color: Color; + constructor(name: string); + copy(): Attachment; + } +} +declare module spine { + class MeshAttachment extends VertexAttachment { + region: TextureRegion; + path: string; + regionUVs: ArrayLike; + uvs: ArrayLike; + triangles: Array; + color: Color; + width: number; + height: number; + hullLength: number; + edges: Array; + private parentMesh; + tempColor: Color; + constructor(name: string); + updateUVs(): void; + getParentMesh(): MeshAttachment; + setParentMesh(parentMesh: MeshAttachment): void; + copy(): Attachment; + newLinkedMesh(): MeshAttachment; + } +} +declare module spine { + class PathAttachment extends VertexAttachment { + lengths: Array; + closed: boolean; + constantSpeed: boolean; + color: Color; + constructor(name: string); + copy(): Attachment; + } +} +declare module spine { + class PointAttachment extends VertexAttachment { + x: number; + y: number; + rotation: number; + color: Color; + constructor(name: string); + computeWorldPosition(bone: Bone, point: Vector2): Vector2; + computeWorldRotation(bone: Bone): number; + copy(): Attachment; + } +} +declare module spine { + class RegionAttachment extends Attachment { + x: number; + y: number; + scaleX: number; + scaleY: number; + rotation: number; + width: number; + height: number; + color: Color; + path: string; + rendererObject: any; + region: TextureRegion; + offset: ArrayLike; + uvs: ArrayLike; + tempColor: Color; + constructor(name: string); + updateOffset(): void; + setRegion(region: TextureRegion): void; + computeWorldVertices(bone: Bone, worldVertices: ArrayLike, offset: number, stride: number): void; + copy(): Attachment; + static X1: number; + static Y1: number; + static C1R: number; + static C1G: number; + static C1B: number; + static C1A: number; + static U1: number; + static V1: number; + static X2: number; + static Y2: number; + static C2R: number; + static C2G: number; + static C2B: number; + static C2A: number; + static U2: number; + static V2: number; + static X3: number; + static Y3: number; + static C3R: number; + static C3G: number; + static C3B: number; + static C3A: number; + static U3: number; + static V3: number; + static X4: number; + static Y4: number; + static C4R: number; + static C4G: number; + static C4B: number; + static C4A: number; + static U4: number; + static V4: number; + } +} +declare module spine { + class JitterEffect implements VertexEffect { + jitterX: number; + jitterY: number; + constructor(jitterX: number, jitterY: number); + begin(skeleton: Skeleton): void; + transform(position: Vector2, uv: Vector2, light: Color, dark: Color): void; + end(): void; + } +} +declare module spine { + class SwirlEffect implements VertexEffect { + static interpolation: PowOut; + centerX: number; + centerY: number; + radius: number; + angle: number; + private worldX; + private worldY; + constructor(radius: number); + begin(skeleton: Skeleton): void; + transform(position: Vector2, uv: Vector2, light: Color, dark: Color): void; + end(): void; + } +} diff --git a/shudu/eslint.config.js b/shudu/eslint.config.js new file mode 100644 index 0000000..34d6647 --- /dev/null +++ b/shudu/eslint.config.js @@ -0,0 +1,36 @@ +import antfu from "@antfu/eslint-config" + +export default antfu({ + // 使用外部格式化程序格式化 css、html、markdown 等文件 + formatters: true, + // 启用样式规则 + stylistic: { + // 缩进级别 + indent: 2, + // 引号风格 'single' | 'double' + quotes: "double", + // 是否启用分号 + semi: false + }, + typescript: true, + // 忽略文件 + ignores: ["engine/types", "settings", "bin", "release"] +}, { + // 对所有文件都生效的规则 + rules: { + // ts + "ts/no-use-before-define": "off", + // node + "node/prefer-global/process": "off", + // style + "style/comma-dangle": ["error", "never"], + "style/brace-style": ["error", "1tbs"], + // regexp + "regexp/no-unused-capturing-group": "off", + // other + "no-console": "off", + "no-debugger": "off", + "symbol-description": "off", + "antfu/if-newline": "off" + } +}) diff --git a/shudu/package-lock.json b/shudu/package-lock.json new file mode 100644 index 0000000..1dce454 --- /dev/null +++ b/shudu/package-lock.json @@ -0,0 +1,6202 @@ +{ + "name": "shudu", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "shudu", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "bezier-easing": "^2.1.0", + "lottie-web": "^5.13.0" + }, + "devDependencies": { + "@antfu/eslint-config": "^4.13.0", + "eslint": "^9.26.0", + "eslint-plugin-format": "^1.0.1" + } + }, + "node_modules/@antfu/eslint-config": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/@antfu/eslint-config/-/eslint-config-4.13.0.tgz", + "integrity": "sha512-zXEe1NWioKWgo094qo7D/IL2NjzWpLolslSFpZTBPtiFPR6DyRwfUVyWdODUgtzM9cU05ETnEPFRpXDYWFR0/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^1.1.0", + "@clack/prompts": "^0.10.1", + "@eslint-community/eslint-plugin-eslint-comments": "^4.5.0", + "@eslint/markdown": "^6.4.0", + "@stylistic/eslint-plugin": "^4.2.0", + "@typescript-eslint/eslint-plugin": "^8.32.0", + "@typescript-eslint/parser": "^8.32.0", + "@vitest/eslint-plugin": "^1.1.44", + "ansis": "^3.17.0", + "cac": "^6.7.14", + "eslint-config-flat-gitignore": "^2.1.0", + "eslint-flat-config-utils": "^2.0.1", + "eslint-merge-processors": "^2.0.0", + "eslint-plugin-antfu": "^3.1.1", + "eslint-plugin-command": "^3.2.0", + "eslint-plugin-import-x": "^4.11.0", + "eslint-plugin-jsdoc": "^50.6.11", + "eslint-plugin-jsonc": "^2.20.0", + "eslint-plugin-n": "^17.17.0", + "eslint-plugin-no-only-tests": "^3.3.0", + "eslint-plugin-perfectionist": "^4.12.3", + "eslint-plugin-pnpm": "^0.3.1", + "eslint-plugin-regexp": "^2.7.0", + "eslint-plugin-toml": "^0.12.0", + "eslint-plugin-unicorn": "^59.0.1", + "eslint-plugin-unused-imports": "^4.1.4", + "eslint-plugin-vue": "^10.1.0", + "eslint-plugin-yml": "^1.18.0", + "eslint-processor-vue-blocks": "^2.0.0", + "globals": "^16.0.0", + "jsonc-eslint-parser": "^2.4.0", + "local-pkg": "^1.1.1", + "parse-gitignore": "^2.0.0", + "toml-eslint-parser": "^0.10.0", + "vue-eslint-parser": "^10.1.3", + "yaml-eslint-parser": "^1.3.0" + }, + "bin": { + "eslint-config": "bin/index.js" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@eslint-react/eslint-plugin": "^1.38.4", + "@prettier/plugin-xml": "^3.4.1", + "@unocss/eslint-plugin": ">=0.50.0", + "astro-eslint-parser": "^1.0.2", + "eslint": "^9.10.0", + "eslint-plugin-astro": "^1.2.0", + "eslint-plugin-format": ">=0.1.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.19", + "eslint-plugin-solid": "^0.14.3", + "eslint-plugin-svelte": ">=2.35.1", + "eslint-plugin-vuejs-accessibility": "^2.4.1", + "prettier-plugin-astro": "^0.14.0", + "prettier-plugin-slidev": "^1.0.5", + "svelte-eslint-parser": ">=0.37.0" + }, + "peerDependenciesMeta": { + "@eslint-react/eslint-plugin": { + "optional": true + }, + "@prettier/plugin-xml": { + "optional": true + }, + "@unocss/eslint-plugin": { + "optional": true + }, + "astro-eslint-parser": { + "optional": true + }, + "eslint-plugin-astro": { + "optional": true + }, + "eslint-plugin-format": { + "optional": true + }, + "eslint-plugin-react-hooks": { + "optional": true + }, + "eslint-plugin-react-refresh": { + "optional": true + }, + "eslint-plugin-solid": { + "optional": true + }, + "eslint-plugin-svelte": { + "optional": true + }, + "eslint-plugin-vuejs-accessibility": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + }, + "prettier-plugin-slidev": { + "optional": true + }, + "svelte-eslint-parser": { + "optional": true + } + } + }, + "node_modules/@antfu/install-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz", + "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/types": "^7.27.1" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", + "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@clack/core": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@clack/core/-/core-0.4.2.tgz", + "integrity": "sha512-NYQfcEy8MWIxrT5Fj8nIVchfRFA26yYKJcvBS7WlUIlw2OmQOY9DhGGXMovyI5J5PpxrCPGkgUi207EBrjpBvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "sisteransi": "^1.0.5" + } + }, + "node_modules/@clack/prompts": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-0.10.1.tgz", + "integrity": "sha512-Q0T02vx8ZM9XSv9/Yde0jTmmBQufZhPJfYAg2XrrrxWWaZgq1rr8nU8Hv710BQ1dhoP8rtY7YUdpGej2Qza/cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@clack/core": "0.4.2", + "picocolors": "^1.0.0", + "sisteransi": "^1.0.5" + } + }, + "node_modules/@dprint/formatter": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@dprint/formatter/-/formatter-0.3.0.tgz", + "integrity": "sha512-N9fxCxbaBOrDkteSOzaCqwWjso5iAe+WJPsHC021JfHNj2ThInPNEF13ORDKta3llq5D1TlclODCvOvipH7bWQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@dprint/markdown": { + "version": "0.17.8", + "resolved": "https://registry.npmjs.org/@dprint/markdown/-/markdown-0.17.8.tgz", + "integrity": "sha512-ukHFOg+RpG284aPdIg7iPrCYmMs3Dqy43S1ejybnwlJoFiW02b+6Bbr5cfZKFRYNP3dKGM86BqHEnMzBOyLvvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@dprint/toml": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@dprint/toml/-/toml-0.6.4.tgz", + "integrity": "sha512-bZXIUjxr0LIuHWshZr/5mtUkOrnh0NKVZEF6ACojW5z7zkJu7s9sV2mMXm8XQDqN4cJzdHYUYzUyEGdfciaLJA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@emnapi/core": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.3.tgz", + "integrity": "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.0.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", + "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.2.tgz", + "integrity": "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@es-joy/jsdoccomment": { + "version": "0.50.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.50.0.tgz", + "integrity": "sha512-+zZymuVLH6zVwXPtCAtC+bDymxmEwEqDftdAK+f407IF1bnX49anIxvBhCA1AqUIfD6egj1jM1vUnSuijjNyYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "^9.6.1", + "@types/estree": "^1.0.6", + "@typescript-eslint/types": "^8.11.0", + "comment-parser": "1.4.1", + "esquery": "^1.6.0", + "jsdoc-type-pratt-parser": "~4.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-plugin-eslint-comments": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.5.0.tgz", + "integrity": "sha512-MAhuTKlr4y/CE3WYX26raZjy+I/kS2PLKSzvfmDCGrBLTFHOYwqROZdr4XwPgXwX3K9rjzMr4pSmUWGnzsUyMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^4.0.0", + "ignore": "^5.2.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/compat": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.2.9.tgz", + "integrity": "sha512-gCdSY54n7k+driCadyMNv8JSPzYLeDVM/ikZRtvtROBpRdFSkS8W9A82MqsaY7lZuwL0wiapgD0NT1xT0hyJsA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^9.10.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/config-array": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", + "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz", + "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz", + "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.26.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.26.0.tgz", + "integrity": "sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/markdown": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@eslint/markdown/-/markdown-6.4.0.tgz", + "integrity": "sha512-J07rR8uBSNFJ9iliNINrchilpkmCihPmTVotpThUeKEn5G8aBBZnkjNBy/zovhJA5LBk1vWU9UDlhqKSc/dViQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint/core": "^0.10.0", + "@eslint/plugin-kit": "^0.2.5", + "mdast-util-from-markdown": "^2.0.2", + "mdast-util-frontmatter": "^2.0.1", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-frontmatter": "^2.0.0", + "micromark-extension-gfm": "^3.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", + "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.13.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", + "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", + "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.11.0.tgz", + "integrity": "sha512-k/1pb70eD638anoi0e8wUGAlbMJXyvdV4p62Ko+EZ7eBe1xMx8Uhak1R5DgfoofsK5IBBnRwsYGTaLZl+6/+RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.3", + "eventsource": "^3.0.2", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.24.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.9.tgz", + "integrity": "sha512-OKRBiajrrxB9ATokgEQoG87Z25c67pCpYcCwmXYX8PBftC9pBfN18gnm/fh1wurSLEKIAt+QRFLFCQISrb66Jg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.0", + "@emnapi/runtime": "^1.4.0", + "@tybys/wasm-util": "^0.9.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.2.tgz", + "integrity": "sha512-fdDH1LSGfZdTH2sxdpVMw31BanV28K/Gry0cVFxaNP77neJSkd82mM8ErPNYs9e+0O7SdHBLTDzDgwUuy18RnQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@stylistic/eslint-plugin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-4.2.0.tgz", + "integrity": "sha512-8hXezgz7jexGHdo5WN6JBEIPHCSFyyU4vgbxevu4YLVS5vl+sxqAAGyXSzfNDyR6xMNSH5H1x67nsXcYMOHtZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^8.23.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", + "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.32.0.tgz", + "integrity": "sha512-/jU9ettcntkBFmWUzzGgsClEi2ZFiikMX5eEQsmxIAWMOn4H3D4rvHssstmAHGVvrYnaMqdWWWg0b5M6IN/MTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.32.0", + "@typescript-eslint/type-utils": "8.32.0", + "@typescript-eslint/utils": "8.32.0", + "@typescript-eslint/visitor-keys": "8.32.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.32.0.tgz", + "integrity": "sha512-B2MdzyWxCE2+SqiZHAjPphft+/2x2FlO9YBx7eKE1BCb+rqBlQdhtAEhzIEdozHd55DXPmxBdpMygFJjfjjA9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.32.0", + "@typescript-eslint/types": "8.32.0", + "@typescript-eslint/typescript-estree": "8.32.0", + "@typescript-eslint/visitor-keys": "8.32.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.32.0.tgz", + "integrity": "sha512-jc/4IxGNedXkmG4mx4nJTILb6TMjL66D41vyeaPWvDUmeYQzF3lKtN15WsAeTr65ce4mPxwopPSo1yUUAWw0hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.32.0", + "@typescript-eslint/visitor-keys": "8.32.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.32.0.tgz", + "integrity": "sha512-t2vouuYQKEKSLtJaa5bB4jHeha2HJczQ6E5IXPDPgIty9EqcJxpr1QHQ86YyIPwDwxvUmLfP2YADQ5ZY4qddZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.32.0", + "@typescript-eslint/utils": "8.32.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.32.0.tgz", + "integrity": "sha512-O5Id6tGadAZEMThM6L9HmVf5hQUXNSxLVKeGJYWNhhVseps/0LddMkp7//VDkzwJ69lPL0UmZdcZwggj9akJaA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.32.0.tgz", + "integrity": "sha512-pU9VD7anSCOIoBFnhTGfOzlVFQIA1XXiQpH/CezqOBaDppRwTglJzCC6fUQGpfwey4T183NKhF1/mfatYmjRqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.32.0", + "@typescript-eslint/visitor-keys": "8.32.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.32.0.tgz", + "integrity": "sha512-8S9hXau6nQ/sYVtC3D6ISIDoJzS1NsCK+gluVhLN2YkBPX+/1wkwyUiDKnxRh15579WoOIyVWnoyIf3yGI9REw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.32.0", + "@typescript-eslint/types": "8.32.0", + "@typescript-eslint/typescript-estree": "8.32.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.32.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.32.0.tgz", + "integrity": "sha512-1rYQTCLFFzOI5Nl0c8LUpJT8HxpwVRn9E4CkMsYfuN6ctmQqExjSTzzSk0Tz2apmXy7WU6/6fyaZVVA/thPN+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.32.0", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.7.2.tgz", + "integrity": "sha512-vxtBno4xvowwNmO/ASL0Y45TpHqmNkAaDtz4Jqb+clmcVSSl8XCG/PNFFkGsXXXS6AMjP+ja/TtNCFFa1QwLRg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.7.2.tgz", + "integrity": "sha512-qhVa8ozu92C23Hsmv0BF4+5Dyyd5STT1FolV4whNgbY6mj3kA0qsrGPe35zNR3wAN7eFict3s4Rc2dDTPBTuFQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.7.2.tgz", + "integrity": "sha512-zKKdm2uMXqLFX6Ac7K5ElnnG5VIXbDlFWzg4WJ8CGUedJryM5A3cTgHuGMw1+P5ziV8CRhnSEgOnurTI4vpHpg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.7.2.tgz", + "integrity": "sha512-8N1z1TbPnHH+iDS/42GJ0bMPLiGK+cUqOhNbMKtWJ4oFGzqSJk/zoXFzcQkgtI63qMcUI7wW1tq2usZQSb2jxw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.7.2.tgz", + "integrity": "sha512-tjYzI9LcAXR9MYd9rO45m1s0B/6bJNuZ6jeOxo1pq1K6OBuRMMmfyvJYval3s9FPPGmrldYA3mi4gWDlWuTFGA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.7.2.tgz", + "integrity": "sha512-jon9M7DKRLGZ9VYSkFMflvNqu9hDtOCEnO2QAryFWgT6o6AXU8du56V7YqnaLKr6rAbZBWYsYpikF226v423QA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.7.2.tgz", + "integrity": "sha512-c8Cg4/h+kQ63pL43wBNaVMmOjXI/X62wQmru51qjfTvI7kmCy5uHTJvK/9LrF0G8Jdx8r34d019P1DVJmhXQpA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.7.2.tgz", + "integrity": "sha512-A+lcwRFyrjeJmv3JJvhz5NbcCkLQL6Mk16kHTNm6/aGNc4FwPHPE4DR9DwuCvCnVHvF5IAd9U4VIs/VvVir5lg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.7.2.tgz", + "integrity": "sha512-hQQ4TJQrSQW8JlPm7tRpXN8OCNP9ez7PajJNjRD1ZTHQAy685OYqPrKjfaMw/8LiHCt8AZ74rfUVHP9vn0N69Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.7.2.tgz", + "integrity": "sha512-NoAGbiqrxtY8kVooZ24i70CjLDlUFI7nDj3I9y54U94p+3kPxwd2L692YsdLa+cqQ0VoqMWoehDFp21PKRUoIQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.7.2.tgz", + "integrity": "sha512-KaZByo8xuQZbUhhreBTW+yUnOIHUsv04P8lKjQ5otiGoSJ17ISGYArc+4vKdLEpGaLbemGzr4ZeUbYQQsLWFjA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.7.2.tgz", + "integrity": "sha512-dEidzJDubxxhUCBJ/SHSMJD/9q7JkyfBMT77Px1npl4xpg9t0POLvnWywSk66BgZS/b2Hy9Y1yFaoMTFJUe9yg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.7.2.tgz", + "integrity": "sha512-RvP+Ux3wDjmnZDT4XWFfNBRVG0fMsc+yVzNFUqOflnDfZ9OYujv6nkh+GOr+watwrW4wdp6ASfG/e7bkDradsw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.7.2.tgz", + "integrity": "sha512-y797JBmO9IsvXVRCKDXOxjyAE4+CcZpla2GSoBQ33TVb3ILXuFnMrbR/QQZoauBYeOFuu4w3ifWLw52sdHGz6g==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.9" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.7.2.tgz", + "integrity": "sha512-gtYTh4/VREVSLA+gHrfbWxaMO/00y+34htY7XpioBTy56YN2eBjkPrY1ML1Zys89X3RJDKVaogzwxlM1qU7egg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.7.2.tgz", + "integrity": "sha512-Ywv20XHvHTDRQs12jd3MY8X5C8KLjDbg/jyaal/QLKx3fAShhJyD4blEANInsjxW3P7isHx1Blt56iUDDJO3jg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.7.2.tgz", + "integrity": "sha512-friS8NEQfHaDbkThxopGk+LuE5v3iY0StruifjQEt7SLbA46OnfgMO15sOTkbpJkol6RB+1l1TYPXh0sCddpvA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@vitest/eslint-plugin": { + "version": "1.1.44", + "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.1.44.tgz", + "integrity": "sha512-m4XeohMT+Dj2RZfxnbiFR+Cv5dEC0H7C6TlxRQT7GK2556solm99kxgzJp/trKrZvanZcOFyw7aABykUTfWyrg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@typescript-eslint/utils": ">= 8.24.0", + "eslint": ">= 8.57.0", + "typescript": ">= 5.0.0", + "vitest": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vitest": { + "optional": true + } + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz", + "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/shared": "3.5.13", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", + "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/compiler-core": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz", + "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/compiler-core": "3.5.13", + "@vue/compiler-dom": "3.5.13", + "@vue/compiler-ssr": "3.5.13", + "@vue/shared": "3.5.13", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.11", + "postcss": "^8.4.48", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz", + "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/compiler-dom": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", + "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansis": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz", + "integrity": "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "node_modules/are-docs-informative": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", + "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/bezier-easing": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bezier-easing/-/bezier-easing-2.1.0.tgz", + "integrity": "sha512-gbIqZ/eslnUFC1tjEvtz0sgx+xTK20wDnYMIA27VA04R7w6xxXQPZDbibjA9DTWZRA2CXtwHykkVzlCaAJAZig==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", + "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001716", + "electron-to-chromium": "^1.5.149", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/builtin-modules": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-5.0.0.tgz", + "integrity": "sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001717", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001717.tgz", + "integrity": "sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ci-info": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz", + "integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/clean-regexp/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/comment-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/core-js-compat": { + "version": "3.42.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.42.0.tgz", + "integrity": "sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz", + "integrity": "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.150", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.150.tgz", + "integrity": "sha512-rOOkP2ZUMx1yL4fCxXQKDHQ8ZXwisb2OycOQVKHgvB3ZI4CvehOd4y2tfnnLDieJ3Zs1RL1Dlp3cMkyIn7nnXA==", + "dev": true, + "license": "ISC" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.26.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.26.0.tgz", + "integrity": "sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.20.0", + "@eslint/config-helpers": "^0.2.1", + "@eslint/core": "^0.13.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.26.0", + "@eslint/plugin-kit": "^0.2.8", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@modelcontextprotocol/sdk": "^1.8.0", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.3.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "zod": "^3.24.2" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-compat-utils": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.6.5.tgz", + "integrity": "sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-config-flat-gitignore": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-flat-gitignore/-/eslint-config-flat-gitignore-2.1.0.tgz", + "integrity": "sha512-cJzNJ7L+psWp5mXM7jBX+fjHtBvvh06RBlcweMhKD8jWqQw0G78hOW5tpVALGHGFPsBV+ot2H+pdDGJy6CV8pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint/compat": "^1.2.5" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "eslint": "^9.5.0" + } + }, + "node_modules/eslint-flat-config-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/eslint-flat-config-utils/-/eslint-flat-config-utils-2.0.1.tgz", + "integrity": "sha512-brf0eAgQ6JlKj3bKfOTuuI7VcCZvi8ZCD1MMTVoEvS/d38j8cByZViLFALH/36+eqB17ukmfmKq3bWzGvizejA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pathe": "^2.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/eslint-formatting-reporter": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/eslint-formatting-reporter/-/eslint-formatting-reporter-0.0.0.tgz", + "integrity": "sha512-k9RdyTqxqN/wNYVaTk/ds5B5rA8lgoAmvceYN7bcZMBwU7TuXx5ntewJv81eF3pIL/CiJE+pJZm36llG8yhyyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-json-compat-utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/eslint-json-compat-utils/-/eslint-json-compat-utils-0.2.1.tgz", + "integrity": "sha512-YzEodbDyW8DX8bImKhAcCeu/L31Dd/70Bidx2Qex9OFUtgzXLqtfWL4Hr5fM/aCCB8QUZLuJur0S9k6UfgFkfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esquery": "^1.6.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": "*", + "jsonc-eslint-parser": "^2.4.0" + }, + "peerDependenciesMeta": { + "@eslint/json": { + "optional": true + } + } + }, + "node_modules/eslint-merge-processors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-merge-processors/-/eslint-merge-processors-2.0.0.tgz", + "integrity": "sha512-sUuhSf3IrJdGooquEUB5TNpGNpBoQccbnaLHsb1XkBLUPPqCNivCpY05ZcpCOiV9uHwO2yxXEWVczVclzMxYlA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/eslint-parser-plain": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/eslint-parser-plain/-/eslint-parser-plain-0.1.1.tgz", + "integrity": "sha512-KRgd6wuxH4U8kczqPp+Oyk4irThIhHWxgFgLDtpgjUGVIS3wGrJntvZW/p6hHq1T4FOwnOtCNkvAI4Kr+mQ/Hw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-antfu": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-antfu/-/eslint-plugin-antfu-3.1.1.tgz", + "integrity": "sha512-7Q+NhwLfHJFvopI2HBZbSxWXngTwBLKxW1AGXLr2lEGxcEIK/AsDs8pn8fvIizl5aZjBbVbVK5ujmMpBe4Tvdg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/eslint-plugin-command": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-command/-/eslint-plugin-command-3.2.0.tgz", + "integrity": "sha512-PSDOB9k7Wd57pp4HD/l3C1D93pKX8/wQo0kWDI4q6/UpgrfMTyNsavklipgiZqbXl1+VBABY1buCcQE5LDpg5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@es-joy/jsdoccomment": "^0.50.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/eslint-plugin-es-x": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", + "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/ota-meshi", + "https://opencollective.com/eslint" + ], + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.11.0", + "eslint-compat-utils": "^0.5.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": ">=8" + } + }, + "node_modules/eslint-plugin-es-x/node_modules/eslint-compat-utils": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", + "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-plugin-format": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-format/-/eslint-plugin-format-1.0.1.tgz", + "integrity": "sha512-Tdns+CDjS+m7QrM85wwRi2yLae88XiWVdIOXjp9mDII0pmTBQlczPCmjpKnjiUIY3yPZNLqb5Ms/A/JXcBF2Dw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@dprint/formatter": "^0.3.0", + "@dprint/markdown": "^0.17.8", + "@dprint/toml": "^0.6.4", + "eslint-formatting-reporter": "^0.0.0", + "eslint-parser-plain": "^0.1.1", + "prettier": "^3.4.2", + "synckit": "^0.9.2" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "eslint": "^8.40.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-import-x": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.11.0.tgz", + "integrity": "sha512-NAaYY49342gj09QGvwnFFl5KcD5aLzjAz97Lo+upnN8MzjEGSIlmL5sxCYGqtIeMjw8fSRDFZIp2xjRLT+yl4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^8.31.0", + "comment-parser": "^1.4.1", + "debug": "^4.4.0", + "eslint-import-resolver-node": "^0.3.9", + "get-tsconfig": "^4.10.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.3 || ^10.0.1", + "semver": "^7.7.1", + "stable-hash": "^0.0.5", + "tslib": "^2.8.1", + "unrs-resolver": "^1.7.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-import-x" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-jsdoc": { + "version": "50.6.11", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.6.11.tgz", + "integrity": "sha512-k4+MnBCGR8cuIB5MZ++FGd4gbXxjob2rX1Nq0q3nWFF4xSGZENTgTLZSjb+u9B8SAnP6lpGV2FJrBjllV3pVSg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@es-joy/jsdoccomment": "~0.49.0", + "are-docs-informative": "^0.0.2", + "comment-parser": "1.4.1", + "debug": "^4.3.6", + "escape-string-regexp": "^4.0.0", + "espree": "^10.1.0", + "esquery": "^1.6.0", + "parse-imports-exports": "^0.2.4", + "semver": "^7.6.3", + "spdx-expression-parse": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/@es-joy/jsdoccomment": { + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.49.0.tgz", + "integrity": "sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "comment-parser": "1.4.1", + "esquery": "^1.6.0", + "jsdoc-type-pratt-parser": "~4.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/eslint-plugin-jsonc": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsonc/-/eslint-plugin-jsonc-2.20.0.tgz", + "integrity": "sha512-FRgCn9Hzk5eKboCbVMrr9QrhM0eO4G+WKH8IFXoaeqhM/2kuWzbStJn4kkr0VWL8J5H8RYZF+Aoam1vlBaZVkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.5.1", + "eslint-compat-utils": "^0.6.4", + "eslint-json-compat-utils": "^0.2.1", + "espree": "^9.6.1 || ^10.3.0", + "graphemer": "^1.4.0", + "jsonc-eslint-parser": "^2.4.0", + "natural-compare": "^1.4.0", + "synckit": "^0.6.2 || ^0.7.3 || ^0.10.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-plugin-jsonc/node_modules/@pkgr/core": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.4.tgz", + "integrity": "sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/eslint-plugin-jsonc/node_modules/synckit": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.10.3.tgz", + "integrity": "sha512-R1urvuyiTaWfeCggqEvpDJwAlDVdsT9NM+IP//Tk2x7qHCkSvBk/fwFgw/TLAHzZlrAnnazMcRw0ZD8HlYFTEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.0", + "tslib": "^2.8.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/eslint-plugin-n": { + "version": "17.17.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.17.0.tgz", + "integrity": "sha512-2VvPK7Mo73z1rDFb6pTvkH6kFibAmnTubFq5l83vePxu0WiY1s0LOtj2WHb6Sa40R3w4mnh8GFYbHBQyMlotKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.5.0", + "enhanced-resolve": "^5.17.1", + "eslint-plugin-es-x": "^7.8.0", + "get-tsconfig": "^4.8.1", + "globals": "^15.11.0", + "ignore": "^5.3.2", + "minimatch": "^9.0.5", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": ">=8.23.0" + } + }, + "node_modules/eslint-plugin-n/node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-no-only-tests": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.3.0.tgz", + "integrity": "sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=5.0.0" + } + }, + "node_modules/eslint-plugin-perfectionist": { + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-perfectionist/-/eslint-plugin-perfectionist-4.12.3.tgz", + "integrity": "sha512-V0dmpq6fBbn0BYofHsiRuuY9wgkKMDkdruM0mIRBIJ8XZ8vEaTAZqFsywm40RuWNVnduWBt5HO1ZZ+flE2yqjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "^8.31.0", + "@typescript-eslint/utils": "^8.31.0", + "natural-orderby": "^5.0.0" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "eslint": ">=8.45.0" + } + }, + "node_modules/eslint-plugin-pnpm": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-pnpm/-/eslint-plugin-pnpm-0.3.1.tgz", + "integrity": "sha512-vi5iHoELIAlBbX4AW8ZGzU3tUnfxuXhC/NKo3qRcI5o9igbz6zJUqSlQ03bPeMqWIGTPatZnbWsNR1RnlNERNQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT", + "dependencies": { + "find-up-simple": "^1.0.1", + "jsonc-eslint-parser": "^2.4.0", + "pathe": "^2.0.3", + "pnpm-workspace-yaml": "0.3.1", + "tinyglobby": "^0.2.12", + "yaml-eslint-parser": "^1.3.0" + }, + "peerDependencies": { + "eslint": "^9.0.0" + } + }, + "node_modules/eslint-plugin-regexp": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-regexp/-/eslint-plugin-regexp-2.7.0.tgz", + "integrity": "sha512-U8oZI77SBtH8U3ulZ05iu0qEzIizyEDXd+BWHvyVxTOjGwcDcvy/kEpgFG4DYca2ByRLiVPFZ2GeH7j1pdvZTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.11.0", + "comment-parser": "^1.4.0", + "jsdoc-type-pratt-parser": "^4.0.0", + "refa": "^0.12.1", + "regexp-ast-analysis": "^0.7.1", + "scslre": "^0.3.0" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "eslint": ">=8.44.0" + } + }, + "node_modules/eslint-plugin-toml": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-toml/-/eslint-plugin-toml-0.12.0.tgz", + "integrity": "sha512-+/wVObA9DVhwZB1nG83D2OAQRrcQZXy+drqUnFJKymqnmbnbfg/UPmEMCKrJNcEboUGxUjYrJlgy+/Y930mURQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "eslint-compat-utils": "^0.6.0", + "lodash": "^4.17.19", + "toml-eslint-parser": "^0.10.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-plugin-unicorn": { + "version": "59.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-59.0.1.tgz", + "integrity": "sha512-EtNXYuWPUmkgSU2E7Ttn57LbRREQesIP1BiLn7OZLKodopKfDXfBUkC/0j6mpw2JExwf43Uf3qLSvrSvppgy8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "@eslint-community/eslint-utils": "^4.5.1", + "@eslint/plugin-kit": "^0.2.7", + "ci-info": "^4.2.0", + "clean-regexp": "^1.0.0", + "core-js-compat": "^3.41.0", + "esquery": "^1.6.0", + "find-up-simple": "^1.0.1", + "globals": "^16.0.0", + "indent-string": "^5.0.0", + "is-builtin-module": "^5.0.0", + "jsesc": "^3.1.0", + "pluralize": "^8.0.0", + "regexp-tree": "^0.1.27", + "regjsparser": "^0.12.0", + "semver": "^7.7.1", + "strip-indent": "^4.0.0" + }, + "engines": { + "node": "^18.20.0 || ^20.10.0 || >=21.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" + }, + "peerDependencies": { + "eslint": ">=9.22.0" + } + }, + "node_modules/eslint-plugin-unused-imports": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.1.4.tgz", + "integrity": "sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0", + "eslint": "^9.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-vue": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.1.0.tgz", + "integrity": "sha512-/VTiJ1eSfNLw6lvG9ENySbGmcVvz6wZ9nA7ZqXlLBY2RkaF15iViYKxglWiIch12KiLAj0j1iXPYU6W4wTROFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^6.0.15", + "semver": "^7.6.3", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "vue-eslint-parser": "^10.0.0" + } + }, + "node_modules/eslint-plugin-yml": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.18.0.tgz", + "integrity": "sha512-9NtbhHRN2NJa/s3uHchO3qVVZw0vyOIvWlXWGaKCr/6l3Go62wsvJK5byiI6ZoYztDsow4GnS69BZD3GnqH3hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.2", + "escape-string-regexp": "4.0.0", + "eslint-compat-utils": "^0.6.0", + "natural-compare": "^1.4.0", + "yaml-eslint-parser": "^1.2.1" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-processor-vue-blocks": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-processor-vue-blocks/-/eslint-processor-vue-blocks-2.0.0.tgz", + "integrity": "sha512-u4W0CJwGoWY3bjXAuFpc/b6eK3NQEI8MoeW7ritKj3G3z/WtHrKjkqf+wk8mPEy5rlMGS+k6AZYOw2XBoN/02Q==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/compiler-sfc": "^3.3.0", + "eslint": ">=9.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/@eslint/core": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", + "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventsource": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.6.tgz", + "integrity": "sha512-l19WpE2m9hSuyP06+FbuUUf1G+R0SFLrtQfbRb9PRr+oimOfxQhgGCbVaXg5IvZyyTThJsxh6L/srkMiCeBPDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.1.tgz", + "integrity": "sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.0.tgz", + "integrity": "sha512-eB5zbQh5h+VenMPM3fh+nw1YExi5nMr6HUCR62ELSP11huvxm/Uir1H1QEyTkk5QX6A58pX6NmaTMceKZ0Eodg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": "^4.11 || 5 || ^5.0.0-beta.1" + } + }, + "node_modules/exsolve": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.5.tgz", + "integrity": "sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-tsconfig": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", + "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.1.0.tgz", + "integrity": "sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-builtin-module": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-5.0.0.tgz", + "integrity": "sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "builtin-modules": "^5.0.0" + }, + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", + "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonc-eslint-parser": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.0.tgz", + "integrity": "sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.5.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/jsonc-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/jsonc-eslint-parser/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/local-pkg": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.1.tgz", + "integrity": "sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.0.1", + "quansync": "^0.2.8" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lottie-web": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/lottie-web/-/lottie-web-5.13.0.tgz", + "integrity": "sha512-+gfBXl6sxXMPe8tKQm7qzLnUy5DUPJPKIyRHwtpCpyUEYjHYRJC/5gjUvdkuO2c3JllrPtHXH5UJJK8LRYl5yQ==", + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", + "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", + "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mlly": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz", + "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.14.0", + "pathe": "^2.0.1", + "pkg-types": "^1.3.0", + "ufo": "^1.5.4" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-postinstall": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.2.3.tgz", + "integrity": "sha512-Mi7JISo/4Ij2tDZ2xBE2WH+/KvVlkhA6juEjpEeRAVPNCpN3nxJo/5FhDNKgBcdmcmhaH6JjgST4xY/23ZYK0w==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-orderby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-5.0.0.tgz", + "integrity": "sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-manager-detector": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.3.0.tgz", + "integrity": "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-gitignore": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-gitignore/-/parse-gitignore-2.0.0.tgz", + "integrity": "sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/parse-imports-exports": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz", + "integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-statements": "1.0.11" + } + }, + "node_modules/parse-statements": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz", + "integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==", + "dev": true, + "license": "MIT" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkce-challenge": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz", + "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/pkg-types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.1.0.tgz", + "integrity": "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.1", + "exsolve": "^1.0.1", + "pathe": "^2.0.3" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pnpm-workspace-yaml": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pnpm-workspace-yaml/-/pnpm-workspace-yaml-0.3.1.tgz", + "integrity": "sha512-3nW5RLmREmZ8Pm8MbPsO2RM+99RRjYd25ynj3NV0cFsN7CcEl4sDFzgoFmSyduFwxFQ2Qbu3y2UdCh6HlyUOeA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT", + "dependencies": { + "yaml": "^2.7.0" + } + }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", + "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quansync": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.10.tgz", + "integrity": "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/refa": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/refa/-/refa-0.12.1.tgz", + "integrity": "sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.8.0" + }, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/regexp-ast-analysis": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/regexp-ast-analysis/-/regexp-ast-analysis-0.7.1.tgz", + "integrity": "sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.8.0", + "refa": "^0.12.1" + }, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "dev": true, + "license": "MIT", + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, + "node_modules/regjsparser": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/scslre": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/scslre/-/scslre-0.3.0.tgz", + "integrity": "sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.8.0", + "refa": "^0.12.0", + "regexp-ast-analysis": "^0.7.0" + }, + "engines": { + "node": "^14.0.0 || >=16.0.0" + } + }, + "node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.21", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz", + "integrity": "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/strip-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/synckit": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", + "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tinyexec": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", + "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toml-eslint-parser": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/toml-eslint-parser/-/toml-eslint-parser-0.10.0.tgz", + "integrity": "sha512-khrZo4buq4qVmsGzS5yQjKe/WsFvV8fGfOjDQN0q4iy9FjRfPWRgTFrU8u1R2iu/SfWLhY9WnCi4Jhdrcbtg+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/toml-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unrs-resolver": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.7.2.tgz", + "integrity": "sha512-BBKpaylOW8KbHsu378Zky/dGh4ckT/4NW/0SHRABdqRLcQJ2dAOjDo9g97p04sWflm0kqPqpUatxReNV/dqI5A==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/JounQin" + }, + "optionalDependencies": { + "@unrs/resolver-binding-darwin-arm64": "1.7.2", + "@unrs/resolver-binding-darwin-x64": "1.7.2", + "@unrs/resolver-binding-freebsd-x64": "1.7.2", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.7.2", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.7.2", + "@unrs/resolver-binding-linux-arm64-gnu": "1.7.2", + "@unrs/resolver-binding-linux-arm64-musl": "1.7.2", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.7.2", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.7.2", + "@unrs/resolver-binding-linux-riscv64-musl": "1.7.2", + "@unrs/resolver-binding-linux-s390x-gnu": "1.7.2", + "@unrs/resolver-binding-linux-x64-gnu": "1.7.2", + "@unrs/resolver-binding-linux-x64-musl": "1.7.2", + "@unrs/resolver-binding-wasm32-wasi": "1.7.2", + "@unrs/resolver-binding-win32-arm64-msvc": "1.7.2", + "@unrs/resolver-binding-win32-ia32-msvc": "1.7.2", + "@unrs/resolver-binding-win32-x64-msvc": "1.7.2" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vue-eslint-parser": { + "version": "10.1.3", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.1.3.tgz", + "integrity": "sha512-dbCBnd2e02dYWsXoqX5yKUZlOt+ExIpq7hmHKPb5ZqKcjf++Eo0hMseFTZMLKThrUk61m+Uv6A2YSBve6ZvuDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.6.0", + "lodash": "^4.17.21", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/yaml": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", + "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yaml-eslint-parser": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.3.0.tgz", + "integrity": "sha512-E/+VitOorXSLiAqtTd7Yqax0/pAS3xaYMP+AUUJGOK1OZG3rhcj9fcJOM5HJ2VrP1FrStVCWr1muTfQCdj4tAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.0.0", + "yaml": "^2.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/yaml-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.24.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.4.tgz", + "integrity": "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.24.5", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", + "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.24.1" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/shudu/package.json b/shudu/package.json new file mode 100644 index 0000000..77f9695 --- /dev/null +++ b/shudu/package.json @@ -0,0 +1,22 @@ +{ + "name": "shudu", + "type": "module", + "version": "1.0.0", + "description": "", + "author": "", + "license": "ISC", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "lint": "eslint . --fix" + }, + "dependencies": { + "bezier-easing": "^2.1.0", + "lottie-web": "^5.13.0" + }, + "devDependencies": { + "@antfu/eslint-config": "^4.13.0", + "eslint": "^9.26.0", + "eslint-plugin-format": "^1.0.1" + } +} diff --git a/shudu/settings/BuildSettings.json b/shudu/settings/BuildSettings.json new file mode 100644 index 0000000..a881d73 --- /dev/null +++ b/shudu/settings/BuildSettings.json @@ -0,0 +1,22 @@ +{ + "name": "Sudoku", + "displayName": "Sudoku", + "minifyJS": true, + "startupScene": "res://9b931ecf-fde9-44dd-acf3-15f8dc807965", + "alwaysIncluded": [ + "fonts", + "images", + "trophys", + "sequences" + ], + "enableVersion": true, + "android": { + "targetArchitectures": { + "ARMv7": true, + "ARM64": false, + "x86": false, + "x86-64": false + }, + "exportFormat": "APK" + } +} \ No newline at end of file diff --git a/shudu/settings/CompilerSettings.json b/shudu/settings/CompilerSettings.json new file mode 100644 index 0000000..dab1d8c --- /dev/null +++ b/shudu/settings/CompilerSettings.json @@ -0,0 +1,3 @@ +{ + "mainScript": "res://b44e3e7a-8acb-4a68-ac7d-83e011f63c04" +} \ No newline at end of file diff --git a/shudu/settings/DimensionsSettings.json b/shudu/settings/DimensionsSettings.json new file mode 100644 index 0000000..32222d6 --- /dev/null +++ b/shudu/settings/DimensionsSettings.json @@ -0,0 +1,8 @@ +{ + "dimensions": { + "设计分辨率": { + "x": 1080, + "y": 1920 + } + } +} \ No newline at end of file diff --git a/shudu/settings/EditorSettings.json b/shudu/settings/EditorSettings.json new file mode 100644 index 0000000..fd0e14a --- /dev/null +++ b/shudu/settings/EditorSettings.json @@ -0,0 +1,11 @@ +{ + "textureType": 2, + "layers": [ + "Default", + "Layer1", + "Layer2", + "Layer3", + "Layer4", + "Layer5" + ] +} \ No newline at end of file diff --git a/shudu/settings/PlayerSettings.json b/shudu/settings/PlayerSettings.json new file mode 100644 index 0000000..fcc683e --- /dev/null +++ b/shudu/settings/PlayerSettings.json @@ -0,0 +1,15 @@ +{ + "resolution": { + "designWidth": 1920, + "designHeight": 1080, + "scaleMode": "fixedauto", + "backgroundColor": "rgba(245, 247, 251, 1)" + }, + "modules": { + "laya.ui": true, + "laya.d3": true + }, + "splash": { + "fit": "center" + } +} \ No newline at end of file diff --git a/shudu/shudu.laya b/shudu/shudu.laya new file mode 100644 index 0000000..a5a19fb --- /dev/null +++ b/shudu/shudu.laya @@ -0,0 +1,3 @@ +{ + "version": "3.2.5" +} \ No newline at end of file diff --git a/shudu/src/Entry.ts b/shudu/src/Entry.ts new file mode 100644 index 0000000..98dd2b8 --- /dev/null +++ b/shudu/src/Entry.ts @@ -0,0 +1,24 @@ +import { config } from "./constants/config" + +Laya.addBeforeInitCallback((stageConfig) => { + console.log(`window innerWidth=${window.innerWidth} innerHeight=${window.innerHeight}`) + console.log(`stageConfig designWidth=${stageConfig.designWidth} designWidth=${stageConfig.designHeight}`) + if (window.innerWidth > window.innerHeight) { + stageConfig.designWidth = config.DESIGN_HEIGHT + stageConfig.designHeight = config.DESIGN_WIDTH + stageConfig.scaleMode = "fixedauto" + config.H_SCREEN = true + } else { + stageConfig.designWidth = config.DESIGN_WIDTH + stageConfig.designHeight = config.DESIGN_HEIGHT + stageConfig.scaleMode = "fixedauto" + config.H_SCREEN = false + } + console.log(`横屏=${config.H_SCREEN}`) +}) + +export async function main() { + console.log("entry") + // 加载场景并打开场景 + Laya.Scene.open("Scene.ls") +} diff --git a/shudu/src/Entry.ts.meta b/shudu/src/Entry.ts.meta new file mode 100644 index 0000000..f7031ed --- /dev/null +++ b/shudu/src/Entry.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "b44e3e7a-8acb-4a68-ac7d-83e011f63c04" +} \ No newline at end of file diff --git a/shudu/src/Main.ts b/shudu/src/Main.ts new file mode 100644 index 0000000..b896ae4 --- /dev/null +++ b/shudu/src/Main.ts @@ -0,0 +1,22 @@ +import { DCManager } from "./models/DCManager" +import { LevelManager } from "./models/LevelManager" +import { ResourceManager } from "./models/ResourceManager" +import { StorageManager } from "./models/StorageManager" + +const { regClass } = Laya + +@regClass() +export class Main extends Laya.Script { + onAwake() { + console.log("Game onAwake") + DCManager.getInstance().init() + LevelManager.getInstance().init() + StorageManager.getInstance().init() + ResourceManager.getInstance().init() + } + + onLateUpdate(): void { + StorageManager.getInstance().saveUser() + StorageManager.getInstance().saveStage() + } +} diff --git a/shudu/src/Main.ts.meta b/shudu/src/Main.ts.meta new file mode 100644 index 0000000..cd60c32 --- /dev/null +++ b/shudu/src/Main.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "7bad1742-6eed-4d8d-81c0-501dc5bf03d6" +} \ No newline at end of file diff --git a/shudu/src/constants/config.ts b/shudu/src/constants/config.ts new file mode 100644 index 0000000..d590448 --- /dev/null +++ b/shudu/src/constants/config.ts @@ -0,0 +1,38 @@ +export const config = { + + DESIGN_WIDTH: 1080, + DESIGN_HEIGHT: 1920, + H_SCREEN: false, // 是否横屏 + + DEBUG: false, + OPEN_GUIDE: true, + + MISTAKE_MAX: 3, // 最大错误数 + + STAGE_TYPE: { // 关卡类型 + MAIN: 1, // 主线 + DC: 2// 每日挑战 + }, + + DEFAULT_STAGE_ID: "main", // 主线关卡标识 + + DIFFICULTY_TYPE: { // 难度 + Easy: "Easy", + Medium: "Medium", + Hard: "Hard", + Expert: "Expert", + Extreme: "Extreme" + }, + DIFFICULTY_LIST: ["Easy", "Medium", "Hard", "Expert", "Extreme"], + + BLOCK_COLOR: { + WHITE: "#ffffff", + GREY: "#f0f2f7", + RED: "#ef3e67", + BLUE: "#2559c0" + }, + + MONTH_ABBRS: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + MONTH_FULLNAMES: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"] + +} diff --git a/shudu/src/constants/config.ts.meta b/shudu/src/constants/config.ts.meta new file mode 100644 index 0000000..8783b85 --- /dev/null +++ b/shudu/src/constants/config.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "9070d54a-128c-45e5-b041-9a3abad8e883" +} \ No newline at end of file diff --git a/shudu/src/constants/respath.ts b/shudu/src/constants/respath.ts new file mode 100644 index 0000000..dd5f75b --- /dev/null +++ b/shudu/src/constants/respath.ts @@ -0,0 +1,103 @@ +import { config } from "./config" + +export const respath = { + home_ui_res: "resources/Home.lh", + topbar_ui_res: "resources/TopBar.lh", + + stage_ui_res: function func(): string { + return config.H_SCREEN ? "resources/Stage_H.lh" : "resources/Stage.lh" + }, + + gamepause_ui_res: function func(): string { + return config.H_SCREEN ? "resources/GamePause_H.lh" : "resources/GamePause.lh" + }, + gameover_ui_res: function func(): string { + return config.H_SCREEN ? "resources/GameOver_H.lh" : "resources/GameOver.lh" + }, + gamedone_ui_res: function func(isClassic: boolean): string { + if (isClassic) { + return config.H_SCREEN ? "resources/GameDone_Normal_H.lh" : "resources/GameDone_Normal.lh" + } else { + return config.H_SCREEN ? "resources/GameDone_DC_H.lh" : "resources/GameDone_DC.lh" + } + }, + + score_add_ui_res: function func(): string { + return config.H_SCREEN ? "resources/ScoreAdd_H.lh" : "resources/ScoreAdd.lh" + }, + + common_tips_ui_res: "resources/CommonTips.lh", + difficulty_ui_res: "resources/Difficulty.lh", + + dc_ui_res: function func(): string { + return config.H_SCREEN ? "resources/dc/DailyChallenge_H.lh" : "resources/dc/DailyChallenge.lh" + }, + trophy_claim_ui_res: function func(): string { + return config.H_SCREEN ? "resources/dc/TrophyClaim_H.lh" : "resources/dc/TrophyClaim.lh" + }, + trophy_show_ui_res: function func(): string { + return config.H_SCREEN ? "resources/dc/TrophyShow_H.lh" : "resources/dc/TrophyShow.lh" + }, + trophy_ui_res: function func(): string { + return config.H_SCREEN ? "resources/dc/TrophyRoom_H.lh" : "resources/dc/TrophyRoom.lh" + }, + trophy_year_ui_res: function func(): string { + return config.H_SCREEN ? "resources/dc/TrophyRoomYear_H.lh" : "resources/dc/TrophyRoomYear.lh" + }, + trophy_cell_ui_res: function func(): string { + return config.H_SCREEN ? "resources/dc/TrophyRoomCell_H.lh" : "resources/dc/TrophyRoomCell.lh" + }, + + font_Bold: "fonts/Inter-Bold-700.ttf", + font_Medium: "fonts/Inter-Medium-500.ttf", + font_Regular: "fonts/Inter-Regular-400.ttf", + font_SemiBold: "fonts/Inter-SemiBold-600.ttf", + + // =============================== + bg_done: "images/bg_done.png", + bg_done_light: "images/bg_done_light.png", + bg_done_top: "images/bg_done_top.png", + icon_star1: "images/star.png", + icon_star2: "images/star2.png", + Congratulations: "images/Congratulations.png", + + home_top_dc_bg_normal: "images/bg_dc_top1.png", + home_top_dc_bg_finish: "images/bg_dc_top2.png", + dc_top_bg_normal: "images/img_dc_bg2.png", + dc_top_bg_finish: "images/img_dc_finished.png", + get_dc_lights: function func(): string[] { + const dc_lights: Array = [] + const prefix = "sequences/lottie_trophy_light_2x/lottie_trophy_light_2x_00" + for (let i = 0; i < 120; i++) { + let endStr = i.toString() + if (i < 10) { + endStr = `00${i}` + } else if (i < 100) { + endStr = `0${i}` + } + const path = `${prefix + endStr}.png` + dc_lights.push(path) + } + return dc_lights + }, + + trophy_bg_light_gold: "trophys/img_trophy_bg_light_gold.png", + trophy_bg_light_grey: "trophys/img_trophy_bg_light_gray.png", + + trophys: function func(): string[] { + const list: Array = [] + list.push("trophys/trophy_01.png") + list.push("trophys/trophy_02.png") + list.push("trophys/trophy_03.png") + list.push("trophys/trophy_04.png") + list.push("trophys/trophy_05.png") + list.push("trophys/trophy_06.png") + list.push("trophys/trophy_07.png") + list.push("trophys/trophy_08.png") + list.push("trophys/trophy_09.png") + list.push("trophys/trophy_10.png") + list.push("trophys/trophy_11.png") + list.push("trophys/trophy_12.png") + return list + } +} diff --git a/shudu/src/constants/respath.ts.meta b/shudu/src/constants/respath.ts.meta new file mode 100644 index 0000000..9884797 --- /dev/null +++ b/shudu/src/constants/respath.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "1efa1426-84f2-4cc2-9061-6e7508539831" +} \ No newline at end of file diff --git a/shudu/src/models/DCManager.ts b/shudu/src/models/DCManager.ts new file mode 100644 index 0000000..3743982 --- /dev/null +++ b/shudu/src/models/DCManager.ts @@ -0,0 +1,58 @@ +import { respath } from "../constants/respath" + +export const MONTH_LIST = [ + { year: 2024, month: 12, begin: 0, dayCount: 31, icon_res: respath.trophys()[11] } +] + +export function G_getMonthInfo(year: number, month: number): any { + for (let i = 0; i < MONTH_LIST.length; i++) { + const obj = MONTH_LIST[i] + if (obj.year === year && obj.month === month) { + return obj + } + } + return null +} + +export class DCManager { + private static instance: DCManager + public static getInstance(): DCManager { + if (!DCManager.instance) { + DCManager.instance = new DCManager() + } + return DCManager.instance + } + + public init(): void { + const now = new Date() + const nowYear = now.getFullYear() + const nowMonth = now.getMonth() + 1 + let year = nowYear + let month = nowMonth + if (nowMonth === 12) { + year++ + month = 1 + } + for (let i = 2025; i <= year; i++) { + let b = false + for (let j = 1; j <= 12; j++) { + const date1 = new Date(`${i}/${j}/1`) + let date2 = new Date(`${i}/${j + 1}/1`) + if (j === 12) { + date2 = new Date(`${i + 1}/1/1`) + } + const seconds = date2.getTime() - date1.getTime() + const dayCount = Math.round(seconds / 1000 / 86400) + const begin = date1.getDay() + MONTH_LIST.push({ year: i, month: j, begin, dayCount, icon_res: respath.trophys()[j - 1] }) + if (i === year && j === month) { + b = true + break + } + } + if (b) { + break + } + } + } +} diff --git a/shudu/src/models/DCManager.ts.meta b/shudu/src/models/DCManager.ts.meta new file mode 100644 index 0000000..b8244e2 --- /dev/null +++ b/shudu/src/models/DCManager.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "261c816d-1904-4442-9934-b0d91044ca02" +} \ No newline at end of file diff --git a/shudu/src/models/DOBlock.ts b/shudu/src/models/DOBlock.ts new file mode 100644 index 0000000..1fe116e --- /dev/null +++ b/shudu/src/models/DOBlock.ts @@ -0,0 +1,80 @@ +import type { DataBlock } from "../types/global" +import { StorageManager } from "./StorageManager" + +export class DOBlock { + private data: DataBlock + private preset: boolean = false// 预设格子 + private correct: number = 0 + private checked: boolean = false// 是否正确 + + constructor(dataBlock: DataBlock, preset: boolean, correct: number) { + this.data = dataBlock + this.preset = preset + this.correct = correct + this.checked = preset || (dataBlock.show === correct) + } + + // ====================================持久化数据 + public get_index(): number { + return this.data.index + } + + public get_show(): number { + return this.data.show + } + + public set_show(show: number): void { + this.data.show = show + this.checked = show === this.get_correct() + StorageManager.getInstance().onStageChanged() + } + + public get_score(): number { + return this.data.score + } + + public set_score(score: number): void { + this.data.score = score + StorageManager.getInstance().onStageChanged() + } + + public get_notes(): Array { + return this.data.notes + } + + public add_note(noteNumber: number): void { + const find = this.data.notes.indexOf(noteNumber) + if (find < 0) { + this.data.notes.push(noteNumber) + StorageManager.getInstance().onStageChanged() + } + } + + public remove_note(noteNumber: number): void { + const find = this.data.notes.indexOf(noteNumber) + if (find >= 0) { + this.data.notes.splice(find, 1) + StorageManager.getInstance().onStageChanged() + } + } + + public clean_notes(): void { + if (this.data.notes.length > 0) { + this.data.notes = [] + StorageManager.getInstance().onStageChanged() + } + } + // ====================================持久化数据 + + public get_preset(): boolean { + return this.preset + } + + public get_correct(): number { + return this.correct + } + + public get_checked(): boolean { + return this.checked + } +} diff --git a/shudu/src/models/DOBlock.ts.meta b/shudu/src/models/DOBlock.ts.meta new file mode 100644 index 0000000..3bc8ee1 --- /dev/null +++ b/shudu/src/models/DOBlock.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "aeb99474-1a9f-4a01-ac79-3416ec39a309" +} \ No newline at end of file diff --git a/shudu/src/models/DOCandy.ts b/shudu/src/models/DOCandy.ts new file mode 100644 index 0000000..7f14d4b --- /dev/null +++ b/shudu/src/models/DOCandy.ts @@ -0,0 +1,21 @@ +export class DOCandy { + private show: number + private left: number + + constructor(show: number, left: number) { + this.show = show + this.left = left + } + + public get_show(): number { + return this.show + } + + public get_left(): number { + return this.left + } + + public set_left(left: number): void { + this.left = left + } +} diff --git a/shudu/src/models/DOCandy.ts.meta b/shudu/src/models/DOCandy.ts.meta new file mode 100644 index 0000000..aa627ae --- /dev/null +++ b/shudu/src/models/DOCandy.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "0c3f05a2-7935-4847-8760-858002151854" +} \ No newline at end of file diff --git a/shudu/src/models/DOStage.ts b/shudu/src/models/DOStage.ts new file mode 100644 index 0000000..2664c21 --- /dev/null +++ b/shudu/src/models/DOStage.ts @@ -0,0 +1,198 @@ +import type { DataBlock, DataStage, DataUndo } from "../types/global" +import { DOBlock } from "./DOBlock" +import { LevelManager } from "./LevelManager" +import { StorageManager } from "./StorageManager" + +export class DOStage { + private data: DataStage + private blocks: Array = [] + + private letterToNumber: Map + private numberToLetter: Map + + constructor(dataStage: DataStage) { + this.data = dataStage + + this.letterToNumber = new Map() + this.letterToNumber.set("A", 1) + this.letterToNumber.set("B", 2) + this.letterToNumber.set("C", 3) + this.letterToNumber.set("D", 4) + this.letterToNumber.set("E", 5) + this.letterToNumber.set("F", 6) + this.letterToNumber.set("G", 7) + this.letterToNumber.set("H", 8) + this.letterToNumber.set("I", 9) + + this.numberToLetter = new Map() + this.numberToLetter.set(1, "a") + this.numberToLetter.set(2, "b") + this.numberToLetter.set(3, "c") + this.numberToLetter.set(4, "d") + this.numberToLetter.set(5, "e") + this.numberToLetter.set(6, "f") + this.numberToLetter.set(7, "g") + this.numberToLetter.set(8, "h") + this.numberToLetter.set(9, "i") + + const blockMap: Map = new Map() + for (let i = 0; i < this.data.blocks.length; i++) { + const dataBlock = this.data.blocks[i] + blockMap.set(dataBlock.index, dataBlock) + } + + const levelStr = LevelManager.getInstance().getLevelStr(this.data.difficulty, this.data.index) + if (!levelStr || levelStr.length !== 81) { + console.log("levelStr error", this.data.difficulty, this.data.index, levelStr) + } + const list = new Map() + for (let i = 0; i < levelStr.length; i++) { + const letter = levelStr[i] + if (this.letterToNumber.has(letter)) { // 预设格子 使用配置文件初始化 + const show = this.letterToNumber.get(letter) + const dataBlock: DataBlock = { index: i, show, score: 0, notes: [] } + const doBlock = new DOBlock(dataBlock, true, show) + this.blocks.push(doBlock) + } else { + const show = this.letterToNumber.get(letter.toUpperCase()) + if (blockMap.has(i)) { // 本地有持久化数据 + const dataBlock = blockMap.get(i) + const doBlock = new DOBlock(dataBlock, false, show) + this.blocks.push(doBlock) + } else { + const notes: Array = [] + const dataBlock = { index: i, show: 0, score: 0, notes } + this.data.blocks.push(dataBlock) + const doBlock = new DOBlock(dataBlock, false, show) + this.blocks.push(doBlock) + } + + if (list.has(letter)) { + list.set(letter, list.get(letter) + 1) + } else { + list.set(letter, 1) + } + } + } + } + + public getData(): DataStage { + return this.data + } + + // ====================================持久化数据 + public get_stageID(): string { + return this.data.id + } + + public get_stageType(): number { + return this.data.type + } + + public get_stageName(): string { + return this.data.name + } + + public get_difficulty(): string { + return this.data.difficulty + } + + public get_stageIndex(): number { + return this.data.index + } + + public get_mistake(): number { + return this.data.mistake + } + + public set_mistake(mistake: number): void { + this.data.mistake = mistake + StorageManager.getInstance().onStageChanged() + } + + public get_score(): number { + return this.data.score + } + + public set_score(score: number): void { + this.data.score = score + StorageManager.getInstance().onStageChanged() + } + + public get_duration(): number { + return this.data.duration + } + + public set_duration(duration: number): void { // 关卡计时 + this.data.duration = duration + StorageManager.getInstance().onStageChanged() + } + + public get_last_hit_time(): number { + return this.data.last_hit_time + } + + public set_last_hit_time(last_hit_time: number): void { + this.data.last_hit_time = last_hit_time + StorageManager.getInstance().onStageChanged() + } + + public get_note_open(): boolean { + return this.data.note_open + } + + public set_note_open(note_open: boolean): void { + this.data.note_open = note_open + StorageManager.getInstance().onStageChanged() + } + + public get_select_index(): number { + return this.data.select_index + } + + public set_select_index(select_index: number): void { // 当前选中 + this.data.select_index = select_index + StorageManager.getInstance().onStageChanged() + } + + public get_hint(): number { + return this.data.hint + } + + public set_hint(hint: number): void { // 提示 + this.data.hint = hint + StorageManager.getInstance().onStageChanged() + } + + public get_undos(): Array { + return this.data.undos + } + + public add_undo(index: number, show: number = 0, notes: Array = []): void { + let _notes: Array + if (notes) { + _notes = [] + for (let i = 0; i < notes.length; i++) + _notes.push(notes[i]) + } + const dataUndo: DataUndo = { index, show, notes: _notes } + // console.log("add_undo >>>>>>>>>>>>>>>>>>>>>>>>>>>>", JSON.stringify(dataUndo)) + this.data.undos.push(dataUndo) + StorageManager.getInstance().onStageChanged() + } + + public pop_undo(): DataUndo { + let dataUndo: DataUndo + if (this.data.undos.length > 0) { + dataUndo = this.data.undos[this.data.undos.length - 1] + this.data.undos.splice(this.data.undos.length - 1, 1) + StorageManager.getInstance().onStageChanged() + } + return dataUndo + } + // ====================================持久化数据 + + public get_blocks(): Array { + return this.blocks + } +} diff --git a/shudu/src/models/DOStage.ts.meta b/shudu/src/models/DOStage.ts.meta new file mode 100644 index 0000000..e670c79 --- /dev/null +++ b/shudu/src/models/DOStage.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "d88044d6-69d3-44d1-85bf-2d353609a8d2" +} \ No newline at end of file diff --git a/shudu/src/models/DOUser.ts b/shudu/src/models/DOUser.ts new file mode 100644 index 0000000..3e5cba7 --- /dev/null +++ b/shudu/src/models/DOUser.ts @@ -0,0 +1,177 @@ +import type { DataProgress, DataUser, StageProgress, TrophyRecord } from "../types/global" +import { StorageManager } from "./StorageManager" + +export class DOUser { + private data: DataUser + private mapDones: Map = new Map() + + constructor(dataUser: DataUser) { + this.data = dataUser + for (let i = 0; i < this.data.dones.length; i++) { + const obj = this.data.dones[i] + this.mapDones.set(obj.stageID, obj.progress) + } + } + + public getData(): DataUser { + return this.data + } + + // ====================================持久化数据 + public get_done(stageID: string): number { + if (this.mapDones.has(stageID)) { + return this.mapDones.get(stageID) + } + return 0 + } + + public get_doneCountByDate(year: number, month: number): number { + let count = 0 + const key = `${year}-${month}` + this.mapDones.forEach((progres: number, stageID: string) => { + if (stageID.startsWith(key) && progres >= 1) { + count++ + } + }) + return count + } + + public get_isAllDoneByDate(year: number, month: number): boolean { + let boolean = true + const key = `${year}-${month}` + this.mapDones.forEach((progres: number, stageID: string) => { + if (stageID.startsWith(key) && progres < 1) { + boolean = false + } + }) + return boolean + } + + public update_stage_done(stageID: string, progress: number): void { + let find: StageProgress + for (let i = 0; i < this.data.dones.length; i++) { + const obj = this.data.dones[i] + if (obj.stageID === stageID) { + find = obj + break + } + } + if (find) { + find.progress = progress + } else { + find = { stageID, progress } + this.data.dones.push(find) + } + this.mapDones.set(find.stageID, find.progress) + StorageManager.getInstance().onUserChanged() + } + + // ================奖杯获得记录 + public get_trophyRecord(year: number, month: number): TrophyRecord { + let find: TrophyRecord + for (let i = 0; i < this.data.trophy_records.length; i++) { + const obj = this.data.trophy_records[i] + if (obj.year === year && obj.month === month) { + find = obj + break + } + } + return find + } + + public get_trophyHasNew(): TrophyRecord { + let find: TrophyRecord + for (let i = 0; i < this.data.trophy_records.length; i++) { + const obj = this.data.trophy_records[i] + if (obj.isNew) { + find = obj + break + } + } + return find + } + + public set_trophyNew(record: TrophyRecord, isNew: boolean): void { + if (record.isNew !== isNew) { + record.isNew = isNew + StorageManager.getInstance().onUserChanged() + } + } + + public get_trophyHasUnread(): boolean { + let unread = false + for (let i = 0; i < this.data.trophy_records.length; i++) { + const obj = this.data.trophy_records[i] + if (obj.read === false) { + unread = true + break + } + } + return unread + } + + public set_trophyAllread(): void { + let changed = false + for (let i = 0; i < this.data.trophy_records.length; i++) { + const obj = this.data.trophy_records[i] + if (obj.read === false) { + obj.read = true + changed = true + } + } + if (changed) { + StorageManager.getInstance().onUserChanged() + } + } + + public add_trophy_record(year: number, month: number, day: number): void { + let find + for (let i = 0; i < this.data.trophy_records.length; i++) { + const obj = this.data.trophy_records[i] + if (obj.year === year && obj.month === month) { + find = obj + break + } + } + if (!find) { + this.data.trophy_records.push({ year, month, day, isNew: true, read: false }) + StorageManager.getInstance().onUserChanged() + } + } + + // =======关卡难度进度 + public get_progress(difficulty: string): number { + let find: DataProgress + for (let i = 0; i < this.data.progresses.length; i++) { + const obj = this.data.progresses[i] + if (obj.difficulty === difficulty) { + find = obj + break + } + } + if (find) { + return find.index + } + return 0 + } + + public update_progress(difficulty: string, index: number): void { + let find: DataProgress + for (let i = 0; i < this.data.progresses.length; i++) { + const obj = this.data.progresses[i] + if (obj.difficulty === difficulty) { + find = obj + break + } + } + if (find) { + find.index = index + } else { + find = { difficulty, index } + this.data.progresses.push(find) + } + StorageManager.getInstance().onUserChanged() + } + + // ====================================持久化数据 +} diff --git a/shudu/src/models/DOUser.ts.meta b/shudu/src/models/DOUser.ts.meta new file mode 100644 index 0000000..35b3ded --- /dev/null +++ b/shudu/src/models/DOUser.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "fc4cb9cd-3bc4-47e8-bfd4-6adbaea331b8" +} \ No newline at end of file diff --git a/shudu/src/models/EventManager.ts b/shudu/src/models/EventManager.ts new file mode 100644 index 0000000..c2681d3 --- /dev/null +++ b/shudu/src/models/EventManager.ts @@ -0,0 +1,48 @@ +export const EVENT_TYPES = { + NOT_UPDATE_MISTAKE: "NOT_UPDATE_MISTAKE", // 更新分数 + NOT_UPDATE_PAUSE: "NOT_UPDATE_PAUSE", // 更新暂停状态 + + NOT_SET_TROPHY_BUTTON: "NOT_SET_TROPHY_BUTTON" +} + +export class EventManager { + private static instance: EventManager + public static getInstance(): EventManager { + if (!EventManager.instance) { + EventManager.instance = new EventManager() + } + return EventManager.instance + } + + private listeners: Map> = new Map() + + public RegisterEvent(eventID: string, func: any): void { + if (this.listeners.has(eventID) === false) { + this.listeners.set(eventID, []) + } + const list: Array = this.listeners.get(eventID) + const find = list.indexOf(func) + if (find < 0) { + list.push(func) + } + } + + public UnregisterEvent(eventID: string, func: any): void { + if (this.listeners.has(eventID)) { + const list: Array = this.listeners.get(eventID) + const find = list.indexOf(func) + if (find >= 0) { + list.splice(find, 1) + } + } + } + + public DispatchEvent(eventID: string, arg: any = null): void { + if (this.listeners.has(eventID)) { + const list: Array = this.listeners.get(eventID) + for (let i = 0; i < list.length; i++) { + list[i](arg) + } + } + } +} diff --git a/shudu/src/models/EventManager.ts.meta b/shudu/src/models/EventManager.ts.meta new file mode 100644 index 0000000..66735d9 --- /dev/null +++ b/shudu/src/models/EventManager.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "1784429c-7fbe-47bc-8281-9a34510da81b" +} \ No newline at end of file diff --git a/shudu/src/models/LevelManager.ts b/shudu/src/models/LevelManager.ts new file mode 100644 index 0000000..d169983 --- /dev/null +++ b/shudu/src/models/LevelManager.ts @@ -0,0 +1,153 @@ +import { config } from "../constants/config" + +const Easy = [ + "aBCeIGFhdEDFcAHBGIhigBdfecAgHDiFBCaeBEAGHCIdffcIdEAHbgcABfGEdiHIFHaCDGEBDGEHbiaFC", + "abecfIgdhdICGhbAFEHGfeAdIcBCFAbigEHDGDhFeABICIEbHdCFGAFaGDBHcEIbCDIGehAFeHIaCFdbG", + "AbIGdeHFCHFDbCieaGgEcfaHbDIEiAdBFGcHFHGcEAIBddCBHIGFEaCdfiGBAHEbgeAHCDIfIaHefdCgB", + "ACEdBIGHFBHGFacDEIdiFheGAbCcEiBdFHaGhfBGIAecDGadcHeIfBIgCaFHbDEFdAegbcIHEBHICDfGa", + "acEIhbgFDFIDAgEBHCBGHfCdeaIDEaBFgicHcFGHAidebIHbDecaGFeBFCIAHdGGDCebHfIAHAiGdfCBE", + "aCfDbGHIEGHBIcEFdaedIAFhbCGDFahGiebCHbecaDIGFiGCbEFdAHBEHGIcAfDFiGedACHBCAdFHBgei", + "ACGBfIHDeHEBCdgFAIfdIHaegcBDgEAHCIBFIbhFEdaGCcAFGIbDEHgIDebHcfabHADcFEiGEfcigABHd", + "AcGFdihBEdHEbGCAifBFIEhaGDCEgADIBfcHhibGcfDEaFDChaEigbGBHCFdEAIIEdabHCFGcAfIEGbHD", + "ACGIFbEhdbFEDGhaCIIHDCAEBGFFAIHBDceggdbecfIahHEcAIGdFBeIHFDAGBcdGFbeCHIacbAgHifdE" +] +const Medium = [ + "achEDIBFGgeIHbFaDCFDBaCGHeIbHaceDGiFCIFGHBeadeGDIFAChbDAGbIeFCHhfEdGCIbaiBcFAhdGE", + "ADBeIGhFCGhCDFabiefiECHBgDACGDbaFieHEBIHGCFADhFAIedCbGdAFGbheCIbEhaciDGFIcGFDeaHb", + "aDBIEcHFGEGHbDFcaiIFCAGHeDbgHdEIafBCCIaHFbdGeBefGcdIHADCGFbeAIHhbedAIGcFFaIcHgBEd", + "AdEGCHfibHGbefIacdCIFABdehgICgHDAbFefahbecDgIEBDIGFCAHbeICAGHDFGFCDheIbADHAFIBGec", + "ADeIBFgHCIHFcgabdebGCeDhaIfHfaDeIcGbgIBFacHEdECdBHGFaiFBHAIEDcGDeGHcBiFaCAIgFDEBH", + "aDFIEHbcGciHaGbFDEeGBcdFHIAbeadhCgfIGHIfBEcAdFCdGAIeHBDAeHcgibFHFGbIDaECIBcEFADGh", + "aDgEICFBHHCFdGBAeIIEBFHacdgcAEgBIdhFDGhCFEiabBFIADHEGCGbciaDHfEEHdbcFgiAFiAHeGbcd", + "adHEbCIfGegBfHIDAcIcfgDaHEBDFABIGcHEHIcdfegbaBEGcAHFdIFAdIgBeCHCbihEFAGdghEACDBIF", + "aecDbHIGFDGHCFIBEAfiBEGaHCdgAFBIedHcHCEaDFGBIbDIghCFAeibahcdeFGcHdfeGAIBefGIAbCDH" +] +const Hard = [ + "AEdfiHgCBIFGECbahdcbHGADeIFGIFCDaBeHHDCbGEIFAeabhfICdgbCIAHFDGeFGadEcHBiDHeIBgFac", + "aEFGBihCdHcIefdGBAGdbcahIfeIBAFDcegHDHEAGBCiFFgcHIEadBeFHDCGBaicidBHAFEGbAGIeFDHC", + "AEGIdchFBFICbehgAdbHDFAGeIchdEgBaFCiGbfchIadeCAIefdbGHdfBaIeChGEGHdCFibAIcaHGbDEf", + "afbCGDehiIGhEaFCdBECDIbHAFGhEGADbfICdbifechGAFACHIGbeDgDFBHAIcEcIaDFeGBHBHegCIdaF", + "AFhIgCdEBcEGDBHAFIiDbfaeGCHhGIEcfbdafcdBIAHGEBaeHdGCIfEBACFdIHggHcAeiFbDdiFGHBEAC", + "agcfdHbEIHBDEIGCaFFiecBAhGDBEghcFIdaDHiAGbEfCCAFiEdGBHGCabfIdHeIDHgAEFCbEFBdHcAIg", + "agibdeFchcHDGIfeBAEFbHAcDIgiDCAEBGHFHBeDFGCaIFAGICHBdEgEaCBihfdbIfeHDAGCdCHFGaIeb", + "AHbIEDcGFCifgHBAdeGEDAfcIHBBdGHCEFaiIFcbdaHeGHaeFIGBCDeBAcGFdIhFGHDaieBcDcIebhGFA", + "AHEbCIGfdiBGDEFHCAdfcHGaBIEBGICfdaeHhCFEAbIdGEAdihgFbcFIAgDECHbcdBAIHegfGEHFbcdAI", + "AHECBgFdIBIGDAfhCECfDHIEagbIGHEDcBFAEBFAGichddCaBFHeigFEIgHadbChDcIeBGaFGabFcdiEH" +] +const Expert = [ + "AHEIDCFGBiBFGaedchcdghbfIEADfHEIACBgbeADCGHfiGCibFHaDEeaBcHDGIFHIdFgBeAcFGCaeIBhD", + "AHEIFGcbDDgBacefhIFIcBdHGeACbdHIFAgehfgEAcIDbEaIGBDHFCIEAFGbdcHBDFchaeiGgCHDEIbAF", + "aIBCFDeHGcGFHaeIdbdHEIGBafCFDGahcbieBeaGDIHcFICHEBfdGAHADFEgcbIgBIdcaFEHEFCbiHGAd", + "AIBHEFDcGEFcaDGihbHDGBCIAefGHFiadEBCBCAeFHGIdIEDGBcHFaCAiFGebdhfbHdIaCgedgECHbfAi", + "aiDHBEfCGCGEFIdhBABFHCaGEdiIDGEHbcAfHABifcdgeECFgDaIHBFBaDEHGiCdECbGIafHGhiacFBed", + "aIgdfbhcEdBEHCiGFAFCHEGaBdIIFbCAGDEHcHABDeFigegdIHFCabBDiFEHAGcHACGIDEBFGefabcihd", + "AIGdFebCHBfHiaCdGEEDcgHbIaFgcBfeAHIdiHecgDfBAfaDbIhgeccbfaDIeHGhGIECFadbdeAHBGCFI", + "baDEHGIFCGIHDCfABEceFAIBgdhfdchGIEABIgAbdEHcFEHbfaCDGIABeGFhciddFiCEabhGHCgIBdFEA", + "baicHdegFHEdIFGcABGFCaebhidfbadGCIHEICEfAhBDGdGHBIeaFCAHBEDfGCICDGHBifEaeiFGCADBh", + "BaiGFcdEHdFCHEAIGBhEgbDIcfaCidFAeBHGFBACGhEIdghEDibAcfEdBIHFgAcaGHECdFBIICfabGHDe", + "bCFIGHADeHAGdFebCIDIEaBcFGHEbHGAFDIcgdCbhieFaafiCEDHBGCEBHdGIafIHAFcbgeDfgDeiACHb", + "BdaHFIEGCicHDgEafBEGFBACDIHfbDcEgIHAHAIFBdgceCeGihAbDFDIbEchFaggFCadbHEIaHEGIfcBD", + "BDCEFiGAHIHacGBeDFGEFHADIBcEIdfHACgBhCGbDEaFIFABgicdHeaFhiEgbCdDbiaChfeGCGEdbFHIa", + "bdEcFAHIGCAIegHFBDFGHBDICaEehfaBDIGCDCgiHeaFBIBAFcgedhaicgEbDHFGeDhAFbcIHFbDiCGEa", + "BEaihfcdgCFIGEDAHBgDHACBIFeFIdhaeGbcAHGcBIDEfebcdFGHAIDgeBIHFCaHCbFGAeiDIAfEdcbGH", + "BehdIcaFgCfGeAHIbdaIdfBGCheEgcIDFHAbdAFHeBGCiIHBGcaDefFCIBHdeGAHbeaGIFDCGDACfEBIH", + "BfHCEGADIIdchAFGbeGaEiBdCHFFBigCADEHHEGBdIfaCDCafhEiGBeGFDIHbCacHdaFBEiGaIbegcHFd" +] +const Extreme = [ + "BGDiEAfchahcFBDIGEEIFhgCDabFAHGibedcDEGACHbIFCbIEdfGHagDACfEHBihFBDAIcegICEbHGaFd", + "BGFAIHDCEDHicegBAfEACFDbIGHidhbCEgFAaEGIhfcDBFCbgadeHIHIedGafBCcbdhFiAEGGFAEbcHID", + "BGFHIAdECaiCdBEFGHhDeFcgbaiGFBeAICHdICAGdHEFbdeHCFBGIAFhIBGDACEeBGaHcIDfcadiefhbg", + "BhAcGEIDFIGdBaFCHefeCHiDGbaeaBFcIdGHcDGEHAFIBhifgdBEACAcIDFHbEGGbHIEcaFDdFeabGhcI", + "BHeadfiCGICAgbHDEFdFgIEcHabgEHdFabICcadBHIfGEFBICGEAdHeiBFAGcHdHdCeIBGfAaGfHcDEBI", + "BHFcEdgaigIDAfbEHcCEaIGHBfDdfIGHCAeBhCBeIADGFAGedbFcihFdHBaGIceIacfDEHBGEbGHCIFdA", + "biADChGFEEHFIagbDCcGDBFEAHIIaeFHDCGBFBHgIcdEadcGebAhIFHfBAGIECDgDICEbFahaechdFibg", + "bICEGDHFAHFeaICdbGaDGbFHEcIEadfcgIHbFGHIbECAdICBhdAfGEcHiDAbgefGBFceiadhDEAGHFBIC", + "bieDFaGHcgcaeHiDbFHfDGcBiAECHIBgEFdaDGBHafEciAEFIDcbghFBcaIdheGIdHCEGAFBEAGFBHCID", + "BIFCAdhGeDhAEbgFCICEgFHiBDaFBEGDAIHCADHicBEfggciHFeDabHGDBicaefiacdeFGbHEFBaGHCID", + "bihCGEADfFAGIbDchEedCfahbigCFDEIGHbaIbEHdaFGCHGaBCfIEdGcFdHbeAIAEBGFIDcHdhIAEcGFB", + "CaBhedgfiidHcFGAEbEFGbiahCDAEIGDbFHcFGdIhcebahBCFaEDiGDHAECIBGFbCEdGFIAHGIfaBhCDE", + "cbFDEGiAHGIacFHdebdeHibAgFcfdIBCehGABHgAIFECdACEgHdfBIIGbFDCahEeAdHGBCIFHfceAIBDG", + "cbgHEaFdIaIdcbfGEHEHFigDBACbFEAIHdCGhcAEDGIBFDGIBFCehaGDCFABHIEiabGHecfdFehdcIaGB", + "CbhdAEIGfaEFgibCdhIGDHCFBEafDEBHaGICGibcfdhAehcAIeGFbddFIEbHAcGEHCagIDFBBAGfDCEHI", + "CDabGEHIFeFhIaCGDbbgIHdFcAEAcEGhbifdGIbCFdaEHdHfaEiBGciaDFCHEbghEgDbafCIFbceiGDha", + "cdgeAIBfhhbFDCgIAeAiEHbFcDGBFICGEdHAdGhBFaECIeACIdHGbfIedFHcagBGhbaEdficfCagiBHed", + "cDgIbFEAHehbdGaFICiafecHgDBACIGEBhfdgbdfhiCeAHFECAdbGIBIHAFedcgfGABdCIheDechIGabF", + "CEBIAFHGDIhAdEgbcfgFdCbheaIFGHACIDEbeBCGFdIhADaIbHEcFgBIEFGcAdHHdGEiaFbcAcFHDBgie", + "cEHGfdIABFIgCAbhedAbDeIHcGfeABFcGdHIHDFBEIACGigChdafbEbFaDHEgIcGCIAbfeDHDHeIGcBFA", + "ceIBaDGfhHaGcfiDEbBdFhGEIaCAHbFICEgDGiCdEahbFEfDGhbACIfbhEDGcIAiCeabHFdgdgaIcFBhe", + "CeiBaGHDfADGfeHIBCbFHidcegAdHCeFagIBIGECHBAFDFBAgIdcHEEaFHBIDcGgidacfBEHHCBdGefaI", + "cEIDAGFHbgDBEFhICAFHAIBCeGdbGFhIeadCACDBGFHIehIecDAGBFdacGEiBfHIfHAcbDEgEbgfhdCai", + "CFeabGHIDGBdHEIfcaihACDFBegEGIBadcHFbDcGFHEAIHAFEICgDBAcGihbDFEFIHdgeabcdebfCAIGH", + "CFEIAdbgHaHicbgDeFGDBEFhcIAeGHADCIfBIcFghbAdEBADFIEhcGFbcHGIeaDHEADCFGbidigBEaFHc", + "CGaBfHIdEHEiacDFBGDbFIgEHcaadcFBgEIHfhECDIGaBBiGHEadFcgCdEIBAHFiAbgHfCEdEFHdacBGI", + "CGhAIbfEDFAIEdhcBgDEBCGfHaIIDgbheACFHFcDaIbgeebAGFcIDHGCFibdEHABHDFEaGicaIeHcgDFB", + "cHbEFDGAIAdIcgBEFHegfhIAcbDHACbDGfieIbEACFDHgGFdIheACBBCaGEHidfdEhfaIBGcFIGDbCHEa", + "cidGHEBFAFaeBDcIGHbHgAFIECdgeIHafdbcAdfecbHIGHbCDIGAEFEFaCBHgDIDCbIGaFheighFEDCAB", + "cIFDHAEbgebHgicAfdaGDEFbhCIBDacGFIEHFHIABEGDCgcehdIFABdeGBAHCIFhfciEdbgAIABFCGDhe", + "CIFeBahdGHGDIcFebabaegDHIcfdhAbEcFGiIfcaHgdEbEBGDFIcAHFcbhaEgidaEIfGDBhCGdHciBAFE", + "DAeFBIHGcFiCHGeBadhGBadCFeIabgIHDECFIEDGCFabhChFBEAdIGbcadfGIHEEdhCiBgFAGfiEAHCdb", + "dafibcGHEHIEFdgcbaBCGAHEDIfeHcDgbfaIGBAHIFECDIFdEcAHGbaGBceDIfHFehGaIBdCCdIBfHAEG", + "DaFIcbHgebeHGDFAiccgiEAHDFBEBcAHgFDIGHdCfibEaIFabEdGcHHIGfBeCAdFCbDIAehGAdEHGcIBF", + "DaibFEGHCGHECIDaBFcFbGHaIDeHiAedbFcGEgFicHBAdBCDAgFheIIEHdAGcfBFDchBIEGAabgFecDiH", + "DaIbGFHeCFChaiebdGGeBdCHIFaCbGFADEHIHFAIEbGCdIDEcHgAbFBGcHDafiEEIFGbcdahahdEFiCGB", + "dAIcebGFHgBEHFaCiDhcFdgIAbeIDBFaGeHcCeAIDHFgBfGhBcEIdABFgAHCDEIAHdeIFBcGeICGbDhaf", + "dbFECIAgHIGaFDHBCeHEcAGbDiFFDBgheiacECGIAFHBDaIHDbceFGcHEbfaGDibfdHIGCEAgaiCEDFhb", + "DbgiCFaehcaehbdIGFHIfAEGCBDgfCeIHDABIHAbDCGFEEdbFGAhCIBEDcaiFHGaGHDfBEIcFciGhEbdA", + "DEbfcgaHIFaIHDbCegcHGaiEFbDAfebhdIGcidCEGABFHgBHcFIdAEhgfibceDaeIdGafHcBBCaDEhGIF", + "dEGHAfIbCBIHcEGFDACFABDIEGhFhbagCdIEEDCfibhAGGAIeHdBCFIGfdcHaEbHCeibaGFDAbdgFechI", + "DFACBhGIEgchaIeFDbBEIFDGaChAHFbgidEcedcHAfbGIIGbdecHAFFBGECDIHAcadIHbefGHiEgFACBD", + "dfbeahiCgECgiDbfHAAihGFCdeBGbFHCDEAihDIAgecBFcaEBIFgDHFGDCHaBIEIeADBGHFcBHcFEIaGd", + "dfeGchaIBICAFbeHgdgBHdAIfceCHIAeBGdfAGBIFDEHcFEDHGCIBaEDgcIFBAHHIfbdAceGbACehGDFi", + "dGaICHBFEFBIAedHcGCEhgBFIADHcEdfagBiaIbeHGCDfgDFciBEHAEAdHGCFIbbhgFdIaEcIFcbAEDGh", + "dGeihbaCFHFBCADgIECiaeFGBDHEDIgBHcfAbACFDiHEGGHFaEcibdaehBIFDGcFBGdcaEhIICDHgEfaB", + "dHcIFGABEIegCABFdHFbADHEIgCaGFebdCHIEDHaCIBFgciBHGFEadbaDGechiFhCIFDageBGfEBiHDca", + "dHGaicbeFEacFHBIDgIbFeDghcAHeIDcAFGBFdbHgECaIGcABFIDHeaIHcEFgbDBfDGAHEiCCGEIbdAFh", + "DICbAEhgfFaGIHDBCEbEHFCGADIEcBGDIFAhaDFCeHibggHiAFBdECIbehGAcFdcGadIFEhBhFDebcGia", + "diGbCEaHFAfCIdhEBghBeAGFCdiCEbDHGFIAIgdfEaBcHFaHcIBgedgcAhBdIFEEDiGfchabbHFEaidgc", + "diGEHFBCAHcaIBGEdfeFbCadIhgiGEDFAHBCaHFBcEDGICBDHGIfAegdcFEBAIHbehAIcGfDFaIGdhceb", + "eaBdfIHGcIGdCHbFAEfHCAGEDBigcebdHAIFhFAiECGdBBdifAGECHabFecdIHGDiHGBFCeaCEgHIabFD", + "EABFHiGcDHdICgaebfcGFBdeAHIaCDHIgBFEbFeaCDIGHiHGEFBdACfbaDECHIGgEHiBfcdadICGahFeB", + "eacIBFhdgGHBecDaFIDIfgAhCBECFGHDEiabIdHaGBECFabeCFIGHDfCiBHGdeAHgdFEabIcBEADiCFGh", + "EadCFbIhGbGCiahdeffhiGedcABGDbEiFHCACEadhgbFIIfHBcAeGddCfabegiHaBEHGIFDChIGFDcaBE" +] + +export class LevelManager { + private static instance: LevelManager + public static getInstance(): LevelManager { + if (!LevelManager.instance) { + LevelManager.instance = new LevelManager() + } + return LevelManager.instance + } + + private levelMap: Map> = new Map() + + public init(): void { + this.levelMap.set(config.DIFFICULTY_TYPE.Easy, Easy) + this.levelMap.set(config.DIFFICULTY_TYPE.Medium, Medium) + this.levelMap.set(config.DIFFICULTY_TYPE.Hard, Hard) + this.levelMap.set(config.DIFFICULTY_TYPE.Expert, Expert) + this.levelMap.set(config.DIFFICULTY_TYPE.Extreme, Extreme) + // 检查关卡配置 + this.levelMap.forEach((list, key) => { + for (let i = 0; i < list.length; i++) { + if (list[i].length !== 81) { + console.error("关卡配置有误>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>", key, i) + } + } + }) + } + + public getLevelList(difficulty: string): Array { + const list = this.levelMap.get(difficulty) + return list + } + + public getLevelStr(difficulty: string, index: number): string { + const list = this.levelMap.get(difficulty) + if (list) { + return list[index] + } + return "" + } +} diff --git a/shudu/src/models/LevelManager.ts.meta b/shudu/src/models/LevelManager.ts.meta new file mode 100644 index 0000000..4154f04 --- /dev/null +++ b/shudu/src/models/LevelManager.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "4b2967ad-786a-4ad1-8b1d-22b093d62575" +} \ No newline at end of file diff --git a/shudu/src/models/ResourceManager.ts b/shudu/src/models/ResourceManager.ts new file mode 100644 index 0000000..08c0144 --- /dev/null +++ b/shudu/src/models/ResourceManager.ts @@ -0,0 +1,166 @@ +import { config } from "../constants/config" +import { respath } from "../constants/respath" + +export class ResourceManager { + private static instance: ResourceManager + public static getInstance(): ResourceManager { + if (!ResourceManager.instance) { + ResourceManager.instance = new ResourceManager() + } + return ResourceManager.instance + } + + private resources: Array<{ url: string, type?: any, lazy?: boolean }> = [] + private textureReqs: Map> = new Map() + private prefabReqs: Map> = new Map() + + public init(): void { + Laya.timer.frameLoop(1, this, () => { + const removes: Array = [] + this.prefabReqs.forEach((list: Array, path: string) => { + const obj = Laya.loader.getRes(path) + if (obj) { + removes.push(path) + for (let i = 0; i < list.length; i++) { + list[i](obj) + } + } + }) + for (let i = 0; i < removes.length; i++) { + this.prefabReqs.delete(removes[i]) + } + }) + } + + private started: boolean = false + public startSchedule(): void { + if (this.started) + return + this.started = true + this.resources.push({ url: respath.gamepause_ui_res() }) + this.resources.push({ url: respath.gameover_ui_res() }) + this.resources.push({ url: respath.gamedone_ui_res(true) }) + this.resources.push({ url: respath.gamedone_ui_res(false) }) + this.resources.push({ url: respath.score_add_ui_res() }) + this.resources.push({ url: respath.dc_ui_res() }) + this.resources.push({ url: respath.trophy_claim_ui_res() }) + this.resources.push({ url: respath.trophy_show_ui_res() }) + this.resources.push({ url: respath.dc_ui_res() }) + this.resources.push({ url: respath.trophy_ui_res() }) + this.resources.push({ url: respath.trophy_year_ui_res() }) + this.resources.push({ url: respath.trophy_cell_ui_res() }) + if (config.H_SCREEN) { + this.resources.push({ url: respath.common_tips_ui_res }) + } else { + this.resources.push({ url: respath.difficulty_ui_res }) + } + + this.resources.push({ url: respath.bg_done, type: Laya.Loader.IMAGE }) + this.resources.push({ url: respath.bg_done_light, type: Laya.Loader.IMAGE }) + this.resources.push({ url: respath.bg_done_top, type: Laya.Loader.IMAGE }) + this.resources.push({ url: respath.icon_star1, type: Laya.Loader.IMAGE }) + this.resources.push({ url: respath.icon_star2, type: Laya.Loader.IMAGE }) + this.resources.push({ url: respath.Congratulations, type: Laya.Loader.IMAGE }) + + this.resources.push({ url: respath.home_top_dc_bg_normal, type: Laya.Loader.IMAGE }) + this.resources.push({ url: respath.home_top_dc_bg_finish, type: Laya.Loader.IMAGE }) + this.resources.push({ url: respath.dc_top_bg_normal, type: Laya.Loader.IMAGE }) + this.resources.push({ url: respath.dc_top_bg_finish, type: Laya.Loader.IMAGE }) + const dc_lights = respath.get_dc_lights() + for (let i = 0; i < dc_lights.length; i++) { + this.resources.push({ url: dc_lights[i], type: Laya.Loader.IMAGE }) + } + + this.resources.push({ url: respath.trophy_bg_light_gold, type: Laya.Loader.IMAGE }) + this.resources.push({ url: respath.trophy_bg_light_grey, type: Laya.Loader.IMAGE }) + const trophys = respath.trophys() + for (let i = 0; i < trophys.length; i++) { + this.resources.push({ url: trophys[i], type: Laya.Loader.IMAGE }) + } + + Laya.loader.load(this.resources, Laya.Handler.create(this, (obj: object) => { // 第二个参数:成功回调 + console.log("预加载资源结束>>>>", obj) + this.textureReqs.forEach((list: Array, path: string) => { + for (let i = 0; i < list.length; i++) { + const img = list[i] + if (img && img.parent) { + img.texture = Laya.loader.getRes(path) + } + } + }) + this.textureReqs.clear() + }), Laya.Handler.create(this, (resProg: number) => { // 第三个参数:进度回调 + console.log("预加载资源进度>>>>", resProg) + })) + } + + public loadTexture(path: string, image: Laya.Image): void { + const obj = Laya.loader.getRes(path) + // console.log("loadTexture obj", path, obj) + image.skin = "" + if (obj) { + image.texture = obj + } else { + if (!this.textureReqs.has(path)) { + this.textureReqs.set(path, []) + } + const list = this.textureReqs.get(path) + list.push(image) + + let find = false + for (let i = 0; i < this.resources.length; i++) { + const info = this.resources[i] + if (info.url === path) { + find = true + break + } + } + // console.log("loadTexture find", path, find) + if (find === false) { + Laya.loader.load(path, Laya.Handler.create(this, (obj: Laya.Texture) => { // 第二个参数:成功回调 + // console.log("加载资源成功>>>>", path, obj, image, image.parent) + const list = this.textureReqs.get(path) + for (let i = 0; i < list.length; i++) { + const img = list[i] + if (img && img.parent) { + img.texture = obj + } + } + this.textureReqs.delete(path) + })) + } + } + } + + public loadPrefab(path: string, callback: any): void { + const obj = Laya.loader.getRes(path) + console.log("loadPrefab >>>>>", path, obj) + if (obj) { + if (callback) { + callback(obj) + } + } else { + if (callback) { + if (!this.prefabReqs.has(path)) { + this.prefabReqs.set(path, []) + } + const list = this.prefabReqs.get(path) + list.push(callback) + } + let find = false + for (let i = 0; i < this.resources.length; i++) { + const info = this.resources[i] + if (info.url === path) { + find = true + break + } + } + // console.log("loadPrefab find", path, find) + if (find === false) { + Laya.loader.load(path, Laya.Handler.create(this, (obj: object) => { // 第二个参数:成功回调 + console.log("加载资源成功>>>>", path, obj) + })) + } + } + } +} diff --git a/shudu/src/models/ResourceManager.ts.meta b/shudu/src/models/ResourceManager.ts.meta new file mode 100644 index 0000000..ef2efc7 --- /dev/null +++ b/shudu/src/models/ResourceManager.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "b3ea9175-3fb5-4ce2-b73d-bdf1f52d6754" +} \ No newline at end of file diff --git a/shudu/src/models/StorageManager.ts b/shudu/src/models/StorageManager.ts new file mode 100644 index 0000000..2c432e5 --- /dev/null +++ b/shudu/src/models/StorageManager.ts @@ -0,0 +1,150 @@ +import type { DataStage } from "../types/global" +import { config } from "../constants/config" +import { createDataStage } from "../types/global" +import { DOStage } from "./DOStage" +import { DOUser } from "./DOUser" +import { LevelManager } from "./LevelManager" + +export class StorageManager { + private static instance: StorageManager + public static getInstance(): StorageManager { + if (!StorageManager.instance) { + StorageManager.instance = new StorageManager() + } + return StorageManager.instance + } + + private user: DOUser + private userChanged = false + + private stageID: string = "" + private stageChanged = false + private stageMap: Map = new Map() + + public init(): void { + if (!this.user) { + const jsonStr = Laya.LocalStorage.getItem("user") + if (jsonStr) { + this.user = new DOUser(JSON.parse(jsonStr)) + } else { + this.user = new DOUser({ dones: [], trophy_records: [], progresses: [] }) + } + } + this.userChanged = false + + this.stageID = "" + this.stageChanged = false + } + + public getUser(): DOUser { + return this.user + } + + public saveUser(): void { + if (this.userChanged) { + this.userChanged = false + if (this.user) { + const jsonStr = JSON.stringify(this.user.getData()) + Laya.LocalStorage.setItem("user", jsonStr) + } + } + } + + public onUserChanged(): void { + this.userChanged = true + } + + public newStage(stageID: string, type: number, name: string, difficulty: string = config.DIFFICULTY_TYPE.Easy): DOStage { + this.stageID = stageID + this.stageChanged = true + + let index + if (type === config.STAGE_TYPE.MAIN) { // 主线关卡 + index = this.user.get_progress(difficulty) + const levelStr = LevelManager.getInstance().getLevelStr(difficulty, index) + if (!levelStr || levelStr.length <= 0) { // 说明当前难度已经打通了,所以给他从头开始 + index = 0 + this.user.update_progress(difficulty, index) + } + } else if (type === config.STAGE_TYPE.DC) { // 每天调整如果已经创建过关卡那么就用之前的关卡配置 + const value = this.getStage(stageID) + if (value) { + difficulty = value.get_difficulty() + index = value.get_stageIndex() + } else { + let random = Math.random() + difficulty = config.DIFFICULTY_LIST[Math.floor(random * config.DIFFICULTY_LIST.length)] + const list = LevelManager.getInstance().getLevelList(difficulty) + random = Math.random() + index = Math.floor(random * list.length) + console.log("每日挑战随机一个关卡", difficulty, index) + } + } + + this.user.update_stage_done(this.stageID, 0)// 重置关卡进度 + const dataStage: DataStage = createDataStage(stageID, type, name, difficulty, index) + const doStage: DOStage = new DOStage(dataStage) + this.stageMap.set(stageID, doStage) + return doStage + } + + public getStage(stageID: string): DOStage { // 获取指定关卡数据对象,注意判空 + if (this.stageMap.has(stageID)) { + const doStage: DOStage = this.stageMap.get(stageID) + return doStage + } else { + const jsonStr = Laya.LocalStorage.getItem(stageID) + if (jsonStr) { + const dataStage: DataStage = JSON.parse(jsonStr) + const doStage: DOStage = new DOStage(dataStage) + this.stageMap.set(stageID, doStage) + return doStage + } + } + return null + } + + public cleanStage(stageID: string): void { + if (this.stageMap.has(stageID)) { + this.stageMap.delete(stageID) + } + Laya.LocalStorage.removeItem(stageID) + } + + public loadStage(stageID: string): DOStage { // 载入关卡 + const doStage = this.getStage(stageID) + if (doStage) { + this.stageID = stageID + this.stageChanged = false + return doStage + } + console.log("载入关卡失败>>>>>", stageID) + return null + } + + public saveStage(): void { + if (this.stageChanged) { + this.stageChanged = false + if (this.stageMap.has(this.stageID)) { + const doStage = this.stageMap.get(this.stageID) + const jsonStr = JSON.stringify(doStage.getData()) + Laya.LocalStorage.setItem(this.stageID, jsonStr) + } + } + } + + public onStageChanged(): void { + this.stageChanged = true + } + + public cleanAll(): void { + this.user = new DOUser({ dones: [], trophy_records: [], progresses: [] }) + this.userChanged = false + + this.stageID = "" + this.stageChanged = false + this.stageMap.clear() + + Laya.LocalStorage.clear() + } +} diff --git a/shudu/src/models/StorageManager.ts.meta b/shudu/src/models/StorageManager.ts.meta new file mode 100644 index 0000000..8dcb558 --- /dev/null +++ b/shudu/src/models/StorageManager.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "7503e6c9-bbbe-40ca-813c-660b4927d3a6" +} \ No newline at end of file diff --git a/shudu/src/models/UIManager.ts b/shudu/src/models/UIManager.ts new file mode 100644 index 0000000..33fbb4e --- /dev/null +++ b/shudu/src/models/UIManager.ts @@ -0,0 +1,239 @@ +import type { TrophyRecord } from "../types/global" +import type { DOStage } from "./DOStage" +import { config } from "../constants/config" +import { respath } from "../constants/respath" +import { DailyChallenge } from "../views/dc/DailyChallenge" +import { TrophyClaim } from "../views/dc/TrophyClaim" +import { TrophyRoom } from "../views/dc/TrophyRoom" +import { TrophyShow } from "../views/dc/TrophyShow" +import { GameDone } from "../views/GameDone" +import { GameOver } from "../views/GameOver" +import { GamePause } from "../views/GamePause" +import { Stage } from "../views/Stage" +import { TopBar } from "../views/TopBar" +import { ResourceManager } from "./ResourceManager" +import { StorageManager } from "./StorageManager" + +const { regClass, property } = Laya + +@regClass() +export class UIManager extends Laya.Script { + declare owner: Laya.Scene + + private static _instance: UIManager + public static getInstance(): UIManager { + return UIManager._instance + } + + @property(Boolean) + public debug: boolean = false + + @property(Laya.Image) + public mask: Laya.Image + + @property(Laya.Box) + public btn_clean: Laya.Box + + onAwake(): void { + UIManager._instance = this + config.DEBUG = this.debug + this.mask.on(Laya.Event.CLICK, this, () => { + console.log("on click mask >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>") + }) + this.mask.visible = false + + this.btn_clean.on(Laya.Event.CLICK, this, (evt: Laya.Event) => { + console.log("btn_clean=", evt) + StorageManager.getInstance().cleanAll() + }) + this.btn_clean.visible = this.debug + + // const lottie = Lottie.loadAnimation({ + // container: document.getElementById("layaContainer") as Element, + // renderer: 'svg', + // loop: true, + // autoplay: true, + // path: 'effect/lottie_trophy_light/lottie_trophy_light.json' + // }) + } + + private UIRoot: Laya.Panel + public getUIRoot(): Laya.Node { + if (!this.UIRoot) { + this.UIRoot = this.owner.getChildByName("UIRoot") as Laya.Panel + } + return this.UIRoot + } + + private topbar: TopBar + private stage: Stage + private dc_ui: DailyChallenge + private dc_year: number = -1 + private dc_month: number = -1 + private trophyRoom: TrophyRoom + + onStart(): void { + const resources: Array<{ url: string, type?: any, lazy?: boolean }> = [] + resources.push({ url: respath.font_Bold, type: Laya.Loader.TTF }) + resources.push({ url: respath.font_Medium, type: Laya.Loader.TTF }) + resources.push({ url: respath.font_Regular, type: Laya.Loader.TTF }) + resources.push({ url: respath.font_SemiBold, type: Laya.Loader.TTF }) + if (!config.H_SCREEN) { // 竖屏情况下预加载dc奖杯 + resources.push({ url: respath.home_top_dc_bg_normal, type: Laya.Loader.IMAGE }) + resources.push({ url: respath.home_top_dc_bg_finish, type: Laya.Loader.IMAGE }) + const now = new Date() + const nowMonth = now.getMonth() + resources.push({ url: respath.trophys()[nowMonth], type: Laya.Loader.IMAGE }) + } + Laya.loader.load(resources, Laya.Handler.create(this, (obj: object) => { // 第二个参数:成功回调 + console.log("预加载字体结束>>>>", obj) + if (config.H_SCREEN) { + this.loadTopBarUI() + } else { + this.loadHomeUI() + } + }), Laya.Handler.create(this, (resProg: number) => { // 第三个参数:进度回调 + console.log("预加载资源进度>>>>", resProg) + })) + } + + public loadHomeUI(): void { + ResourceManager.getInstance().loadPrefab(respath.home_ui_res, (go: any) => { + const prefab = go.create() + this.getUIRoot().addChild(prefab) + ResourceManager.getInstance().startSchedule() + }) + } + + public loadTopBarUI(): void { + ResourceManager.getInstance().loadPrefab(respath.topbar_ui_res, (go: any) => { + const prefab = go.create() + this.topbar = this.getUIRoot().addChild(prefab).getComponent(TopBar) + }) + } + + public setTopbarTo(isClassic: boolean): void { + if (this.topbar) { + this.topbar.onClickTab(isClassic) + } + } + + public setCurrentDCMonth(year: number, month: number): void { + this.dc_year = year + this.dc_month = month + console.log("setCurrentDCMonth >>>>>>>>>>>>>>>>>>>>", year, month) + } + + public loadDCUI(): void { + this.mask.visible = true + ResourceManager.getInstance().loadPrefab(respath.dc_ui_res(), (go: any) => { + const prefab = go.create() + this.dc_ui = this.getUIRoot().addChild(prefab).getComponent(DailyChallenge) + if (this.dc_year <= 0 || this.dc_month <= 0) { + const now = new Date() + this.dc_year = now.getFullYear() + this.dc_month = now.getMonth() + 1 + } + this.dc_ui.loadWithMonth(this.dc_year, this.dc_month) + this.mask.visible = false + }) + } + + public loadDCWtihMonth(year: number, month: number): void { + this.closeTrophyUI() + if (this.dc_ui) { + this.dc_ui.loadWithMonth(year, month) + } + } + + public closeDCUI(): void { + if (this.dc_ui) { + this.dc_ui.owner.destroy() + this.dc_ui = null + } + } + + public loadTrophyClaimUI(record: TrophyRecord): void { + ResourceManager.getInstance().loadPrefab(respath.trophy_claim_ui_res(), (go: any) => { + const prefab = go.create() + const obj = this.getUIRoot().addChild(prefab).getComponent(TrophyClaim) + obj.onSetShow(record) + }) + } + + public loadTrophyUI(): void { + this.mask.visible = true + ResourceManager.getInstance().loadPrefab(respath.trophy_ui_res(), (go: any) => { + const prefab = go.create() + this.trophyRoom = this.getUIRoot().addChild(prefab).getComponent(TrophyRoom) + this.mask.visible = false + }) + } + + public closeTrophyUI(): void { + if (this.trophyRoom) { + this.trophyRoom.owner.destroy() + this.trophyRoom = null + } + } + + public loadTrophyShowUI(record: TrophyRecord): void { + this.mask.visible = true + ResourceManager.getInstance().loadPrefab(respath.trophy_show_ui_res(), (go: any) => { + const prefab = go.create() + const obj = this.getUIRoot().addChild(prefab).getComponent(TrophyShow) + obj.onSetShow(record) + this.mask.visible = false + }) + } + + public loadStageUI(stageID: string): void { + if (this.stage) { + this.stage.onLoadStage(StorageManager.getInstance().loadStage(stageID)) + } else { + ResourceManager.getInstance().loadPrefab(respath.stage_ui_res(), (go: any) => { + const prefab = go.create() + this.stage = this.getUIRoot().addChild(prefab).getComponent(Stage) + this.stage.onLoadStage(StorageManager.getInstance().loadStage(stageID)) + ResourceManager.getInstance().startSchedule() + }) + } + } + + public closeStageUI(): void { + if (this.stage) { + this.stage.owner.destroy() + this.stage = null + } + } + + public loadGamePauseUI(doStage: DOStage): void { + this.mask.visible = true + ResourceManager.getInstance().loadPrefab(respath.gamepause_ui_res(), (go: any) => { + const prefab = go.create() + const ui = this.getUIRoot().addChild(prefab).getComponent(GamePause) + ui.onSetStageInfo(doStage) + this.mask.visible = false + }) + } + + public loadGameOverUI(doStage: DOStage): void { + this.mask.visible = true + ResourceManager.getInstance().loadPrefab(respath.gameover_ui_res(), (go: any) => { + const prefab = go.create() + const ui = this.getUIRoot().addChild(prefab).getComponent(GameOver) + ui.onSetStageInfo(doStage) + this.mask.visible = false + }) + } + + public loadGameDoneUI(isClassic: boolean, doStage: DOStage): void { + this.mask.visible = true + ResourceManager.getInstance().loadPrefab(respath.gamedone_ui_res(isClassic), (go: any) => { + const prefab = go.create() + const ui = this.getUIRoot().addChild(prefab).getComponent(GameDone) + ui.onSetStageInfo(doStage) + this.mask.visible = false + }) + } +} diff --git a/shudu/src/models/UIManager.ts.meta b/shudu/src/models/UIManager.ts.meta new file mode 100644 index 0000000..89e327e --- /dev/null +++ b/shudu/src/models/UIManager.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "cd70cd5e-b4cd-4277-ac0a-2224cfbe89ac" +} \ No newline at end of file diff --git a/shudu/src/types/global.ts b/shudu/src/types/global.ts new file mode 100644 index 0000000..89571a1 --- /dev/null +++ b/shudu/src/types/global.ts @@ -0,0 +1,66 @@ +// 格子持久化数据结构 +export interface DataBlock { + index: number + show: number + score: number + notes: Array +} + +// 撤回数据结构 +export interface DataUndo { + index: number + show: number + notes?: Array +} + +// 关卡数据 +export interface DataStage { + id: string// 关卡ID dc关卡格式为:年-月-日 + type: number + name: string + difficulty: string + index: number + mistake?: number + score?: number + duration?: number + last_hit_time?: number// 上一次填对计时 + note_open?: boolean + hint?: number + select_index?: number + blocks?: Array + undos?: Array +} +export function createDataStage(id: string, type: number, name: string, difficulty: string, index: number): DataStage { + const data: DataStage = { id, type, name, difficulty, index } + data.mistake = 0 + data.score = 0 + data.duration = 0 + data.last_hit_time = 0 + data.note_open = false + data.hint = 2 + data.select_index = 0 + data.blocks = [] + data.undos = [] + return data +} + +export interface StageProgress { // 关卡完成进度 + stageID: string// 关卡ID dc关卡格式为:年-月-日 + progress: number +} +export interface TrophyRecord { + year: number + month: number + day: number + isNew: boolean + read: boolean +} +export interface DataProgress { // 关卡难度进度 + difficulty: string + index: number +} +export interface DataUser { + dones: Array// 关卡完成进度 + trophy_records: Array// 奖杯获得记录 + progresses: Array// 主线各个难度进度 +} diff --git a/shudu/src/types/global.ts.meta b/shudu/src/types/global.ts.meta new file mode 100644 index 0000000..ae677a2 --- /dev/null +++ b/shudu/src/types/global.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "c76d8037-4918-4ac5-a920-02fe0f4d8df7" +} \ No newline at end of file diff --git a/shudu/src/utils/utility.ts b/shudu/src/utils/utility.ts new file mode 100644 index 0000000..e876749 --- /dev/null +++ b/shudu/src/utils/utility.ts @@ -0,0 +1,46 @@ +import BezierEasing from "bezier-easing" +import { config } from "../constants/config" + +export function Utility_ConvertSecondToString(seconds: number) { + let last = seconds + const hour = Math.floor(last / 3600) + last = last - hour * 3600 + const minite = Math.floor(last / 60) + last = last - minite * 60 + const second = Math.floor(last) + function format(value: number) { + return value >= 10 ? value.toString() : (`0${value}`) + } + return `${format(hour)}:${format(minite)}:${format(second)}` +} + +// 计算积分 +export function Utility_CalculateScore(difficulty: string, second: number): number { + let score = 0 + const currentTime = Math.min(120, second) + if (difficulty === config.DIFFICULTY_TYPE.Easy) { + score = 270 - currentTime + } else if (difficulty === config.DIFFICULTY_TYPE.Medium) { + score = 420 - currentTime * 2 + } else if (difficulty === config.DIFFICULTY_TYPE.Hard) { + score = 760 - currentTime * 3 + } else if (difficulty === config.DIFFICULTY_TYPE.Expert) { + score = 1120 - currentTime * 3 + } else if (difficulty === config.DIFFICULTY_TYPE.Extreme) { + score = 1320 - currentTime * 4 + } + // console.log("计算积分 >>>>>", difficulty, second, score) + return score +} + +const bezier_ease_out = BezierEasing(0.2, 0.8, 0.5, 1) +export function Utility_EaseOut(t: number, b: number, c: number, d: number) { + const p = bezier_ease_out(t / d) + return c * p + b +} + +const bezier_ease_out_2 = BezierEasing(0.25, 0.1, 0.3, 1) +export function Utility_EaseOut_2(t: number, b: number, c: number, d: number) { + const p = bezier_ease_out_2(t / d) + return c * p + b +} diff --git a/shudu/src/utils/utility.ts.meta b/shudu/src/utils/utility.ts.meta new file mode 100644 index 0000000..8e69aed --- /dev/null +++ b/shudu/src/utils/utility.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "d17f1a58-98e1-4a84-8bd0-8612a1662cea" +} \ No newline at end of file diff --git a/shudu/src/views/Block.ts b/shudu/src/views/Block.ts new file mode 100644 index 0000000..fdd99e8 --- /dev/null +++ b/shudu/src/views/Block.ts @@ -0,0 +1,212 @@ +import type { DOBlock } from "../models/DOBlock" +import { G_ShowScoreTips } from "../views/common/GUITips" + +const { regClass, property } = Laya + +@regClass() +export class Block extends Laya.Script { + declare owner: Laya.Box + + @property(Number) + public XIndex: number = 0 + + @property(Number) + public YIndex: number = 0 + + @property(Number) + public XGroup: number = 0 + + @property(Number) + public YGroup: number = 0 + + @property(Laya.Box) + private obj_pos: Laya.Box + + private sprite_show: Laya.Sprite + private blockSize: number + private obj_notes: Laya.Box + private label_show: Laya.Label + private tips_bgs: Array = [] + private tips_labels: Array = [] + private tipsSize: number + + private selected: boolean = false + + private data: DOBlock + + public onInit(XIndex: number, YIndex: number, XGroup: number, YGroup: number, obj_pos: Laya.Box, handler: any, func: any): void { + this.XIndex = XIndex + this.YIndex = YIndex + this.XGroup = XGroup + this.YGroup = YGroup + this.obj_pos = obj_pos + + this.sprite_show = this.owner.getChildByName("Sprite") as Laya.Sprite + this.blockSize = this.sprite_show.width + this.label_show = this.owner.getChildByName("label_show") as Laya.Label + + const notes = this.owner.getChildByName("notes") as Laya.Box + this.obj_notes = notes + for (let i = 0; i < notes.numChildren; i++) { + const hbox = notes.getChildAt(i) + for (let j = 0; j < hbox.numChildren; j++) { + const sp = hbox.getChildAt(j).getChildByName("Sprite") as Laya.Sprite + this.tips_bgs.push(sp) + const Label = hbox.getChildAt(j).getChildByName("Label") as Laya.Label + Label.text = "" + this.tips_labels.push(Label) + this.tipsSize = sp.width + } + } + + this.owner.on(Laya.Event.CLICK, handler, func) + } + + public setSelected(selected: boolean): void { + this.selected = selected + this.updateBlock() + } + + public setPaused(paused: boolean): void { + this.sprite_show.visible = !paused + this.obj_notes.visible = !paused + this.label_show.visible = !paused + } + + public setBlockColor(color: string, alpha: number = 1, animated: boolean = false, completedColor: string = "", completedAlpha: number = 1): void { + this.sprite_show.graphics.clear() + this.sprite_show.graphics.drawRect(0, 0, this.blockSize, this.blockSize, color) + if (animated) { + this.sprite_show.alpha = 0 + Laya.Tween.to(this.sprite_show, { alpha }, 100, Laya.Ease.linearIn, Laya.Handler.create(this, () => { + Laya.Tween.to(this.sprite_show, { alpha: 0 }, 150, Laya.Ease.linearIn, Laya.Handler.create(this, () => { + Laya.Tween.to(this.sprite_show, { alpha }, 100, Laya.Ease.linearIn, Laya.Handler.create(this, () => { + Laya.Tween.to(this.sprite_show, { alpha: 0 }, 150, Laya.Ease.linearIn, Laya.Handler.create(this, () => { + this.sprite_show.graphics.clear() + this.sprite_show.graphics.drawRect(0, 0, this.blockSize, this.blockSize, completedColor) + this.sprite_show.alpha = completedAlpha + })) + })) + })) + })) + // Laya.Handler.create(this, () => { + // }) + } else { + this.sprite_show.alpha = alpha + } + } + + public setFadeAnimation(): void { + Laya.timer.once(200, this, () => { + this.label_show.color = "#ff0000" + Laya.timer.once(100, this, () => { + this.label_show.color = "#2d3138" + Laya.timer.once(200, this, () => { + this.label_show.color = "#ff0000" + Laya.timer.once(100, this, () => { + this.updateBlock() + }) + }) + }) + }) + } + + public setTipsBgColor(visible: boolean, noteNumber: number = 0, color: string = "", alpha: number = 1): void { + if (visible) { + const obj = this.tips_bgs[noteNumber - 1] + obj.visible = true + obj.graphics.clear() + obj.graphics.drawRect(0, 0, this.tipsSize, this.tipsSize, color) + obj.alpha = alpha + } else { + for (let i = 0; i < this.tips_bgs.length; i++) { + const obj = this.tips_bgs[i] + obj.visible = false + } + } + } + + public setBlock(data: DOBlock): void { + this.data = data + this.updateBlock() + } + + public getData(): DOBlock { + return this.data + } + + public setShowNumber(showNumber: number, score: number): boolean { + this.data.set_show(showNumber) + if (this.data.get_checked()) { + this.data.set_score(score) + if (score > 0) + G_ShowScoreTips(`+${score}`, this.obj_pos) + } else { + if (this.data.get_score() !== 0) + this.data.set_score(0) + } + this.data.clean_notes() + this.updateBlock() + return this.data.get_checked() + } + + public addNoteNumber(noteNumber: number): void { + this.data.set_show(0) + const note_numbers = this.data.get_notes() + const find = note_numbers.indexOf(noteNumber) + + if (find >= 0) { + this.data.remove_note(noteNumber) + } else { + this.data.add_note(noteNumber) + } + this.updateBlock() + } + + public setNotes(notes: Array): void { + this.data.set_show(0) + this.data.clean_notes() + for (let i = 0; i < notes.length; i++) { + this.data.add_note(notes[i]) + } + this.updateBlock() + } + + updateBlock(): void { + // 设置文字颜色 + if (this.selected) { + this.label_show.color = "#ffffff" + for (let i = 0; i < this.tips_labels.length; i++) { + this.tips_labels[i].color = "#ffffff" + } + } else { + if (this.data.get_show() === this.data.get_correct()) { + if (this.data.get_preset()) { + this.label_show.color = "#2d3138" + } else { + this.label_show.color = "#2559c0" + } + } else { + this.label_show.color = "#cb3256" + } + for (let i = 0; i < this.tips_labels.length; i++) { + this.tips_labels[i].color = "#2d3138" + } + } + + for (let i = 0; i < this.tips_labels.length; i++) { + this.tips_labels[i].text = "" + } + if (this.data.get_show() > 0) { + this.label_show.text = this.data.get_show().toString() + } else { + this.label_show.text = "" + const note_numbers = this.data.get_notes() + for (let i = 0; i < note_numbers.length; i++) { + const value = note_numbers[i] + const label = this.tips_labels[value - 1] + label.text = value.toString() + } + } + } +} diff --git a/shudu/src/views/Block.ts.meta b/shudu/src/views/Block.ts.meta new file mode 100644 index 0000000..195a3b6 --- /dev/null +++ b/shudu/src/views/Block.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "abc6b60b-980b-4853-baa5-ac8506e00c4a" +} \ No newline at end of file diff --git a/shudu/src/views/Candy.ts b/shudu/src/views/Candy.ts new file mode 100644 index 0000000..6ee0b5d --- /dev/null +++ b/shudu/src/views/Candy.ts @@ -0,0 +1,126 @@ +import type { Stage } from "./Stage" + +const { regClass } = Laya + +@regClass() +export class Candy extends Laya.Script { + declare owner: Laya.Box + + private _stage: Stage + + private offset: Laya.Box + private bg_sprite: Laya.Sprite + private bg_filter: Laya.GlowFilter + private show_sprite: Laya.Sprite + private mask_sprite: Laya.Sprite + private label_show: Laya.Label + private label_left: Laya.Label + + private show: number + private left: number + private available: boolean = true + + public onInit(handler: any): void { + this._stage = handler + this.owner.on(Laya.Event.CLICK, this, () => { + if (this.available === false) + return + this._stage.onApplyCandy(this.show, false) + }) + + this.owner.on(Laya.Event.MOUSE_DOWN, this, () => { + if (this.available === false) + return + Laya.Tween.to(this.bg_sprite, { alpha: 0 }, 200) + Laya.Tween.to(this.mask_sprite, { alpha: 0.1 }, 200) + Laya.Tween.to(this.offset, { scaleX: 0.96, scaleY: 0.96 }, 200) + }) + this.owner.on(Laya.Event.MOUSE_UP, this, () => { + if (this.available === false) + return + Laya.Tween.to(this.bg_sprite, { alpha: 0.12 }, 200) + Laya.Tween.to(this.mask_sprite, { alpha: 0 }, 200) + Laya.Tween.to(this.offset, { scaleX: 1, scaleY: 1 }, 200) + }) + this.owner.on(Laya.Event.MOUSE_OVER, this, () => { + if (this.available === false) + return + Laya.Render.canvas.style.cursor = "pointer" + Laya.Tween.to(this.bg_sprite, { alpha: 0.16 }, 200) + Laya.Tween.to(this.bg_filter, { offY: 4, blur: 8 }, 200) + Laya.Tween.to(this.mask_sprite, { alpha: 0.05 }, 200) + }) + this.owner.on(Laya.Event.MOUSE_OUT, this, () => { + if (this.available === false) + return + Laya.Render.canvas.style.cursor = "" + Laya.Tween.to(this.bg_sprite, { alpha: 0.12 }, 200) + Laya.Tween.to(this.bg_filter, { offY: 2, blur: 4 }, 200) + Laya.Tween.to(this.mask_sprite, { alpha: 0 }, 200) + }) + this.offset = this.owner.getChildByName("offset") as Laya.Box + this.bg_sprite = this.owner.getChildByName("offset").getChildByName("shadow") as Laya.Sprite + this.bg_filter = this.bg_sprite.filters[0] as Laya.GlowFilter + this.show_sprite = this.owner.getChildByName("offset").getChildByName("Sprite") as Laya.Sprite + this.mask_sprite = this.owner.getChildByName("offset").getChildByName("mask") as Laya.Sprite + this.label_show = this.owner.getChildByName("offset").getChildByName("label") as Laya.Label + this.label_left = this.owner.getChildByName("offset").getChildByName("label_left") as Laya.Label + } + + public setAvailableStatus(available: boolean) { + this.available = available + if (available) { + Laya.Tween.to(this.bg_sprite, { alpha: 0.12 }, 200) + Laya.Tween.to(this.label_show, { alpha: 1 }, 200) + Laya.Tween.to(this.label_left, { alpha: 1 }, 200) + } else { + Laya.Tween.to(this.bg_sprite, { alpha: 0 }, 200) + Laya.Tween.to(this.label_show, { alpha: 0.4 }, 200) + Laya.Tween.to(this.label_left, { alpha: 0.4 }, 200) + } + } + + public setNoteStatus(note_open: boolean) { + if (note_open) { + this.label_show.color = "#2d3138" + } else { + this.label_show.color = "#2559c0" + } + } + + public setCandy(show: number, left: number): void { + this.offset.scaleX = 1 + this.offset.scaleY = 1 + this.bg_sprite.alpha = 0.12 + this.bg_filter.offY = 2 + this.bg_filter.blur = 4 + this.mask_sprite.alpha = 0 + this.label_show.alpha = 1 + this.label_left.alpha = 1 + + this.show = show + this.left = left + this.updateCandy() + } + + public get_show(): number { + return this.show + } + + updateCandy(): void { + if (this.show > 0) { + this.label_show.text = this.show.toString() + } else { + this.label_show.text = "" + } + + if (this.left > 0) { + this.label_left.text = this.left.toString() + this.owner.visible = true + } else { + this.label_left.text = "" + this.owner.visible = false + this.label_show.text = "" + } + } +} diff --git a/shudu/src/views/Candy.ts.meta b/shudu/src/views/Candy.ts.meta new file mode 100644 index 0000000..11444f7 --- /dev/null +++ b/shudu/src/views/Candy.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "067a5d3a-4d7c-48d7-bb01-db2682fd6c01" +} \ No newline at end of file diff --git a/shudu/src/views/CommonTips.ts b/shudu/src/views/CommonTips.ts new file mode 100644 index 0000000..e591f55 --- /dev/null +++ b/shudu/src/views/CommonTips.ts @@ -0,0 +1,90 @@ +import { respath } from "../constants/respath" +import { ResourceManager } from "../models/ResourceManager" +import { UIManager } from "../models/UIManager" +import { Utility_EaseOut, Utility_EaseOut_2 } from "../utils/utility" + +const { regClass, property } = Laya + +export function G_ShowCommonTips(title: string, content: string, showToggle: boolean, func: any): void { + ResourceManager.getInstance().loadPrefab(respath.common_tips_ui_res, (go: any) => { + const prefab = go.create() + const obj = UIManager.getInstance().getUIRoot().addChild(prefab).getComponent(CommonTips) + obj.showCommonTips(title, content, showToggle, func) + }) +} + +@regClass() +export class CommonTips extends Laya.Script { + declare owner: Laya.Box + + @property(Laya.Label) + public label_title: Laya.Label + + @property(Laya.Label) + public label_content: Laya.Label + + @property(Laya.Box) + public btn_ok: Laya.Box + + @property(Laya.Box) + public btn_cancel: Laya.Box + + @property(Laya.Box) + public toggle: Laya.Box + + @property(Laya.Image) + public check: Laya.Image + + private isChecked = false + + private mask: Laya.Image + private center: Laya.Box + + onAwake(): void { + this.mask = this.owner.getChildByName("Image") as Laya.Image + this.mask.alpha = 0 + Laya.Tween.to(this.mask, { alpha: 0.6 }, 400, Utility_EaseOut) + + this.center = this.owner.getChildByName("center") as Laya.Box + this.center.scaleX = 0.8 + this.center.scaleY = 0.8 + Laya.Tween.to(this.center, { scaleX: 1, scaleY: 1 }, 400, Utility_EaseOut) + this.center.alpha = 0 + Laya.Tween.to(this.center, { alpha: 1 }, 400, Utility_EaseOut) + } + + destroyUI(): void { + Laya.Tween.to(this.mask, { alpha: 0 }, 400, Utility_EaseOut_2) + Laya.Tween.to(this.center, { scaleX: 0.8, scaleY: 0.8 }, 400, Utility_EaseOut_2) + Laya.Tween.to(this.center, { alpha: 0 }, 400, Utility_EaseOut_2, Laya.Handler.create(this, () => { + this.owner.destroy() + })) + } + + public showCommonTips(title: string, content: string, showToggle: boolean, func: any): void { + this.label_title.text = title + this.label_content.text = content + this.toggle.visible = showToggle + this.check.visible = false + this.toggle.on(Laya.Event.CLICK, this, () => { + this.isChecked = !this.isChecked + this.check.visible = this.isChecked + }) + + this.btn_ok.on(Laya.Event.CLICK, this, () => { + if (func) { + func(true, this.isChecked) + } + this.destroyUI() + }) + this.btn_cancel.on(Laya.Event.CLICK, this, () => { + if (func) { + func(false, this.isChecked) + } + this.destroyUI() + }) + this.mask.on(Laya.Event.CLICK, this, () => { + this.destroyUI() + }) + } +} diff --git a/shudu/src/views/CommonTips.ts.meta b/shudu/src/views/CommonTips.ts.meta new file mode 100644 index 0000000..5134d6c --- /dev/null +++ b/shudu/src/views/CommonTips.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "b0dfcf08-5aef-4078-8149-1fbd00d8038f" +} \ No newline at end of file diff --git a/shudu/src/views/Difficulty.ts b/shudu/src/views/Difficulty.ts new file mode 100644 index 0000000..0657bb6 --- /dev/null +++ b/shudu/src/views/Difficulty.ts @@ -0,0 +1,63 @@ +import { config } from "../constants/config" +import { Utility_EaseOut, Utility_EaseOut_2 } from "../utils/utility" +import { CommonData } from "./common/CommonData" + +const { regClass, property } = Laya + +@regClass() +export class Difficulty extends Laya.Script { + declare owner: Laya.Box + + @property(Laya.Box) + public obj_items: Laya.Box + + private mask: Laya.Image + private offset: Laya.Box + + onAwake(): void { + this.mask = this.owner.getChildByName("mask") as Laya.Image + this.mask.alpha = 0 + Laya.Tween.to(this.mask, { alpha: 0.4 }, 400, Utility_EaseOut) + + this.offset = this.owner.getChildByName("bottom").getChildByName("offset") as Laya.Box + this.offset.y = this.offset.width + + const bg = this.offset.getChildByName("bg") as Laya.Sprite + bg.graphics.clear() + bg.graphics.drawRoundRect(0, 0, this.offset.width, this.offset.height, 20, 20, 0, 0, "#f5f7fb") + + const mask = this.owner.getChildByName("mask") + mask.on(Laya.Event.CLICK, this, () => { + Laya.Tween.to(this.offset, { y: 2400 }, 200, null, Laya.Handler.create(this, () => { + this.destroyUI() + })) + }) + } + + destroyUI(): void { + Laya.Tween.to(this.mask, { alpha: 0 }, 400, Utility_EaseOut_2, Laya.Handler.create(this, () => { + this.owner.destroy() + })) + } + + onStart(): void { + Laya.Tween.to(this.offset, { y: 0 }, 200) + } + + public onInit(callback: any): void { + for (let i = 0; i < config.DIFFICULTY_LIST.length; i++) { + const obj = this.obj_items.getChildAt(i) + const Label = obj.getChildByName("Label") as Laya.Label + Label.text = config.DIFFICULTY_LIST[i] + const data = obj.getComponent(CommonData) + data.strValue = config.DIFFICULTY_LIST[i] + obj.on(Laya.Event.CLICK, this, (evt: Laya.Event) => { + const data = evt.target.getComponent(CommonData) + if (callback) { + callback(data.strValue) + } + this.owner.destroy() + }) + } + } +} diff --git a/shudu/src/views/Difficulty.ts.meta b/shudu/src/views/Difficulty.ts.meta new file mode 100644 index 0000000..d9be251 --- /dev/null +++ b/shudu/src/views/Difficulty.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "87bad4d3-bede-442e-914d-d7bcdc85f0d1" +} \ No newline at end of file diff --git a/shudu/src/views/EaseTest.ts b/shudu/src/views/EaseTest.ts new file mode 100644 index 0000000..04d7864 --- /dev/null +++ b/shudu/src/views/EaseTest.ts @@ -0,0 +1,85 @@ +const { regClass, property } = Laya + +@regClass() +export class Script extends Laya.Script { + @property(Laya.Label) + public title: Laya.Label + + @property(Laya.Image) + public icon: Laya.Image + + @property(Laya.Box) + public obj_eases: Laya.Box + + onAwake(): void { + const list: Array = [] + list.push(Laya.Ease.backIn) + list.push(Laya.Ease.backInOut) + list.push(Laya.Ease.backOut) + + list.push(Laya.Ease.bounceIn) + list.push(Laya.Ease.bounceInOut) + list.push(Laya.Ease.bounceOut) + + list.push(Laya.Ease.circIn) + list.push(Laya.Ease.circInOut) + list.push(Laya.Ease.circOut) + + list.push(Laya.Ease.cubicIn) + list.push(Laya.Ease.cubicInOut) + list.push(Laya.Ease.cubicOut) + + list.push(Laya.Ease.elasticIn) + list.push(Laya.Ease.elasticInOut) + list.push(Laya.Ease.elasticOut) + + list.push(Laya.Ease.expoIn) + list.push(Laya.Ease.expoInOut) + list.push(Laya.Ease.expoOut) + + list.push(Laya.Ease.linearIn) + list.push(Laya.Ease.linearInOut) + list.push(Laya.Ease.linearNone) + list.push(Laya.Ease.linearOut) + + list.push(Laya.Ease.quadIn) + list.push(Laya.Ease.quadInOut) + list.push(Laya.Ease.quadOut) + + list.push(Laya.Ease.quartIn) + list.push(Laya.Ease.quartInOut) + list.push(Laya.Ease.quartOut) + + list.push(Laya.Ease.quintIn) + list.push(Laya.Ease.quintInOut) + list.push(Laya.Ease.quintOut) + + list.push(Laya.Ease.sineIn) + list.push(Laya.Ease.sineInOut) + list.push(Laya.Ease.sineOut) + + list.push(Laya.Ease.strongIn) + list.push(Laya.Ease.strongInOut) + list.push(Laya.Ease.strongOut) + console.log("length", list.length) + + this.title.text = "" + + for (let i = 0; i < list.length; i++) { + const label = this.obj_eases.getChildAt(i) as Laya.Label + label.text = list[i].name + label.on(Laya.Event.CLICK, this, (evt: Laya.Event) => { + const label = evt.target as Laya.Label + this.title.text = label.text + this.icon.x = 400 + for (let j = 0; j < list.length; j++) { + const obj = list[j] + if (obj.name === label.text) { + Laya.Tween.to(this.icon, { x: 1500 }, 2000, obj) + break + } + } + }) + } + } +} diff --git a/shudu/src/views/EaseTest.ts.meta b/shudu/src/views/EaseTest.ts.meta new file mode 100644 index 0000000..c3bc24d --- /dev/null +++ b/shudu/src/views/EaseTest.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "ce663753-2b15-47c1-a70f-474d0b365bdd" +} \ No newline at end of file diff --git a/shudu/src/views/GameDone.ts b/shudu/src/views/GameDone.ts new file mode 100644 index 0000000..57aeb06 --- /dev/null +++ b/shudu/src/views/GameDone.ts @@ -0,0 +1,175 @@ +import type { DOStage } from "../models/DOStage" +import { config } from "../constants/config" +import { respath } from "../constants/respath" +import { ResourceManager } from "../models/ResourceManager" +import { StorageManager } from "../models/StorageManager" +import { UIManager } from "../models/UIManager" +import { Utility_ConvertSecondToString } from "../utils/utility" +import { Difficulty } from "./Difficulty" + +const { regClass, property } = Laya + +@regClass() +export class GameDone extends Laya.Script { + declare owner: Laya.Box + + @property(Laya.Image) + public bg: Laya.Image + + @property(Laya.Image) + public obj_light: Laya.Image + + @property(Laya.Image) + public obj_top: Laya.Image + + @property(Laya.Box) + public obj_panel: Laya.Box + + @property(Laya.Image) + public star1: Laya.Image + + @property(Laya.Image) + public star2: Laya.Image + + @property(Laya.Image) + public star3: Laya.Image + + @property(Laya.Image) + public star4: Laya.Image + + @property(Laya.Image) + public img_title: Laya.Image + + @property(Laya.Label) + public label_diffucuty: Laya.Label + + @property(Laya.Label) + public label_time: Laya.Label + + @property(Laya.Label) + public label_score: Laya.Label + + @property(Laya.Box) + public btn_new: Laya.Box + + @property(Laya.Box) + public btn_home: Laya.Box + + @property(Laya.Box) + public btn_continue: Laya.Box + + onAwake(): void { + ResourceManager.getInstance().loadTexture(respath.bg_done, this.bg) + ResourceManager.getInstance().loadTexture(respath.bg_done_light, this.obj_light) + ResourceManager.getInstance().loadTexture(respath.bg_done_top, this.obj_top) + ResourceManager.getInstance().loadTexture(respath.icon_star2, this.star1) + ResourceManager.getInstance().loadTexture(respath.icon_star2, this.star2) + ResourceManager.getInstance().loadTexture(respath.icon_star2, this.star3) + ResourceManager.getInstance().loadTexture(respath.icon_star1, this.star4) + if (this.img_title) + ResourceManager.getInstance().loadTexture(respath.Congratulations, this.img_title) + + this.owner.x = 0 + this.owner.y = 0 + + this.obj_panel.alpha = 0 + this.obj_panel.scaleX = 0.8 + this.obj_panel.scaleY = 0.8 + + this.star1.scaleX = 1.2 + this.star1.scaleY = 1.2 + + this.star2.scaleX = 1.2 + this.star2.scaleY = 1.2 + + this.star3.scaleX = 1.2 + this.star3.scaleY = 1.2 + + this.star4.scaleX = 1.2 + this.star4.scaleY = 1.2 + } + + onStart(): void { + // Laya.Tween.to(this.owner, { y: 0 }, 300, Laya.Ease.elasticOut) + + Laya.Tween.to(this.obj_panel, { alpha: 1 }, 400, Laya.Ease.elasticOut, null, 100) + Laya.Tween.to(this.obj_panel, { scaleX: 1, scaleY: 1 }, 400, Laya.Ease.elasticOut, null, 100) + + Laya.Tween.to(this.star1, { scaleX: 1, scaleY: 1 }, 300, Laya.Ease.elasticOut, null, 400) + const y1 = this.star1.y + this.star1.y = y1 - 10 + Laya.Tween.to(this.star1, { y: y1 }, 300, Laya.Ease.elasticOut, null, 400) + + Laya.Tween.to(this.star2, { scaleX: 1, scaleY: 1 }, 300, Laya.Ease.elasticOut, null, 600) + const y2 = this.star2.y + this.star2.y = y2 - 10 + Laya.Tween.to(this.star2, { y: y2 }, 300, Laya.Ease.elasticOut, null, 600) + + Laya.Tween.to(this.star3, { scaleX: 1, scaleY: 1 }, 300, Laya.Ease.elasticOut, null, 800) + const y3 = this.star3.y + this.star3.y = y3 - 10 + Laya.Tween.to(this.star3, { y: y3 }, 300, Laya.Ease.elasticOut, null, 800) + + Laya.Tween.to(this.star4, { scaleX: 1, scaleY: 1 }, 300, Laya.Ease.elasticOut, null, 600) + const y4 = this.star4.y + this.star4.y = y4 - 10 + Laya.Tween.to(this.star4, { y: y4 }, 300, Laya.Ease.elasticOut, null, 600) + + this.obj_light.alpha = 0 + Laya.Tween.to(this.obj_light, { alpha: 0.2 }, 500, Laya.Ease.elasticOut, null, 1000) + + this.btn_new.alpha = 0 + Laya.Tween.to(this.btn_new, { alpha: 1 }, 300, Laya.Ease.elasticOut, null, 1200) + } + + public onSetStageInfo(doStage: DOStage): void { + this.label_diffucuty.text = doStage.get_difficulty() + this.label_time.text = Utility_ConvertSecondToString(doStage.get_duration()) + this.label_score.text = doStage.get_score().toString() + + this.btn_new.on(Laya.Event.CLICK, this, () => { + if (config.H_SCREEN) { + const user = StorageManager.getInstance().getUser() + user.update_progress(doStage.get_difficulty(), doStage.get_stageIndex() + 1)// 主线关卡更新难度进度 + StorageManager.getInstance().newStage(config.DEFAULT_STAGE_ID, config.STAGE_TYPE.MAIN, doStage.get_difficulty(), doStage.get_difficulty()) + UIManager.getInstance().loadStageUI(config.DEFAULT_STAGE_ID) + this.owner.destroy() + } else { + ResourceManager.getInstance().loadPrefab(respath.difficulty_ui_res, (go: any) => { + const prefab = go.create() + const d = UIManager.getInstance().getUIRoot().addChild(prefab).getComponent(Difficulty) + d.onInit((value: string) => { + console.log("选择难度", value) + StorageManager.getInstance().newStage(config.DEFAULT_STAGE_ID, config.STAGE_TYPE.MAIN, value, value) + UIManager.getInstance().loadStageUI(config.DEFAULT_STAGE_ID) + this.owner.destroy() + }) + }) + } + }) + + this.btn_continue.on(Laya.Event.CLICK, this, () => { // 这个按钮只有从DC来的会显示 + UIManager.getInstance().loadDCUI() + UIManager.getInstance().closeStageUI() + this.owner.destroy() + }) + + this.btn_home.on(Laya.Event.CLICK, this, () => { + if (config.H_SCREEN) { + UIManager.getInstance().closeDCUI() + if (doStage.get_stageType() === config.STAGE_TYPE.MAIN) { + const user = StorageManager.getInstance().getUser() + user.update_progress(doStage.get_difficulty(), doStage.get_stageIndex() + 1)// 主线关卡更新难度进度 + StorageManager.getInstance().newStage(config.DEFAULT_STAGE_ID, config.STAGE_TYPE.MAIN, doStage.get_difficulty(), doStage.get_difficulty()) + UIManager.getInstance().loadStageUI(config.DEFAULT_STAGE_ID) + } else if (doStage.get_stageType() === config.STAGE_TYPE.DC) { + UIManager.getInstance().setTopbarTo(true) + } + } else { + UIManager.getInstance().loadHomeUI() + UIManager.getInstance().closeStageUI() + } + this.owner.destroy() + }) + } +} diff --git a/shudu/src/views/GameDone.ts.meta b/shudu/src/views/GameDone.ts.meta new file mode 100644 index 0000000..71c2e2f --- /dev/null +++ b/shudu/src/views/GameDone.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "13e020d1-5ab8-4082-80ca-c0d208342103" +} \ No newline at end of file diff --git a/shudu/src/views/GameOver.ts b/shudu/src/views/GameOver.ts new file mode 100644 index 0000000..bf71542 --- /dev/null +++ b/shudu/src/views/GameOver.ts @@ -0,0 +1,102 @@ +import type { DOStage } from "../models/DOStage" +import { config } from "../constants/config" +import { respath } from "../constants/respath" +import { EVENT_TYPES, EventManager } from "../models/EventManager" +import { ResourceManager } from "../models/ResourceManager" +import { StorageManager } from "../models/StorageManager" +import { UIManager } from "../models/UIManager" +import { Utility_EaseOut, Utility_EaseOut_2 } from "../utils/utility" +import { Difficulty } from "./Difficulty" + +const { regClass, property } = Laya + +@regClass() +export class GameOver extends Laya.Script { + declare owner: Laya.Box + + @property(Laya.Box) + public btn_second: Laya.Box + + @property(Laya.Box) + public btn_restart: Laya.Box + + @property(Laya.Box) + public btn_newOrClose: Laya.Box + + @property(Laya.Label) + public label_newOrClose: Laya.Label + + private mask: Laya.Image + private center: Laya.Box + + onAwake(): void { + this.mask = this.owner.getChildByName("Image") as Laya.Image + this.mask.alpha = 0 + Laya.Tween.to(this.mask, { alpha: 0.6 }, 400, Utility_EaseOut) + + this.center = this.owner.getChildByName("center") as Laya.Box + this.center.scaleX = 0.8 + this.center.scaleY = 0.8 + Laya.Tween.to(this.center, { scaleX: 1, scaleY: 1 }, 400, Utility_EaseOut) + this.center.alpha = 0 + Laya.Tween.to(this.center, { alpha: 1 }, 400, Utility_EaseOut) + } + + destroyUI(): void { + Laya.Tween.to(this.mask, { alpha: 0 }, 400, Utility_EaseOut_2) + Laya.Tween.to(this.center, { scaleX: 0.8, scaleY: 0.8 }, 400, Utility_EaseOut_2) + Laya.Tween.to(this.center, { alpha: 0 }, 400, Utility_EaseOut_2, Laya.Handler.create(this, () => { + this.owner.destroy() + })) + } + + public onSetStageInfo(doStage: DOStage): void { + this.btn_second.on(Laya.Event.CLICK, this, () => { + doStage.set_mistake(doStage.get_mistake() - 1) + EventManager.getInstance().DispatchEvent(EVENT_TYPES.NOT_UPDATE_MISTAKE) + this.destroyUI() + }) + + this.btn_restart.on(Laya.Event.CLICK, this, () => { + const stageID = doStage.get_stageID() + const type = doStage.get_stageType() + const difficulty = doStage.get_difficulty() + StorageManager.getInstance().newStage(stageID, type, difficulty, difficulty) + UIManager.getInstance().loadStageUI(stageID) + this.destroyUI() + }) + + const type = doStage.get_stageType() + if (type === config.STAGE_TYPE.MAIN) { + this.label_newOrClose.text = "New Game" + this.btn_newOrClose.on(Laya.Event.CLICK, this, () => { + if (config.H_SCREEN) { + const user = StorageManager.getInstance().getUser() + user.update_progress(doStage.get_difficulty(), doStage.get_stageIndex() + 1)// 主线关卡更新难度进度 + const difficulty = doStage.get_difficulty() + StorageManager.getInstance().newStage(config.DEFAULT_STAGE_ID, config.STAGE_TYPE.MAIN, difficulty, difficulty) + UIManager.getInstance().loadStageUI(config.DEFAULT_STAGE_ID) + this.destroyUI() + } else { + ResourceManager.getInstance().loadPrefab(respath.difficulty_ui_res, (go: any) => { + const prefab = go.create() + const d = UIManager.getInstance().getUIRoot().addChild(prefab).getComponent(Difficulty) + d.onInit((value: string) => { + console.log("选择难度", value) + StorageManager.getInstance().newStage(config.DEFAULT_STAGE_ID, config.STAGE_TYPE.MAIN, value, value) + UIManager.getInstance().loadStageUI(config.DEFAULT_STAGE_ID) + this.destroyUI() + }) + }) + } + }) + } else { + this.label_newOrClose.text = "Close" + this.btn_newOrClose.on(Laya.Event.CLICK, this, () => { + UIManager.getInstance().loadDCUI() + UIManager.getInstance().closeStageUI() + this.destroyUI() + }) + } + } +} diff --git a/shudu/src/views/GameOver.ts.meta b/shudu/src/views/GameOver.ts.meta new file mode 100644 index 0000000..ae3d5c8 --- /dev/null +++ b/shudu/src/views/GameOver.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "72a5ccd3-8177-451c-b2ce-cf1b42f7e6d4" +} \ No newline at end of file diff --git a/shudu/src/views/GamePause.ts b/shudu/src/views/GamePause.ts new file mode 100644 index 0000000..f96b455 --- /dev/null +++ b/shudu/src/views/GamePause.ts @@ -0,0 +1,76 @@ +import type { DOStage } from "../models/DOStage" +import { EVENT_TYPES, EventManager } from "../models/EventManager" +import { StorageManager } from "../models/StorageManager" +import { UIManager } from "../models/UIManager" +import { Utility_ConvertSecondToString, Utility_EaseOut, Utility_EaseOut_2 } from "../utils/utility" + +const { regClass, property } = Laya + +@regClass() +export class GamePause extends Laya.Script { + declare owner: Laya.Box + + @property(Laya.Label) + public label_time: Laya.Label + + @property(Laya.Label) + public label_diffucuty: Laya.Label + + @property(Laya.Box) + public btn_continue: Laya.Box + + @property(Laya.Box) + public btn_restart: Laya.Box + + private mask: Laya.Image + private center: Laya.Box + + onAwake(): void { + EventManager.getInstance().DispatchEvent(EVENT_TYPES.NOT_UPDATE_PAUSE, true) + + this.mask = this.owner.getChildByName("Image") as Laya.Image + this.mask.alpha = 0 + Laya.Tween.to(this.mask, { alpha: 0.6 }, 400, Utility_EaseOut) + + this.center = this.owner.getChildByName("center") as Laya.Box + this.center.scaleX = 0.8 + this.center.scaleY = 0.8 + Laya.Tween.to(this.center, { scaleX: 1, scaleY: 1 }, 400, Utility_EaseOut) + this.center.alpha = 0 + Laya.Tween.to(this.center, { alpha: 1 }, 400, Utility_EaseOut) + } + + onDestroy(): void { + EventManager.getInstance().DispatchEvent(EVENT_TYPES.NOT_UPDATE_PAUSE, false) + } + + destroyUI(): void { + Laya.Tween.to(this.mask, { alpha: 0 }, 400, Utility_EaseOut_2) + Laya.Tween.to(this.center, { scaleX: 0.8, scaleY: 0.8 }, 400, Utility_EaseOut_2) + Laya.Tween.to(this.center, { alpha: 0 }, 400, Utility_EaseOut_2, Laya.Handler.create(this, () => { + this.owner.destroy() + })) + } + + public onSetStageInfo(doStage: DOStage): void { + this.label_time.text = Utility_ConvertSecondToString(doStage.get_duration()) + this.label_diffucuty.text = doStage.get_difficulty() + + this.mask.on(Laya.Event.CLICK, this, () => { + this.destroyUI() + }) + + this.btn_continue.on(Laya.Event.CLICK, this, () => { + this.destroyUI() + }) + + this.btn_restart.on(Laya.Event.CLICK, this, () => { + const stageID = doStage.get_stageID() + const type = doStage.get_stageType() + const difficulty = doStage.get_difficulty() + StorageManager.getInstance().newStage(stageID, type, difficulty, difficulty) + UIManager.getInstance().loadStageUI(stageID) + this.destroyUI() + }) + } +} diff --git a/shudu/src/views/GamePause.ts.meta b/shudu/src/views/GamePause.ts.meta new file mode 100644 index 0000000..db55e21 --- /dev/null +++ b/shudu/src/views/GamePause.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "c8bf81c2-c8fd-4f25-b120-4ad620ff7b88" +} \ No newline at end of file diff --git a/shudu/src/views/Home.ts b/shudu/src/views/Home.ts new file mode 100644 index 0000000..3413f47 --- /dev/null +++ b/shudu/src/views/Home.ts @@ -0,0 +1,157 @@ +import { config } from "../constants/config" +import { respath } from "../constants/respath" +import { G_getMonthInfo } from "../models/DCManager" +import { ResourceManager } from "../models/ResourceManager" +import { StorageManager } from "../models/StorageManager" +import { UIManager } from "../models/UIManager" +import { Utility_ConvertSecondToString } from "../utils/utility" +import { Difficulty } from "./Difficulty" + +const { regClass, property } = Laya + +@regClass() +export class Home extends Laya.Script { + declare owner: Laya.Box + + @property(Laya.Image) + public bg_dc: Laya.Image + + @property(Laya.Image) + public icon_dc: Laya.Image + + @property(Laya.Label) + public label_dc_title: Laya.Label + + @property(Laya.Label) + public label_dc_date: Laya.Label + + @property(Laya.Box) + public btn_play: Laya.Box + + @property(Laya.Box) + public btn_continue: Laya.Box + + @property(Laya.Box) + public btn_more: Laya.Box + + @property(Laya.Box) + public btn_new_blue: Laya.Box + + @property(Laya.Box) + public btn_go: Laya.Box + + @property(Laya.Box) + public btn_new_white: Laya.Box + + onStart(): void { + const user = StorageManager.getInstance().getUser() + const now = new Date() + const nowYear = now.getFullYear() + const nowMonth = now.getMonth() + 1 + const nowDay = now.getDate() + const find = G_getMonthInfo(nowYear, nowMonth) + if (find) { + ResourceManager.getInstance().loadTexture(find.icon_res, this.icon_dc) + if (user.get_trophyRecord(nowYear, nowMonth)) { + ResourceManager.getInstance().loadTexture(respath.home_top_dc_bg_finish, this.bg_dc) + this.label_dc_title.color = "#ffffff" + this.label_dc_date.color = "#ffffff" + } else { + ResourceManager.getInstance().loadTexture(respath.home_top_dc_bg_normal, this.bg_dc) + this.label_dc_title.color = "#2d3138" + this.label_dc_date.color = "#2d3138" + } + } else { + ResourceManager.getInstance().loadTexture(respath.home_top_dc_bg_normal, this.bg_dc) + this.label_dc_title.color = "#2d3138" + this.label_dc_date.color = "#2d3138" + } + + const stageID = `${nowYear}-${nowMonth}-${nowDay}` + this.label_dc_date.text = `${config.MONTH_ABBRS[nowMonth - 1]} ${nowDay}` + + const progress = user.get_done(stageID) + if (progress <= 0) { + this.btn_play.visible = true + this.btn_continue.visible = false + this.btn_more.visible = false + this.btn_play.on(Laya.Event.CLICK, this, () => { // Play + const stageName = `${config.MONTH_ABBRS[nowMonth - 1]} ${nowDay}` + StorageManager.getInstance().newStage(stageID, config.STAGE_TYPE.DC, stageName) + UIManager.getInstance().loadStageUI(stageID) + this.owner.destroy() + }) + } else if (progress >= 1) { + this.btn_play.visible = false + this.btn_continue.visible = false + this.btn_more.visible = true + this.btn_more.on(Laya.Event.CLICK, this, () => { // 更多 + UIManager.getInstance().loadDCUI() + this.owner.destroy() + }) + } else { + this.btn_play.visible = false + this.btn_continue.visible = true + this.btn_more.visible = false + this.btn_continue.on(Laya.Event.CLICK, this, () => { // 继续 + UIManager.getInstance().loadStageUI(stageID) + this.owner.destroy() + }) + } + + this.btn_new_blue.on(Laya.Event.CLICK, this, this.onClickNew) + this.btn_new_white.on(Laya.Event.CLICK, this, this.onClickNew) + this.btn_go.on(Laya.Event.CLICK, this, () => { + UIManager.getInstance().loadStageUI(config.DEFAULT_STAGE_ID) + this.owner.destroy() + }) + + if (user.get_done(config.DEFAULT_STAGE_ID) >= 1) { + console.log("当前主线关卡完成") + this.btn_new_blue.visible = true + this.btn_new_white.visible = false + this.btn_go.visible = false + } else { + const doStage = StorageManager.getInstance().getStage(config.DEFAULT_STAGE_ID) + if (doStage) { + console.log("当前主线关卡进行中 mistake=", doStage.get_mistake()) + if (doStage.get_mistake() >= config.MISTAKE_MAX) { + this.btn_new_blue.visible = true + this.btn_new_white.visible = false + this.btn_go.visible = false + } else { + this.btn_new_blue.visible = false + this.btn_new_white.visible = true + this.btn_go.visible = true + + const HBox = this.btn_go.getChildByName("HBox") as Laya.HBox + const time = HBox.getChildByName("time") as Laya.Image + const label_time = HBox.getChildByName("label_time") as Laya.Text + const duration = doStage.get_duration() + const timeStr = Utility_ConvertSecondToString(duration) + label_time.text = `${timeStr} - ${doStage.get_difficulty()}` + label_time.width = label_time.textWidth + HBox.width = time.width + HBox.space + label_time.textWidth + } + } else { + console.log("当前主线关卡未开始") + this.btn_new_blue.visible = true + this.btn_new_white.visible = false + this.btn_go.visible = false + } + } + } + + public onClickNew(_evt: Laya.Event): void { + ResourceManager.getInstance().loadPrefab(respath.difficulty_ui_res, (go: any) => { + const prefab = go.create() + const d = UIManager.getInstance().getUIRoot().addChild(prefab).getComponent(Difficulty) + d.onInit((value: string) => { + console.log("选择难度", value) + StorageManager.getInstance().newStage(config.DEFAULT_STAGE_ID, config.STAGE_TYPE.MAIN, value, value) + UIManager.getInstance().loadStageUI(config.DEFAULT_STAGE_ID) + this.owner.destroy() + }) + }) + } +} diff --git a/shudu/src/views/Home.ts.meta b/shudu/src/views/Home.ts.meta new file mode 100644 index 0000000..cd17d52 --- /dev/null +++ b/shudu/src/views/Home.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "f2970e4d-7a09-4a9b-aef3-45d330c86f4f" +} \ No newline at end of file diff --git a/shudu/src/views/ScoreAdd.ts b/shudu/src/views/ScoreAdd.ts new file mode 100644 index 0000000..73ed05f --- /dev/null +++ b/shudu/src/views/ScoreAdd.ts @@ -0,0 +1,53 @@ +import BezierEasing from "bezier-easing" +import { Utility_EaseOut } from "../utils/utility" +import { AutoDestroy } from "./common/AutoDestroy" + +const { regClass, property } = Laya + +@regClass() +export class ScoreAdd extends Laya.Script { + declare owner: Laya.Box + + @property(Laya.Label) + public shadow: Laya.Label + + @property(Laya.Label) + public label: Laya.Label + + onAwake(): void { + this.shadow.scaleX = 0 + this.shadow.scaleY = 0 + this.label.scaleX = 0 + this.label.scaleY = 0 + + const d = this.owner.getComponent(AutoDestroy) + d.lifeTime = 2 + } + + onStart(): void { + // const filter: Laya.GlowFilter = new Laya.GlowFilter("#000000", 5, 0, 0); + // this.label.filters = [filter]; + + function bezierEaseLaya1(t: number, b: number, c: number, d: number) { + const bezier = BezierEasing(0.55, 1.8, 0.8, 0.95) + const p = bezier(t / d) + return c * p + b + } + Laya.Tween.to(this.shadow, { scaleX: 1, scaleY: 1 }, 300, bezierEaseLaya1, null, 0) + Laya.Tween.to(this.label, { scaleX: 1, scaleY: 1 }, 300, bezierEaseLaya1, null, 0) + + Laya.Tween.to(this.shadow, { y: -102 }, 300, Utility_EaseOut, null, 500) + Laya.Tween.to(this.label, { y: -102 }, 300, Utility_EaseOut, null, 500) + + Laya.Tween.to(this.shadow, { alpha: 0 }, 300, Utility_EaseOut, null, 500) + Laya.Tween.to(this.label, { alpha: 0 }, 300, Utility_EaseOut, null, 500) + + // Laya.Tween.to(this.label, { scaleX: 1, scaleY: 1 }, 300, Laya.Ease.bounceIn, null, 0) + // Laya.Tween.to(this.label, { y: -102 }, 300, Laya.Ease.linearOut, null, 500) + // Laya.Tween.to(this.label, { alpha: 0 }, 300, Laya.Ease.linearOut, null, 500) + } + + public onSetText(text: string): void { + this.label.text = text + } +} diff --git a/shudu/src/views/ScoreAdd.ts.meta b/shudu/src/views/ScoreAdd.ts.meta new file mode 100644 index 0000000..46973cb --- /dev/null +++ b/shudu/src/views/ScoreAdd.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "c910a064-d127-442e-a884-b5289c488647" +} \ No newline at end of file diff --git a/shudu/src/views/Stage.ts b/shudu/src/views/Stage.ts new file mode 100644 index 0000000..1442596 --- /dev/null +++ b/shudu/src/views/Stage.ts @@ -0,0 +1,642 @@ +import type { DOStage } from "../models/DOStage" +import { config } from "../constants/config" +import { G_getMonthInfo } from "../models/DCManager" +import { EVENT_TYPES, EventManager } from "../models/EventManager" +import { StorageManager } from "../models/StorageManager" +import { UIManager } from "../models/UIManager" +import { Utility_CalculateScore, Utility_ConvertSecondToString } from "../utils/utility" +import { Block } from "./Block" +import { Candy } from "./Candy" + +const { regClass, property } = Laya + +@regClass() +export class Stage extends Laya.Script { + declare owner: Laya.Box + + @property(Laya.Box) + public btn_back: Laya.Box + + @property(Laya.Box) + public btn_new: Laya.Box + + @property(Laya.Box) + public btn_pause: Laya.Box + + @property(Laya.Box) + public obj_mask: Laya.Box + + @property(Laya.Label) + public label_score: Laya.Label + + private score_last: number + private score_current: number + private score_step: number + private score_animation_wait_frame = 0 + @property(Laya.Label) + public label_mistake: Laya.Label + + @property(Laya.Label) + public label_name: Laya.Label + + @property(Laya.Label) + public label_time: Laya.Label + + @property(Laya.Box) + public obj_blocks: Laya.Box + + @property(Laya.Box) + public obj_pos: Laya.Box + + private blocks: Array = [] + + @property(Laya.Box) + public obj_candys: Laya.Box + + private candys: Array = [] + + @property(Laya.Button) + public btn_undo: Laya.Button + + @property(Laya.Button) + public btn_erase: Laya.Button + + @property(Laya.Button) + public btn_note: Laya.Button + + private btn_note_normal: Laya.Box + private btn_note_checked: Laya.Box + private label_note: Laya.Label + @property(Laya.Button) + public btn_hint: Laya.Button + + private btn_hint_normal: Laya.Box + private btn_hint_ad: Laya.Box + private btn_hint_label: Laya.Label + + private data: DOStage + private selectedBlock: Block + private paused: boolean + private isShowPauseUI: boolean + + private static _instance: Stage + onAwake(): void { + Stage._instance = this + + this.btn_back.on(Laya.Event.CLICK, this, () => { + if (this.data.get_stageType() === config.STAGE_TYPE.MAIN) { + UIManager.getInstance().loadHomeUI() + UIManager.getInstance().closeStageUI() + } else { + UIManager.getInstance().loadDCUI() + UIManager.getInstance().closeStageUI() + } + }) + + if (this.btn_new) { + this.btn_new.on(Laya.Event.CLICK, this, () => { + const user = StorageManager.getInstance().getUser() + user.update_progress(this.data.get_difficulty(), this.data.get_stageIndex() + 1)// 主线关卡更新难度进度 + StorageManager.getInstance().newStage(config.DEFAULT_STAGE_ID, config.STAGE_TYPE.MAIN, this.data.get_difficulty(), this.data.get_difficulty()) + UIManager.getInstance().loadStageUI(config.DEFAULT_STAGE_ID) + }) + } + + this.btn_pause.on(Laya.Event.CLICK, this, () => { + UIManager.getInstance().loadGamePauseUI(this.data) + }) + + let XGroup = 0 + let YGroup = 0 + for (let i = 0; i < this.obj_blocks.numChildren; i++) { + YGroup = i + const ibox = this.obj_blocks.getChildAt(i) + const pos_ibox = this.obj_pos.getChildAt(i) + for (let j = 0; j < ibox.numChildren; j++) { + XGroup = j + const jbox = ibox.getChildAt(j) + const VBox = jbox.getChildByName("VBox") + const pos_jbox = pos_ibox.getChildAt(j) + const pos_VBox = pos_jbox.getChildByName("VBox") + for (let k = 0; k < VBox.numChildren; k++) { + const kbox = VBox.getChildAt(k) + const pos_kbox = pos_VBox.getChildAt(k) + for (let l = 0; l < kbox.numChildren; l++) { + const block = kbox.getChildAt(l).getComponent(Block) + const XIndex = j * 3 + l + const YIndex = i * 3 + k + block.onInit(XIndex, YIndex, XGroup, YGroup, pos_kbox.getChildAt(l) as Laya.Box, this, this.onClickBlock) + this.blocks[XIndex + YIndex * 9] = block + } + } + } + } + for (let i = 0; i < this.obj_candys.numChildren; i++) { + const hbox = this.obj_candys.getChildAt(i) + for (let j = 0; j < hbox.numChildren; j++) { + const candy = hbox.getChildAt(j).getComponent(Candy) + this.candys.push(candy) + candy.onInit(this) + } + } + + this.btn_undo.on(Laya.Event.CLICK, this, this.onClickUndo) + this.btn_erase.on(Laya.Event.CLICK, this, this.onClickErase) + this.btn_note.on(Laya.Event.CLICK, this, this.onClickNote) + this.btn_note_normal = this.btn_note.getChildByName("normal") as Laya.Box + this.btn_note_checked = this.btn_note.getChildByName("checked") as Laya.Box + this.label_note = this.btn_note.getChildByName("label") as Laya.Label + this.btn_hint.on(Laya.Event.CLICK, this, this.onClickHint) + this.btn_hint_normal = this.btn_hint.getChildByName("Image").getChildByName("normal") as Laya.Box + this.btn_hint_ad = this.btn_hint.getChildByName("Image").getChildByName("ad") as Laya.Box + this.btn_hint_label = this.btn_hint.getChildByName("Image").getChildByName("normal").getChildByName("label") as Laya.Label + + // 失去舞台焦点(切出游戏)的处理 + Laya.stage.on(Laya.Event.BLUR, this, () => { + if (!Stage._instance.isShowPauseUI) { + Stage._instance.onUpdatePaused(true) + } + }) + // 获得舞台焦点(切回游戏)的处理 + Laya.stage.on(Laya.Event.FOCUS, this, () => { + if (!Stage._instance.isShowPauseUI) { + Stage._instance.onUpdatePaused(false) + } + }) + // Laya.stage.on(Laya.Event.FOCUS_CHANGE, this, (evt: Laya.Event) => { + // console.log(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>FOCUS_CHANGE", evt, Laya.stage.isFocused) + // Stage.EventUpdatePause(!Laya.stage.isFocused) + // }) + + EventManager.getInstance().RegisterEvent(EVENT_TYPES.NOT_UPDATE_MISTAKE, Stage.EventUpdateMistake) + EventManager.getInstance().RegisterEvent(EVENT_TYPES.NOT_UPDATE_PAUSE, Stage.EventUpdatePause) + } + + onDestroy(): void { + EventManager.getInstance().UnregisterEvent(EVENT_TYPES.NOT_UPDATE_MISTAKE, Stage.EventUpdateMistake) + EventManager.getInstance().UnregisterEvent(EVENT_TYPES.NOT_UPDATE_PAUSE, Stage.EventUpdatePause) + } + + public static EventUpdateMistake(): void { + if (Stage._instance) { + Stage._instance.onUpdateMistake() + } + } + + public static EventUpdatePause(arg: any): void { + if (Stage._instance) { + Stage._instance.isShowPauseUI = arg + Stage._instance.onUpdatePaused(arg) + } + } + + public onUpdatePaused(paused: boolean): void { + this.paused = paused + Stage._instance.obj_mask.visible = paused + for (let i = 0; i < Stage._instance.blocks.length; i++) { + Stage._instance.blocks[i].setPaused(paused) + } + } + + public onLoadStage(doStage: DOStage): void { + this.data = doStage + this.paused = false + this.isShowPauseUI = false + + this.obj_mask.visible = false + + if (config.H_SCREEN) { + this.btn_back.visible = this.data.get_stageType() === config.STAGE_TYPE.DC + this.btn_new.visible = this.data.get_stageType() === config.STAGE_TYPE.MAIN + } + + this.score_last = 0 + this.score_current = 0 + this.onUpdateScore() + this.score_last = this.score_current + this.label_score.text = `Score: ${this.score_last}` + + this.label_name.text = this.data.get_stageName() + if (this.data.get_stageType() === config.STAGE_TYPE.MAIN && config.H_SCREEN) + this.label_name.text = "" + this.onUpdateMistake() + + this.label_time.text = Utility_ConvertSecondToString(this.data.get_duration()) + Laya.timer.clearAll(this) + Laya.timer.loop(1000, this, () => { + if (this.paused) { + return + } + let last = this.data.get_duration() + last++ + this.data.set_duration(last) + this.label_time.text = Utility_ConvertSecondToString(last) + }) + + const blocks = doStage.get_blocks() + for (let i = 0; i < blocks.length; i++) { + const doBlock = blocks[i] + const block = this.blocks[i] + block.setBlockColor(config.BLOCK_COLOR.WHITE) + block.setBlock(doBlock) + block.setTipsBgColor(false) + block.setSelected(false) + block.setPaused(false) + } + this.onUpdateCandys() + this.onClickNote(null) + this.onUpdateHintStatus() + + this.selectedBlock = this.blocks[this.data.get_select_index()] + this.onApplyBlock(this.selectedBlock) + } + + onUpdateScore(): void { + let score = 0 + const blocks = this.data.get_blocks() + for (let i = 0; i < blocks.length; i++) { + score += blocks[i].get_score() + } + if (this.score_current !== score) { // 分数发生变化 + this.score_current = score + this.score_step = Math.ceil((this.score_current - this.score_last) / 24) + if (this.score_current > this.score_last) + this.score_animation_wait_frame = 36 + else + this.score_animation_wait_frame = 0 + this.data.set_score(score) + } + } + + onLateUpdate(): void { + this.score_animation_wait_frame-- + if (this.score_animation_wait_frame < 0) + this.score_animation_wait_frame = 0 + if (this.score_animation_wait_frame <= 0) { + if (this.score_current !== this.score_last) { + if (this.score_current > this.score_last) { + this.score_last += this.score_step + if (this.score_last > this.score_current) + this.score_last = this.score_current + this.label_score.text = `Score: ${this.score_last}` + } else { + this.label_score.text = `Score: ${this.score_current}` + this.score_last = this.score_current + } + } + } + } + + onUpdateMistake(): void { + this.label_mistake.text = `Mistakes: ${this.data.get_mistake()} / ${config.MISTAKE_MAX}` + } + + onSetBlock(block: Block, animated: boolean = false): void { + // 全部格子还原 + for (let i = 0; i < this.blocks.length; i++) { + this.blocks[i].setBlockColor(config.BLOCK_COLOR.WHITE) + this.blocks[i].setTipsBgColor(false) + } + // 相关格子置灰 + const relateds = this.findRelatedBlocks(block) + for (let i = 0; i < relateds.length; i++) + relateds[i].setBlockColor(config.BLOCK_COLOR.GREY) + + // 选中空白格子 + if (block.getData().get_show() <= 0) { + block.setBlockColor(config.BLOCK_COLOR.BLUE) + } else { + const sameNumbers = this.findSameNumberBlocks(block)// 相同数字的格子 + for (let i = 0; i < sameNumbers.length; i++) { + sameNumbers[i].setBlockColor(config.BLOCK_COLOR.BLUE, 0.4) + } + const sameNotes = this.findSameNoteBlocks(block)// 相同数字的铅笔格子 + for (let i = 0; i < sameNotes.length; i++) { + sameNotes[i].setTipsBgColor(true, block.getData().get_show(), config.BLOCK_COLOR.BLUE, 0.4) + } + // 正确 + if (block.getData().get_checked()) { + block.setBlockColor(config.BLOCK_COLOR.BLUE) + } else { // 错误 + if (animated) { // 填数状态播放闪动效果 + for (let i = 0; i < relateds.length; i++) { // 相关且数字相同 + if (relateds[i].getData().get_show() === block.getData().get_show()) { // 播放变红动效 + if (relateds[i].getData().get_index() !== block.getData().get_index()) { + // relateds[i].setBlockColor(config.BLOCK_COLOR.WHITE) + relateds[i].setBlockColor(config.BLOCK_COLOR.RED, 0.4, true, config.BLOCK_COLOR.GREY, 1) + } + } + } + } else { + for (let i = 0; i < relateds.length; i++) { // 相关且数字相同 + if (relateds[i].getData().get_show() === block.getData().get_show()) { // 直接变红 + if (relateds[i].getData().get_index() !== block.getData().get_index()) { + relateds[i].setBlockColor(config.BLOCK_COLOR.RED, 0.4) + } + } + } + } + block.setBlockColor(config.BLOCK_COLOR.RED) + } + } + } + + onApplyBlock(block: Block): void { + this.selectedBlock.setSelected(false) + this.selectedBlock = block + this.selectedBlock.setSelected(true) + this.onSetBlock(this.selectedBlock) + this.data.set_select_index(this.selectedBlock.getData().get_index()) + for (let i = 0; i < this.candys.length; i++) { + this.candys[i].setAvailableStatus(this.selectedBlock.getData().get_checked() === false) + } + } + + onClickBlock(evt: Laya.Event): void { + const block = evt.target.getComponent(Block) + this.onApplyBlock(block) + } + + onClickUndo(): void { + const undo = this.data.pop_undo() + if (undo) { + // console.log("onClickUndo>>>>", JSON.stringify(undo)) + this.onApplyBlock(this.blocks[undo.index]) + if (undo.notes && undo.notes.length > 0) { + this.selectedBlock.setNotes(undo.notes) + } else { + this.selectedBlock.setShowNumber(undo.show, 0) + } + this.onUpdateScore() + const undos = this.data.get_undos() + if (undos.length > 0) { + const last = undos[undos.length - 1] + this.onApplyBlock(this.blocks[last.index]) + } + this.onSetBlock(this.selectedBlock) + this.onUpdateCandys() + } + } + + onClickErase(): void { + if (this.selectedBlock.getData().get_checked() === false) { // 未完成且有数字或者笔记才可以使用橡皮 + const show = this.selectedBlock.getData().get_show() + const notes = this.selectedBlock.getData().get_notes() + if (show > 0 || notes.length > 0) { + this.data.add_undo(this.selectedBlock.getData().get_index(), show, notes) + this.selectedBlock.setShowNumber(0, 0) + this.onUpdateScore() + this.onSetBlock(this.selectedBlock) + } + } + } + + onClickNote(evt: Laya.Event): void { + if (evt !== null) { + this.data.set_note_open(!this.data.get_note_open()) + } + this.btn_note_normal.visible = this.data.get_note_open() === false + this.btn_note_checked.visible = this.data.get_note_open() + this.label_note.color = this.data.get_note_open() ? "#1d5cdc" : "#545962" + for (let i = 0; i < this.candys.length; i++) { + this.candys[i].setNoteStatus(this.data.get_note_open()) + } + } + + onClickHint(): void { + const hint = this.data.get_hint() + if (hint > 0) { + if (this.selectedBlock.getData().get_checked() === false) { // 当前选中的格子没有完成 + const correct = this.selectedBlock.getData().get_correct() + this.onApplyCandy(correct, true) + this.data.set_hint(hint - 1) + this.onUpdateHintStatus() + } else { + const list: Array = [] + for (let i = 0; i < this.blocks.length; i++) { + const block = this.blocks[i] + if (block.getData().get_checked() === false) + list.push(block) + } + if (list.length > 0) { + const random = Math.random() + let index = Math.round(random * list.length) + if (index >= list.length) + index = list.length - 1 + const block = list[index] + this.onApplyBlock(block) + const correct = block.getData().get_correct() + this.onApplyCandy(correct, true) + this.data.set_hint(hint - 1) + this.onUpdateHintStatus() + } + } + } else { + // 这里播放广告 现在每个广告每次点击+9 + this.data.set_hint(9) + this.onUpdateHintStatus() + } + } + + onUpdateHintStatus(): void { + const hint = this.data.get_hint() + this.btn_hint_normal.visible = hint > 0 + this.btn_hint_ad.visible = hint <= 0 + this.btn_hint_label.text = hint.toString() + } + + public onApplyCandy(showNumber: number, hint: boolean): void { + if (this.data.get_mistake() >= config.MISTAKE_MAX) { + return + } + const show = this.selectedBlock.getData().get_show() + const notes = this.selectedBlock.getData().get_notes() + if (this.selectedBlock.getData().get_checked() === false) { + if (this.data.get_note_open() && hint === false) { + const relateds = this.findRelatedBlocks(this.selectedBlock) + let find = false + for (let i = 0; i < relateds.length; i++) { + if (relateds[i].getData().get_show() === showNumber) { + find = true + break + } + } + if (find === false) { + this.data.add_undo(this.selectedBlock.getData().get_index(), show, notes) + this.selectedBlock.addNoteNumber(showNumber) + this.onSetBlock(this.selectedBlock) + } else { + for (let i = 0; i < relateds.length; i++) { + const obj = relateds[i] + if (obj.getData().get_show() === showNumber && obj.getData().get_index() !== this.selectedBlock.getData().get_index()) { + obj.setFadeAnimation() + } + } + } + } else { + this.data.add_undo(this.selectedBlock.getData().get_index(), show, notes) + if (this.selectedBlock.getData().get_show() === showNumber) { + this.selectedBlock.setShowNumber(0, 0) + this.onSetBlock(this.selectedBlock) + } else { + let blockScore = 0 + if (hint === false) { + const duration = this.data.get_duration() - this.data.get_last_hit_time() + blockScore = Utility_CalculateScore(this.data.get_difficulty(), duration) + } + const b = this.selectedBlock.setShowNumber(showNumber, blockScore) + this.onUpdateScore() + this.onSetBlock(this.selectedBlock, true) + if (b) { + this.data.set_last_hit_time(this.data.get_duration()) + const user = StorageManager.getInstance().getUser() + let all = 0 + let finished = 0 + const blocks = this.data.get_blocks() + for (let i = 0; i < blocks.length; i++) { + if (blocks[i].get_preset() === false) { + all++ + if (blocks[i].get_checked()) { + finished++ + } + } + } + const progress = finished / all + user.update_stage_done(this.data.get_stageID(), progress)// 更新关卡完成进度 + if (this.getIsComplete()) { + console.log("完成关卡", finished, all, progress) + this.paused = true + if (this.data.get_stageType() === config.STAGE_TYPE.MAIN) { // 主线关卡更新难度进度 + user.update_progress(this.data.get_difficulty(), this.data.get_stageIndex() + 1) + UIManager.getInstance().loadGameDoneUI(true, this.data) + } else if (this.data.get_stageType() === config.STAGE_TYPE.DC) { // dc + if (progress >= 1) { // 完成每日挑战关卡检查是否或者当月奖杯 + const stageID = this.data.get_stageID() + const list = stageID.split("-") + const nowYear = Number(list[0]) + const nowMonth = Number(list[1]) + const day = Number(list[2]) + const doneCount = user.get_doneCountByDate(nowYear, nowMonth) + let dayCount = 0 + const info = G_getMonthInfo(nowYear, nowMonth) + if (info) + dayCount = info.dayCount + console.log("dc完成信息>>>>>>>>>>>>>>>", nowYear, nowMonth, doneCount, dayCount) + if (doneCount >= dayCount) { // 当月每日挑战全部完成 + user.add_trophy_record(nowYear, nowMonth, day) + } else { + this.rewardTrophyInDebug() + } + } + UIManager.getInstance().loadGameDoneUI(false, this.data) + } + } + } else { // 失败 + this.data.set_mistake(this.data.get_mistake() + 1) + this.onUpdateMistake() + if (this.data.get_mistake() >= config.MISTAKE_MAX) { + console.log("关卡失败") + this.paused = true + UIManager.getInstance().loadGameOverUI(this.data) + } + } + } + this.onUpdateCandys() + } + } + } + + onKeyUp(evt: Laya.Event): void { + const n = Number(evt.key) + if (n && n > 0) { + this.onApplyCandy(n, false) + } + } + + onUpdateCandys(): void { + const list: Map = new Map() + for (let i = 1; i <= 9; i++) + list.set(i, 0) + for (let i = 0; i < this.blocks.length; i++) { + const block = this.blocks[i] + if (block.getData().get_checked() === false) { + const correct = block.getData().get_correct() + list.set(correct, list.get(correct) + 1) + } + } + for (let i = 0; i < this.candys.length; i++) { + const candy = this.candys[i] + const show = i + 1 + const left = list.get(show) + candy.setCandy(show, left) + } + } + + findRelatedBlocks(obj: Block): Array { + const list: Array = [] + for (let i = 0; i < this.blocks.length; i++) { + const block = this.blocks[i] + if (block.XIndex === obj.XIndex) + list.push(block) + else if (block.YIndex === obj.YIndex) + list.push(block) + else if (block.XGroup === obj.XGroup && block.YGroup === obj.YGroup) + list.push(block) + } + return list + } + + findSameNumberBlocks(obj: Block): Array { + const list: Array = [] + for (let i = 0; i < this.blocks.length; i++) { + const block = this.blocks[i] + if (block.getData().get_show() === obj.getData().get_show()) + list.push(block) + } + return list + } + + findSameNoteBlocks(obj: Block): Array { + const list: Array = [] + for (let i = 0; i < this.blocks.length; i++) { + const block = this.blocks[i] + const note_numbers = block.getData().get_notes() + const find = note_numbers.indexOf(obj.getData().get_show()) + if (find >= 0) + list.push(block) + } + return list + } + + getIsComplete(): boolean { + let b = true + for (let i = 1; i < this.blocks.length; i++) { + const block = this.blocks[i] + if (block.getData().get_checked() === false) { + b = false + break + } + } + return b + } + + rewardTrophyInDebug(): void { + console.log("测试模式非本月10号通关之后即可获得奖杯", config.DEBUG) + if (config.DEBUG) { + const stageID = this.data.get_stageID() + const list = stageID.split("-") + const year = Number(list[0]) + const month = Number(list[1]) + const day = Number(list[2]) + if (day === 10) { + const now = new Date() + const nowYear = now.getFullYear() + const nowMonth = now.getMonth() + 1 + if (year !== nowYear || month !== nowMonth) { + const user = StorageManager.getInstance().getUser() + user.add_trophy_record(year, month, day) + } + } + } + } +} diff --git a/shudu/src/views/Stage.ts.meta b/shudu/src/views/Stage.ts.meta new file mode 100644 index 0000000..40944d9 --- /dev/null +++ b/shudu/src/views/Stage.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "692a672b-2457-456c-8093-321ea7a10e1b" +} \ No newline at end of file diff --git a/shudu/src/views/TopBar.ts b/shudu/src/views/TopBar.ts new file mode 100644 index 0000000..fe952ce --- /dev/null +++ b/shudu/src/views/TopBar.ts @@ -0,0 +1,190 @@ +import { config } from "../constants/config" +import { StorageManager } from "../models/StorageManager" +import { UIManager } from "../models/UIManager" +import { CommonData } from "./common/CommonData" +import { G_ShowCommonTips } from "./CommonTips" + +const { regClass, property } = Laya + +@regClass() +export class TopBar extends Laya.Script { + declare owner: Laya.Box + + @property(Laya.Box) + public btn_classic: Laya.Box + + @property(Laya.Sprite) + public sprite_classic: Laya.Sprite + + @property(Laya.Label) + public label_classic: Laya.Label + + @property(Laya.Box) + public btn_dc: Laya.Box + + @property(Laya.Sprite) + public sprite_dc: Laya.Sprite + + @property(Laya.Label) + public label_dc: Laya.Label + + private isClassic: boolean = true + + @property(Laya.Label) + public obj_label: Laya.Label + + @property(Laya.Box) + public obj_items: Laya.Box + + private item_sprites: Map = new Map() + private item_labels: Map = new Map() + + onStart(): void { + // 如果是第一次以横屏启动游戏需要创建经典关卡 + let difficulty = Laya.LocalStorage.getItem("difficulty")// 读取用户上次选择的难度 + if (!difficulty || difficulty.length <= 0) { + difficulty = config.DIFFICULTY_TYPE.Easy + Laya.LocalStorage.setItem("difficulty", difficulty) + } + const doStage = StorageManager.getInstance().getStage(config.DEFAULT_STAGE_ID) + if (!doStage) { + StorageManager.getInstance().newStage(config.DEFAULT_STAGE_ID, config.STAGE_TYPE.MAIN, difficulty, difficulty) + } else { + const user = StorageManager.getInstance().getUser() + if (user.get_done(config.DEFAULT_STAGE_ID) >= 1) { + console.log("当前主线关卡完成") + user.update_progress(doStage.get_difficulty(), doStage.get_stageIndex() + 1)// 主线关卡更新难度进度 + StorageManager.getInstance().newStage(config.DEFAULT_STAGE_ID, config.STAGE_TYPE.MAIN, difficulty, difficulty) + } else if (doStage.get_mistake() >= config.MISTAKE_MAX) { // 上次失败了则重新开始 + StorageManager.getInstance().newStage(config.DEFAULT_STAGE_ID, config.STAGE_TYPE.MAIN, difficulty, difficulty) + } + } + + this.btn_classic.on(Laya.Event.CLICK, this, () => { + if (this.isClassic === false) { + this.onClickTab(true) + } + }) + this.btn_dc.on(Laya.Event.CLICK, this, () => { + if (this.isClassic) { + this.onClickTab(false) + } + }) + this.onClickTab(this.isClassic) + + const showToggle = Laya.LocalStorage.getItem("showToggle") + if (!showToggle || showToggle.length <= 0) { + Laya.LocalStorage.setItem("showToggle", "true") + } + + for (let i = 0; i < this.obj_items.numChildren; i++) { + const obj = this.obj_items.getChildAt(i) + obj.on(Laya.Event.MOUSE_OVER, this, this.onOver) + obj.on(Laya.Event.MOUSE_OUT, this, this.onOut) + const value = config.DIFFICULTY_LIST[i] + const Sprite = obj.getChildByName("Sprite") as Laya.Sprite + this.item_sprites.set(value, Sprite) + const label = obj.getChildByName("Label") as Laya.Label + label.text = value + this.item_labels.set(value, label) + const common = obj.getComponent(CommonData) + common.strValue = value + obj.on(Laya.Event.CLICK, this, (evt: Laya.Event) => { + const common = evt.target.getComponent(CommonData) + const difficulty = Laya.LocalStorage.getItem("difficulty") + if (common.strValue !== difficulty) { + if (Laya.LocalStorage.getItem("showToggle") === "true") { + const title = "Start New Game" + const content = "Current game progress will be lost" + G_ShowCommonTips(title, content, true, (ok: boolean, toggleValue: boolean) => { + if (ok) { + if (toggleValue) { + Laya.LocalStorage.setItem("showToggle", "false") + } + this.onClickDifficulty(common.strValue) + } + }) + } else { + this.onClickDifficulty(common.strValue) + } + } + }) + } + this.updateDifficulty(difficulty) + } + + onClickTab(isClassic: boolean): void { + this.isClassic = isClassic + if (isClassic) { + UIManager.getInstance().closeTrophyUI() + UIManager.getInstance().closeDCUI() + UIManager.getInstance().loadStageUI(config.DEFAULT_STAGE_ID) + } else { + UIManager.getInstance().closeStageUI() + UIManager.getInstance().loadDCUI() + } + this.updateLeftTab() + } + + updateLeftTab(): void { + this.sprite_classic.alpha = this.isClassic ? 1 : 0.1 + this.label_classic.color = this.isClassic ? "#ffffff" : "#0e2a53" + this.sprite_dc.alpha = this.isClassic ? 0.1 : 1 + this.label_dc.color = this.isClassic ? "#0e2a53" : "#ffffff" + + this.obj_label.visible = this.isClassic + this.obj_items.visible = this.isClassic + } + + onClickDifficulty(difficulty: string): void { + Laya.LocalStorage.setItem("difficulty", difficulty)// 记录横屏模式用户选择的难度 + StorageManager.getInstance().newStage(config.DEFAULT_STAGE_ID, config.STAGE_TYPE.MAIN, difficulty, difficulty) + UIManager.getInstance().loadStageUI(config.DEFAULT_STAGE_ID) + + this.updateDifficulty(difficulty) + } + + updateDifficulty(difficulty: string): void { + this.item_sprites.forEach((sprite: Laya.Sprite) => { + sprite.graphics.clear() + sprite.graphics.drawRoundRect(0, 0, sprite.width, sprite.height, 12, 12, 12, 12, "#f5f7fb") + sprite.alpha = 1 + }) + const sprite = this.item_sprites.get(difficulty) + sprite.graphics.clear() + sprite.graphics.drawRoundRect(0, 0, sprite.width, sprite.height, 12, 12, 12, 12, "#f5f7fb", "#1d5cdc", 3) + sprite.alpha = 1 + + this.item_labels.forEach((label: Laya.Label) => { + label.color = "#0e2a53" + }) + const label = this.item_labels.get(difficulty) + label.color = "#1d5cdc" + } + + onOver(evt: Laya.Event): void { + const difficulty = Laya.LocalStorage.getItem("difficulty") + const Box = evt.target as Laya.Box + const common = Box.getComponent(CommonData) + if (common.strValue !== difficulty) { + Laya.Render.canvas.style.cursor = "pointer" + const sprite = Box.getChildByName("Sprite") as Laya.Sprite + sprite.graphics.clear() + sprite.graphics.drawRoundRect(0, 0, sprite.width, sprite.height, 12, 12, 12, 12, "#0e2a53") + sprite.alpha = 0.1 + } + } + + onOut(evt: Laya.Event): void { + const difficulty = Laya.LocalStorage.getItem("difficulty") + const Box = evt.target as Laya.Box + const common = Box.getComponent(CommonData) + if (common.strValue !== difficulty) { + Laya.Render.canvas.style.cursor = "" + const sprite = Box.getChildByName("Sprite") as Laya.Sprite + sprite.graphics.clear() + sprite.graphics.drawRoundRect(0, 0, sprite.width, sprite.height, 12, 12, 12, 12, "#f5f7fb") + sprite.alpha = 0.1 + } + } +} diff --git a/shudu/src/views/TopBar.ts.meta b/shudu/src/views/TopBar.ts.meta new file mode 100644 index 0000000..20c154e --- /dev/null +++ b/shudu/src/views/TopBar.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "cadd567d-5099-49b9-a9b3-b7c404d5fe1b" +} \ No newline at end of file diff --git a/shudu/src/views/common/AutoDestroy.ts b/shudu/src/views/common/AutoDestroy.ts new file mode 100644 index 0000000..a1892f2 --- /dev/null +++ b/shudu/src/views/common/AutoDestroy.ts @@ -0,0 +1,19 @@ +const { regClass, property } = Laya + +@regClass() +export class AutoDestroy extends Laya.Script { + declare owner: Laya.Box + + @property(Number) + public lifeTime: number = 1 + + // 组件被激活后执行,此时所有节点和组件均已创建完毕,此方法只执行一次 + onStart(): void { + if (this.lifeTime < 1) { + this.lifeTime = 1 + } + Laya.timer.once(this.lifeTime * 1000, this, () => { + this.owner.destroy() + }) + } +} diff --git a/shudu/src/views/common/AutoDestroy.ts.meta b/shudu/src/views/common/AutoDestroy.ts.meta new file mode 100644 index 0000000..2cc73cf --- /dev/null +++ b/shudu/src/views/common/AutoDestroy.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "bdb0e671-99fa-47a5-9101-7ec008b1d25d" +} \ No newline at end of file diff --git a/shudu/src/views/common/AutoRotate.ts b/shudu/src/views/common/AutoRotate.ts new file mode 100644 index 0000000..4b3219a --- /dev/null +++ b/shudu/src/views/common/AutoRotate.ts @@ -0,0 +1,19 @@ +const { regClass, property } = Laya + +@regClass() +export class AutoRotate extends Laya.Script { + declare owner: Laya.Image + + @property(Number) + public speed: number = 0.2 + + private begin = 0 + + onLateUpdate(): void { + this.begin += this.speed + if (this.begin >= 360) { + this.begin = 0 + } + this.owner.rotation = this.begin + } +} diff --git a/shudu/src/views/common/AutoRotate.ts.meta b/shudu/src/views/common/AutoRotate.ts.meta new file mode 100644 index 0000000..ee0b5dd --- /dev/null +++ b/shudu/src/views/common/AutoRotate.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "b4f67ca3-86fe-409d-a439-63a715243fb7" +} \ No newline at end of file diff --git a/shudu/src/views/common/CommonData.ts b/shudu/src/views/common/CommonData.ts new file mode 100644 index 0000000..3c61221 --- /dev/null +++ b/shudu/src/views/common/CommonData.ts @@ -0,0 +1,12 @@ +const { regClass, property } = Laya + +@regClass() +export class CommonData extends Laya.Script { + declare owner: Laya.Box + + @property(Number) + public intValue: number = 0 + + @property(String) + public strValue: string = "" +} diff --git a/shudu/src/views/common/CommonData.ts.meta b/shudu/src/views/common/CommonData.ts.meta new file mode 100644 index 0000000..bce328e --- /dev/null +++ b/shudu/src/views/common/CommonData.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "8857686b-9b2c-4e9c-af0f-0164c0994e46" +} \ No newline at end of file diff --git a/shudu/src/views/common/CommonHover.ts b/shudu/src/views/common/CommonHover.ts new file mode 100644 index 0000000..cb05ee9 --- /dev/null +++ b/shudu/src/views/common/CommonHover.ts @@ -0,0 +1,24 @@ +const { regClass, property } = Laya + +@regClass() +export class CommonHover extends Laya.Script { + declare owner: Laya.Box + + @property(Boolean) + public hoverAlpha: boolean = true + + onAwake(): void { + this.owner.on(Laya.Event.MOUSE_OVER, this, () => { + Laya.Render.canvas.style.cursor = "pointer" + if (this.hoverAlpha) { + this.owner.alpha = 0.8 + } + }) + this.owner.on(Laya.Event.MOUSE_OUT, this, () => { + Laya.Render.canvas.style.cursor = "" + if (this.hoverAlpha) { + this.owner.alpha = 1 + } + }) + } +} diff --git a/shudu/src/views/common/CommonHover.ts.meta b/shudu/src/views/common/CommonHover.ts.meta new file mode 100644 index 0000000..c84824d --- /dev/null +++ b/shudu/src/views/common/CommonHover.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "a541bdfc-e8e1-4795-b68e-7138c5190f17" +} \ No newline at end of file diff --git a/shudu/src/views/common/GUITips.ts b/shudu/src/views/common/GUITips.ts new file mode 100644 index 0000000..ad64e49 --- /dev/null +++ b/shudu/src/views/common/GUITips.ts @@ -0,0 +1,11 @@ +import { respath } from "../../constants/respath" +import { ResourceManager } from "../../models/ResourceManager" +import { ScoreAdd } from "../ScoreAdd" + +export function G_ShowScoreTips(text: string, parent: any): void { + ResourceManager.getInstance().loadPrefab(respath.score_add_ui_res(), (go: any) => { + const prefab = go.create() + const score = parent.addChild(prefab).getComponent(ScoreAdd) + score.onSetText(text) + }) +} diff --git a/shudu/src/views/common/GUITips.ts.meta b/shudu/src/views/common/GUITips.ts.meta new file mode 100644 index 0000000..b7081d2 --- /dev/null +++ b/shudu/src/views/common/GUITips.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "0a00337c-1c20-470f-930f-2b47f0294e23" +} \ No newline at end of file diff --git a/shudu/src/views/common/UISequenceAnimation.ts b/shudu/src/views/common/UISequenceAnimation.ts new file mode 100644 index 0000000..b512b7b --- /dev/null +++ b/shudu/src/views/common/UISequenceAnimation.ts @@ -0,0 +1,65 @@ +const { regClass, property } = Laya + +@regClass() +export class UISequenceAnimation extends Laya.Script { + declare owner: Laya.Image + + @property(String) + public prefix: string + + @property(Number) + public beginIndex: number = 0 + + @property(Number) + public endIndex: number + + @property(Boolean) + public playOnAwake: boolean = true + + @property(Boolean) + public loop: boolean = false + + private running: boolean = false + private currentIndex: number = 0 + + onAwake(): void { + if (this.playOnAwake) { + this.running = true + } else { + this.running = false + } + this.currentIndex = this.beginIndex + } + + onLateUpdate(): void { + if (this.running) { + if (this.currentIndex > this.endIndex) { + this.currentIndex = this.beginIndex + if (this.loop === false) { + this.running = false + this.owner.visible = false + } + } + let endStr = this.currentIndex.toString() + if (this.currentIndex < 10) { + endStr = `00${this.currentIndex}` + } else if (this.currentIndex < 100) { + endStr = `0${this.currentIndex}` + } + const path = `${this.prefix + endStr}.png` + // ResourceManager.getInstance().loadTexture(path, this.image) + const obj = Laya.Loader.getRes(path) + if (obj) { + this.owner.texture = obj + } else { + this.owner.skin = path + } + + this.currentIndex++ + } + } + + onSetRunning(running: boolean): void { + this.running = running + } +} diff --git a/shudu/src/views/common/UISequenceAnimation.ts.meta b/shudu/src/views/common/UISequenceAnimation.ts.meta new file mode 100644 index 0000000..c2f63e8 --- /dev/null +++ b/shudu/src/views/common/UISequenceAnimation.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "ca60d5cb-d801-434b-9e6a-7b0c738cb0e9" +} \ No newline at end of file diff --git a/shudu/src/views/dc/CalendarUnit.ts b/shudu/src/views/dc/CalendarUnit.ts new file mode 100644 index 0000000..567ef27 --- /dev/null +++ b/shudu/src/views/dc/CalendarUnit.ts @@ -0,0 +1,123 @@ +const { regClass, property } = Laya + +@regClass() +export class CalendarUnit extends Laya.Script { + declare owner: Laya.Box + + @property(Number) + public year: number = 0 + + @property(Number) + public month: number = 0 + + @property(Number) + public day: number = 0 + + @property(Boolean) + public open: boolean = false + + @property(Number) + public progress: number = 0 + + private selected: boolean = false + + @property(Laya.Image) + public obj_selected: Laya.Image + + @property(Laya.Box) + public obj_pie: Laya.Box + + @property(Laya.Sprite) + public sprite_pie: Laya.Sprite + + private pieSize: number + + @property(Laya.Sprite) + public obj_mask: Laya.Sprite + + @property(Laya.Sprite) + public sprite_mask: Laya.Sprite + + @property(Laya.Image) + public obj_star: Laya.Image + + @property(Laya.Label) + public label_show: Laya.Label + + // 组件被激活后执行,此时所有节点和组件均已创建完毕,此方法只执行一次 + onAwake(): void { + this.pieSize = this.sprite_pie.width / 2 + } + + public setCalendarUnit(year: number, month: number, day: number, open: boolean, progress: number, handler: any, func: any): void { + this.selected = false + this.year = year + this.month = month + this.day = day + this.open = open + this.progress = progress + if (open) { + if (progress >= 1) { + this.label_show.text = "" + } else { + this.label_show.text = this.day.toString() + } + this.label_show.color = "#2d3138" + this.owner.on(Laya.Event.CLICK, handler, func) + this.updateUnit() + } else { + this.label_show.text = this.day.toString() + this.label_show.color = "#d3d5db" + this.owner.on(Laya.Event.CLICK, this, () => { + + }) + this.obj_selected.visible = false + this.obj_pie.visible = false + this.obj_mask.visible = false + this.obj_star.visible = false + } + } + + public setSelected(selected: boolean): void { + this.selected = selected + this.updateUnit() + } + + updateUnit(): void { + if (this.open === false) { + return + } + + this.obj_star.visible = this.progress >= 1 + + if (this.selected) { + this.label_show.color = "#ffffff" + this.obj_selected.visible = true + if (this.progress > 0) { + this.obj_pie.visible = true + this.obj_mask.visible = true + this.sprite_pie.graphics.clear() + this.sprite_pie.graphics.drawPie(this.pieSize, this.pieSize, this.pieSize, 0, 360 * this.progress, "#ffffff") + this.sprite_mask.graphics.clear() + this.sprite_mask.graphics.drawCircle(this.obj_mask.width / 2, this.obj_mask.width / 2, this.obj_mask.width / 2, "#1d5cdc") + } else { + this.obj_pie.visible = false + this.obj_mask.visible = false + } + } else { + this.label_show.color = "#2d3138" + this.obj_selected.visible = false + if (this.progress > 0 && this.progress < 1) { + this.obj_pie.visible = true + this.obj_mask.visible = true + this.sprite_pie.graphics.clear() + this.sprite_pie.graphics.drawPie(this.pieSize, this.pieSize, this.pieSize, 0, 360 * this.progress, "#2d3138") + this.sprite_mask.graphics.clear() + this.sprite_mask.graphics.drawCircle(this.obj_mask.width / 2, this.obj_mask.width / 2, this.obj_mask.width / 2, "#ffffff") + } else { + this.obj_pie.visible = false + this.obj_mask.visible = false + } + } + } +} diff --git a/shudu/src/views/dc/CalendarUnit.ts.meta b/shudu/src/views/dc/CalendarUnit.ts.meta new file mode 100644 index 0000000..17743f4 --- /dev/null +++ b/shudu/src/views/dc/CalendarUnit.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "04c54914-715e-4e07-8a45-770f2a2c05a6" +} \ No newline at end of file diff --git a/shudu/src/views/dc/DailyChallenge.ts b/shudu/src/views/dc/DailyChallenge.ts new file mode 100644 index 0000000..11ea3ef --- /dev/null +++ b/shudu/src/views/dc/DailyChallenge.ts @@ -0,0 +1,318 @@ +import { config } from "../../constants/config" +import { respath } from "../../constants/respath" +import { MONTH_LIST } from "../../models/DCManager" +import { EVENT_TYPES, EventManager } from "../../models/EventManager" +import { ResourceManager } from "../../models/ResourceManager" +import { StorageManager } from "../../models/StorageManager" +import { UIManager } from "../../models/UIManager" +import { Utility_ConvertSecondToString } from "../../utils/utility" +import { CalendarUnit } from "./CalendarUnit" + +const { regClass, property } = Laya +@regClass() +export class DailyChallenge extends Laya.Script { + declare owner: Laya.Box + + @property(Laya.Sprite) + public sprite_bottom: Laya.Sprite + + @property(Laya.Button) + public btn_back: Laya.Button + + @property(Laya.Image) + public btn_trophy: Laya.Image + + @property(Laya.Sprite) + public btn_trophy_red: Laya.Sprite + + @property(Laya.Image) + public trophy_light: Laya.Image + + @property(Laya.Image) + public trophy_icon: Laya.Image + + @property(Laya.Box) + public btn_left: Laya.Box + + @property(Laya.Box) + public btn_right: Laya.Box + + @property(Laya.Box) + public btn_left2: Laya.Box + + @property(Laya.Box) + public btn_right2: Laya.Box + + @property(Laya.Image) + public bg_dc: Laya.Image + + @property(Laya.Label) + public label_year: Laya.Label + + @property(Laya.Label) + public label_month: Laya.Label + + @property(Laya.Label) + public label_star: Laya.Label + + @property(Laya.Box) + public btn_play: Laya.Box + + @property(Laya.Label) + public label_play: Laya.Label + + @property(Laya.Box) + public obj_summary: Laya.Box + + @property(Laya.Label) + public label_date: Laya.Label + + @property(Laya.Label) + public label_diffucuty: Laya.Label + + @property(Laya.Label) + public label_score: Laya.Label + + @property(Laya.Label) + public label_time: Laya.Label + + @property(Laya.Box) + public obj_items: Laya.Box + + private units: Array = [] + + private selectedUnit: CalendarUnit + private currentIndex: number + private indexMax: number + + private static _instance: DailyChallenge + onAwake(): void { + DailyChallenge._instance = this + + if (!config.H_SCREEN) { + const parent = this.sprite_bottom.parent as Laya.Box + this.sprite_bottom.graphics.clear() + this.sprite_bottom.graphics.drawRoundRect(0, 0, parent.width, parent.height, 72, 72, 0, 0, "#ffffff") + } + + if (this.btn_back) { + this.btn_back.on(Laya.Event.CLICK, this, () => { + UIManager.getInstance().loadHomeUI() + UIManager.getInstance().closeDCUI() + }) + } + + const user = StorageManager.getInstance().getUser() + this.btn_trophy_red.visible = user.get_trophyHasUnread() + this.btn_trophy.on(Laya.Event.CLICK, this, () => { + user.set_trophyAllread() + this.btn_trophy_red.visible = false + UIManager.getInstance().loadTrophyUI() + }) + + this.btn_play.on(Laya.Event.CLICK, this, () => { + const year = this.selectedUnit.year + const month = this.selectedUnit.month + const dayNow = this.selectedUnit.day + const stageID = `${year}-${month}-${dayNow}` + const doStage = StorageManager.getInstance().getStage(stageID) + console.log("play >>>>>>>>>>>>>>>>>>>>>>>", stageID, doStage) + if (!doStage || doStage.get_mistake() >= config.MISTAKE_MAX) { + const stageName = `${config.MONTH_ABBRS[month - 1]} ${dayNow}` + StorageManager.getInstance().newStage(stageID, config.STAGE_TYPE.DC, stageName) + } + UIManager.getInstance().loadStageUI(stageID) + this.owner.destroy() + }) + + for (let i = 0; i < this.obj_items.numChildren; i++) { + const hbox = this.obj_items.getChildAt(i) + for (let j = 0; j < hbox.numChildren; j++) { + const unit = hbox.getChildAt(j).getComponent(CalendarUnit) + this.units.push(unit) + } + } + + this.indexMax = MONTH_LIST.length - 1 + const now = new Date() + const nowYear = now.getFullYear() + const nowMonth = now.getMonth() + 1 + for (let i = 0; i < MONTH_LIST.length; i++) { + const obj = MONTH_LIST[i] + if (nowYear === obj.year && nowMonth === obj.month) { + this.indexMax = i + break + } + } + + this.btn_left.on(Laya.Event.CLICK, this, this.onClickLeft) + this.btn_right.on(Laya.Event.CLICK, this, this.onClickRight) + this.btn_left2.on(Laya.Event.CLICK, this, this.onClickLeft) + this.btn_right2.on(Laya.Event.CLICK, this, this.onClickRight) + + EventManager.getInstance().RegisterEvent(EVENT_TYPES.NOT_SET_TROPHY_BUTTON, DailyChallenge.EventUpdateTrophyButton) + } + + onDestroy(): void { + EventManager.getInstance().UnregisterEvent(EVENT_TYPES.NOT_SET_TROPHY_BUTTON, DailyChallenge.EventUpdateTrophyButton) + } + + public static EventUpdateTrophyButton(arg: any): void { + if (DailyChallenge._instance) { + DailyChallenge._instance.owner.visible = arg + } + } + + loadWithMonth(nowYear: number, nowMonth: number): void { + this.currentIndex = 0 + for (let i = 0; i < MONTH_LIST.length; i++) { + const obj = MONTH_LIST[i] + if (nowYear === obj.year && nowMonth === obj.month) { + this.currentIndex = i + break + } + } + this.loadWithIndex(this.currentIndex) + } + + public loadWithIndex(index: number): void { + this.btn_left.visible = this.currentIndex > 0 + this.btn_right.visible = this.currentIndex < this.indexMax + this.btn_left2.visible = this.currentIndex > 0 + this.btn_right2.visible = this.currentIndex < this.indexMax + const info = MONTH_LIST[index] + UIManager.getInstance().setCurrentDCMonth(info.year, info.month) + console.log("DailyChallenge loadWithIndex >>>>>>>>>>>>>>>", info.year, info.month) + const user = StorageManager.getInstance().getUser() + const now = new Date() + const nowYear = now.getFullYear() + const nowMonth = now.getMonth() + 1 + const nowDay = new Date().getDate() + + ResourceManager.getInstance().loadTexture(info.icon_res, this.trophy_icon) + // 设置背景 + if (user.get_trophyRecord(info.year, info.month)) { + ResourceManager.getInstance().loadTexture(respath.dc_top_bg_finish, this.bg_dc) + this.trophy_icon.gray = false + } else { + ResourceManager.getInstance().loadTexture(respath.dc_top_bg_normal, this.bg_dc) + this.trophy_icon.gray = true + } + const starCount = user.get_doneCountByDate(info.year, info.month) + this.label_year.text = info.year.toString() + this.label_month.text = config.MONTH_FULLNAMES[info.month - 1] + this.label_star.text = `${starCount}/${info.dayCount}` + + let todayUnit = null + let lastUnfinishUnit = null + let day = 1 + for (let i = 0; i < this.units.length; i++) { + const unit = this.units[i] + if (i >= info.begin && i < info.begin + info.dayCount) { + unit.owner.visible = true + unit.label_show.visible = true + let open = true + if (info.year > nowYear) { + open = false + } else if (info.year === nowYear) { + if (info.month > nowMonth) { + open = false + } else if (info.month === nowMonth) { + if (day > nowDay) { + open = false + } + } + } + const stageID = `${info.year}-${info.month}-${day}` + let progress = user.get_done(stageID) + if (open && progress < 1) { // 检查失败的关卡,如果失败了就重置 + const doStage = StorageManager.getInstance().getStage(stageID) + if (doStage) { // 有关卡数据 + if (doStage.get_mistake() >= config.MISTAKE_MAX) { + progress = 0 + user.update_stage_done(stageID, 0) + StorageManager.getInstance().cleanStage(stageID) + } + } + if (info.year === nowYear && info.month === nowMonth && day === nowDay) { + todayUnit = unit + } + lastUnfinishUnit = unit + } + unit.setCalendarUnit(info.year, info.month, day, open, progress, this, this.onClickUnit) + day++ + } else { + unit.owner.visible = false + unit.label_show.visible = false + } + } + if (todayUnit) { + this.selectedUnit = todayUnit + } else { + this.selectedUnit = lastUnfinishUnit + } + if (!this.selectedUnit) { + this.selectedUnit = this.units[info.begin + info.dayCount - 1] + } + this.onApplyUnit(this.selectedUnit) + } + + public onApplyUnit(unit: CalendarUnit): void { + this.selectedUnit.setSelected(false) + this.selectedUnit = unit + this.selectedUnit.setSelected(true) + + const stageID = `${unit.year}-${unit.month}-${unit.day}` + this.label_date.text = `${config.MONTH_ABBRS[unit.month - 1]} ${unit.day}, ${unit.year}` + const user = StorageManager.getInstance().getUser() + const progress = user.get_done(stageID) + // console.log("onApplyUnit >>>>>", stageID, progress) + if (progress >= 1) { + this.btn_play.visible = false + this.obj_summary.visible = true + const doStage = StorageManager.getInstance().getStage(stageID) + this.label_diffucuty.text = doStage.get_difficulty() + this.label_score.text = doStage.get_score().toString() + this.label_time.text = Utility_ConvertSecondToString(doStage.get_duration()) + } else { + this.btn_play.visible = true + this.obj_summary.visible = false + const doStage = StorageManager.getInstance().getStage(stageID) + if (doStage) { + this.label_play.text = "Continue" + } else { + this.label_play.text = "Play" + } + } + } + + public onClickUnit(evt: Laya.Event): void { + const unit = evt.target.getComponent(CalendarUnit) + if (unit.open) { + this.onApplyUnit(unit) + } + } + + onClickLeft(): void { + if (this.currentIndex > 0) { + this.currentIndex-- + this.loadWithIndex(this.currentIndex) + } + } + + onClickRight(): void { + if (this.currentIndex < this.indexMax) { + this.currentIndex++ + this.loadWithIndex(this.currentIndex) + } + } + + onStart(): void { + const user = StorageManager.getInstance().getUser() + const find = user.get_trophyHasNew() + if (find) { + UIManager.getInstance().loadTrophyClaimUI(find) + user.set_trophyNew(find, false) + } + } +} diff --git a/shudu/src/views/dc/DailyChallenge.ts.meta b/shudu/src/views/dc/DailyChallenge.ts.meta new file mode 100644 index 0000000..3990465 --- /dev/null +++ b/shudu/src/views/dc/DailyChallenge.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "3f68d98d-3867-41a7-b277-a24d279a22fa" +} \ No newline at end of file diff --git a/shudu/src/views/dc/TrophyClaim.ts b/shudu/src/views/dc/TrophyClaim.ts new file mode 100644 index 0000000..c5563b7 --- /dev/null +++ b/shudu/src/views/dc/TrophyClaim.ts @@ -0,0 +1,72 @@ +import type { TrophyRecord } from "../../types/global" +import { config } from "../../constants/config" +import { MONTH_LIST } from "../../models/DCManager" +import { ResourceManager } from "../../models/ResourceManager" +import { Utility_EaseOut_2 } from "../../utils/utility" +import { UISequenceAnimation } from "../common/UISequenceAnimation" + +const { regClass, property } = Laya + +@regClass() +export class TrophyClaim extends Laya.Script { + declare owner: Laya.Box + + @property(Laya.Image) + public icon: Laya.Image + + @property(Laya.Label) + public label_date: Laya.Label + + @property(Laya.Box) + public btn_close: Laya.Box + + private mask: Laya.Image + private center: Laya.Box + + onAwake(): void { + this.mask = this.owner.getChildByName("Image") as Laya.Image + this.mask.alpha = 0 + Laya.Tween.to(this.mask, { alpha: 0.8 }, 600) + + this.center = this.owner.getChildByName("center") as Laya.Box + + const light = this.center.getChildByName("light") as Laya.Image + light.scaleX = 0 + light.scaleY = 0 + Laya.Tween.to(light, { scaleX: 1, scaleY: 1 }, 200, Utility_EaseOut_2, null, 200) + + const trophy = this.center.getChildByName("trophy") as Laya.Image + trophy.scaleX = 0 + trophy.scaleY = 0 + Laya.Tween.to(trophy, { scaleX: 1, scaleY: 1 }, 200, Utility_EaseOut_2, null, 200) + + const blossom = trophy.getChildByName("blossom").getComponent(UISequenceAnimation) + Laya.timer.once(400, this, () => { + blossom.onSetRunning(true) + }) + + const label_titlle = this.center.getChildByName("label_titlle") as Laya.Label + label_titlle.alpha = 0 + Laya.Tween.to(label_titlle, { alpha: 1 }, 600, Laya.Ease.linearNone, null, 600) + + const btn_close = this.center.getChildByName("btn_close") as Laya.Box + btn_close.alpha = 0 + Laya.Tween.to(btn_close, { alpha: 1 }, 600, Laya.Ease.linearNone, null, 800) + } + + public onSetShow(record: TrophyRecord): void { + for (let i = 0; i < MONTH_LIST.length; i++) { + const obj = MONTH_LIST[i] + if (obj.year === record.year && obj.month === record.month) { + ResourceManager.getInstance().loadTexture(obj.icon_res, this.icon) + break + } + } + + this.label_date.text = `${config.MONTH_ABBRS[record.month - 1]} ${record.day}, ${record.year}` + + this.btn_close.on(Laya.Event.CLICK, this, () => { + this.owner.destroy() + }) + } +} diff --git a/shudu/src/views/dc/TrophyClaim.ts.meta b/shudu/src/views/dc/TrophyClaim.ts.meta new file mode 100644 index 0000000..c1577f5 --- /dev/null +++ b/shudu/src/views/dc/TrophyClaim.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "0550b681-b602-49fe-900f-e30866ce922c" +} \ No newline at end of file diff --git a/shudu/src/views/dc/TrophyRoom.ts b/shudu/src/views/dc/TrophyRoom.ts new file mode 100644 index 0000000..e0033dd --- /dev/null +++ b/shudu/src/views/dc/TrophyRoom.ts @@ -0,0 +1,108 @@ +import { config } from "../../constants/config" +import { respath } from "../../constants/respath" +import { MONTH_LIST } from "../../models/DCManager" +import { EVENT_TYPES, EventManager } from "../../models/EventManager" +import { ResourceManager } from "../../models/ResourceManager" +import { UIManager } from "../../models/UIManager" +import { TrophyUnit } from "./TrophyUnit" + +const { regClass, property } = Laya + +@regClass() +export class TrophyRoom extends Laya.Script { + declare owner: Laya.Box + + @property(Laya.Box) + public btn_back: Laya.Box + + @property(Laya.Box) + public obj_items: Laya.Box + + // 第一次执行update之前执行,只会执行一次 + onStart(): void { + let trophyCountOfCell = 3 + if (config.H_SCREEN) + trophyCountOfCell = 5 + + this.btn_back.on(Laya.Event.CLICK, this, () => { + UIManager.getInstance().closeTrophyUI() + }) + + const infos: Array = [] + const now = new Date() + const nowYear = now.getFullYear() + const nowMonth = now.getMonth() + 1 + for (let i = 0; i < MONTH_LIST.length; i++) { + const obj = MONTH_LIST[i] + infos.push(obj) + if (obj.year === nowYear && obj.month === nowMonth) { + break + } + } + infos.reverse() + + const years: Array = [] + const monthMap: Map> = new Map() + for (let i = 0; i < infos.length; i++) { + const obj = infos[i] + const find = years.indexOf(obj.year) + if (find < 0) { + years.push(obj.year) + } + if (monthMap.has(obj.year) === false) { + monthMap.set(obj.year, []) + } + const list = monthMap.get(obj.year) + list.push(obj) + } + console.log(">>>>>>>>>>>>years=", years) + ResourceManager.getInstance().loadPrefab(respath.trophy_year_ui_res(), (go: any) => { + for (let i = 1; i < years.length; i++) { + const prefab = go.create() + this.obj_items.addChild(prefab) + } + + ResourceManager.getInstance().loadPrefab(respath.trophy_cell_ui_res(), (go: any) => { + let itemsHeight = 0 + for (let i = 0; i < years.length; i++) { + const list = monthMap.get(years[i]) + const cellCount = Math.ceil(list.length / trophyCountOfCell) + const yearHeight = 120 + cellCount * 444 + itemsHeight += yearHeight + + const obj_year = this.obj_items.getChildAt(i) as Laya.Box + obj_year.height = yearHeight + const label = obj_year.getChildByName("year").getChildByName("Label") as Laya.Label + label.text = years[i].toString() + + for (let j = 2; j < cellCount + 1; j++) { + const prefab = go.create() + obj_year.addChild(prefab) + } + let index = -1 + for (let j = 1; j < cellCount + 1; j++) { + const obj_cell = obj_year.getChildAt(j) + const hbox = obj_cell.getChildByName("HBox") + for (let k = 0; k < hbox.numChildren; k++) { + const unit = hbox.getChildAt(k).getComponent(TrophyUnit) + index++ + if (index < list.length) { + unit.owner.visible = true + unit.onInit(list[index]) + } else { + unit.owner.visible = false + } + } + } + } + this.obj_items.height = itemsHeight + }) + }) + + EventManager.getInstance().DispatchEvent(EVENT_TYPES.NOT_SET_TROPHY_BUTTON, false) + } + + onDestroy(): void { + EventManager.getInstance().DispatchEvent(EVENT_TYPES.NOT_SET_TROPHY_BUTTON, true) + } +} diff --git a/shudu/src/views/dc/TrophyRoom.ts.meta b/shudu/src/views/dc/TrophyRoom.ts.meta new file mode 100644 index 0000000..e4ea7c9 --- /dev/null +++ b/shudu/src/views/dc/TrophyRoom.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "554595b0-0dd8-4e4b-8073-8d775219659c" +} \ No newline at end of file diff --git a/shudu/src/views/dc/TrophyShow.ts b/shudu/src/views/dc/TrophyShow.ts new file mode 100644 index 0000000..4e14ac1 --- /dev/null +++ b/shudu/src/views/dc/TrophyShow.ts @@ -0,0 +1,36 @@ +import type { TrophyRecord } from "../../types/global" +import { config } from "../../constants/config" +import { MONTH_LIST } from "../../models/DCManager" +import { ResourceManager } from "../../models/ResourceManager" + +const { regClass, property } = Laya + +@regClass() +export class TrophyShow extends Laya.Script { + declare owner: Laya.Box + + @property(Laya.Image) + public icon: Laya.Image + + @property(Laya.Label) + public label_date: Laya.Label + + @property(Laya.Box) + public btn_close: Laya.Box + + public onSetShow(record: TrophyRecord): void { + for (let i = 0; i < MONTH_LIST.length; i++) { + const obj = MONTH_LIST[i] + if (obj.year === record.year && obj.month === record.month) { + ResourceManager.getInstance().loadTexture(obj.icon_res, this.icon) + break + } + } + + this.label_date.text = `${config.MONTH_ABBRS[record.month - 1]} ${record.day}, ${record.year}` + + this.btn_close.on(Laya.Event.CLICK, this, () => { + this.owner.destroy() + }) + } +} diff --git a/shudu/src/views/dc/TrophyShow.ts.meta b/shudu/src/views/dc/TrophyShow.ts.meta new file mode 100644 index 0000000..9dacf6a --- /dev/null +++ b/shudu/src/views/dc/TrophyShow.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "42f2370b-c65c-4119-8725-6d4520582431" +} \ No newline at end of file diff --git a/shudu/src/views/dc/TrophyUnit.ts b/shudu/src/views/dc/TrophyUnit.ts new file mode 100644 index 0000000..ce21eb8 --- /dev/null +++ b/shudu/src/views/dc/TrophyUnit.ts @@ -0,0 +1,50 @@ +import { config } from "../../constants/config" +import { respath } from "../../constants/respath" +import { ResourceManager } from "../../models/ResourceManager" +import { StorageManager } from "../../models/StorageManager" +import { UIManager } from "../../models/UIManager" + +const { regClass, property } = Laya + +@regClass() +export class TrophyUnit extends Laya.Script { + declare owner: Laya.Box + + @property(Laya.Image) + public bg_light: Laya.Image + + @property(Laya.Image) + public icon: Laya.Image + + @property(Laya.Label) + public label_count: Laya.Label + + @property(Laya.Label) + public label_month: Laya.Label + + public onInit(info: any): void { + const user = StorageManager.getInstance().getUser() + const starCount = user.get_doneCountByDate(info.year, info.month) + ResourceManager.getInstance().loadTexture(info.icon_res, this.icon) + this.label_count.text = `${starCount}/${info.dayCount}` + this.label_month.text = config.MONTH_ABBRS[info.month - 1] + if (user.get_trophyRecord(info.year, info.month)) { + ResourceManager.getInstance().loadTexture(respath.trophy_bg_light_gold, this.bg_light) + this.icon.gray = false + this.label_month.color = "#2d3138" + } else { + ResourceManager.getInstance().loadTexture(respath.trophy_bg_light_grey, this.bg_light) + this.icon.gray = true + this.label_month.color = "#a7abb3" + } + + this.icon.on(Laya.Event.CLICK, this, () => { + const find = user.get_trophyRecord(info.year, info.month) + if (find) { + UIManager.getInstance().loadTrophyShowUI(find) + } else { + UIManager.getInstance().loadDCWtihMonth(info.year, info.month) + } + }) + } +} diff --git a/shudu/src/views/dc/TrophyUnit.ts.meta b/shudu/src/views/dc/TrophyUnit.ts.meta new file mode 100644 index 0000000..0a57172 --- /dev/null +++ b/shudu/src/views/dc/TrophyUnit.ts.meta @@ -0,0 +1,3 @@ +{ + "uuid": "79064920-30a6-4b11-a82e-bbdd4112c4e1" +} \ No newline at end of file diff --git a/shudu/tsconfig.json b/shudu/tsconfig.json new file mode 100644 index 0000000..0def4ab --- /dev/null +++ b/shudu/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "es6", + "experimentalDecorators": true, + "module": "es6", + "moduleResolution": "node", + "paths": { + "~/packages/*": [ + "./library/packages/*" + ] + }, + "strict": true, + "strictNullChecks": false, + "noEmitHelpers": true, + "sourceMap": false, + "allowSyntheticDefaultImports": true, + "skipLibCheck": true + }, + "include": [ + "./assets", + "./src", + "./engine" + ] +} diff --git a/test.js b/test.js index 16a62bc..f688910 100644 --- a/test.js +++ b/test.js @@ -1 +1 @@ -var a = 1; \ No newline at end of file +var a = 1;