first commit

This commit is contained in:
zzc
1970-01-01 08:27:52 +08:00
commit 3c80593c3d
135 changed files with 19822 additions and 0 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

View File

@@ -0,0 +1,2 @@
[InternetShortcut]
URL=https://docs.cocos.com/creator/manual/en/scripting/setup.html#custom-script-template

View File

@@ -0,0 +1,5 @@
{
"image": {
"type": "sprite-frame"
}
}

24
.gitignore vendored Normal file
View File

@@ -0,0 +1,24 @@
#///////////////////////////
# Cocos Creator 3D Project
#///////////////////////////
library/
temp/
local/
build/
profiles/
native
#//////////////////////////
# NPM
#//////////////////////////
node_modules/
#//////////////////////////
# VSCode
#//////////////////////////
.vscode/
#//////////////////////////
# WebStorm
#//////////////////////////
.idea/

BIN
assets/.DS_Store vendored Normal file

Binary file not shown.

9
assets/Music.meta Normal file
View File

@@ -0,0 +1,9 @@
{
"ver": "1.2.0",
"importer": "directory",
"imported": true,
"uuid": "89841261-db10-4d0a-bb77-d90710c093ee",
"files": [],
"subMetas": {},
"userData": {}
}

BIN
assets/Music/.DS_Store vendored Normal file

Binary file not shown.

BIN
assets/Music/clear.mp3 Normal file

Binary file not shown.

View File

@@ -0,0 +1,14 @@
{
"ver": "1.0.0",
"importer": "audio-clip",
"imported": true,
"uuid": "226321ef-18ba-4971-8c1e-390621bd586a",
"files": [
".json",
".mp3"
],
"subMetas": {},
"userData": {
"downloadMode": 0
}
}

Binary file not shown.

View File

@@ -0,0 +1,14 @@
{
"ver": "1.0.0",
"importer": "audio-clip",
"imported": true,
"uuid": "c70553ee-1056-4775-9ff9-c237a713654f",
"files": [
".json",
".mp3"
],
"subMetas": {},
"userData": {
"downloadMode": 0
}
}

BIN
assets/Music/hint.mp3 Normal file

Binary file not shown.

View File

@@ -0,0 +1,14 @@
{
"ver": "1.0.0",
"importer": "audio-clip",
"imported": true,
"uuid": "506f2137-ea3a-496d-b351-278cd50ffd56",
"files": [
".json",
".mp3"
],
"subMetas": {},
"userData": {
"downloadMode": 0
}
}

BIN
assets/Music/magic.mp3 Normal file

Binary file not shown.

View File

@@ -0,0 +1,14 @@
{
"ver": "1.0.0",
"importer": "audio-clip",
"imported": true,
"uuid": "255c0043-ac64-4437-89f0-c0f645a26918",
"files": [
".json",
".mp3"
],
"subMetas": {},
"userData": {
"downloadMode": 0
}
}

BIN
assets/Music/play.mp3 Normal file

Binary file not shown.

View File

@@ -0,0 +1,14 @@
{
"ver": "1.0.0",
"importer": "audio-clip",
"imported": true,
"uuid": "1b3412d9-9df6-4e43-9b89-53f824efc759",
"files": [
".json",
".mp3"
],
"subMetas": {},
"userData": {
"downloadMode": 0
}
}

BIN
assets/Music/remove.mp3 Normal file

Binary file not shown.

View File

@@ -0,0 +1,14 @@
{
"ver": "1.0.0",
"importer": "audio-clip",
"imported": true,
"uuid": "a5363c1d-f32a-400a-ba20-d69481533373",
"files": [
".json",
".mp3"
],
"subMetas": {},
"userData": {
"downloadMode": 0
}
}

BIN
assets/Music/shuffle.mp3 Normal file

Binary file not shown.

View File

@@ -0,0 +1,14 @@
{
"ver": "1.0.0",
"importer": "audio-clip",
"imported": true,
"uuid": "5d1b053d-a3aa-43e9-b794-cd5acbb9767f",
"files": [
".json",
".mp3"
],
"subMetas": {},
"userData": {
"downloadMode": 0
}
}

BIN
assets/Music/startAudio.mp3 Normal file

Binary file not shown.

View File

@@ -0,0 +1,14 @@
{
"ver": "1.0.0",
"importer": "audio-clip",
"imported": true,
"uuid": "0b1fe855-606c-411e-b287-72a9b2b78d59",
"files": [
".json",
".mp3"
],
"subMetas": {},
"userData": {
"downloadMode": 0
}
}

BIN
assets/Music/victory.mp3 Normal file

Binary file not shown.

View File

@@ -0,0 +1,14 @@
{
"ver": "1.0.0",
"importer": "audio-clip",
"imported": true,
"uuid": "79b91b1d-d514-4317-91ba-4dfceaee8ae7",
"files": [
".json",
".mp3"
],
"subMetas": {},
"userData": {
"downloadMode": 0
}
}

9
assets/prefabs.meta Normal file
View File

@@ -0,0 +1,9 @@
{
"ver": "1.2.0",
"importer": "directory",
"imported": true,
"uuid": "da9740f8-c097-47c9-b759-b2e91aa13d36",
"files": [],
"subMetas": {},
"userData": {}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,13 @@
{
"ver": "1.1.50",
"importer": "prefab",
"imported": true,
"uuid": "1bf00709-edb9-4753-a6bc-5d7908f24fbb",
"files": [
".json"
],
"subMetas": {},
"userData": {
"syncNodeName": "AudioSettingsPanel"
}
}

378
assets/prefabs/Block.prefab Normal file
View File

@@ -0,0 +1,378 @@
[
{
"__type__": "cc.Prefab",
"_name": "Block",
"_objFlags": 0,
"__editorExtras__": {},
"_native": "",
"data": {
"__id__": 1
},
"optimizationPolicy": 0,
"persistent": false
},
{
"__type__": "cc.Node",
"_name": "Block",
"_objFlags": 0,
"__editorExtras__": {},
"_parent": null,
"_children": [
{
"__id__": 2
},
{
"__id__": 8
}
],
"_active": true,
"_components": [
{
"__id__": 14
}
],
"_prefab": {
"__id__": 16
},
"_lpos": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
},
"_lrot": {
"__type__": "cc.Quat",
"x": 0,
"y": 0,
"z": 0,
"w": 1
},
"_lscale": {
"__type__": "cc.Vec3",
"x": 1,
"y": 1,
"z": 1
},
"_mobility": 0,
"_layer": 33554432,
"_euler": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
},
"_id": ""
},
{
"__type__": "cc.Node",
"_name": "Bg",
"_objFlags": 0,
"__editorExtras__": {},
"_parent": {
"__id__": 1
},
"_children": [],
"_active": true,
"_components": [
{
"__id__": 3
},
{
"__id__": 5
}
],
"_prefab": {
"__id__": 7
},
"_lpos": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
},
"_lrot": {
"__type__": "cc.Quat",
"x": 0,
"y": 0,
"z": 0,
"w": 1
},
"_lscale": {
"__type__": "cc.Vec3",
"x": 1,
"y": 1,
"z": 1
},
"_mobility": 0,
"_layer": 33554432,
"_euler": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
},
"_id": ""
},
{
"__type__": "cc.UITransform",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 2
},
"_enabled": true,
"__prefab": {
"__id__": 4
},
"_contentSize": {
"__type__": "cc.Size",
"width": 198,
"height": 198
},
"_anchorPoint": {
"__type__": "cc.Vec2",
"x": 0.5,
"y": 0.5
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "3dXbVEaRNKz5cPuNJ27SGV"
},
{
"__type__": "cc.Sprite",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 2
},
"_enabled": true,
"__prefab": {
"__id__": 6
},
"_customMaterial": null,
"_srcBlendFactor": 2,
"_dstBlendFactor": 4,
"_color": {
"__type__": "cc.Color",
"r": 255,
"g": 255,
"b": 255,
"a": 255
},
"_spriteFrame": {
"__uuid__": "38593591-e719-4f26-8a25-db4e021d8f3f@f9941",
"__expectedType__": "cc.SpriteFrame"
},
"_type": 0,
"_fillType": 0,
"_sizeMode": 1,
"_fillCenter": {
"__type__": "cc.Vec2",
"x": 0,
"y": 0
},
"_fillStart": 0,
"_fillRange": 0,
"_isTrimmedMode": true,
"_useGrayscale": false,
"_atlas": null,
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "03WyJryl9GuYgDjfoMO1rE"
},
{
"__type__": "cc.PrefabInfo",
"root": {
"__id__": 1
},
"asset": {
"__id__": 0
},
"fileId": "c3eihc62NPnr6RI8VMNmL8",
"instance": null,
"targetOverrides": null,
"nestedPrefabInstanceRoots": null
},
{
"__type__": "cc.Node",
"_name": "Icon",
"_objFlags": 0,
"__editorExtras__": {},
"_parent": {
"__id__": 1
},
"_children": [],
"_active": true,
"_components": [
{
"__id__": 9
},
{
"__id__": 11
}
],
"_prefab": {
"__id__": 13
},
"_lpos": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
},
"_lrot": {
"__type__": "cc.Quat",
"x": 0,
"y": 0,
"z": 0,
"w": 1
},
"_lscale": {
"__type__": "cc.Vec3",
"x": 1,
"y": 1,
"z": 1
},
"_mobility": 0,
"_layer": 33554432,
"_euler": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
},
"_id": ""
},
{
"__type__": "cc.UITransform",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 8
},
"_enabled": true,
"__prefab": {
"__id__": 10
},
"_contentSize": {
"__type__": "cc.Size",
"width": 40,
"height": 36
},
"_anchorPoint": {
"__type__": "cc.Vec2",
"x": 0.5,
"y": 0.5
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "22s2RxEIZFe7g7jMygTP8R"
},
{
"__type__": "cc.Sprite",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 8
},
"_enabled": true,
"__prefab": {
"__id__": 12
},
"_customMaterial": null,
"_srcBlendFactor": 2,
"_dstBlendFactor": 4,
"_color": {
"__type__": "cc.Color",
"r": 255,
"g": 255,
"b": 255,
"a": 255
},
"_spriteFrame": {
"__uuid__": "57520716-48c8-4a19-8acf-41c9f8777fb0@f9941",
"__expectedType__": "cc.SpriteFrame"
},
"_type": 0,
"_fillType": 0,
"_sizeMode": 1,
"_fillCenter": {
"__type__": "cc.Vec2",
"x": 0,
"y": 0
},
"_fillStart": 0,
"_fillRange": 0,
"_isTrimmedMode": true,
"_useGrayscale": false,
"_atlas": null,
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "7euT41/SFLgb1jfUY/Me8z"
},
{
"__type__": "cc.PrefabInfo",
"root": {
"__id__": 1
},
"asset": {
"__id__": 0
},
"fileId": "7bCF37+CtCSLrI7gObuY1D",
"instance": null,
"targetOverrides": null,
"nestedPrefabInstanceRoots": null
},
{
"__type__": "cc.UITransform",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 15
},
"_contentSize": {
"__type__": "cc.Size",
"width": 100,
"height": 100
},
"_anchorPoint": {
"__type__": "cc.Vec2",
"x": 0.5,
"y": 0.5
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "6aX/IOoYVDUKZ84bN0DaxR"
},
{
"__type__": "cc.PrefabInfo",
"root": {
"__id__": 1
},
"asset": {
"__id__": 0
},
"fileId": "88vcfQJ7xKIZ0ejqSCSdo8",
"instance": null,
"targetOverrides": null
}
]

View File

@@ -0,0 +1,13 @@
{
"ver": "1.1.50",
"importer": "prefab",
"imported": true,
"uuid": "9fa6687e-41ec-4a98-bc60-fbf24dc8a22b",
"files": [
".json"
],
"subMetas": {},
"userData": {
"syncNodeName": "Block"
}
}

14
assets/resources.meta Normal file
View File

@@ -0,0 +1,14 @@
{
"ver": "1.2.0",
"importer": "directory",
"imported": true,
"uuid": "1ed9b8a7-b57f-4e50-bdc6-8cfbc7f70ce5",
"files": [],
"subMetas": {},
"userData": {
"isBundle": true,
"bundleConfigID": "default",
"bundleName": "resources",
"priority": 8
}
}

View File

@@ -0,0 +1,9 @@
{
"ver": "1.2.0",
"importer": "directory",
"imported": true,
"uuid": "7b2ffd95-2192-41db-a474-b9cc90d5c933",
"files": [],
"subMetas": {},
"userData": {}
}

BIN
assets/resources/textures/.DS_Store vendored Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

View File

@@ -0,0 +1,134 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "a19c48c6-e2ce-473b-87a8-d1140251756c",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "a19c48c6-e2ce-473b-87a8-d1140251756c@6c48a",
"displayName": "1",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "a19c48c6-e2ce-473b-87a8-d1140251756c",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "a19c48c6-e2ce-473b-87a8-d1140251756c@f9941",
"displayName": "1",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 240,
"height": 286,
"rawWidth": 240,
"rawHeight": 286,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-120,
-143,
0,
120,
-143,
0,
-120,
143,
0,
120,
143,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
286,
240,
286,
0,
0,
240,
0
],
"nuv": [
0,
0,
1,
0,
0,
1,
1,
1
],
"minPos": [
-120,
-143,
0
],
"maxPos": [
120,
143,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "a19c48c6-e2ce-473b-87a8-d1140251756c@6c48a",
"atlasUuid": "",
"trimType": "auto"
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "a19c48c6-e2ce-473b-87a8-d1140251756c@6c48a"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

View File

@@ -0,0 +1,134 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "af528c64-b079-463b-88e0-7bfbba947bf2",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "af528c64-b079-463b-88e0-7bfbba947bf2@6c48a",
"displayName": "2",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "af528c64-b079-463b-88e0-7bfbba947bf2",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "af528c64-b079-463b-88e0-7bfbba947bf2@f9941",
"displayName": "2",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimThreshold": 1,
"rotated": false,
"offsetX": 3,
"offsetY": 0,
"trimX": 6,
"trimY": 0,
"width": 203,
"height": 307,
"rawWidth": 209,
"rawHeight": 307,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-101.5,
-153.5,
0,
101.5,
-153.5,
0,
-101.5,
153.5,
0,
101.5,
153.5,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
6,
307,
209,
307,
6,
0,
209,
0
],
"nuv": [
0.028708133971291867,
0,
1,
0,
0.028708133971291867,
1,
1,
1
],
"minPos": [
-101.5,
-153.5,
0
],
"maxPos": [
101.5,
153.5,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "af528c64-b079-463b-88e0-7bfbba947bf2@6c48a",
"atlasUuid": "",
"trimType": "auto"
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "af528c64-b079-463b-88e0-7bfbba947bf2@6c48a"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

View File

@@ -0,0 +1,134 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "5b4d5825-6c8e-44e5-a71d-2d087c8993ca",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "5b4d5825-6c8e-44e5-a71d-2d087c8993ca@6c48a",
"displayName": "3",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "5b4d5825-6c8e-44e5-a71d-2d087c8993ca",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "5b4d5825-6c8e-44e5-a71d-2d087c8993ca@f9941",
"displayName": "3",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimThreshold": 1,
"rotated": false,
"offsetX": 1,
"offsetY": 0,
"trimX": 2,
"trimY": 0,
"width": 222,
"height": 275,
"rawWidth": 224,
"rawHeight": 275,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-111,
-137.5,
0,
111,
-137.5,
0,
-111,
137.5,
0,
111,
137.5,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
2,
275,
224,
275,
2,
0,
224,
0
],
"nuv": [
0.008928571428571428,
0,
1,
0,
0.008928571428571428,
1,
1,
1
],
"minPos": [
-111,
-137.5,
0
],
"maxPos": [
111,
137.5,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "5b4d5825-6c8e-44e5-a71d-2d087c8993ca@6c48a",
"atlasUuid": "",
"trimType": "auto"
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "5b4d5825-6c8e-44e5-a71d-2d087c8993ca@6c48a"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

View File

@@ -0,0 +1,134 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "4e57c78e-d895-4138-a2b3-25b825699979",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "4e57c78e-d895-4138-a2b3-25b825699979@6c48a",
"displayName": "4",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "4e57c78e-d895-4138-a2b3-25b825699979",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "4e57c78e-d895-4138-a2b3-25b825699979@f9941",
"displayName": "4",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 204,
"height": 287,
"rawWidth": 204,
"rawHeight": 287,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-102,
-143.5,
0,
102,
-143.5,
0,
-102,
143.5,
0,
102,
143.5,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
287,
204,
287,
0,
0,
204,
0
],
"nuv": [
0,
0,
1,
0,
0,
1,
1,
1
],
"minPos": [
-102,
-143.5,
0
],
"maxPos": [
102,
143.5,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "4e57c78e-d895-4138-a2b3-25b825699979@6c48a",
"atlasUuid": "",
"trimType": "auto"
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "4e57c78e-d895-4138-a2b3-25b825699979@6c48a"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

View File

@@ -0,0 +1,134 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "c34a77c1-d19d-4f03-bbeb-4cbb51aa3d9d",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "c34a77c1-d19d-4f03-bbeb-4cbb51aa3d9d@6c48a",
"displayName": "5",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "c34a77c1-d19d-4f03-bbeb-4cbb51aa3d9d",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "c34a77c1-d19d-4f03-bbeb-4cbb51aa3d9d@f9941",
"displayName": "5",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 224,
"height": 278,
"rawWidth": 224,
"rawHeight": 278,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-112,
-139,
0,
112,
-139,
0,
-112,
139,
0,
112,
139,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
278,
224,
278,
0,
0,
224,
0
],
"nuv": [
0,
0,
1,
0,
0,
1,
1,
1
],
"minPos": [
-112,
-139,
0
],
"maxPos": [
112,
139,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "c34a77c1-d19d-4f03-bbeb-4cbb51aa3d9d@6c48a",
"atlasUuid": "",
"trimType": "auto"
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "c34a77c1-d19d-4f03-bbeb-4cbb51aa3d9d@6c48a"
}
}

9
assets/scene.meta Normal file
View File

@@ -0,0 +1,9 @@
{
"ver": "1.2.0",
"importer": "directory",
"imported": true,
"uuid": "f72eca68-16b5-4abe-8ba3-7c9037ac8f88",
"files": [],
"subMetas": {},
"userData": {}
}

1176
assets/scene/Load.scene Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,11 @@
{
"ver": "1.1.50",
"importer": "scene",
"imported": true,
"uuid": "7e6b8aff-6d8d-40e7-aa76-36fd1952f14f",
"files": [
".json"
],
"subMetas": {},
"userData": {}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,11 @@
{
"ver": "1.1.50",
"importer": "scene",
"imported": true,
"uuid": "58e12c37-b669-4dd6-a1e2-2cfc37074151",
"files": [
".json"
],
"subMetas": {},
"userData": {}
}

4421
assets/scene/s1.scene Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,11 @@
{
"ver": "1.1.50",
"importer": "scene",
"imported": true,
"uuid": "9de958b4-c0ee-4c33-8a6c-c4fd2a633a34",
"files": [
".json"
],
"subMetas": {},
"userData": {}
}

9
assets/scripts.meta Normal file
View File

@@ -0,0 +1,9 @@
{
"ver": "1.2.0",
"importer": "directory",
"imported": true,
"uuid": "c8a78a0b-cd2c-4c1a-bae3-76bb4078a7f4",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@@ -0,0 +1,139 @@
import { _decorator, Component, Node, AudioSource, AudioClip, director } from 'cc';
const { ccclass, property } = _decorator;
// 背景音乐类型
export enum BGMType {
Home,
Level,
Boss,
}
// 音效类型
export enum SFXType {
Remove,
Success,
Fail,
Item,
Victory,
Magic,
Shuffle,
Hint
}
@ccclass('AudioManager')
export class AudioManager extends Component {
private static _instance: AudioManager | null = null;
public static get instance(): AudioManager {
if (!this._instance) {
const node = new Node('AudioManager');
this._instance = node.addComponent(AudioManager);
director.addPersistRootNode(node);
}
return this._instance;
}
// AudioSources
private bgmSource!: AudioSource;
private sfxSource!: AudioSource;
// 开关
public bgmEnabled: boolean = true;
public sfxEnabled: boolean = true;
// 音乐 / 音效 Map
private bgmClips: Map<BGMType, AudioClip> = new Map();
private sfxClips: Map<SFXType, AudioClip> = new Map();
private currentBGM: BGMType | null = null;
onLoad() {
// 初始化单例
AudioManager._instance = this;
// 跨场景不销毁
// director.addPersistRootNode(this.node);
// 读取本地开关
this.bgmEnabled = localStorage.getItem('bgmEnabled') !== '0';
this.sfxEnabled = localStorage.getItem('sfxEnabled') !== '0';
// 自动挂载或创建 AudioSource
const sources = this.node.getComponents(AudioSource);
if (sources.length >= 2) {
this.bgmSource = sources[0];
this.sfxSource = sources[1];
} else {
this.bgmSource = this.node.addComponent(AudioSource);
this.bgmSource.loop = true;
this.sfxSource = this.node.addComponent(AudioSource);
}
}
/** 注册 BGM */
public registerBGM(type: BGMType, clip: AudioClip) {
this.bgmClips.set(type, clip);
}
/** 注册 SFX */
public registerSFX(type: SFXType, clip: AudioClip) {
this.sfxClips.set(type, clip);
}
/** 播放背景音乐 */
public playBGM(type: BGMType) {
if (!this.bgmEnabled) return;
// if (this.currentBGM === type) return;
const clip = this.bgmClips.get(type);
if (!clip) return;
this.currentBGM = type;
this.bgmSource.clip = clip;
this.bgmSource.loop = true;
this.bgmSource.play();
}
/** 播放音效 */
public playSFX(type: SFXType) {
if (!this.sfxEnabled) return;
const clip = this.sfxClips.get(type);
if (!clip) return;
this.sfxSource.playOneShot(clip, 1.0);
}
/** 设置 BGM 开关 */
public setBGMEnabled(enabled: boolean) {
this.bgmEnabled = enabled;
localStorage.setItem('bgmEnabled', enabled ? '1' : '0');
if (!this.bgmSource) return;
if (enabled) {
// 开启播放当前 BGM
if (this.currentBGM !== null || this.currentBGM !== undefined) {
const clip = this.bgmClips.get(this.currentBGM);
if (clip) {
this.bgmSource.clip = clip;
this.bgmSource.play();
}
}
} else {
// 关闭停止播放
this.bgmSource.stop();
}
}
/** 设置 SFX 开关 */
public setSFXEnabled(enabled: boolean) {
this.sfxEnabled = enabled;
localStorage.setItem('sfxEnabled', enabled ? '1' : '0');
// 关闭音效后playSFX 会直接返回,不会播放
}
/** 设置 SFX 开关 */
public setCurBgm(type: number) {
this.currentBGM = type;
}
}

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.24",
"importer": "typescript",
"imported": true,
"uuid": "b07ed8a6-f1ba-46a1-8edd-9b424894ec9f",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@@ -0,0 +1,48 @@
import { _decorator, Component, Node, Toggle } from 'cc';
import { AudioManager } from './AudioManager';
const { ccclass, property } = _decorator;
@ccclass('AudioSettingsUI')
export class AudioSettingsUI extends Component {
@property(Node)
panel: Node = null!; // 设置面板节点
@property(Toggle)
bgmToggle: Toggle = null!;
@property(Toggle)
sfxToggle: Toggle = null!;
onLoad() {
const am = AudioManager.instance;
// 初始化 Toggle 状态
this.bgmToggle.isChecked = am.bgmEnabled;
this.sfxToggle.isChecked = am.sfxEnabled;
// Toggle 监听
this.bgmToggle.node.on('toggle', this.onBgmToggleChanged, this);
this.sfxToggle.node.on('toggle', this.onSfxToggleChanged, this);
// 面板默认隐藏
this.panel.active = false;
}
/** 打开设置面板 */
openPanel() {
this.panel.active = true;
}
/** 关闭设置面板 */
closePanel() {
this.panel.active = false;
}
private onBgmToggleChanged(toggle: Toggle) {
AudioManager.instance.setBGMEnabled(toggle.isChecked);
}
private onSfxToggleChanged(toggle: Toggle) {
AudioManager.instance.setSFXEnabled(toggle.isChecked);
}
}

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.24",
"importer": "typescript",
"imported": true,
"uuid": "e6a5f56b-bc7d-48ad-82cf-23ab8d7da791",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@@ -0,0 +1,50 @@
export type BoardShapeName = "rectangle" | "L_shape" | "T_shape" | "cross_shape" | "diamond" | "custom";
export const BoardShapes: Record<BoardShapeName, number[][]> = {
rectangle: [
[1,1,1,1,1,1],
[1,1,1,1,1,1],
[1,1,1,1,1,1],
[1,1,1,1,1,1],
[1,1,1,1,1,1],
],
L_shape: [
[1,1,1,0,0,0],
[1,1,1,0,0,0],
[1,1,1,1,1,1],
[1,1,1,1,1,1],
],
T_shape: [
[1,1,1,1,1,1,1],
[0,0,1,1,1,0,0],
[0,0,1,1,1,0,0],
[0,0,1,1,1,0,0],
],
cross_shape: [
[0,0,1,1,0,0],
[0,0,1,1,0,0],
[1,1,1,1,1,1],
[0,0,1,1,0,0],
[0,0,1,1,0,0],
],
diamond: [
[0,0,0,1,0,0,0],
[0,0,1,1,1,0,0],
[0,1,1,1,1,1,0],
[1,1,1,1,1,1,1],
[0,1,1,1,1,1,0],
[0,0,1,1,1,0,0],
[0,0,0,1,0,0,0],
[0,0,0,1,0,0,0],
],
custom: [
[0,0,0,0,-1,0,0],
[0,0,0,0,-1,0,0],
[0,0,0,0,-1,0,0],
[0,0,0,0,1,1,1],
[0,0,0,0,1,0,0],
[0,0,0,0,0,0,0],
[0,0,0,0,0,0,0],
[0,0,0,0,0,0,0],
]
};

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.24",
"importer": "typescript",
"imported": true,
"uuid": "5ff0aad1-47ce-41a6-9dfd-25e0d722b769",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@@ -0,0 +1,195 @@
import { _decorator, Component, Node, Label, sys } from 'cc';
const { ccclass, property } = _decorator;
@ccclass('ButtonBadge')
export class ButtonBadge extends Component {
@property(Node)
hint_badge: Node | null = null;
@property(Label)
hint_countLabel: Label | null = null;
@property(Node)
hint_adIcon: Node | null = null;
@property(Node)
shuffle_badge: Node | null = null;
@property(Label)
shuffle_countLabel: Label | null = null;
@property(Node)
shuffle_adIcon: Node | null = null;
@property(Node)
magic_badge: Node | null = null;
@property(Label)
magic_countLabel: Label | null = null;
@property(Node)
magic_adIcon: Node | null = null;
private _hint_count: number = 0;
private _hint_storageKey: string = "hint_button_usage_count";
private _shuffle_count: number = 0;
private _shuffle_storageKey: string = "shuffle_button_usage_count";
private _magic_count: number = 0;
private _magic_storageKey: string = "magic_button_usage_count";
onLoad() {
// 从本地缓存读取
const hintSaved = sys.localStorage.getItem(this._hint_storageKey);
const shuffleSaved = sys.localStorage.getItem(this._shuffle_storageKey);
const magicSaved = sys.localStorage.getItem(this._magic_storageKey);
this._hint_count = hintSaved ? parseInt(hintSaved) : 3; // 默认初始 3 次
this._shuffle_count = shuffleSaved ? parseInt(shuffleSaved) : 3; // 默认初始 3 次
this._magic_count = magicSaved ? parseInt(magicSaved) : 3; // 默认初始 3 次
console.log('load', this._shuffle_count, this._magic_count)
this.updateHintView();
this.updateShuffleView();
this.updateMagicView();
}
private updateHintView() {
if (!this.hint_badge) return;
if (this._hint_count > 0) {
this.hint_badge.active = true;
if (this.hint_countLabel) {
this.hint_countLabel.string = this._hint_count.toString();
this.hint_countLabel.node.active = true;
}
if (this.hint_adIcon) this.hint_adIcon.active = false;
} else {
this.hint_badge.active = true;
if (this.hint_countLabel) this.hint_countLabel.node.active = false;
if (this.hint_adIcon) this.hint_adIcon.active = true;
}
}
private updateShuffleView() {
if (!this.shuffle_badge) return;
if (this._shuffle_count > 0) {
this.shuffle_badge.active = true;
if (this.shuffle_countLabel) {
this.shuffle_countLabel.string = this._shuffle_count.toString();
this.shuffle_countLabel.node.active = true;
}
if (this.shuffle_adIcon) this.shuffle_adIcon.active = false;
} else {
this.shuffle_badge.active = true;
if (this.shuffle_countLabel) this.shuffle_countLabel.node.active = false;
if (this.shuffle_adIcon) this.shuffle_adIcon.active = true;
}
}
private updateMagicView() {
if (!this.magic_badge) return;
if (this._magic_count > 0) {
this.magic_badge.active = true;
if (this.magic_countLabel) {
this.magic_countLabel.string = this._magic_count.toString();
this.magic_countLabel.node.active = true;
}
if (this.magic_adIcon) this.magic_adIcon.active = false;
} else {
this.magic_badge.active = true;
if (this.magic_countLabel) this.magic_countLabel.node.active = false;
if (this.magic_adIcon) this.magic_adIcon.active = true;
}
}
private saveHint() {
sys.localStorage.setItem(this._hint_storageKey, this._hint_count.toString());
}
private saveShuffle() {
sys.localStorage.setItem(this._shuffle_storageKey, this._shuffle_count.toString());
}
private saveMagic() {
sys.localStorage.setItem(this._magic_storageKey, this._magic_count.toString());
}
public useHintOnce(): boolean {
if (this._hint_count > 0) {
this._hint_count--;
this.saveHint();
this.updateHintView();
return true; // 成功使用
} else {
// this.showAdAndReward();
return false; // 没次数,去看广告
}
}
public useShuffleOnce(): boolean {
if (this._shuffle_count > 0) {
this._shuffle_count--;
this.saveShuffle();
this.updateShuffleView();
return true; // 成功使用
} else {
// this.showAdAndReward();
return false; // 没次数,去看广告
}
}
public useMagicOnce(): boolean {
if (this._magic_count > 0) {
this._magic_count--;
this.saveMagic();
this.updateMagicView();
return true; // 成功使用
} else {
// this.showAdAndReward();
return false; // 没次数,去看广告
}
}
public getHintCount() {
return this._hint_count;
}
public getShuffleCount() {
return this._shuffle_count;
}
public getMagicCount() {
return this._magic_count;
}
public showAdAndReward(type) {
// ⚠️ 这里接入广告 SDK
console.log("显示广告...");
// 假设广告结束回调
if(type === 'hint') this.onAdHintComplete();
if(type === 'shuffle') this.onAdShuffleComplete();
if(type === 'magic') this.onAdMagicComplete();
}
private onAdHintComplete() {
this._hint_count += 3;
this.saveHint();
this.updateHintView();
}
private onAdShuffleComplete() {
this._shuffle_count += 3;
this.saveShuffle();
this.updateShuffleView();
}
private onAdMagicComplete() {
this._magic_count += 3;
this.saveMagic();
this.updateMagicView();
}
}

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.24",
"importer": "typescript",
"imported": true,
"uuid": "718c3d80-1392-4a19-9a8c-31e59d8b5627",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@@ -0,0 +1,232 @@
import { Node, Vec3, tween } from "cc";
export interface DragCell {
r: number;
c: number;
type: number;
node: Node;
}
export interface DragGroup {
cells: DragCell[];
dirR: number;
dirC: number;
maxSteps: number;
}
export class DragManager {
private board: number[][];
private blockNodes: (Node | null)[][];
private rows: number;
private cols: number;
private blockSize: number;
constructor(
board: number[][],
blockNodes: (Node | null)[][],
rows: number,
cols: number,
blockSize: number,
) {
this.board = board;
this.blockNodes = blockNodes;
this.rows = rows;
this.cols = cols;
this.blockSize = blockSize;
}
/** 查找拖动组(从点击格子 + 方向出发) */
findDragGroup(
r: number,
c: number,
dirR: number,
dirC: number,
): { r: number; c: number }[] {
if (this.board[r][c] < 0) return [];
const group: { r: number; c: number }[] = [];
// 包含起点
group.push({ r, c });
if (dirR === 0 && dirC === 0) {
// 无方向,返回只有自己
return group;
}
if (dirR !== 0) {
// 垂直方向,向前方向查找
// 前面方向就是 dirR 方向(正负决定上或下)
let rr = r + dirR;
while (rr >= 0 && rr < this.rows) {
if (this.board[rr][c] >= 0) {
if (dirR > 0) {
// 向下push后面
group.push({ r: rr, c });
} else {
// 向上unshift前面
group.unshift({ r: rr, c });
}
rr += dirR;
} else {
break;
}
}
} else if (dirC !== 0) {
// 水平方向,向前方向查找
// 前面方向就是 dirC 方向(正负决定左或右)
let cc = c + dirC;
while (cc >= 0 && cc < this.cols) {
if (this.board[r][cc] >= 0) {
if (dirC > 0) {
// 向右push后面
group.push({ r, c: cc });
} else {
// 向左unshift前面
group.unshift({ r, c: cc });
}
cc += dirC;
} else {
break;
}
}
}
return group;
}
/** 计算最多能移动多少格 */
countEmptyStepsGroup(
group: { r: number; c: number }[],
dirR: number,
dirC: number,
): number {
if (group.length === 0) return 0;
// 按滑动方向,找整组前方连续空格最小值
if (dirR !== 0) {
// 纵向滑动,找组中最顶部或最底部行号
const rows = group.map((g) => g.r);
const col = group[0].c;
const boundaryRow = dirR === 1 ? Math.max(...rows) : Math.min(...rows);
let count = 0;
let checkRow = boundaryRow + dirR;
while (
checkRow >= 0 &&
checkRow < this.rows &&
this.board[checkRow][col] === -1
) {
count++;
checkRow += dirR;
}
return count;
} else {
// 横向滑动,找组中最左或最右列号
const cols = group.map((g) => g.c);
const row = group[0].r;
const boundaryCol = dirC === 1 ? Math.max(...cols) : Math.min(...cols);
let count = 0;
let checkCol = boundaryCol + dirC;
while (
checkCol >= 0 &&
checkCol < this.cols &&
this.board[row][checkCol] === -1
) {
count++;
checkCol += dirC;
}
return count;
}
}
/** 执行拖动中的偏移 */
public applyDragOffset(
draggingGroup,
maxSteps: number,
dirR: number,
dirC: number,
dy: number,
dx: number,
) {
// 计算偏移量滑动方向相反时置0
let offset = dirR !== 0 ? dy : dx;
if (
(dirR === -1 && offset <= 0) ||
(dirR === 1 && offset >= 0) ||
(dirC === 1 && offset <= 0) ||
(dirC === -1 && offset >= 0)
)
offset = 0;
const maxOffset = maxSteps * this.blockSize;
if (Math.abs(offset) > maxOffset) offset = maxOffset * Math.sign(offset);
// 整组方块移动
draggingGroup.forEach(({ r, c }) => {
const block = this.blockNodes[r][c];
if (!block) return;
const startPos = this.getPos(r, c);
if (dirR !== 0) {
block.setPosition(startPos.x, startPos.y + offset, 0);
} else {
block.setPosition(startPos.x + offset, startPos.y, 0);
}
});
}
getPos(row: number, col: number): Vec3 {
const x =
col * this.blockSize -
(this.cols * this.blockSize) / 2 +
this.blockSize / 2;
const y =
(this.rows * this.blockSize) / 2 -
row * this.blockSize -
this.blockSize / 2;
return new Vec3(x, y, 0);
}
/** 松手:确认移动 or 回弹 */
public async settleDrag(
blocksInfo: DragCell[],
reset: boolean,
steps?: number,
slidingDir?,
) {
if (reset) {
await this.resetGroup(blocksInfo);
} else {
await this.applyMove(blocksInfo, steps, slidingDir);
}
}
/** 执行动画移动 */
private async applyMove(blocksInfo: DragCell[], steps: number, slidingDir) {
blocksInfo.forEach(({ r, c, type, node }) => {
const tr = r + slidingDir.dirR * steps;
const tc = c + slidingDir.dirC * steps;
this.board[tr][tc] = type;
this.blockNodes[tr][tc] = node;
if (node) node.setPosition(this.getPos(tr, tc));
});
}
/** 回弹动画 */
private async resetGroup(blocksInfo) {
const promises = blocksInfo.map(({ r, c, type, node }) => {
const targetPos = this.getPos(r, c);
this.board[r][c] = type;
this.blockNodes[r][c] = node;
return new Promise<void>((resolve) => {
tween(node)
.to(0.15, { position: targetPos })
.call(() => resolve()) // ✅ 修复
.start();
});
});
await Promise.all(promises);
}
}

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.24",
"importer": "typescript",
"imported": true,
"uuid": "6426afbd-e807-450a-b364-9b404873d8b3",
"files": [],
"subMetas": {},
"userData": {}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.24",
"importer": "typescript",
"imported": true,
"uuid": "f5caabc4-7ab4-4966-ad71-81c18beb874c",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@@ -0,0 +1,75 @@
import { _decorator, Component, Node, tween, Vec3, Sprite, UITransform } from "cc";
const { ccclass, property } = _decorator;
@ccclass("HintManager")
export class HintManager extends Component {
@property(Node)
handNode: Node | null = null; // 编辑器里拖一只手的 sprite 节点
private runningTween: any = null;
// 传入 getHint 的结果
showHint(hint: any, getPos: (r: number, c: number) => Vec3) {
if (!this.handNode) return;
// 清理之前的动画
if (this.runningTween) {
this.runningTween.stop();
this.runningTween = null;
}
if (!hint.from || !hint.dir || hint.steps == null) return;
const { from, dir, steps } = hint;
const dr = dir.dr;
const dc = dir.dc;
// 生成路径格子(起点 + dir * step
const pathCells: { r: number; c: number }[] = [];
for (let s = 0; s <= steps; s++) {
pathCells.push({ r: from.r + dr * s, c: from.c + dc * s });
}
// 转换成 UI 坐标
const positions: Vec3[] = pathCells.map(cell => getPos(cell.r, cell.c));
const startPos = positions[0];
this.handNode.active = true;
this.handNode.setSiblingIndex(this.handNode.parent.children.length - 1);
this.handNode.setPosition(startPos);
// 构建单向滑动动画(格子之间平均时间)
const durationPerCell = 1 / steps;
let tw = tween(this.handNode);
for (let i = 1; i < positions.length; i++) {
tw = tw.to(durationPerCell, { position: positions[i] });
}
// 到终点瞬间回起点
tw = tw.call(() => this.handNode.setPosition(startPos));
// 重复 3 次
this.runningTween = tween(this.handNode)
.repeat(3, tw)
.call(() => {
this.handNode.active = false;
this.runningTween = null;
})
.start();
}
cancelHint() {
if (this.runningTween) {
try {
this.runningTween.stop();
} catch (e) {
console.warn("停止手势动画失败", e);
}
this.runningTween = null;
}
if (this.handNode) {
this.handNode.active = false;
}
}
}

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.24",
"importer": "typescript",
"imported": true,
"uuid": "1fafa285-6dac-4a29-8a97-fbb3d3389996",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@@ -0,0 +1,267 @@
import {
Node,
Prefab,
instantiate,
Sprite,
SpriteFrame,
UITransform,
Vec3,
} from "cc";
import { BoardShapes, BoardShapeName } from "./BoardShape";
export interface LevelConfig {
rows?: number;
cols?: number;
blockSize?: number;
tileTypes?: number;
currentShape?: BoardShapeName;
isTutorial?: boolean;
fixedBoard?: number[][];
}
export class LevelBuilder {
public board: number[][] = [];
public blockNodes: (Node | null)[][] = [];
public rows: number = 0;
public cols: number = 0;
private node: Node;
private blockPrefab: Prefab;
private spriteFrames: SpriteFrame[] = [];
private blockSize: number = 100;
private tileTypes: number = 5;
public currentShape: BoardShapeName = "rectangle";
private fixedBoard: number[][] | null = null;
constructor(
node: Node,
blockPrefab: Prefab,
spriteFrames: SpriteFrame[],
config?: LevelConfig,
) {
this.node = node;
this.blockPrefab = blockPrefab;
this.spriteFrames = spriteFrames;
if (config) {
this.blockSize = config.blockSize ?? this.blockSize;
this.tileTypes = config.tileTypes ?? this.tileTypes;
if (config.currentShape) this.currentShape = config.currentShape;
if (config.fixedBoard) this.fixedBoard = config.fixedBoard;
}
}
public buildBoard(): void {
if (this.fixedBoard) {
this.buildFixedBoard();
return;
}
const shapeTemplate = BoardShapes[this.currentShape];
if (!shapeTemplate) throw new Error(`Shape "${this.currentShape}" 未定义`);
const maxCols = Math.max(...shapeTemplate.map((row) => row.length));
const rows = shapeTemplate.length;
// 自动补齐矩形
const fixedTemplate: number[][] = [];
for (let r = 0; r < rows; r++) {
fixedTemplate[r] = [];
for (let c = 0; c < maxCols; c++) {
fixedTemplate[r][c] = shapeTemplate[r][c] ?? 0;
}
}
// 收集可用格子
const validCells = [];
for (let r = 0; r < rows; r++) {
for (let c = 0; c < maxCols; c++) {
if (fixedTemplate[r][c] === 1) validCells.push({ r, c });
}
}
if (validCells.length % 2 !== 0) throw new Error("有效格子数量必须为偶数");
// 随机生成配对
let tiles: number[] = [];
for (let i = 0; i < validCells.length / 2; i++) {
const id = i % this.tileTypes;
tiles.push(id, id);
}
for (let i = tiles.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[tiles[i], tiles[j]] = [tiles[j], tiles[i]];
}
let tileIndex = 0;
this.board = [];
this.blockNodes = [];
this.rows = rows;
this.cols = maxCols;
for (let r = 0; r < rows; r++) {
this.board[r] = [];
this.blockNodes[r] = [];
for (let c = 0; c < maxCols; c++) {
if (fixedTemplate[r][c] === 1) {
const tileId = tiles[tileIndex++];
this.board[r][c] = tileId;
const block = this.createNormalBlock(tileId);
block.setPosition(this.getPos(r, c));
this.node.addChild(block);
this.blockNodes[r][c] = block;
} else if (fixedTemplate[r][c] === -1) {
this.board[r][c] = -1;
this.blockNodes[r][c] = null;
} else {
this.board[r][c] = -2;
const stone = this.createStoneBlock();
stone.setPosition(this.getPos(r, c));
this.node.addChild(stone);
this.blockNodes[r][c] = stone;
}
}
}
}
private buildFixedBoard() {
this.rows = this.fixedBoard.length;
this.cols = this.fixedBoard[0].length;
this.board = [];
this.blockNodes = [];
for (let r = 0; r < this.rows; r++) {
this.board[r] = [];
this.blockNodes[r] = [];
for (let c = 0; c < this.cols; c++) {
const val = this.fixedBoard[r][c];
this.board[r][c] = val;
if (val >= 0) {
const block = this.createNormalBlock(val);
block.setPosition(this.getPos(r, c));
this.node.addChild(block);
this.blockNodes[r][c] = block;
} else if (val === -1) {
this.blockNodes[r][c] = null;
} else if (val === -2) {
const stone = this.createStoneBlock();
stone.setPosition(this.getPos(r, c));
this.node.addChild(stone);
this.blockNodes[r][c] = stone;
}
}
}
}
private createNormalBlock(tileId: number) {
const block = instantiate(this.blockPrefab);
const bgNode = block.getChildByName("Bg");
const bgUI =
bgNode.getComponent(UITransform) ?? bgNode.addComponent(UITransform);
bgUI.setContentSize(this.blockSize, this.blockSize);
const iconNode = block.getChildByName("Icon");
const iconUI =
iconNode.getComponent(UITransform) ?? iconNode.addComponent(UITransform);
const iconUI_sprite = iconNode.getComponent(Sprite)!;
iconUI_sprite.spriteFrame = this.spriteFrames[tileId];
iconUI.setContentSize(this.blockSize * 0.7, this.blockSize * 0.7);
iconNode.setPosition(0, 0, 0);
return block;
}
private createStoneBlock() {
const stone = instantiate(this.blockPrefab);
const bgNode = stone.getChildByName("Bg");
const bgUI =
bgNode.getComponent(UITransform) ?? bgNode.addComponent(UITransform);
bgUI.setContentSize(this.blockSize, this.blockSize);
const iconNode = stone.getChildByName("Icon");
iconNode.active = false;
return stone;
}
private getPos(row: number, col: number): Vec3 {
const x =
col * this.blockSize -
(this.cols * this.blockSize) / 2 +
this.blockSize / 2;
const y =
(this.rows * this.blockSize) / 2 -
row * this.blockSize -
this.blockSize / 2;
return new Vec3(x, y, 0);
}
/**
* 新建 UI 节点,并设置类型和位置
*/
public createBlockNode(type: number, r: number, c: number): Node {
let block: Node;
if (type >= 0) {
// 普通方块
block = this.createNormalBlock(type);
} else if (type === -2) {
// 石头障碍
block = this.createStoneBlock();
} else {
// 空格不需要节点
return null!;
}
block.setPosition(this.getPos(r, c));
this.node.addChild(block);
return block;
}
/**
* 更新节点的贴图/颜色/数字等显示
*/
public setBlockType(node: Node, type: number): void {
if (!node) return;
const iconNode = node.getChildByName("Icon");
if (!iconNode) return;
if (type >= 0) {
// 普通方块
iconNode.active = true;
const iconUI =
iconNode.getComponent(UITransform) ??
iconNode.addComponent(UITransform);
const iconUI_sprite = iconNode.getComponent(Sprite)!;
iconUI_sprite.spriteFrame = this.spriteFrames[type];
iconUI.setContentSize(this.blockSize * 0.7, this.blockSize * 0.7);
iconNode.setPosition(0, 0, 0);
} else if (type === -2) {
// 石头
iconNode.active = false;
} else {
// 空格
iconNode.active = false;
}
}
/**
* 更新节点的坐标位置UI 上)
*/
public setBlockPosition(node: Node, r: number, c: number): void {
if (!node) return;
node.setPosition(this.getPos(r, c));
}
/**
* 销毁节点或隐藏
*/
public destroyBlockNode(node: Node): void {
if (!node) return;
node.destroy(); // 如果想复用可改为 node.active = false
}
}

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.24",
"importer": "typescript",
"imported": true,
"uuid": "b69764f9-e98c-4d95-afa7-0b2649089cb5",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@@ -0,0 +1,131 @@
import { sys } from "cc";
import { LevelConfig } from "./LevelBuilder";
import { BoardShapeName } from "./BoardShape";
export class LevelManager {
private static _instance: LevelManager;
public static get instance() {
if (!this._instance) this._instance = new LevelManager();
return this._instance;
}
private levelIndex: number = 0;
private unlockedLevels: number = 1; // 已解锁关卡数
private STORAGE_KEY = "MY_GAME_PROGRESS";
private TUTORIAL_KEY = "TUTORIAL_COMPLETED";
// 预设关卡配置表(可以继续扩展) //rectangle L_shape T_shape cross_shape
private levels: LevelConfig[] = [
{ currentShape: "rectangle", blockSize: 100, tileTypes: 5 },
{ currentShape: "L_shape", blockSize: 90, tileTypes: 4 },
{ currentShape: "T_shape", blockSize: 80, tileTypes: 3 },
{ currentShape: "cross_shape", blockSize: 70, tileTypes: 3 },
{ currentShape: "diamond", blockSize: 80, tileTypes: 4 },
];
constructor() {
this.loadProgress();
}
public isTutorialCompleted(): boolean {
return sys.localStorage.getItem(this.TUTORIAL_KEY) === "true";
}
public setTutorialCompleted() {
sys.localStorage.setItem(this.TUTORIAL_KEY, "true");
}
public getTutorialLevel(): LevelConfig {
return {
isTutorial: true,
tileTypes: 2,
blockSize: 120,
fixedBoard: [
[0, 0, -1],
[1, -1, 1]
]
};
}
public getCurrentLevel(): LevelConfig {
if (!this.isTutorialCompleted()) {
return this.getTutorialLevel();
}
if (this.levelIndex < this.levels.length) {
return this.levels[this.levelIndex];
}
console.log('随机关卡')
return this.generateRandomLevel(this.levelIndex + 1);
}
public nextLevel(): LevelConfig | null {
if (!this.isTutorialCompleted()) {
this.setTutorialCompleted();
this.levelIndex = 0;
this.saveProgress();
return this.getCurrentLevel();
}
this.levelIndex++;
this.saveProgress();
return this.getCurrentLevel();
}
public reset() {
this.levelIndex = 0;
this.unlockedLevels = 1;
this.saveProgress();
// 重置时是否重置教学?通常不用,除非显式清除数据
// sys.localStorage.removeItem(this.TUTORIAL_KEY);
}
/** 本地存储进度 */
private saveProgress() {
const data = {
levelIndex: this.levelIndex,
unlockedLevels: this.unlockedLevels,
};
sys.localStorage.setItem(this.STORAGE_KEY, JSON.stringify(data));
}
/** 读取本地存储 */
private loadProgress() {
const json = sys.localStorage.getItem(this.STORAGE_KEY);
if (json) {
try {
const data = JSON.parse(json);
this.levelIndex = data.levelIndex ?? 0;
this.unlockedLevels = data.unlockedLevels ?? 1;
// 如果是老玩家已解锁超过1关跳过教学
if (this.unlockedLevels > 1 && !this.isTutorialCompleted()) {
this.setTutorialCompleted();
}
} catch (e) {
console.warn("进度解析失败, 重置进度");
this.reset();
}
}
}
private generateRandomLevel(id: number): LevelConfig {
const allShapes: BoardShapeName[] = ["rectangle", "L_shape", "T_shape", "cross_shape", "diamond"];
// 随机选一个形状
const shape = allShapes[Math.floor(Math.random() * allShapes.length)];
// 随机决定方块种类 (6~12)
const tileTypes = 5;
// const tileTypes = 6 + Math.floor(Math.random() * 7);
// 随机大小 (70~100)
const blockSize = 70 + Math.floor(Math.random() * 31);
return {
currentShape: shape,
tileTypes,
blockSize,
};
}
}

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.24",
"importer": "typescript",
"imported": true,
"uuid": "f6594edb-0e1e-41bc-b818-0c9b51a816ff",
"files": [],
"subMetas": {},
"userData": {}
}

64
assets/scripts/Loading.ts Normal file
View File

@@ -0,0 +1,64 @@
import { _decorator, Component, ProgressBar, Label, assetManager, director, SpriteFrame, Prefab } from 'cc';
import { ResourceManager } from './ResourceManager';
const { ccclass, property } = _decorator;
@ccclass('Loading')
export class Loading extends Component {
@property(ProgressBar)
progressBar: ProgressBar | null = null;
@property(Label)
progressLabel: Label | null = null;
@property
nextScene: string = "StartScene";
onLoad() {
// if (typeof wx !== 'undefined' && wx.hideLoading) {
// wx.hideLoading();
// }
this.startLoading();
}
startLoading() {
assetManager.loadBundle("resources", (err, bundle) => {
if (err) {
console.error("加载 resources 失败:", err);
return;
}
console.log(11111111111,2222)
// 加载整个 resources 下的内容
bundle.loadDir(".", (finished, total, item) => {
let ratio = finished / total;
console.log(11111111111,ratio)
this.updateProgress(ratio);
}, (err, assets) => {
if (err) {
console.error("资源加载失败:", err);
return;
}
// 缓存资源
assets.forEach(asset => {
ResourceManager.instance.set(asset.name, asset);
asset.addRef(); // 增加引用计数,避免被自动释放
});
// 进入主场景
director.loadScene(this.nextScene);
});
});
}
updateProgress(ratio: number) {
console.log(111111, ratio)
if (this.progressBar) {
this.progressBar.progress = ratio;
}
if (this.progressLabel) {
this.progressLabel.string = `${Math.floor(ratio * 100)}%`;
}
}
}

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.24",
"importer": "typescript",
"imported": true,
"uuid": "5eac7988-bb99-4c65-a76c-37013eb0eac7",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@@ -0,0 +1,45 @@
import { _decorator, Asset } from 'cc';
const { ccclass } = _decorator;
@ccclass('ResourceManager')
export class ResourceManager {
private static _instance: ResourceManager;
private cache: Map<string, Asset> = new Map();
static get instance(): ResourceManager {
if (!this._instance) {
this._instance = new ResourceManager();
}
return this._instance;
}
/** 存资源 */
set(key: string, asset: Asset) {
this.cache.set(key, asset);
}
/** 取资源 */
get<T extends Asset>(key: string): T | undefined {
return this.cache.get(key) as T | undefined;
}
/** 是否存在 */
has(key: string): boolean {
return this.cache.has(key);
}
/** 释放某个资源 */
release(key: string) {
const asset = this.cache.get(key);
if (asset) {
asset.decRef(); // 减少引用计数
this.cache.delete(key);
}
}
/** 释放全部资源 */
releaseAll() {
this.cache.forEach(asset => asset.decRef());
this.cache.clear();
}
}

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.24",
"importer": "typescript",
"imported": true,
"uuid": "57226c7a-7652-40f6-a947-d9fc032231b0",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@@ -0,0 +1,160 @@
import {
_decorator,
Component,
Node,
tween,
UIOpacity,
Vec3,
director,
Button,
AudioClip,
AudioSource,
Toggle,
} from "cc";
import { AudioManager, BGMType, SFXType } from "./AudioManager";
const { ccclass, property } = _decorator;
@ccclass("StartScene")
export class StartScene extends Component {
@property(Node)
background: Node = null;
@property(Node)
logo: Node = null;
@property(Node)
startButton: Node = null;
@property(Node)
setting_node: Node = null;
@property(Node)
setting_tab_node: Node = null;
@property(AudioClip)
bg_audio: AudioClip = null;
@property(Toggle)
bgmToggle: Toggle = null!;
@property(Toggle)
sfxToggle: Toggle = null!;
onLoad() {
const am = AudioManager.instance;
// 注册首页 BGM 和音效
am.registerBGM(BGMType.Home, this.bg_audio);
// 初始化 Toggle 状态
this.bgmToggle.isChecked = am.bgmEnabled;
this.sfxToggle.isChecked = am.sfxEnabled;
// am.registerSFX(SFXType.Item, this.startClickClip);
am.setCurBgm(BGMType.Home);
am.playBGM(BGMType.Home);
// 监听切换事件
this.bgmToggle.node.on("toggle", this.onBgmToggleChanged, this);
this.sfxToggle.node.on("toggle", this.onSfxToggleChanged, this);
}
start() {
// 初始化透明度
const bgOpacity = this.background.addComponent(UIOpacity);
bgOpacity.opacity = 0;
const logoOpacity = this.logo.addComponent(UIOpacity);
logoOpacity.opacity = 0;
this.logo.setScale(new Vec3(0.5, 0.5, 1));
const btnOpacity = this.startButton.addComponent(UIOpacity);
btnOpacity.opacity = 0;
// 背景渐入
tween(bgOpacity).to(1, { opacity: 255 }).start();
// Logo 缩放 + 渐入
tween(logoOpacity).delay(0.5).to(1, { opacity: 255 }).start();
tween(this.logo)
.delay(0.5)
.to(1, { scale: new Vec3(1.1, 1.1, 1) })
.to(0.3, { scale: new Vec3(1, 1, 1) })
.start();
// 按钮呼吸动画
tween(btnOpacity)
.delay(1.2)
.to(0.8, { opacity: 255 })
.call(() => {
this.playButtonBreathing();
})
.start();
// 按钮点击事件
// this.startButton.on(Button.EventType.CLICK, this.onStartGame, this);
}
onBgmToggleChanged(toggle: Toggle) {
AudioManager.instance.setBGMEnabled(toggle.isChecked);
}
onSfxToggleChanged(toggle: Toggle) {
AudioManager.instance.setSFXEnabled(toggle.isChecked);
}
playButtonBreathing() {
tween(this.startButton)
.repeatForever(
tween()
.to(0.6, { scale: new Vec3(1.1, 1.1, 1) })
.to(0.6, { scale: new Vec3(1, 1, 1) })
)
.start();
}
onStartGame() {
// 按钮点击反馈动画
tween(this.startButton)
.to(0.1, { scale: new Vec3(0.9, 0.9, 1) })
.to(0.1, { scale: new Vec3(1, 1, 1) })
.call(() => {
director.loadScene("s1"); // 这里替换为你的第一关场景名
})
.start();
}
onShowSettingTab() {
this.setting_tab_node.active = true;
}
onHideSettingTab() {
this.setting_tab_node.active = false;
}
onSwitchMusic(toggle) {
// this.audioMgr.bgmSource = this.node.getComponent(AudioSource);
if (toggle.isChecked) {
// this.audioMgr.setBGMEnabled(true);
// this.audioMgr.playBGM(this.bg_audio);
// this.playBgAudio();
} else {
// this.audioMgr.setBGMEnabled(false);
// this.notPlayBgAudio();
// this.audioMgr.playBGM(this.bg_audio);
}
}
playBgAudio() {
const Audio = this.node.getComponent(AudioSource);
Audio.clip = this.bg_audio;
Audio.play();
}
notPlayBgAudio() {
const Audio = this.node.getComponent(AudioSource);
Audio.clip = this.bg_audio;
Audio.stop();
}
}

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.24",
"importer": "typescript",
"imported": true,
"uuid": "0c27000f-a20c-4b07-9ac1-5c05df71c90e",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@@ -0,0 +1,9 @@
{
"ver": "1.2.0",
"importer": "directory",
"imported": true,
"uuid": "c85a2ba2-7cde-4fdc-ae16-3f2718db5c2c",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@@ -0,0 +1,35 @@
// ScreenAdapter.ts
import { _decorator, Component, view, ResolutionPolicy } from 'cc';
const { ccclass, property } = _decorator;
@ccclass('ScreenAdapter')
export class ScreenAdapter extends Component {
@property
designWidth: number = 1080; // 默认设计宽度
@property
designHeight: number = 1920; // 默认设计高度
onLoad() {
this.applyAdapter();
}
/**
* 应用屏幕适配
*/
applyAdapter() {
// const frameSize = view.getFrameSize();
// const aspect = frameSize.width / frameSize.height;
// const designAspect = this.designWidth / this.designHeight;
// if (aspect > designAspect) {
// // 屏幕更宽 → 固定高度,保证上下完整
// view.setDesignResolutionSize(this.designWidth, this.designHeight, ResolutionPolicy.FIXED_HEIGHT);
// console.log('[ScreenAdapter] Use FIXED_HEIGHT, aspect =', aspect.toFixed(2));
// } else {
// // 屏幕更窄 → 固定宽度,保证左右完整
// view.setDesignResolutionSize(this.designWidth, this.designHeight, ResolutionPolicy.FIXED_WIDTH);
// console.log('[ScreenAdapter] Use FIXED_WIDTH, aspect =', aspect.toFixed(2));
// }
}
}

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.24",
"importer": "typescript",
"imported": true,
"uuid": "043cfab9-7936-40a6-ab63-145e9193c71a",
"files": [],
"subMetas": {},
"userData": {}
}

View File

@@ -0,0 +1,13 @@
import { resources, SpriteFrame } from "cc";
export const loadSpriteFrames = (dir: string): Promise<SpriteFrame[]> => {
return new Promise((resolve, reject) => {
resources.loadDir(dir, SpriteFrame, (err, frames) => {
if (err) {
reject(err);
return;
}
resolve(frames);
});
});
}

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.24",
"importer": "typescript",
"imported": true,
"uuid": "a2baa6eb-8db8-4998-9719-ae146445a3e2",
"files": [],
"subMetas": {},
"userData": {}
}

9
assets/ui.meta Normal file
View File

@@ -0,0 +1,9 @@
{
"ver": "1.2.0",
"importer": "directory",
"imported": true,
"uuid": "ddd6e477-3e21-4ebd-82db-feb2a24db491",
"files": [],
"subMetas": {},
"userData": {}
}

BIN
assets/ui/.DS_Store vendored Normal file

Binary file not shown.

BIN
assets/ui/Music.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

134
assets/ui/Music.png.meta Normal file
View File

@@ -0,0 +1,134 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "66a951bb-1d71-4b2c-8eb6-fd42cc5c0413",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "66a951bb-1d71-4b2c-8eb6-fd42cc5c0413@6c48a",
"displayName": "Music",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "66a951bb-1d71-4b2c-8eb6-fd42cc5c0413",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "66a951bb-1d71-4b2c-8eb6-fd42cc5c0413@f9941",
"displayName": "Music",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 45,
"trimY": 25,
"width": 110,
"height": 150,
"rawWidth": 200,
"rawHeight": 200,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-55,
-75,
0,
55,
-75,
0,
-55,
75,
0,
55,
75,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
45,
175,
155,
175,
45,
25,
155,
25
],
"nuv": [
0.225,
0.125,
0.775,
0.125,
0.225,
0.875,
0.775,
0.875
],
"minPos": [
-55,
-75,
0
],
"maxPos": [
55,
75,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "66a951bb-1d71-4b2c-8eb6-fd42cc5c0413@6c48a",
"atlasUuid": "",
"trimType": "auto"
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "66a951bb-1d71-4b2c-8eb6-fd42cc5c0413@6c48a"
}
}

BIN
assets/ui/ad.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

134
assets/ui/ad.png.meta Normal file
View File

@@ -0,0 +1,134 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "0b92f301-47bc-4438-9dc6-6f3291c5f638",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "0b92f301-47bc-4438-9dc6-6f3291c5f638@6c48a",
"displayName": "ad",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "0b92f301-47bc-4438-9dc6-6f3291c5f638",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "0b92f301-47bc-4438-9dc6-6f3291c5f638@f9941",
"displayName": "ad",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimThreshold": 1,
"rotated": false,
"offsetX": -2,
"offsetY": 0,
"trimX": 35,
"trimY": 39,
"width": 182,
"height": 178,
"rawWidth": 256,
"rawHeight": 256,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-91,
-89,
0,
91,
-89,
0,
-91,
89,
0,
91,
89,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
35,
217,
217,
217,
35,
39,
217,
39
],
"nuv": [
0.13671875,
0.15234375,
0.84765625,
0.15234375,
0.13671875,
0.84765625,
0.84765625,
0.84765625
],
"minPos": [
-91,
-89,
0
],
"maxPos": [
91,
89,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "0b92f301-47bc-4438-9dc6-6f3291c5f638@6c48a",
"atlasUuid": "",
"trimType": "auto"
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "0b92f301-47bc-4438-9dc6-6f3291c5f638@6c48a"
}
}

BIN
assets/ui/bg.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

134
assets/ui/bg.jpg.meta Normal file
View File

@@ -0,0 +1,134 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "e1c0688e-a6d3-48b7-8a1b-1f3db5b2c438",
"files": [
".jpg",
".json"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "e1c0688e-a6d3-48b7-8a1b-1f3db5b2c438@6c48a",
"displayName": "bg",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "e1c0688e-a6d3-48b7-8a1b-1f3db5b2c438",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "e1c0688e-a6d3-48b7-8a1b-1f3db5b2c438@f9941",
"displayName": "bg",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 582,
"height": 876,
"rawWidth": 582,
"rawHeight": 876,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-291,
-438,
0,
291,
-438,
0,
-291,
438,
0,
291,
438,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
876,
582,
876,
0,
0,
582,
0
],
"nuv": [
0,
0,
1,
0,
0,
1,
1,
1
],
"minPos": [
-291,
-438,
0
],
"maxPos": [
291,
438,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "e1c0688e-a6d3-48b7-8a1b-1f3db5b2c438@6c48a",
"atlasUuid": "",
"trimType": "auto"
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": false,
"fixAlphaTransparencyArtifacts": false,
"redirect": "e1c0688e-a6d3-48b7-8a1b-1f3db5b2c438@6c48a"
}
}

BIN
assets/ui/bg_block.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

134
assets/ui/bg_block.png.meta Normal file
View File

@@ -0,0 +1,134 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "38593591-e719-4f26-8a25-db4e021d8f3f",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "38593591-e719-4f26-8a25-db4e021d8f3f@6c48a",
"displayName": "bg_block",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "38593591-e719-4f26-8a25-db4e021d8f3f",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "38593591-e719-4f26-8a25-db4e021d8f3f@f9941",
"displayName": "bg_block",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 198,
"height": 198,
"rawWidth": 198,
"rawHeight": 198,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-99,
-99,
0,
99,
-99,
0,
-99,
99,
0,
99,
99,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
198,
198,
198,
0,
0,
198,
0
],
"nuv": [
0,
0,
1,
0,
0,
1,
1,
1
],
"minPos": [
-99,
-99,
0
],
"maxPos": [
99,
99,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "38593591-e719-4f26-8a25-db4e021d8f3f@6c48a",
"atlasUuid": "",
"trimType": "auto"
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "38593591-e719-4f26-8a25-db4e021d8f3f@6c48a"
}
}

BIN
assets/ui/buttonStart.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

View File

@@ -0,0 +1,134 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "b064e3fd-a28b-4f0e-85fe-a19c402cd8dc",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "b064e3fd-a28b-4f0e-85fe-a19c402cd8dc@6c48a",
"displayName": "buttonStart",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "b064e3fd-a28b-4f0e-85fe-a19c402cd8dc",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "b064e3fd-a28b-4f0e-85fe-a19c402cd8dc@f9941",
"displayName": "buttonStart",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimThreshold": 1,
"rotated": false,
"offsetX": 6,
"offsetY": -1.5,
"trimX": 12,
"trimY": 15,
"width": 388,
"height": 293,
"rawWidth": 400,
"rawHeight": 320,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-194,
-146.5,
0,
194,
-146.5,
0,
-194,
146.5,
0,
194,
146.5,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
12,
305,
400,
305,
12,
12,
400,
12
],
"nuv": [
0.03,
0.0375,
1,
0.0375,
0.03,
0.953125,
1,
0.953125
],
"minPos": [
-194,
-146.5,
0
],
"maxPos": [
194,
146.5,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "b064e3fd-a28b-4f0e-85fe-a19c402cd8dc@6c48a",
"atlasUuid": "",
"trimType": "auto"
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "b064e3fd-a28b-4f0e-85fe-a19c402cd8dc@6c48a"
}
}

BIN
assets/ui/hand.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

134
assets/ui/hand.png.meta Normal file
View File

@@ -0,0 +1,134 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "12833244-7bd0-4417-b298-ccd19e59b3e6",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "12833244-7bd0-4417-b298-ccd19e59b3e6@6c48a",
"displayName": "hand",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "12833244-7bd0-4417-b298-ccd19e59b3e6",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "12833244-7bd0-4417-b298-ccd19e59b3e6@f9941",
"displayName": "hand",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 28,
"trimY": 0,
"width": 200,
"height": 256,
"rawWidth": 256,
"rawHeight": 256,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-100,
-128,
0,
100,
-128,
0,
-100,
128,
0,
100,
128,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
28,
256,
228,
256,
28,
0,
228,
0
],
"nuv": [
0.109375,
0,
0.890625,
0,
0.109375,
1,
0.890625,
1
],
"minPos": [
-100,
-128,
0
],
"maxPos": [
100,
128,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "12833244-7bd0-4417-b298-ccd19e59b3e6@6c48a",
"atlasUuid": "",
"trimType": "auto"
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "12833244-7bd0-4417-b298-ccd19e59b3e6@6c48a"
}
}

BIN
assets/ui/hint.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

134
assets/ui/hint.png.meta Normal file
View File

@@ -0,0 +1,134 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "2cfb061e-ef65-42d7-868d-d1232daf0ddb",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "2cfb061e-ef65-42d7-868d-d1232daf0ddb@6c48a",
"displayName": "hint",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "2cfb061e-ef65-42d7-868d-d1232daf0ddb",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "2cfb061e-ef65-42d7-868d-d1232daf0ddb@f9941",
"displayName": "hint",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimThreshold": 1,
"rotated": false,
"offsetX": 0,
"offsetY": 0,
"trimX": 0,
"trimY": 0,
"width": 256,
"height": 256,
"rawWidth": 256,
"rawHeight": 256,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-128,
-128,
0,
128,
-128,
0,
-128,
128,
0,
128,
128,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
256,
256,
256,
0,
0,
256,
0
],
"nuv": [
0,
0,
1,
0,
0,
1,
1,
1
],
"minPos": [
-128,
-128,
0
],
"maxPos": [
128,
128,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "2cfb061e-ef65-42d7-868d-d1232daf0ddb@6c48a",
"atlasUuid": "",
"trimType": "auto"
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "2cfb061e-ef65-42d7-868d-d1232daf0ddb@6c48a"
}
}

BIN
assets/ui/laba.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

134
assets/ui/laba.png.meta Normal file
View File

@@ -0,0 +1,134 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "572b4278-e7c1-457c-a1aa-394095659678",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "572b4278-e7c1-457c-a1aa-394095659678@6c48a",
"displayName": "laba",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "572b4278-e7c1-457c-a1aa-394095659678",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "572b4278-e7c1-457c-a1aa-394095659678@f9941",
"displayName": "laba",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimThreshold": 1,
"rotated": false,
"offsetX": -0.5,
"offsetY": 2,
"trimX": 0,
"trimY": 0,
"width": 222,
"height": 196,
"rawWidth": 223,
"rawHeight": 200,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-111,
-98,
0,
111,
-98,
0,
-111,
98,
0,
111,
98,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
0,
200,
222,
200,
0,
4,
222,
4
],
"nuv": [
0,
0.02,
0.9955156950672646,
0.02,
0,
1,
0.9955156950672646,
1
],
"minPos": [
-111,
-98,
0
],
"maxPos": [
111,
98,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "572b4278-e7c1-457c-a1aa-394095659678@6c48a",
"atlasUuid": "",
"trimType": "auto"
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "572b4278-e7c1-457c-a1aa-394095659678@6c48a"
}
}

BIN
assets/ui/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

134
assets/ui/logo.png.meta Normal file
View File

@@ -0,0 +1,134 @@
{
"ver": "1.0.27",
"importer": "image",
"imported": true,
"uuid": "46e4ca9d-4861-4169-b3bf-b69db7f5dbcb",
"files": [
".json",
".png"
],
"subMetas": {
"6c48a": {
"importer": "texture",
"uuid": "46e4ca9d-4861-4169-b3bf-b69db7f5dbcb@6c48a",
"displayName": "logo",
"id": "6c48a",
"name": "texture",
"userData": {
"wrapModeS": "clamp-to-edge",
"wrapModeT": "clamp-to-edge",
"imageUuidOrDatabaseUri": "46e4ca9d-4861-4169-b3bf-b69db7f5dbcb",
"isUuid": true,
"visible": false,
"minfilter": "linear",
"magfilter": "linear",
"mipfilter": "none",
"anisotropy": 0
},
"ver": "1.0.22",
"imported": true,
"files": [
".json"
],
"subMetas": {}
},
"f9941": {
"importer": "sprite-frame",
"uuid": "46e4ca9d-4861-4169-b3bf-b69db7f5dbcb@f9941",
"displayName": "logo",
"id": "f9941",
"name": "spriteFrame",
"userData": {
"trimThreshold": 1,
"rotated": false,
"offsetX": 4,
"offsetY": 5.5,
"trimX": 68,
"trimY": 155,
"width": 449,
"height": 112,
"rawWidth": 577,
"rawHeight": 433,
"borderTop": 0,
"borderBottom": 0,
"borderLeft": 0,
"borderRight": 0,
"packable": true,
"pixelsToUnit": 100,
"pivotX": 0.5,
"pivotY": 0.5,
"meshType": 0,
"vertices": {
"rawPosition": [
-224.5,
-56,
0,
224.5,
-56,
0,
-224.5,
56,
0,
224.5,
56,
0
],
"indexes": [
0,
1,
2,
2,
1,
3
],
"uv": [
68,
278,
517,
278,
68,
166,
517,
166
],
"nuv": [
0.11785095320623917,
0.3833718244803695,
0.8960138648180243,
0.3833718244803695,
0.11785095320623917,
0.6420323325635104,
0.8960138648180243,
0.6420323325635104
],
"minPos": [
-224.5,
-56,
0
],
"maxPos": [
224.5,
56,
0
]
},
"isUuid": true,
"imageUuidOrDatabaseUri": "46e4ca9d-4861-4169-b3bf-b69db7f5dbcb@6c48a",
"atlasUuid": "",
"trimType": "auto"
},
"ver": "1.0.12",
"imported": true,
"files": [
".json"
],
"subMetas": {}
}
},
"userData": {
"type": "sprite-frame",
"hasAlpha": true,
"fixAlphaTransparencyArtifacts": false,
"redirect": "46e4ca9d-4861-4169-b3bf-b69db7f5dbcb@6c48a"
}
}

Some files were not shown because too many files have changed in this diff Show More