Merge branch 'card' of ssh://dev.eoxnet.com:40086/pixelheros into card

This commit is contained in:
walkpan
2026-03-24 18:30:40 +08:00
31 changed files with 2916 additions and 410 deletions

View File

@@ -0,0 +1,100 @@
[
{
"__type__": "cc.AnimationClip",
"_name": "ball_blue",
"_objFlags": 0,
"__editorExtras__": {
"embeddedPlayerGroups": []
},
"_native": "",
"sample": 12,
"speed": 1,
"wrapMode": 2,
"enableTrsBlending": false,
"_duration": 0.3333333333333333,
"_hash": 500763545,
"_tracks": [
{
"__id__": 1
}
],
"_exoticAnimation": null,
"_events": [],
"_embeddedPlayers": [],
"_additiveSettings": {
"__id__": 7
},
"_auxiliaryCurveEntries": []
},
{
"__type__": "cc.animation.ObjectTrack",
"_binding": {
"__type__": "cc.animation.TrackBinding",
"path": {
"__id__": 2
},
"proxy": null
},
"_channel": {
"__id__": 5
}
},
{
"__type__": "cc.animation.TrackPath",
"_paths": [
{
"__id__": 3
},
{
"__id__": 4
},
"spriteFrame"
]
},
{
"__type__": "cc.animation.HierarchyPath",
"path": "Node"
},
{
"__type__": "cc.animation.ComponentPath",
"component": "cc.Sprite"
},
{
"__type__": "cc.animation.Channel",
"_curve": {
"__id__": 6
}
},
{
"__type__": "cc.ObjectCurve",
"_times": [
0,
0.08333333333333333,
0.16666666666666666,
0.25
],
"_values": [
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@a4e22",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@2b0ce",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@29738",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@faf10",
"__expectedType__": "cc.SpriteFrame"
}
]
},
{
"__type__": "cc.AnimationClipAdditiveSettings",
"enabled": false,
"refClip": null
}
]

View File

@@ -0,0 +1,13 @@
{
"ver": "2.0.3",
"importer": "animation-clip",
"imported": true,
"uuid": "863d7ce6-3da1-47c6-9c99-9a6af94dfcfc",
"files": [
".cconb"
],
"subMetas": {},
"userData": {
"name": "ball_blue"
}
}

View File

@@ -0,0 +1,95 @@
[
{
"__type__": "cc.AnimationClip",
"_name": "ball_fire-001",
"_objFlags": 0,
"__editorExtras__": {
"embeddedPlayerGroups": []
},
"_native": "",
"sample": 12,
"speed": 1,
"wrapMode": 2,
"enableTrsBlending": false,
"_duration": 0.25,
"_hash": 500763545,
"_tracks": [
{
"__id__": 1
}
],
"_exoticAnimation": null,
"_events": [],
"_embeddedPlayers": [],
"_additiveSettings": {
"__id__": 7
},
"_auxiliaryCurveEntries": []
},
{
"__type__": "cc.animation.ObjectTrack",
"_binding": {
"__type__": "cc.animation.TrackBinding",
"path": {
"__id__": 2
},
"proxy": null
},
"_channel": {
"__id__": 5
}
},
{
"__type__": "cc.animation.TrackPath",
"_paths": [
{
"__id__": 3
},
{
"__id__": 4
},
"spriteFrame"
]
},
{
"__type__": "cc.animation.HierarchyPath",
"path": "Node"
},
{
"__type__": "cc.animation.ComponentPath",
"component": "cc.Sprite"
},
{
"__type__": "cc.animation.Channel",
"_curve": {
"__id__": 6
}
},
{
"__type__": "cc.ObjectCurve",
"_times": [
0,
0.08333333333333333,
0.16666666666666666
],
"_values": [
{
"__uuid__": "2423272e-e63b-4736-b15b-30b40cf98a23@59ec8",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "2423272e-e63b-4736-b15b-30b40cf98a23@3a170",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "2423272e-e63b-4736-b15b-30b40cf98a23@482b5",
"__expectedType__": "cc.SpriteFrame"
}
]
},
{
"__type__": "cc.AnimationClipAdditiveSettings",
"enabled": false,
"refClip": null
}
]

View File

@@ -0,0 +1,13 @@
{
"ver": "2.0.3",
"importer": "animation-clip",
"imported": true,
"uuid": "e4ff9dbb-37f1-49d6-b656-b42ceb67f1a7",
"files": [
".cconb"
],
"subMetas": {},
"userData": {
"name": "ball_fire-001"
}
}

View File

@@ -0,0 +1,100 @@
[
{
"__type__": "cc.AnimationClip",
"_name": "ball_red",
"_objFlags": 0,
"__editorExtras__": {
"embeddedPlayerGroups": []
},
"_native": "",
"sample": 12,
"speed": 1,
"wrapMode": 2,
"enableTrsBlending": false,
"_duration": 0.3333333333333333,
"_hash": 500763545,
"_tracks": [
{
"__id__": 1
}
],
"_exoticAnimation": null,
"_events": [],
"_embeddedPlayers": [],
"_additiveSettings": {
"__id__": 7
},
"_auxiliaryCurveEntries": []
},
{
"__type__": "cc.animation.ObjectTrack",
"_binding": {
"__type__": "cc.animation.TrackBinding",
"path": {
"__id__": 2
},
"proxy": null
},
"_channel": {
"__id__": 5
}
},
{
"__type__": "cc.animation.TrackPath",
"_paths": [
{
"__id__": 3
},
{
"__id__": 4
},
"spriteFrame"
]
},
{
"__type__": "cc.animation.HierarchyPath",
"path": "Node"
},
{
"__type__": "cc.animation.ComponentPath",
"component": "cc.Sprite"
},
{
"__type__": "cc.animation.Channel",
"_curve": {
"__id__": 6
}
},
{
"__type__": "cc.ObjectCurve",
"_times": [
0,
0.08333333333333333,
0.16666666666666666,
0.25
],
"_values": [
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@a22e7",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@20740",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@35944",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@b9343",
"__expectedType__": "cc.SpriteFrame"
}
]
},
{
"__type__": "cc.AnimationClipAdditiveSettings",
"enabled": false,
"refClip": null
}
]

View File

@@ -0,0 +1,13 @@
{
"ver": "2.0.3",
"importer": "animation-clip",
"imported": true,
"uuid": "d567be4c-7211-471d-b278-c6487f41d3a8",
"files": [
".cconb"
],
"subMetas": {},
"userData": {
"name": "ball_red"
}
}

View File

@@ -0,0 +1,100 @@
[
{
"__type__": "cc.AnimationClip",
"_name": "ball_yellow",
"_objFlags": 0,
"__editorExtras__": {
"embeddedPlayerGroups": []
},
"_native": "",
"sample": 12,
"speed": 1,
"wrapMode": 2,
"enableTrsBlending": false,
"_duration": 0.3333333333333333,
"_hash": 500763545,
"_tracks": [
{
"__id__": 1
}
],
"_exoticAnimation": null,
"_events": [],
"_embeddedPlayers": [],
"_additiveSettings": {
"__id__": 7
},
"_auxiliaryCurveEntries": []
},
{
"__type__": "cc.animation.ObjectTrack",
"_binding": {
"__type__": "cc.animation.TrackBinding",
"path": {
"__id__": 2
},
"proxy": null
},
"_channel": {
"__id__": 5
}
},
{
"__type__": "cc.animation.TrackPath",
"_paths": [
{
"__id__": 3
},
{
"__id__": 4
},
"spriteFrame"
]
},
{
"__type__": "cc.animation.HierarchyPath",
"path": "Node"
},
{
"__type__": "cc.animation.ComponentPath",
"component": "cc.Sprite"
},
{
"__type__": "cc.animation.Channel",
"_curve": {
"__id__": 6
}
},
{
"__type__": "cc.ObjectCurve",
"_times": [
0,
0.08333333333333333,
0.16666666666666666,
0.25
],
"_values": [
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@1b09a",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@341ae",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@6459e",
"__expectedType__": "cc.SpriteFrame"
},
{
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6@820a5",
"__expectedType__": "cc.SpriteFrame"
}
]
},
{
"__type__": "cc.AnimationClipAdditiveSettings",
"enabled": false,
"refClip": null
}
]

View File

@@ -0,0 +1,13 @@
{
"ver": "2.0.3",
"importer": "animation-clip",
"imported": true,
"uuid": "b7ae2d93-c955-4027-9e7d-959233b51b04",
"files": [
".cconb"
],
"subMetas": {},
"userData": {
"name": "ball_yellow"
}
}

View File

@@ -176,7 +176,7 @@
"__uuid__": "2423272e-e63b-4736-b15b-30b40cf98a23@25994", "__uuid__": "2423272e-e63b-4736-b15b-30b40cf98a23@25994",
"__expectedType__": "cc.SpriteFrame" "__expectedType__": "cc.SpriteFrame"
}, },
"_type": 1, "_type": 0,
"_fillType": 0, "_fillType": 0,
"_sizeMode": 1, "_sizeMode": 1,
"_fillCenter": { "_fillCenter": {

View File

@@ -0,0 +1,372 @@
[
{
"__type__": "cc.Prefab",
"_name": "ball_blue",
"_objFlags": 0,
"__editorExtras__": {},
"_native": "",
"data": {
"__id__": 1
},
"optimizationPolicy": 0,
"persistent": false
},
{
"__type__": "cc.Node",
"_name": "ball_blue",
"_objFlags": 0,
"__editorExtras__": {},
"_parent": null,
"_children": [
{
"__id__": 2
}
],
"_active": true,
"_components": [
{
"__id__": 8
},
{
"__id__": 10
},
{
"__id__": 12
},
{
"__id__": 14
},
{
"__id__": 16
}
],
"_prefab": {
"__id__": 18
},
"_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": 1073741824,
"_euler": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
},
"_id": ""
},
{
"__type__": "cc.Node",
"_name": "Node",
"_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": 1073741824,
"_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": 64,
"height": 64
},
"_anchorPoint": {
"__type__": "cc.Vec2",
"x": 0.5,
"y": 0.5
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "93pNmvtQlLSqtTgIepyEmA"
},
{
"__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__": "3d46f945-3f07-477e-a95a-b49557d552c6@a4e22",
"__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": {
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6",
"__expectedType__": "cc.SpriteAtlas"
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "12eKc8gltBz50frJCS5+ww"
},
{
"__type__": "cc.PrefabInfo",
"root": {
"__id__": 1
},
"asset": {
"__id__": 0
},
"fileId": "3arqAMBz1MvoXBzeDaL5M/",
"instance": null,
"targetOverrides": null,
"nestedPrefabInstanceRoots": null
},
{
"__type__": "cc.UITransform",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 9
},
"_contentSize": {
"__type__": "cc.Size",
"width": 50,
"height": 50
},
"_anchorPoint": {
"__type__": "cc.Vec2",
"x": 0.5,
"y": 0.5
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "63NP9yq3hEUKD/OZZZ5t7x"
},
{
"__type__": "cc.Animation",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 11
},
"playOnLoad": true,
"_clips": [
{
"__uuid__": "863d7ce6-3da1-47c6-9c99-9a6af94dfcfc",
"__expectedType__": "cc.AnimationClip"
}
],
"_defaultClip": {
"__uuid__": "863d7ce6-3da1-47c6-9c99-9a6af94dfcfc",
"__expectedType__": "cc.AnimationClip"
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "c2RDvksalG2acL3tyGCY0t"
},
{
"__type__": "57aabs7TE1J5obTAZczc+64",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 13
},
"atk_x": 10,
"atk_y": 15,
"debugMode": true,
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "60LInmZXxDtKu79AshRG9j"
},
{
"__type__": "cc.RigidBody2D",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 15
},
"enabledContactListener": true,
"bullet": false,
"awakeOnLoad": true,
"_group": 1,
"_type": 1,
"_allowSleep": false,
"_gravityScale": 1,
"_linearDamping": 0,
"_angularDamping": 0,
"_linearVelocity": {
"__type__": "cc.Vec2",
"x": 0,
"y": 0
},
"_angularVelocity": 0,
"_fixedRotation": false,
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "e1yBA625RLwLhzo6bLYW7j"
},
{
"__type__": "cc.BoxCollider2D",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 17
},
"tag": 0,
"_group": 1,
"_density": 1,
"_sensor": true,
"_friction": 0.2,
"_restitution": 0,
"_offset": {
"__type__": "cc.Vec2",
"x": 0,
"y": 0
},
"_size": {
"__type__": "cc.Size",
"width": 20,
"height": 100
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "43ZDJfXX9AX73gyytKQZWm"
},
{
"__type__": "cc.PrefabInfo",
"root": {
"__id__": 1
},
"asset": {
"__id__": 0
},
"fileId": "c46/YsCPVOJYA4mWEpNYRx",
"instance": null,
"targetOverrides": null
}
]

View File

@@ -0,0 +1,13 @@
{
"ver": "1.1.50",
"importer": "prefab",
"imported": true,
"uuid": "7420247a-adb4-4ca4-9eab-e7457c7dc4ca",
"files": [
".json"
],
"subMetas": {},
"userData": {
"syncNodeName": "ball_blue"
}
}

View File

@@ -0,0 +1,372 @@
[
{
"__type__": "cc.Prefab",
"_name": "ball_fire2",
"_objFlags": 0,
"__editorExtras__": {},
"_native": "",
"data": {
"__id__": 1
},
"optimizationPolicy": 0,
"persistent": false
},
{
"__type__": "cc.Node",
"_name": "ball_fire2",
"_objFlags": 0,
"__editorExtras__": {},
"_parent": null,
"_children": [
{
"__id__": 2
}
],
"_active": true,
"_components": [
{
"__id__": 8
},
{
"__id__": 10
},
{
"__id__": 12
},
{
"__id__": 14
},
{
"__id__": 16
}
],
"_prefab": {
"__id__": 18
},
"_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": 1073741824,
"_euler": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
},
"_id": ""
},
{
"__type__": "cc.Node",
"_name": "Node",
"_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.7071067811865475,
"w": 0.7071067811865476
},
"_lscale": {
"__type__": "cc.Vec3",
"x": -0.7,
"y": 0.7,
"z": 1
},
"_mobility": 0,
"_layer": 1073741824,
"_euler": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 90
},
"_id": ""
},
{
"__type__": "cc.UITransform",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 2
},
"_enabled": true,
"__prefab": {
"__id__": 4
},
"_contentSize": {
"__type__": "cc.Size",
"width": 119,
"height": 167
},
"_anchorPoint": {
"__type__": "cc.Vec2",
"x": 0.5,
"y": 0.5
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "93pNmvtQlLSqtTgIepyEmA"
},
{
"__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__": "2423272e-e63b-4736-b15b-30b40cf98a23@59ec8",
"__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": {
"__uuid__": "2423272e-e63b-4736-b15b-30b40cf98a23",
"__expectedType__": "cc.SpriteAtlas"
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "12eKc8gltBz50frJCS5+ww"
},
{
"__type__": "cc.PrefabInfo",
"root": {
"__id__": 1
},
"asset": {
"__id__": 0
},
"fileId": "3arqAMBz1MvoXBzeDaL5M/",
"instance": null,
"targetOverrides": null,
"nestedPrefabInstanceRoots": null
},
{
"__type__": "cc.UITransform",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 9
},
"_contentSize": {
"__type__": "cc.Size",
"width": 50,
"height": 50
},
"_anchorPoint": {
"__type__": "cc.Vec2",
"x": 0.5,
"y": 0.5
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "63NP9yq3hEUKD/OZZZ5t7x"
},
{
"__type__": "cc.Animation",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 11
},
"playOnLoad": true,
"_clips": [
{
"__uuid__": "e4ff9dbb-37f1-49d6-b656-b42ceb67f1a7",
"__expectedType__": "cc.AnimationClip"
}
],
"_defaultClip": {
"__uuid__": "e4ff9dbb-37f1-49d6-b656-b42ceb67f1a7",
"__expectedType__": "cc.AnimationClip"
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "c2RDvksalG2acL3tyGCY0t"
},
{
"__type__": "57aabs7TE1J5obTAZczc+64",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 13
},
"atk_x": 10,
"atk_y": 15,
"debugMode": true,
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "60LInmZXxDtKu79AshRG9j"
},
{
"__type__": "cc.RigidBody2D",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 15
},
"enabledContactListener": true,
"bullet": false,
"awakeOnLoad": true,
"_group": 1,
"_type": 1,
"_allowSleep": false,
"_gravityScale": 1,
"_linearDamping": 0,
"_angularDamping": 0,
"_linearVelocity": {
"__type__": "cc.Vec2",
"x": 0,
"y": 0
},
"_angularVelocity": 0,
"_fixedRotation": false,
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "e1yBA625RLwLhzo6bLYW7j"
},
{
"__type__": "cc.BoxCollider2D",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 17
},
"tag": 0,
"_group": 1,
"_density": 1,
"_sensor": true,
"_friction": 0.2,
"_restitution": 0,
"_offset": {
"__type__": "cc.Vec2",
"x": 0,
"y": 0
},
"_size": {
"__type__": "cc.Size",
"width": 50,
"height": 50
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "43ZDJfXX9AX73gyytKQZWm"
},
{
"__type__": "cc.PrefabInfo",
"root": {
"__id__": 1
},
"asset": {
"__id__": 0
},
"fileId": "c46/YsCPVOJYA4mWEpNYRx",
"instance": null,
"targetOverrides": null
}
]

View File

@@ -0,0 +1,13 @@
{
"ver": "1.1.50",
"importer": "prefab",
"imported": true,
"uuid": "ab7926ea-3e90-48e2-864d-b0a29cee1c9a",
"files": [
".json"
],
"subMetas": {},
"userData": {
"syncNodeName": "ball_fire2"
}
}

View File

@@ -0,0 +1,372 @@
[
{
"__type__": "cc.Prefab",
"_name": "ball_green",
"_objFlags": 0,
"__editorExtras__": {},
"_native": "",
"data": {
"__id__": 1
},
"optimizationPolicy": 0,
"persistent": false
},
{
"__type__": "cc.Node",
"_name": "ball_green",
"_objFlags": 0,
"__editorExtras__": {},
"_parent": null,
"_children": [
{
"__id__": 2
}
],
"_active": true,
"_components": [
{
"__id__": 8
},
{
"__id__": 10
},
{
"__id__": 12
},
{
"__id__": 14
},
{
"__id__": 16
}
],
"_prefab": {
"__id__": 18
},
"_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": 1073741824,
"_euler": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
},
"_id": ""
},
{
"__type__": "cc.Node",
"_name": "Node",
"_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": 1073741824,
"_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": 64,
"height": 64
},
"_anchorPoint": {
"__type__": "cc.Vec2",
"x": 0.5,
"y": 0.5
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "93pNmvtQlLSqtTgIepyEmA"
},
{
"__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__": "3d46f945-3f07-477e-a95a-b49557d552c6@1b09a",
"__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": {
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6",
"__expectedType__": "cc.SpriteAtlas"
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "12eKc8gltBz50frJCS5+ww"
},
{
"__type__": "cc.PrefabInfo",
"root": {
"__id__": 1
},
"asset": {
"__id__": 0
},
"fileId": "3arqAMBz1MvoXBzeDaL5M/",
"instance": null,
"targetOverrides": null,
"nestedPrefabInstanceRoots": null
},
{
"__type__": "cc.UITransform",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 9
},
"_contentSize": {
"__type__": "cc.Size",
"width": 50,
"height": 50
},
"_anchorPoint": {
"__type__": "cc.Vec2",
"x": 0.5,
"y": 0.5
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "63NP9yq3hEUKD/OZZZ5t7x"
},
{
"__type__": "cc.Animation",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 11
},
"playOnLoad": true,
"_clips": [
{
"__uuid__": "b7ae2d93-c955-4027-9e7d-959233b51b04",
"__expectedType__": "cc.AnimationClip"
}
],
"_defaultClip": {
"__uuid__": "b7ae2d93-c955-4027-9e7d-959233b51b04",
"__expectedType__": "cc.AnimationClip"
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "c2RDvksalG2acL3tyGCY0t"
},
{
"__type__": "57aabs7TE1J5obTAZczc+64",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 13
},
"atk_x": 10,
"atk_y": 15,
"debugMode": true,
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "60LInmZXxDtKu79AshRG9j"
},
{
"__type__": "cc.RigidBody2D",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 15
},
"enabledContactListener": true,
"bullet": false,
"awakeOnLoad": true,
"_group": 1,
"_type": 1,
"_allowSleep": false,
"_gravityScale": 1,
"_linearDamping": 0,
"_angularDamping": 0,
"_linearVelocity": {
"__type__": "cc.Vec2",
"x": 0,
"y": 0
},
"_angularVelocity": 0,
"_fixedRotation": false,
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "e1yBA625RLwLhzo6bLYW7j"
},
{
"__type__": "cc.BoxCollider2D",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 17
},
"tag": 0,
"_group": 1,
"_density": 1,
"_sensor": true,
"_friction": 0.2,
"_restitution": 0,
"_offset": {
"__type__": "cc.Vec2",
"x": 0,
"y": 0
},
"_size": {
"__type__": "cc.Size",
"width": 20,
"height": 100
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "43ZDJfXX9AX73gyytKQZWm"
},
{
"__type__": "cc.PrefabInfo",
"root": {
"__id__": 1
},
"asset": {
"__id__": 0
},
"fileId": "c46/YsCPVOJYA4mWEpNYRx",
"instance": null,
"targetOverrides": null
}
]

View File

@@ -0,0 +1,13 @@
{
"ver": "1.1.50",
"importer": "prefab",
"imported": true,
"uuid": "0ddcc956-2a13-4d96-bd0c-22c33f659f7b",
"files": [
".json"
],
"subMetas": {},
"userData": {
"syncNodeName": "ball_green"
}
}

View File

@@ -0,0 +1,372 @@
[
{
"__type__": "cc.Prefab",
"_name": "ball_red",
"_objFlags": 0,
"__editorExtras__": {},
"_native": "",
"data": {
"__id__": 1
},
"optimizationPolicy": 0,
"persistent": false
},
{
"__type__": "cc.Node",
"_name": "ball_red",
"_objFlags": 0,
"__editorExtras__": {},
"_parent": null,
"_children": [
{
"__id__": 2
}
],
"_active": true,
"_components": [
{
"__id__": 8
},
{
"__id__": 10
},
{
"__id__": 12
},
{
"__id__": 14
},
{
"__id__": 16
}
],
"_prefab": {
"__id__": 18
},
"_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": 1073741824,
"_euler": {
"__type__": "cc.Vec3",
"x": 0,
"y": 0,
"z": 0
},
"_id": ""
},
{
"__type__": "cc.Node",
"_name": "Node",
"_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": 1073741824,
"_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": 64,
"height": 64
},
"_anchorPoint": {
"__type__": "cc.Vec2",
"x": 0.5,
"y": 0.5
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "93pNmvtQlLSqtTgIepyEmA"
},
{
"__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__": "3d46f945-3f07-477e-a95a-b49557d552c6@a22e7",
"__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": {
"__uuid__": "3d46f945-3f07-477e-a95a-b49557d552c6",
"__expectedType__": "cc.SpriteAtlas"
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "12eKc8gltBz50frJCS5+ww"
},
{
"__type__": "cc.PrefabInfo",
"root": {
"__id__": 1
},
"asset": {
"__id__": 0
},
"fileId": "3arqAMBz1MvoXBzeDaL5M/",
"instance": null,
"targetOverrides": null,
"nestedPrefabInstanceRoots": null
},
{
"__type__": "cc.UITransform",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 9
},
"_contentSize": {
"__type__": "cc.Size",
"width": 50,
"height": 50
},
"_anchorPoint": {
"__type__": "cc.Vec2",
"x": 0.5,
"y": 0.5
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "63NP9yq3hEUKD/OZZZ5t7x"
},
{
"__type__": "cc.Animation",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 11
},
"playOnLoad": true,
"_clips": [
{
"__uuid__": "d567be4c-7211-471d-b278-c6487f41d3a8",
"__expectedType__": "cc.AnimationClip"
}
],
"_defaultClip": {
"__uuid__": "d567be4c-7211-471d-b278-c6487f41d3a8",
"__expectedType__": "cc.AnimationClip"
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "c2RDvksalG2acL3tyGCY0t"
},
{
"__type__": "57aabs7TE1J5obTAZczc+64",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 13
},
"atk_x": 10,
"atk_y": 15,
"debugMode": true,
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "60LInmZXxDtKu79AshRG9j"
},
{
"__type__": "cc.RigidBody2D",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 15
},
"enabledContactListener": true,
"bullet": false,
"awakeOnLoad": true,
"_group": 1,
"_type": 1,
"_allowSleep": false,
"_gravityScale": 1,
"_linearDamping": 0,
"_angularDamping": 0,
"_linearVelocity": {
"__type__": "cc.Vec2",
"x": 0,
"y": 0
},
"_angularVelocity": 0,
"_fixedRotation": false,
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "e1yBA625RLwLhzo6bLYW7j"
},
{
"__type__": "cc.BoxCollider2D",
"_name": "",
"_objFlags": 0,
"__editorExtras__": {},
"node": {
"__id__": 1
},
"_enabled": true,
"__prefab": {
"__id__": 17
},
"tag": 0,
"_group": 1,
"_density": 1,
"_sensor": true,
"_friction": 0.2,
"_restitution": 0,
"_offset": {
"__type__": "cc.Vec2",
"x": 0,
"y": 0
},
"_size": {
"__type__": "cc.Size",
"width": 20,
"height": 100
},
"_id": ""
},
{
"__type__": "cc.CompPrefabInfo",
"fileId": "43ZDJfXX9AX73gyytKQZWm"
},
{
"__type__": "cc.PrefabInfo",
"root": {
"__id__": 1
},
"asset": {
"__id__": 0
},
"fileId": "c46/YsCPVOJYA4mWEpNYRx",
"instance": null,
"targetOverrides": null
}
]

View File

@@ -0,0 +1,13 @@
{
"ver": "1.1.50",
"importer": "prefab",
"imported": true,
"uuid": "7256c23c-9a9a-46d8-90e8-d2a64a421114",
"files": [
".json"
],
"subMetas": {},
"userData": {
"syncNodeName": "ball_red"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -12,11 +12,11 @@ const { ccclass, property } = _decorator;
@ccclass('Main') @ccclass('Main')
export class Main extends Root { export class Main extends Root {
start() { start() {
PhysicsSystem2D.instance.debugDrawFlags = EPhysics2DDrawFlags.Aabb // PhysicsSystem2D.instance.debugDrawFlags = EPhysics2DDrawFlags.Aabb
|EPhysics2DDrawFlags.Pair // |EPhysics2DDrawFlags.Pair
|EPhysics2DDrawFlags.CenterOfMass // |EPhysics2DDrawFlags.CenterOfMass
|EPhysics2DDrawFlags.Joint // |EPhysics2DDrawFlags.Joint
|EPhysics2DDrawFlags.Shape; // |EPhysics2DDrawFlags.Shape;
} }
protected async run() { protected async run() {
smc.initialize = ecs.getEntity<Initialize>(Initialize); smc.initialize = ecs.getEntity<Initialize>(Initialize);

View File

@@ -167,6 +167,7 @@ export const SkillSet: Record<number, SkillConfig> = {
DTType:DTType.single,ap:100,hit_count:1,hitcd:0.2,speed:720,with:0,ready:0,EAnm:0,DAnm:"", DTType:DTType.single,ap:100,hit_count:1,hitcd:0.2,speed:720,with:0,ready:0,EAnm:0,DAnm:"",
RType:RType.linear,EType:EType.collision,buffs:[],info:"对单个造成100%攻击的伤害", RType:RType.linear,EType:EType.collision,buffs:[],info:"对单个造成100%攻击的伤害",
}, },
//大招
6002: { 6002: {
uuid:6002,name:"闪光攻击",sp_name:"atk_s2",icon:"1173",TGroup:TGroup.Enemy,readyAnm:"blues",endAnm:"",act:"max", uuid:6002,name:"闪光攻击",sp_name:"atk_s2",icon:"1173",TGroup:TGroup.Enemy,readyAnm:"blues",endAnm:"",act:"max",
DTType:DTType.single,ap:150,hit_count:3,hitcd:0.2,speed:720,with:0,ready:0,EAnm:0,DAnm:"", DTType:DTType.single,ap:150,hit_count:3,hitcd:0.2,speed:720,with:0,ready:0,EAnm:0,DAnm:"",
@@ -178,12 +179,12 @@ export const SkillSet: Record<number, SkillConfig> = {
RType:RType.fixed,EType:EType.animationEnd,buffs:[],info:"对多个目标造成150%攻击的伤害,击退率20%", RType:RType.fixed,EType:EType.animationEnd,buffs:[],info:"对多个目标造成150%攻击的伤害,击退率20%",
}, },
6004: { 6004: {
uuid:6004,name:"闪电攻击",sp_name:"atk_s4",icon:"1173",TGroup:TGroup.Enemy,readyAnm:"blues",endAnm:"",act:"max", uuid:6004,name:"闪电攻击",sp_name:"atk_s4",icon:"1173",TGroup:TGroup.Enemy,readyAnm:"yellow",endAnm:"",act:"max",
DTType:DTType.single,crt:20,ap:100,hit_count:6,hitcd:0.2,speed:720,with:0,ready:0,EAnm:0,DAnm:"", DTType:DTType.single,crt:20,ap:100,hit_count:6,hitcd:0.2,speed:720,with:0,ready:0,EAnm:0,DAnm:"",
RType:RType.fixed,EType:EType.animationEnd,buffs:[],info:"对多个目标造成150%攻击的伤害,暴击率20%", RType:RType.fixed,EType:EType.animationEnd,buffs:[],info:"对多个目标造成150%攻击的伤害,暴击率20%",
}, },
6005: { 6005: {
uuid:6005,name:"半月攻击",sp_name:"atk_light",icon:"1126",TGroup:TGroup.Enemy,readyAnm:"",endAnm:"",act:"atk", uuid:6005,name:"半月攻击",sp_name:"atk_light",icon:"1126",TGroup:TGroup.Enemy,readyAnm:"blues",endAnm:"",act:"atk",
DTType:DTType.single,ap:100,hit_count:3,hitcd:0.3,speed:720,with:90,ready:0,EAnm:0,DAnm:"", DTType:DTType.single,ap:100,hit_count:3,hitcd:0.3,speed:720,with:90,ready:0,EAnm:0,DAnm:"",
RType:RType.linear,EType:EType.collision,buffs:[],info:"穿透多个目标造成100%攻击的伤害", RType:RType.linear,EType:EType.collision,buffs:[],info:"穿透多个目标造成100%攻击的伤害",
}, },
@@ -195,44 +196,46 @@ export const SkillSet: Record<number, SkillConfig> = {
RType:RType.linear,EType:EType.collision,buffs:[],info:"对单个目标造成100%攻击的伤害", RType:RType.linear,EType:EType.collision,buffs:[],info:"对单个目标造成100%攻击的伤害",
}, },
6102: { 6102: {
uuid:6102,name:"冰冻射击",sp_name:"arrow",icon:"1135",TGroup:TGroup.Enemy,readyAnm:"",endAnm:"",act:"atk", uuid:6102,name:"冰冻射击",sp_name:"arrow_blue",icon:"1135",TGroup:TGroup.Enemy,readyAnm:"",endAnm:"",act:"atk",
DTType:DTType.single,ap:100,hit_count:1,hitcd:0.2,speed:720,with:0,ready:0,EAnm:0,DAnm:"", DTType:DTType.single,ap:100,hit_count:1,hitcd:0.2,speed:720,with:0,ready:0,EAnm:0,DAnm:"",
RType:RType.linear,EType:EType.collision,buffs:[],info:"对单个目标造成100%攻击的伤害", RType:RType.linear,EType:EType.collision,buffs:[],info:"对单个目标造成100%攻击的伤害",
}, },
6103: { 6103: {
uuid:6103,name:"暴击射击",sp_name:"arrow",icon:"1135",TGroup:TGroup.Enemy,readyAnm:"",endAnm:"",act:"atk", uuid:6103,name:"暴击射击",sp_name:"arrow_red",icon:"1135",TGroup:TGroup.Enemy,readyAnm:"",endAnm:"",act:"atk",
DTType:DTType.single,ap:100,hit_count:1,hitcd:0.2,speed:720,with:0,ready:0,EAnm:0,DAnm:"", DTType:DTType.single,ap:100,hit_count:1,hitcd:0.2,speed:720,with:0,ready:0,EAnm:0,DAnm:"",
RType:RType.linear,EType:EType.collision,buffs:[],info:"对单个目标造成100%攻击的伤害", RType:RType.linear,EType:EType.collision,buffs:[],info:"对单个目标造成100%攻击的伤害",
}, },
//大招
6104: { 6104: {
uuid:6104,name:"闪光设计",sp_name:"arrow_big_yellow",icon:"1135",TGroup:TGroup.Enemy,readyAnm:"reds",endAnm:"",act:"max", uuid:6104,name:"闪光设计",sp_name:"arrow_big_yellow",icon:"1135",TGroup:TGroup.Enemy,readyAnm:"yellow",endAnm:"",act:"max",
DTType:DTType.single,crt:20,ap:100,hit_count:6,hitcd:0.2,speed:720,with:0,ready:0,EAnm:0,DAnm:"", DTType:DTType.single,crt:20,ap:100,hit_count:6,hitcd:0.2,speed:720,with:0,ready:0,EAnm:0,DAnm:"",
RType:RType.linear,EType:EType.collision,buffs:[],info:"对多个目标造成100%攻击的伤害,暴击", RType:RType.linear,EType:EType.collision,buffs:[],info:"对多个目标造成100%攻击的伤害,暴击",
}, },
//===========魔法技能=========== //===========魔法技能===========
6201: { 6201: {
uuid:6201,name:"冰击",sp_name:"ball_forst",icon:"1126",TGroup:TGroup.Enemy,readyAnm:"",endAnm:"",act:"atk", uuid:6201,name:"蓝波",sp_name:"ball_blue",icon:"1126",TGroup:TGroup.Enemy,readyAnm:"",endAnm:"",act:"atk",
DTType:DTType.single,frz:20,ap:100,hit_count:1,hitcd:0.3,speed:720,with:90,ready:0,EAnm:0,DAnm:"", DTType:DTType.single,frz:20,ap:100,hit_count:1,hitcd:0.3,speed:720,with:90,ready:0,EAnm:0,DAnm:"",
RType:RType.linear,EType:EType.collision,buffs:[],info:"对单个目标造成100%攻击的伤害,冰冻率20%", RType:RType.linear,EType:EType.collision,buffs:[],info:"对单个目标造成100%攻击的伤害,冰冻率20%",
}, },
6202: { 6202: {
uuid:6202,name:"冰球",sp_name:"ball_ice",icon:"1126",TGroup:TGroup.Enemy,readyAnm:"",endAnm:"",act:"atk", uuid:6202,name:"绿波",sp_name:"ball_green",icon:"1126",TGroup:TGroup.Enemy,readyAnm:"",endAnm:"",act:"atk",
DTType:DTType.single,ap:100,hit_count:1,hitcd:0.3,speed:720,with:90,ready:0,EAnm:0,DAnm:"", DTType:DTType.single,ap:100,hit_count:1,hitcd:0.3,speed:720,with:90,ready:0,EAnm:0,DAnm:"",
RType:RType.linear,EType:EType.collision,buffs:[],info:"对单个目标造成100%攻击的伤害", RType:RType.linear,EType:EType.collision,buffs:[],info:"对单个目标造成100%攻击的伤害",
}, },
6203: { 6203: {
uuid:6203,name:"火击",sp_name:"ball_fire",icon:"1126",TGroup:TGroup.Enemy,readyAnm:"",endAnm:"",act:"atk", uuid:6203,name:"红波",sp_name:"ball_red",icon:"1126",TGroup:TGroup.Enemy,readyAnm:"",endAnm:"",act:"atk",
DTType:DTType.single,ap:100,hit_count:1,hitcd:0.3,speed:720,with:90,ready:0,EAnm:0,DAnm:"", DTType:DTType.single,ap:100,hit_count:1,hitcd:0.3,speed:720,with:90,ready:0,EAnm:0,DAnm:"",
RType:RType.linear,EType:EType.collision,buffs:[],info:"对单个目标造成100%攻击的伤害", RType:RType.linear,EType:EType.collision,buffs:[],info:"对单个目标造成100%攻击的伤害",
}, },
//大招
6204: { 6204: {
uuid:6204,name:"火球",sp_name:"ball_fire",icon:"1126",TGroup:TGroup.Enemy,readyAnm:"",endAnm:"",act:"atk", uuid:6204,name:"火球",sp_name:"ball_fire",icon:"1126",TGroup:TGroup.Enemy,readyAnm:"reds",endAnm:"",act:"atk",
DTType:DTType.single,bck:20,ap:100,hit_count:1,hitcd:0.3,speed:720,with:90,ready:0,EAnm:0,DAnm:"", DTType:DTType.single,bck:20,ap:100,hit_count:1,hitcd:0.3,speed:720,with:90,ready:0,EAnm:0,DAnm:"",
RType:RType.linear,EType:EType.collision,buffs:[],info:"对单个目标造成100%攻击的伤害,击退率20%", RType:RType.linear,EType:EType.collision,buffs:[],info:"对单个目标造成100%攻击的伤害,击退率20%",
}, },
6205: { 6205: {
uuid:6205,name:"月波",sp_name:"ball_gquan",icon:"1126",TGroup:TGroup.Enemy,readyAnm:"",endAnm:"",act:"atk", uuid:6205,name:"月波",sp_name:"ball_gquan",icon:"1126",TGroup:TGroup.Enemy,readyAnm:"blues",endAnm:"",act:"atk",
DTType:DTType.single,ap:200,hit_count:6,hitcd:0.3,speed:300,with:90,ready:0,EAnm:0,DAnm:"", DTType:DTType.single,ap:200,hit_count:6,hitcd:0.3,speed:300,with:90,ready:0,EAnm:0,DAnm:"",
RType:RType.linear,EType:EType.collision,buffs:[],info:"对多个目标造成200%攻击的伤害", RType:RType.linear,EType:EType.collision,buffs:[],info:"对多个目标造成200%攻击的伤害",
}, },
@@ -243,7 +246,7 @@ export const SkillSet: Record<number, SkillConfig> = {
RType:RType.fixed,EType:EType.animationEnd,buffs:[],info:"多次对多个目标造成150%攻击的伤害,暴击率20%", RType:RType.fixed,EType:EType.animationEnd,buffs:[],info:"多次对多个目标造成150%攻击的伤害,暴击率20%",
}, },
6207: { 6207: {
uuid:6207,name:"冰刺",sp_name:"atk_fire",icon:"1173",TGroup:TGroup.Enemy,readyAnm:"reds",endAnm:"",act:"max", uuid:6207,name:"冰刺",sp_name:"atk_fire",icon:"1173",TGroup:TGroup.Enemy,readyAnm:"blues",endAnm:"",act:"max",
DTType:DTType.range,frz:20,ap:100,hit_count:6,hitcd:0.2,speed:720,with:0,ready:0,EAnm:0,DAnm:"", DTType:DTType.range,frz:20,ap:100,hit_count:6,hitcd:0.2,speed:720,with:0,ready:0,EAnm:0,DAnm:"",
RType:RType.fixed,EType:EType.animationEnd,buffs:[],info:"多次对多个目标造成150%攻击的伤害,冰冻率20%", RType:RType.fixed,EType:EType.animationEnd,buffs:[],info:"多次对多个目标造成150%攻击的伤害,冰冻率20%",
}, },
@@ -255,7 +258,7 @@ export const SkillSet: Record<number, SkillConfig> = {
//============================= ====== 辅助技能 ====== ========================== //============================= ====== 辅助技能 ====== ==========================
6301:{ 6301:{
uuid:6301,name:"魔法盾",sp_name:"buff_wind",icon:"1255",TGroup:TGroup.Self,readyAnm:"",endAnm:"",act:"atk", uuid:6301,name:"魔法盾",sp_name:"buff_wind",icon:"1255",TGroup:TGroup.Self,readyAnm:"up_hp",endAnm:"",act:"atk",
DTType:DTType.single,kind:SkillKind.Shield,ap:300,hit_count:1,hitcd:0.2,speed:720,with:0,ready:0,EAnm:0,DAnm:"", DTType:DTType.single,kind:SkillKind.Shield,ap:300,hit_count:1,hitcd:0.2,speed:720,with:0,ready:0,EAnm:0,DAnm:"",
RType:RType.fixed,EType:EType.animationEnd,buffs:[],info:"获得300%攻击力的护盾", RType:RType.fixed,EType:EType.animationEnd,buffs:[],info:"获得300%攻击力的护盾",
}, },
@@ -265,7 +268,7 @@ export const SkillSet: Record<number, SkillConfig> = {
RType:RType.fixed,EType:EType.animationEnd,buffs:[],info:"治疗1个友方300%攻击力的生命值", RType:RType.fixed,EType:EType.animationEnd,buffs:[],info:"治疗1个友方300%攻击力的生命值",
}, },
6303:{ 6303:{
uuid:6303,name:"护盾",sp_name:"buff_wind",icon:"1255",TGroup:TGroup.Self,readyAnm:"",endAnm:"",act:"atk", uuid:6303,name:"护盾",sp_name:"buff_wind",icon:"1255",TGroup:TGroup.Self,readyAnm:"up_hp",endAnm:"",act:"atk",
DTType:DTType.single,kind:SkillKind.Shield,ap:300,hit_count:1,hitcd:0.2,speed:720,with:0,ready:0,EAnm:0,DAnm:"", DTType:DTType.single,kind:SkillKind.Shield,ap:300,hit_count:1,hitcd:0.2,speed:720,with:0,ready:0,EAnm:0,DAnm:"",
RType:RType.fixed,EType:EType.animationEnd,buffs:[],info:"随机1个友方获得300%攻击力的护盾", RType:RType.fixed,EType:EType.animationEnd,buffs:[],info:"随机1个友方获得300%攻击力的护盾",
}, },
@@ -275,38 +278,38 @@ export const SkillSet: Record<number, SkillConfig> = {
RType:RType.fixed,EType:EType.animationEnd,buffs:[],info:"随机治疗3个友方200%攻击力的生命值", RType:RType.fixed,EType:EType.animationEnd,buffs:[],info:"随机治疗3个友方200%攻击力的生命值",
}, },
6305:{ 6305:{
uuid:6305,name:"群体护盾",sp_name:"buff_wind",icon:"1255",TGroup:TGroup.Team,readyAnm:"",endAnm:"",act:"atk", uuid:6305,name:"群体护盾",sp_name:"buff_wind",icon:"1255",TGroup:TGroup.Team,readyAnm:"up_hp",endAnm:"",act:"atk",
DTType:DTType.single,kind:SkillKind.Shield,ap:200,hit_count:3,hitcd:0.2,speed:720,with:0,ready:0,EAnm:0,DAnm:"", DTType:DTType.single,kind:SkillKind.Shield,ap:200,hit_count:3,hitcd:0.2,speed:720,with:0,ready:0,EAnm:0,DAnm:"",
RType:RType.fixed,EType:EType.animationEnd,buffs:[],info:"随机3个友方获得200%攻击力的护盾", RType:RType.fixed,EType:EType.animationEnd,buffs:[],info:"随机3个友方获得200%攻击力的护盾",
}, },
//==========================buff 技能===================== //==========================buff 技能=====================
6401:{ 6401:{
uuid:6401,name:"单体攻击",sp_name:"buff_wind",icon:"1255",TGroup:TGroup.Team,readyAnm:"",endAnm:"",act:"atk", uuid:6401,name:"单体攻击",sp_name:"buff_wind",icon:"1255",TGroup:TGroup.Team,readyAnm:"ap_up",endAnm:"",act:"atk",
DTType:DTType.single,kind:SkillKind.Support,ap:0,hit_count:1,hitcd:0.2,speed:720,with:0,ready:0,EAnm:0,DAnm:"", DTType:DTType.single,kind:SkillKind.Support,ap:0,hit_count:1,hitcd:0.2,speed:720,with:0,ready:0,EAnm:0,DAnm:"",
RType:RType.fixed,EType:EType.animationEnd,buffs:[{buff:Attrs.ap,value:5}],info:"随机1个友方+5攻击", RType:RType.fixed,EType:EType.animationEnd,buffs:[{buff:Attrs.ap,value:5}],info:"随机1个友方+5攻击",
}, },
6402:{ 6402:{
uuid:6402,name:"单体生命",sp_name:"buff_wind",icon:"1255",TGroup:TGroup.Team,readyAnm:"",endAnm:"",act:"atk", uuid:6402,name:"单体生命",sp_name:"buff_wind",icon:"1255",TGroup:TGroup.Team,readyAnm:"up_hp",endAnm:"",act:"atk",
DTType:DTType.single,kind:SkillKind.Support,ap:0,hit_count:1,hitcd:0.2,speed:720,with:0,ready:0,EAnm:0,DAnm:"", DTType:DTType.single,kind:SkillKind.Support,ap:0,hit_count:1,hitcd:0.2,speed:720,with:0,ready:0,EAnm:0,DAnm:"",
RType:RType.fixed,EType:EType.animationEnd,buffs:[{buff:Attrs.hp_max,value:20}],info:"随机1个友方+20最大生命值", RType:RType.fixed,EType:EType.animationEnd,buffs:[{buff:Attrs.hp_max,value:20}],info:"随机1个友方+20最大生命值",
}, },
6403:{ 6403:{
uuid:6403,name:"单体全能",sp_name:"buff_wind",icon:"1255",TGroup:TGroup.Team,readyAnm:"",endAnm:"",act:"atk", uuid:6403,name:"单体全能",sp_name:"buff_wind",icon:"1255",TGroup:TGroup.Team,readyAnm:"up_hp",endAnm:"",act:"atk",
DTType:DTType.single,kind:SkillKind.Support,ap:0,hit_count:1,hitcd:0.2,speed:720,with:0,ready:0,EAnm:0,DAnm:"", DTType:DTType.single,kind:SkillKind.Support,ap:0,hit_count:1,hitcd:0.2,speed:720,with:0,ready:0,EAnm:0,DAnm:"",
RType:RType.fixed,EType:EType.animationEnd,buffs:[{buff:Attrs.ap,value:5},{buff:Attrs.hp_max,value:20}],info:"随机1个友方+2攻击,+10最大生命值", RType:RType.fixed,EType:EType.animationEnd,buffs:[{buff:Attrs.ap,value:5},{buff:Attrs.hp_max,value:20}],info:"随机1个友方+2攻击,+10最大生命值",
}, },
6404:{ 6404:{
uuid:6404,name:"群体攻击",sp_name:"buff_wind",icon:"1255",TGroup:TGroup.Team,readyAnm:"",endAnm:"",act:"atk", uuid:6404,name:"群体攻击",sp_name:"buff_wind",icon:"1255",TGroup:TGroup.Team,readyAnm:"ap_up",endAnm:"",act:"atk",
DTType:DTType.single,kind:SkillKind.Support,ap:0,hit_count:3,hitcd:0.2,speed:720,with:0,ready:0,EAnm:0,DAnm:"", DTType:DTType.single,kind:SkillKind.Support,ap:0,hit_count:3,hitcd:0.2,speed:720,with:0,ready:0,EAnm:0,DAnm:"",
RType:RType.fixed,EType:EType.animationEnd,buffs:[{buff:Attrs.ap,value:2}],info:"随机3个友方+2攻击", RType:RType.fixed,EType:EType.animationEnd,buffs:[{buff:Attrs.ap,value:2}],info:"随机3个友方+2攻击",
}, },
6405:{ 6405:{
uuid:6405,name:"群体生命",sp_name:"buff_wind",icon:"1255",TGroup:TGroup.Team,readyAnm:"",endAnm:"",act:"atk", uuid:6405,name:"群体生命",sp_name:"buff_wind",icon:"1255",TGroup:TGroup.Team,readyAnm:"up_hp",endAnm:"",act:"atk",
DTType:DTType.single,kind:SkillKind.Support,ap:0,hit_count:3,hitcd:0.2,speed:720,with:0,ready:0,EAnm:0,DAnm:"", DTType:DTType.single,kind:SkillKind.Support,ap:0,hit_count:3,hitcd:0.2,speed:720,with:0,ready:0,EAnm:0,DAnm:"",
RType:RType.fixed,EType:EType.animationEnd,buffs:[{buff:Attrs.hp_max,value:10}],info:"随机3个友方+10最大生命值", RType:RType.fixed,EType:EType.animationEnd,buffs:[{buff:Attrs.hp_max,value:10}],info:"随机3个友方+10最大生命值",
}, },
6406:{ 6406:{
uuid:6406,name:"群体全能",sp_name:"buff_wind",icon:"1255",TGroup:TGroup.Team,readyAnm:"",endAnm:"",act:"atk", uuid:6406,name:"群体全能",sp_name:"buff_wind",icon:"1255",TGroup:TGroup.Team,readyAnm:"ap_up",endAnm:"",act:"atk",
DTType:DTType.single,kind:SkillKind.Support,ap:0,hit_count:3,hitcd:0.2,speed:720,with:0,ready:0,EAnm:0,DAnm:"", DTType:DTType.single,kind:SkillKind.Support,ap:0,hit_count:3,hitcd:0.2,speed:720,with:0,ready:0,EAnm:0,DAnm:"",
RType:RType.fixed,EType:EType.animationEnd,buffs:[{buff:Attrs.ap,value:2},{buff:Attrs.hp_max,value:10}],info:"随机3个友方+2攻击,+10最大生命值", RType:RType.fixed,EType:EType.animationEnd,buffs:[{buff:Attrs.ap,value:2},{buff:Attrs.hp_max,value:10}],info:"随机3个友方+2攻击,+10最大生命值",
}, },

View File

@@ -1,6 +1,5 @@
import { v3 } from "cc" import { v3 } from "cc"
import { BoxSet, FacSet } from "./GameSet" import { BoxSet, FacSet } from "./GameSet"
import { SkillSet } from "./SkillSet";
export enum HType { export enum HType {
Melee = 0, Melee = 0,
@@ -86,12 +85,12 @@ export interface HSkillInfo {
* skills[0]是普通攻击技能 * skills[0]是普通攻击技能
* skills[1]是等级1时的技能,skills[2]是等级2时的技能,skills[3]是等级3时的技能,最多3级 * skills[1]是等级1时的技能,skills[2]是等级2时的技能,skills[3]是等级3时的技能,最多3级
* *
* 属性基准(cards_lv:1,lv:1) SPEED:120,AP:30 |HP:300|as:1 * 属性基准(cards_lv:1,lv:1) SPEED:120,AP:30 | HP:300 | skills[0].cd=1
* 坦克(cards_lv:1,lv:1) SPEED:180,AP:25 |HP:450|as:0.75 * 坦克(cards_lv:1,lv:1) SPEED:180,AP:25 | HP:450 | skills[0].cd=0.75
* 近战dps(cards_lv:1,lv:1) SPEED:180,AP:50 |HP:250|as:1.1 * 近战dps(cards_lv:1,lv:1) SPEED:180,AP:50 | HP:250 | skills[0].cd=1.1
* 远程dps(cards_lv:1,lv:1) SPEED:120,AP:60 |HP:150|as:1.3 * 远程dps(cards_lv:1,lv:1) SPEED:120,AP:60 | HP:150 | skills[0].cd=1.3
*远程法dps(cards_lv:1,lv:1) SPEED:100,AP:60 |HP:150|as:1.4 *远程法dps(cards_lv:1,lv:1) SPEED:100,AP:60 | HP:150 | skills[0].cd=1.4
* 远程辅助(cards_lv:1,lv:1) SPEED:100,AP:20 |HP:150|as:1 * 远程辅助(cards_lv:1,lv:1) SPEED:100,AP:20 | HP:150 | skills[0].cd=1
*/ */
export const HeroInfo: Record<number, heroInfo> = { export const HeroInfo: Record<number, heroInfo> = {
@@ -110,34 +109,34 @@ export const HeroInfo: Record<number, heroInfo> = {
// ========== 法师英雄 ========== // ========== 法师英雄 ==========
5101:{uuid:5101,name:"奥术法师",path:"hm2", fac:FacSet.HERO,cards_lv:1,lv:1,type:HType.Long,hp:150,ap:60,speed:100, 5101:{uuid:5101,name:"奥术法师",path:"hm2", fac:FacSet.HERO,cards_lv:1,lv:1,type:HType.Long,hp:150,ap:60,speed:100,
skills:{6005:{uuid:6005,lv:1,cd:1.4,ccd:0},6012:{uuid:6012,lv:1,cd:5,ccd:0}},info:"冰球,冰锥 远法dps"}, skills:{6201:{uuid:6201,lv:1,cd:1.4,ccd:0},6012:{uuid:6012,lv:1,cd:5,ccd:0}},info:"冰球,冰锥 远法dps"},
5102:{uuid:5012,name:"火焰法师",path:"hm1", fac:FacSet.HERO,cards_lv:2,lv:1,type:HType.Long,hp:300,ap:120,speed:100, 5102:{uuid:5012,name:"火焰法师",path:"hm1", fac:FacSet.HERO,cards_lv:2,lv:1,type:HType.Long,hp:300,ap:120,speed:100,
skills:{6004:{uuid:6004,lv:1,cd:1.4,ccd:0},6013:{uuid:6013,lv:1,cd:5,ccd:0}},info:"火击,火球 远法dps"}, skills:{6203:{uuid:6203,lv:1,cd:1.4,ccd:0},6013:{uuid:6013,lv:1,cd:5,ccd:0}},info:"火击,火球 远法dps"},
5103:{uuid:5013,name:"冰法法师",path:"hm4", fac:FacSet.HERO,cards_lv:3,lv:1,type:HType.Long,hp:450,ap:180,speed:100, 5103:{uuid:5013,name:"冰法法师",path:"hm4", fac:FacSet.HERO,cards_lv:3,lv:1,type:HType.Long,hp:450,ap:180,speed:100,
skills:{6003:{uuid:6003,lv:1,cd:1.4,ccd:0},6012:{uuid:6012,lv:1,cd:5,ccd:0}},info:"冰击,冰锥 远法dps"}, skills:{6201:{uuid:6201,lv:1,cd:1.4,ccd:0},6012:{uuid:6012,lv:1,cd:5,ccd:0}},info:"冰击,冰锥 远法dps"},
5104:{uuid:5104,name:"寒霜术士",path:"hm4", fac:FacSet.HERO,cards_lv:4,lv:1,type:HType.Long,hp:600,ap:240,speed:100, 5104:{uuid:5104,name:"寒霜术士",path:"hm4", fac:FacSet.HERO,cards_lv:4,lv:1,type:HType.Long,hp:600,ap:240,speed:100,
skills:{6012:{uuid:6012,lv:1,cd:1.4,ccd:0},6202:{uuid:6202,lv:1,cd:5,ccd:0}},info:"冰锥,冰刺 远法dps"}, skills:{6201:{uuid:6201,lv:1,cd:1.4,ccd:0},6202:{uuid:6202,lv:1,cd:5,ccd:0}},info:"冰锥,冰刺 远法dps"},
5105:{uuid:5105,name:"炎爆法师",path:"hm3", fac:FacSet.HERO,cards_lv:5,lv:1,type:HType.Long,hp:750,ap:300,speed:100, 5105:{uuid:5105,name:"炎爆法师",path:"hm3", fac:FacSet.HERO,cards_lv:5,lv:1,type:HType.Long,hp:750,ap:300,speed:100,
skills:{6013:{uuid:6013,lv:1,cd:1.4,ccd:0},6201:{uuid:6201,lv:1,cd:5,ccd:0}},info:"火球,陨石术 远法dps" }, skills:{6203:{uuid:6203,lv:1,cd:1.4,ccd:0},6201:{uuid:6201,lv:1,cd:5,ccd:0}},info:"火球,陨石术 远法dps" },
// ========== 远程英雄 ========== // ========== 远程英雄 ==========
5201:{uuid:5201,name:"射手",path:"ha1", fac:FacSet.HERO,cards_lv:1,lv:1,type:HType.Long,hp:150,ap:60,speed:120, 5201:{uuid:5201,name:"射手",path:"ha1", fac:FacSet.HERO,cards_lv:1,lv:1,type:HType.Long,hp:150,ap:60,speed:120,
skills:{6002:{uuid:6002,lv:1,cd:1.3,ccd:0},6011:{uuid:6011,lv:1,cd:5,ccd:0}},info:"普通射击,暴射 远dps"}, skills:{6101:{uuid:6101,lv:1,cd:1.3,ccd:0},6011:{uuid:6011,lv:1,cd:5,ccd:0}},info:"普通射击,暴射 远dps"},
5202:{uuid:5202,name:"游侠",path:"ha2", fac:FacSet.HERO,cards_lv:3,lv:1,type:HType.Long,hp:450,ap:180,speed:120, 5202:{uuid:5202,name:"游侠",path:"ha2", fac:FacSet.HERO,cards_lv:3,lv:1,type:HType.Long,hp:450,ap:180,speed:120,
skills:{6011:{uuid:6011,lv:1,cd:1.3,ccd:0},6101:{uuid:6101,lv:1,cd:5,ccd:0}},info:"暴射,光箭 远dps"}, skills:{6011:{uuid:6101,lv:1,cd:1.3,ccd:0},6101:{uuid:6101,lv:1,cd:5,ccd:0}},info:"暴射,光箭 远dps"},
// ========== 腐竹英雄 ========== // ========== 腐竹英雄 ==========
5301:{uuid:5301,name:"牧师",path:"hh1", fac:FacSet.HERO,cards_lv:1,lv:1,type:HType.Long,hp:150,ap:20,speed:100, 5301:{uuid:5301,name:"牧师",path:"hh1", fac:FacSet.HERO,cards_lv:1,lv:1,type:HType.Long,hp:150,ap:20,speed:100,
skills:{6012:{uuid:6012,lv:1,cd:1,ccd:0},6302:{uuid:6302,lv:1,cd:5,ccd:0}},info:"冰锥1,治疗 远辅助" }, skills:{6202:{uuid:6202,lv:1,cd:1,ccd:0},6302:{uuid:6302,lv:1,cd:5,ccd:0}},info:"冰锥1,治疗 远辅助" },
5302:{uuid:5302,name:"战地医师",path:"hz1", fac:FacSet.HERO,cards_lv:2,lv:1,type:HType.Mid,hp:300,ap:40,speed:100, 5302:{uuid:5302,name:"战地医师",path:"hz1", fac:FacSet.HERO,cards_lv:2,lv:1,type:HType.Mid,hp:300,ap:40,speed:100,
skills:{6012:{uuid:6012,lv:1,cd:1,ccd:0},6304:{uuid:6304,lv:1,cd:5,ccd:0}},info:"冰锥1,群体治疗 远辅助"}, skills:{6202:{uuid:6202,lv:1,cd:1,ccd:0},6304:{uuid:6304,lv:1,cd:5,ccd:0}},info:"冰锥1,群体治疗 远辅助"},
5303:{uuid:5303,name:"守护祭司",path:"ha3", fac:FacSet.HERO,cards_lv:4,lv:1,type:HType.Mid,hp:600,ap:80,speed:100, 5303:{uuid:5303,name:"守护祭司",path:"ha3", fac:FacSet.HERO,cards_lv:4,lv:1,type:HType.Mid,hp:600,ap:80,speed:100,
skills:{6002:{uuid:6002,lv:1,cd:1,ccd:0},6004:{uuid:6004,lv:1,cd:5,ccd:0}},info:"普通射击,单体攻击buff 射手辅助"}, skills:{6202:{uuid:6202,lv:1,cd:1,ccd:0},6004:{uuid:6004,lv:1,cd:5,ccd:0}},info:"普通射击,单体攻击buff 射手辅助"},
5304:{uuid:5304,name:"秘法精灵",path:"ha3", fac:FacSet.HERO,cards_lv:6,lv:1,type:HType.Long,hp:900,ap:120,speed:100, 5304:{uuid:5304,name:"秘法精灵",path:"ha3", fac:FacSet.HERO,cards_lv:6,lv:1,type:HType.Long,hp:900,ap:120,speed:100,
skills:{6002:{uuid:6002,lv:1,cd:1,ccd:0},6105:{uuid:6105,lv:1,cd:5,ccd:0}},info:"普通射击,群体攻击buff 射手辅助"}, skills:{6202:{uuid:6202,lv:1,cd:1,ccd:0},6105:{uuid:6105,lv:1,cd:5,ccd:0}},info:"普通射击,群体攻击buff 射手辅助"},
@@ -154,21 +153,19 @@ export const HeroInfo: Record<number, heroInfo> = {
*/ */
//============== 兽人系列 =============== //============== 兽人系列 ===============
// 1. 基础近战型 // 近战型
6001:{uuid:6001,name:"兽人战士",path:"mo1", fac:FacSet.MON,cards_lv:1,lv:1,type:HType.Melee,hp:120,ap:12,speed:180,skills:{6001:{uuid:6001,lv:1,cd:0.65,ccd:0},6003:{uuid:6003,lv:1,cd:10,ccd:0}},info:""}, 6001:{uuid:6001,name:"兽人战士",path:"mo1", fac:FacSet.MON,cards_lv:1,lv:1,type:HType.Melee,hp:120,ap:12,speed:120,
// 2. 快速突击型 skills:{6001:{uuid:6001,lv:1,cd:0.65,ccd:0},6003:{uuid:6003,lv:1,cd:10,ccd:0}},info:""},
6002:{uuid:6002,name:"兽人斥候",path:"mo1", fac:FacSet.MON,cards_lv:1,lv:1,type:HType.Melee,hp:120,ap:12,speed:180,skills:{6001:{uuid:6001,lv:1,cd:0.65,ccd:0},6003:{uuid:6003,lv:1,cd:10,ccd:0}},info:""}, 6003:{uuid:6003,name:"兽人卫士",path:"mo4", fac:FacSet.MON,cards_lv:1,lv:1,type:HType.Melee,hp:350,ap:30,speed:120,
// 3. 重型坦克型 skills:{6001:{uuid:6001,lv:1,cd:2,ccd:0},6003:{uuid:6003,lv:1,cd:10,ccd:0}},info:""},
6003:{uuid:6003,name:"兽人卫士",path:"mo3", fac:FacSet.MON,cards_lv:1,lv:1,type:HType.Melee,hp:350,ap:30,speed:120,skills:{6001:{uuid:6001,lv:1,cd:2,ccd:0},6003:{uuid:6003,lv:1,cd:10,ccd:0}},info:""}, // 4. 远程
6004:{uuid:6004,name:"兽人射手",path:"mo2", fac:FacSet.MON,cards_lv:1,lv:1,type:HType.Long,hp:80,ap:45,speed:80,
// 4. 远程骚扰型 skills:{6001:{uuid:6001,lv:1,cd:1.5,ccd:0},6003:{uuid:6003,lv:1,cd:10,ccd:0}},info:""},
6004:{uuid:6004,name:"兽人射手",path:"mo1", fac:FacSet.MON,cards_lv:1,lv:1,type:HType.Long,hp:80,ap:45,speed:80,skills:{6001:{uuid:6001,lv:1,cd:1.5,ccd:0},6003:{uuid:6003,lv:1,cd:10,ccd:0}},info:""}, 6005:{uuid:6005,name:"兽人法师",path:"mo5", fac:FacSet.MON,cards_lv:1,lv:1,type:HType.Melee,hp:80,ap:20,speed:80,
skills:{6001:{uuid:6001,lv:1,cd:1,ccd:0},6003:{uuid:6003,lv:1,cd:10,ccd:0}},info:""},
// 5. 特殊机制型
6005:{uuid:6005,name:"兽人自爆兵",path:"mo1", fac:FacSet.MON,cards_lv:1,lv:1,type:HType.Melee,hp:120,ap:12,speed:180,skills:{6001:{uuid:6001,lv:1,cd:0.65,ccd:0},6003:{uuid:6003,lv:1,cd:10,ccd:0}},info:""},
6006:{uuid:6006,name:"兽人召唤师",path:"mo1", fac:FacSet.MON,cards_lv:1,lv:1,type:HType.Melee,hp:80,ap:20,speed:80,skills:{6001:{uuid:6001,lv:1,cd:1,ccd:0},6003:{uuid:6003,lv:1,cd:10,ccd:0}},info:""},
6007:{uuid:6007,name:"兽人祭司",path:"mo1", fac:FacSet.MON,cards_lv:1,lv:1,type:HType.Melee,hp:80,ap:20,speed:80,skills:{6001:{uuid:6001,lv:1,cd:1,ccd:0},6003:{uuid:6003,lv:1,cd:10,ccd:0}},info:""},
6008:{uuid:6008,name:"兽人图腾师",path:"mo1", fac:FacSet.MON,cards_lv:1,lv:1,type:HType.Melee,hp:80,ap:20,speed:80,skills:{6001:{uuid:6001,lv:1,cd:1,ccd:0},6003:{uuid:6003,lv:1,cd:10,ccd:0}},info:""},
// 6. 精英/BOSS型 // 6. 精英/BOSS型
6009:{uuid:6009,name:"兽人首领(BOSS)",path:"mo4", fac:FacSet.MON,cards_lv:1,lv:1,type:HType.Melee,hp:1500,ap:20,speed:100,skills:{6002:{uuid:6002,lv:1,cd:1,ccd:0},6004:{uuid:6004,lv:1,cd:10,ccd:0}},info:""}, 6002:{uuid:6002,name:"兽人斥候",path:"mo3", fac:FacSet.MON,cards_lv:1,lv:1,type:HType.Melee,hp:120,ap:12,speed:180,
skills:{6001:{uuid:6001,lv:1,cd:0.65,ccd:0},6003:{uuid:6003,lv:1,cd:10,ccd:0}},info:""},
6006:{uuid:6006,name:"兽人首领(BOSS)",path:"mo6", fac:FacSet.MON,cards_lv:1,lv:1,type:HType.Melee,hp:1500,ap:20,speed:100,
skills:{6002:{uuid:6002,lv:1,cd:1,ccd:0},6004:{uuid:6004,lv:1,cd:10,ccd:0}},info:""},
}; };

View File

@@ -10,14 +10,20 @@ import { GameEvent } from "../common/config/GameEvent";
import { Attrs} from "../common/config/HeroAttrs"; import { Attrs} from "../common/config/HeroAttrs";
import { MoveComp } from "./MoveComp"; import { MoveComp } from "./MoveComp";
import { mLogger } from "../common/Logger"; import { mLogger } from "../common/Logger";
/** 角色实体 */ /** 英雄实体:负责英雄节点创建、属性初始化、入场动画与销毁流程 */
@ecs.register(`Hero`) @ecs.register(`Hero`)
export class Hero extends ecs.Entity { export class Hero extends ecs.Entity {
/** 英雄数据组件引用 */
HeroModel!: HeroAttrsComp; HeroModel!: HeroAttrsComp;
/** 英雄表现组件引用 */
View!: HeroViewComp; View!: HeroViewComp;
/** 英雄移动组件引用 */
HeroMove!: MoveComp; HeroMove!: MoveComp;
debugMode: boolean = false; // 是否启用调试模式 /** 调试开关,开启后输出实体层级等调试信息 */
debugMode: boolean = false;
/** 注册实体必需组件:移动 + 属性 */
protected init() { protected init() {
this.addComponents<ecs.Comp>( this.addComponents<ecs.Comp>(
MoveComp, MoveComp,
@@ -25,88 +31,111 @@ export class Hero extends ecs.Entity {
); );
} }
/** 销毁实体并释放视图节点,防止残留碰撞体与显示对象 */
destroy(): void { destroy(): void {
// 销毁节点,防止视觉残留 // 优先销毁节点,避免实体销毁后场景仍残留可见对象
const view = this.get(HeroViewComp); const view = this.get(HeroViewComp);
if (view && view.node && view.node.isValid) { if (view && view.node && view.node.isValid) {
view.node.destroy(); view.node.destroy();
} }
// 手动移除组件,确保 ecs 侧引用及时释放
this.remove(HeroViewComp); this.remove(HeroViewComp);
this.remove(HeroAttrsComp); this.remove(HeroAttrsComp);
super.destroy(); super.destroy();
} }
/** 加载角色 */ /**
* 加载并初始化英雄
* 1) 创建节点并挂到 HERO 层
* 2) 初始化表现与属性数据
* 3) 播放下落入场并在落地后启用碰撞与移动
*/
load(pos: Vec3 = Vec3.ZERO,scale:number = 1,uuid:number=1001, dropToY:number = pos.y,hero_lv:number=1) { load(pos: Vec3 = Vec3.ZERO,scale:number = 1,uuid:number=1001, dropToY:number = pos.y,hero_lv:number=1) {
// 英雄始终朝右,表现缩放固定为正向
scale = 1 scale = 1
// 英雄等级在当前规则下上限为 3避免超配表范围
if(hero_lv>3) hero_lv=3 if(hero_lv>3) hero_lv=3
// 查找空闲英雄槽位 // 英雄尺寸随等级做轻量放大,强化成长反馈
let size=1+0.1*hero_lv let size=1+0.1*hero_lv
// 根据配置路径加载英雄预制体
var path = "game/heros/"+HeroInfo[uuid].path; var path = "game/heros/"+HeroInfo[uuid].path;
var prefab: Prefab = oops.res.get(path, Prefab)!; var prefab: Prefab = oops.res.get(path, Prefab)!;
var node = instantiate(prefab); var node = instantiate(prefab);
var scene = smc.map.MapView.scene; var scene = smc.map.MapView.scene;
// 统一挂到实体显示层 HERO 节点下
node.parent = scene.entityLayer!.node!.getChildByName("HERO")!; node.parent = scene.entityLayer!.node!.getChildByName("HERO")!;
const collider = node.getComponent(BoxCollider2D); const collider = node.getComponent(BoxCollider2D);
if (collider) collider.enabled = false; // 先禁用 // 入场过程暂不参与碰撞,防止半空触发战斗逻辑
if (collider) collider.enabled = false;
node.setScale(size*node.scale.x,size*node.scale.y); node.setScale(size*node.scale.x,size*node.scale.y);
node.setPosition(pos) node.setPosition(pos)
// 🔥 设置初始 SiblingIndex - 英雄基础层级 + 位置偏移 // 输出节点层级信息,便于排查遮挡与渲染顺序问题
mLogger.log(this.debugMode,"hero",node.getSiblingIndex()); mLogger.log(this.debugMode,"hero",node.getSiblingIndex());
var hv = node.getComponent(HeroViewComp)!; var hv = node.getComponent(HeroViewComp)!;
const model = this.get(HeroAttrsComp); const model = this.get(HeroAttrsComp);
let hero = HeroInfo[uuid]; // 共用英雄数据 // 从配置中读取英雄静态数据
let hero = HeroInfo[uuid];
// 设置 View 层属性(表现相关) // 视图层参数:朝向与碰撞阵营
hv.scale = 1; hv.scale = 1;
hv.box_group = BoxSet.HERO; hv.box_group = BoxSet.HERO;
// 设置 Model 层属性(数据相关) // 模型层参数:身份、阵营、等级、职业
model.hero_uuid = uuid; model.hero_uuid = uuid;
model.hero_name = hero.name; model.hero_name = hero.name;
model.lv = hero_lv; model.lv = hero_lv;
model.type = hero.type; model.type = hero.type;
model.fac = FacSet.HERO; model.fac = FacSet.HERO;
// 只有主角才挂载天赋组件
// ✅ 初始化技能数据(迁移到 HeroSkillsComp // 基础属性按等级倍率初始化
// 设置基础属性
model.ap = hero.ap*model.lv; model.ap = hero.ap*model.lv;
model.hp= model.hp_max = hero.hp*model.lv; model.hp= model.hp_max = hero.hp*model.lv;
model.speed = hero.speed; model.speed = hero.speed;
// 构建技能表并注入运行时冷却字段 ccd
model.skills = {}; model.skills = {};
for (const key in hero.skills) { for (const key in hero.skills) {
const skill = hero.skills[key]; const skill = hero.skills[key];
if (!skill) continue; if (!skill) continue;
//用于增量 计算最终技能等级英雄等级与技能初始等级均从1开始需各减1抵消故-2 // 最终技能等级 = 初始技能等级 + 英雄等级增量,且下限为 0
model.skills[skill.uuid] = { ...skill, lv: skill.lv + hero_lv - 2, ccd: skill.cd }; model.skills[skill.uuid] = { ...skill, lv: Math.max(0,skill.lv + hero_lv - 2), ccd: 0 };
} }
// 缓存技能射程等派生数据,减少战斗帧内重复计算
model.updateSkillDistanceCache(); model.updateSkillDistanceCache();
// 初始化 buff/debuff 系统 // 初始化属性系统(buff/debuff 等动态属性容器)
model.initAttrs(); model.initAttrs();
// 将视图组件注册到实体,打通逻辑与表现
this.add(hv); this.add(hv);
// 广播主角召唤事件,触发外部系统监听逻辑
oops.message.dispatchEvent(GameEvent.MasterCalled,{uuid:uuid}) oops.message.dispatchEvent(GameEvent.MasterCalled,{uuid:uuid})
// 初始化移动组件:方向、目标 X、站位基准 Y
const move = this.get(MoveComp); const move = this.get(MoveComp);
move.direction = 1; // 向右移动 move.direction = 1;
move.targetX = resolveFormationTargetX(model.fac, model.type); move.targetX = resolveFormationTargetX(model.fac, model.type);
move.baseY = dropToY; move.baseY = dropToY;
move.moving = false; move.moving = false;
// 依据下落距离自适应入场时长,保证手感稳定
const dropDistance = Math.abs(pos.y - dropToY); const dropDistance = Math.abs(pos.y - dropToY);
const dropDuration = Math.max(0.18, Math.min(0.38, dropDistance / 1200)); const dropDuration = Math.max(0.18, Math.min(0.38, dropDistance / 1200));
// 停止旧动画后执行下落 tween避免复用节点时动画叠加
Tween.stopAllByTarget(node); Tween.stopAllByTarget(node);
tween(node) tween(node)
.to(dropDuration, { position: v3(pos.x, dropToY, 0) }) .to(dropDuration, { position: v3(pos.x, dropToY, 0) })
.call(() => { .call(() => {
if (!node || !node.isValid) return; if (!node || !node.isValid) return;
// 落地后锁定最终位置,切换到落地完成状态
node.setPosition(pos.x, dropToY, 0); node.setPosition(pos.x, dropToY, 0);
hv.playEnd("down"); hv.playEnd("down");
move.moving = true; move.moving = true;
// 落地后再启用碰撞,避免空中阶段触发伤害结算
if (collider) { if (collider) {
collider.enabled = true; collider.enabled = true;
collider.group = BoxSet.HERO; collider.group = BoxSet.HERO;
@@ -114,41 +143,54 @@ export class Hero extends ecs.Entity {
} }
}) })
.start(); .start();
// 维护关卡内英雄数量统计
smc.vmdata.mission_data.hero_num++ smc.vmdata.mission_data.hero_num++
} }
/** 重置入口:复用 destroy 的释放流程 */
reset() { reset() {
// 注: 自定义释放逻辑,视图层实现 ecs.IComp 接口的 ecs 组件需要手动释放
super.destroy(); super.destroy();
} }
} }
@ecs.register('HeroLifecycleSystem') /** 统一生命周期系统:按 fac 区分英雄与怪物并输出日志 */
export class HeroLifecycleSystem extends ecs.ComblockSystem @ecs.register('BattleEntityLifecycleSystem')
export class BattleEntityLifecycleSystem extends ecs.ComblockSystem
implements ecs.IEntityEnterSystem, ecs.IEntityRemoveSystem { implements ecs.IEntityEnterSystem, ecs.IEntityRemoveSystem {
/** 仅处理拥有 MoveComp 的实体 */
filter() { filter() {
return ecs.allOf(MoveComp); return ecs.allOf(MoveComp);
} }
/** 基于阵营生成日志名称 */
private resolveLabel(heroAttrs: HeroAttrsComp | null) {
if (!heroAttrs) return "未知";
if (heroAttrs.fac === FacSet.HERO) return "英雄";
if (heroAttrs.fac === FacSet.MON) return "怪物";
return "未知";
}
/** 实体进入世界时记录日志 */
entityEnter(e: ecs.Entity): void { entityEnter(e: ecs.Entity): void {
// 英雄实体创建时的特殊处理
const heroAttrs = e.get(HeroAttrsComp); const heroAttrs = e.get(HeroAttrsComp);
const label = this.resolveLabel(heroAttrs);
if (heroAttrs) { if (heroAttrs) {
mLogger.log(heroAttrs.debugMode, 'HeroLifecycle', `英雄进入世界: ${heroAttrs.hero_name}`); mLogger.log(heroAttrs.debugMode, 'BattleEntityLifecycle', `${label}进入世界: ${heroAttrs.hero_name}`);
} else { } else {
mLogger.log(true, 'HeroLifecycle', `英雄进入世界: 实体ID ${e.eid}`); mLogger.log(true, 'BattleEntityLifecycle', `${label}进入世界: 实体ID ${e.eid}`);
} }
} }
/** 实体离开世界时记录日志 */
entityRemove(e: ecs.Entity): void { entityRemove(e: ecs.Entity): void {
// 英雄实体销毁时的清理工作
const heroAttrs = e.get(HeroAttrsComp); const heroAttrs = e.get(HeroAttrsComp);
const label = this.resolveLabel(heroAttrs);
if (heroAttrs) { if (heroAttrs) {
mLogger.log(heroAttrs.debugMode, 'HeroLifecycle', `英雄离开世界: ${heroAttrs.hero_name}`); mLogger.log(heroAttrs.debugMode, 'BattleEntityLifecycle', `${label}离开世界: ${heroAttrs.hero_name}`);
} else { } else {
mLogger.log(true, 'HeroLifecycle', `英雄离开世界: 实体ID ${e.eid}`); mLogger.log(true, 'BattleEntityLifecycle', `${label}离开世界: 实体ID ${e.eid}`);
} }
} }
} }

View File

@@ -139,8 +139,8 @@ export class HeroAttrsComp extends ecs.Comp {
return this.frost_end_time > 0 return this.frost_end_time > 0
} }
getSkillLevel(skillId: number): number { getSkillLevel(skillId: number): number {
if (!skillId) return 1; if (!skillId) return 0;
return this.skills[skillId]?.lv ?? 1; return this.skills[skillId]?.lv ?? 0;
} }
getSkillIds(): number[] { getSkillIds(): number[] {

View File

@@ -115,13 +115,12 @@ export class HeroViewComp extends CCComp {
private initUINodes() { private initUINodes() {
this.top_node = this.node.getChildByName("top"); this.top_node = this.node.getChildByName("top");
this.topOpacity = this.top_node.getComponent(UIOpacity) || this.top_node.addComponent(UIOpacity); this.topOpacity = this.top_node.getComponent(UIOpacity) || this.top_node.addComponent(UIOpacity);
this.top_node.setPosition(0, 90+this.model.lv*10, 0);
this.topBasePos = this.top_node.position.clone(); this.topBasePos = this.top_node.position.clone();
const hpNode = this.top_node.getChildByName("hp"); const hpNode = this.top_node.getChildByName("hp");
if(this.model.fac==FacSet.HERO){ if(this.model.fac==FacSet.HERO){
hpNode.getChildByName("Bar").getComponent(Sprite).color=new Color("#2ECC71") hpNode.getChildByName("Bar").getComponent(Sprite).color=new Color("#2ECC71")
} }
// let hp_y = this.node.getComponent(UITransform).height+10;
// this.top_node.setPosition(0, hp_y, 0);
} }
@@ -169,12 +168,11 @@ export class HeroViewComp extends CCComp {
/** 显示护盾 */ /** 显示护盾 */
private show_shield(shield: number = 0, shield_max: number = 0) { private show_shield(shield: number = 0, shield_max: number = 0) {
this.lastBarUpdateTime = Date.now() / 1000; this.lastBarUpdateTime = Date.now() / 1000;
if(!this.top_node.active) return
let shield_progress = shield / shield_max; let shield_progress = shield / shield_max;
this.node.getChildByName("shielded").active = shield > 0; this.node.getChildByName("shielded").active = shield > 0;
this.top_node.getChildByName("shield").active = shield > 0; this.top_node.getChildByName("shield").active = shield > 0;
this.top_node.getChildByName("shield").getComponent(ProgressBar).progress = shield_progress; this.top_node.getChildByName("shield").getComponent(ProgressBar).progress = shield_progress;
this.setTopBarOpacity(false);
} }
/** 显示血量 */ /** 显示血量 */
@@ -201,19 +199,24 @@ export class HeroViewComp extends CCComp {
} }
} }
private isFullHp(): boolean { private isFullHpAndNoShield(): boolean {
if (!this.model) return false; if (!this.model) return false;
if (this.model.hp_max <= 0) return false; if (this.model.hp_max <= 0) return false;
return this.model.hp >= this.model.hp_max; const isFullHp = this.model.hp >= this.model.hp_max;
const noShield = this.model.shield <= 0;
return isFullHp && noShield;
} }
private setTopBarOpacity(isActive: boolean) { private setTopBarOpacity(isActive: boolean) {
if (!this.topOpacity || !this.topOpacity.isValid) return; if (!this.top_node || !this.top_node.isValid) return;
if (isActive) { if (this.topOpacity) {
this.topOpacity.opacity = this.barActiveOpacity; this.topOpacity.opacity = this.barActiveOpacity;
}
if (isActive) {
this.top_node.active = true;
return; return;
} }
this.topOpacity.opacity = this.isFullHp() ? this.barIdleOpacity : this.barActiveOpacity; this.top_node.active = !this.isFullHpAndNoShield();
} }
private activateTopBar() { private activateTopBar() {
@@ -286,7 +289,7 @@ export class HeroViewComp extends CCComp {
// 起点设为怪物中心位置 + 20偏移 // 起点设为怪物中心位置 + 20偏移
let ny = this.node.position.y + halfHeight + 20; let ny = this.node.position.y + halfHeight + 20;
let pos = v3(x, ny, 0); let pos = v3(x, ny, 0);
Tooltip.load(pos, type, value, s_uuid, this.node.parent); Tooltip.load(pos, type, value, s_uuid, this.node.parent, 1, this.model?.fac ?? FacSet.MON);
} }
/** 护盾吸收提示 */ /** 护盾吸收提示 */
@@ -367,7 +370,7 @@ export class HeroViewComp extends CCComp {
health(hp: number = 0) { health(hp: number = 0) {
// ✅ 仅显示特效和提示,不调用 hp_show() // ✅ 仅显示特效和提示,不调用 hp_show()
if(hp<=99) return; if(hp<=20) return;
this.heathed(); this.heathed();
this.hp_tip(TooltipTypes.health, hp.toFixed(0)); this.hp_tip(TooltipTypes.health, hp.toFixed(0));
this.lastBarUpdateTime = Date.now() / 1000; this.lastBarUpdateTime = Date.now() / 1000;

View File

@@ -7,19 +7,26 @@ import { HeroInfo } from "../common/config/heroSet";
import { HeroAttrsComp } from "./HeroAttrsComp"; import { HeroAttrsComp } from "./HeroAttrsComp";
import { HeroViewComp } from "./HeroViewComp"; import { HeroViewComp } from "./HeroViewComp";
import { MoveComp } from "./MoveComp"; import { MoveComp } from "./MoveComp";
import { mLogger } from "../common/Logger"; /** 怪物实体:负责怪物对象池复用、属性初始化、入场动画与回收 */
/** 角色实体 */
@ecs.register(`Monster`) @ecs.register(`Monster`)
export class Monster extends ecs.Entity { export class Monster extends ecs.Entity {
/** 怪物数据组件引用 */
HeroModel!: HeroAttrsComp; HeroModel!: HeroAttrsComp;
/** 怪物表现组件引用 */
HeroView!: HeroViewComp; HeroView!: HeroViewComp;
/** 怪物移动组件引用 */
MonMove!: MoveComp; MonMove!: MoveComp;
private debugMode: boolean = false; // 是否启用调试模式 /** 调试开关,控制生命周期日志输出 */
private debugMode: boolean = false;
// 多键对象池:Map<prefabPath, NodePool> /** 多键对象池:key 为 prefab 路径value 为对应节点池 */
static pools: Map<string, NodePool> = new Map(); static pools: Map<string, NodePool> = new Map();
/** 单个路径的池容量上限 */
static readonly MAX_POOL_SIZE: number = 12; static readonly MAX_POOL_SIZE: number = 12;
/** 所有路径合计池容量上限 */
static readonly MAX_POOL_TOTAL: number = 60; static readonly MAX_POOL_TOTAL: number = 60;
/** 计算当前所有对象池节点总量 */
private static totalPoolSize(): number { private static totalPoolSize(): number {
let total = 0; let total = 0;
this.pools.forEach((pool) => { this.pools.forEach((pool) => {
@@ -28,6 +35,7 @@ export class Monster extends ecs.Entity {
return total; return total;
} }
/** 从指定路径对象池取可用节点,取不到返回 null */
static getFromPool(path: string): Node | null { static getFromPool(path: string): Node | null {
if (this.pools.has(path)) { if (this.pools.has(path)) {
const pool = this.pools.get(path)!; const pool = this.pools.get(path)!;
@@ -41,6 +49,7 @@ export class Monster extends ecs.Entity {
return null; return null;
} }
/** 节点回收到对象池,超上限则直接销毁 */
static putToPool(path: string, node: Node) { static putToPool(path: string, node: Node) {
if (!node || !node.isValid) return; if (!node || !node.isValid) return;
if (!this.pools.has(path)) { if (!this.pools.has(path)) {
@@ -54,6 +63,7 @@ export class Monster extends ecs.Entity {
pool.put(node); pool.put(node);
} }
/** 清空所有对象池并销毁池内节点 */
static clearPools() { static clearPools() {
this.pools.forEach((pool) => { this.pools.forEach((pool) => {
while (pool.size() > 0) { while (pool.size() > 0) {
@@ -67,6 +77,7 @@ export class Monster extends ecs.Entity {
this.pools.clear(); this.pools.clear();
} }
/** 获取对象池统计信息,用于调试与容量监控 */
static getPoolStats() { static getPoolStats() {
let total = 0; let total = 0;
this.pools.forEach((pool) => { this.pools.forEach((pool) => {
@@ -80,6 +91,7 @@ export class Monster extends ecs.Entity {
}; };
} }
/** 注册实体必需组件:移动 + 属性 */
protected init() { protected init() {
this.addComponents<ecs.Comp>( this.addComponents<ecs.Comp>(
MoveComp, MoveComp,
@@ -87,8 +99,9 @@ export class Monster extends ecs.Entity {
); );
} }
/** 销毁实体:优先回收节点,然后释放组件 */
destroy(): void { destroy(): void {
// 回收节点到对象池 // 按英雄路径回收到对象池,提升高频刷怪性能
const model = this.get(HeroAttrsComp); const model = this.get(HeroAttrsComp);
const view = this.get(HeroViewComp); const view = this.get(HeroViewComp);
if (model && view && view.node && view.node.isValid) { if (model && view && view.node && view.node.isValid) {
@@ -96,28 +109,39 @@ export class Monster extends ecs.Entity {
Monster.putToPool(path, view.node); Monster.putToPool(path, view.node);
} }
// 手动移除组件,避免 ecs 引用滞留
this.remove(HeroViewComp); this.remove(HeroViewComp);
this.remove(HeroAttrsComp); this.remove(HeroAttrsComp);
super.destroy(); super.destroy();
} }
/** 加载角色 */ /**
load(pos: Vec3 = Vec3.ZERO,scale:number = 1,uuid:number=1001, is_boss:boolean=false, dropToY:number = pos.y) { * 加载并初始化怪物
* 1) 优先对象池复用节点,减少实例化开销
* 2) 初始化表现、属性、技能与阵营
* 3) 播放下落入场并在落地后启用碰撞与移动
*/
load(pos: Vec3 = Vec3.ZERO,scale:number = 1,uuid:number=1001, is_boss:boolean=false, dropToY:number = pos.y,mon_lv:number=1) {
// 怪物默认朝左,表现缩放固定为负向
scale=-1 scale=-1
// 当前怪物尺寸固定,保留变量便于后续扩展
let size=1 let size=1
var scene = smc.map.MapView.scene; var scene = smc.map.MapView.scene;
// 根据配置读取怪物预制体路径
var path = "game/heros/"+HeroInfo[uuid].path; var path = "game/heros/"+HeroInfo[uuid].path;
// 尝试从池中获取 // 优先从对象池取节点,未命中时再实例化
let node = Monster.getFromPool(path); let node = Monster.getFromPool(path);
if (!node) { if (!node) {
var prefab: Prefab = oops.res.get(path, Prefab)!; var prefab: Prefab = oops.res.get(path, Prefab)!;
node = instantiate(prefab); node = instantiate(prefab);
} }
// 统一挂到实体显示层 HERO 节点下
node.parent = scene.entityLayer!.node!.getChildByName("HERO")!; node.parent = scene.entityLayer!.node!.getChildByName("HERO")!;
var view = node.getComponent(HeroViewComp)!; var view = node.getComponent(HeroViewComp)!;
const collider = node.getComponent(BoxCollider2D); const collider = node.getComponent(BoxCollider2D);
// 入场期间关闭碰撞,防止下落时提前参与战斗
if (collider) { if (collider) {
collider.enabled = false; collider.enabled = false;
} }
@@ -125,54 +149,64 @@ export class Monster extends ecs.Entity {
node.setScale(size*node.scale.x,size*node.scale.y); node.setScale(size*node.scale.x,size*node.scale.y);
node.setPosition(pos) node.setPosition(pos)
const model = this.get(HeroAttrsComp); const model = this.get(HeroAttrsComp);
let hero = HeroInfo[uuid]; // 共用英雄数据 // 从配置表获取怪物静态数据
// 设置 View 层属性(表现相关) let hero = HeroInfo[uuid];
// 视图层参数:朝向与碰撞阵营
view.scale = scale; view.scale = scale;
view.box_group = BoxSet.MONSTER; view.box_group = BoxSet.MONSTER;
// 设置 Model 层属性 基础属性 // 模型层参数:身份、阵营、基础数值
model.hero_uuid = uuid; model.hero_uuid = uuid;
model.hero_name = hero.name; model.hero_name = hero.name;
model.hp = model.hp_max = hero.hp; model.hp = model.hp_max = hero.hp;
model.ap = hero.ap; model.ap = hero.ap;
model.speed = hero.speed; // 使用成长后的速度 model.speed = hero.speed;
model.type = hero.type; model.type = hero.type;
model.fac = FacSet.MON; model.fac = FacSet.MON;
// 标记是否 Boss非 Boss 默认记作杂兵
model.is_boss =is_boss model.is_boss =is_boss
if(!model.is_boss){ if(!model.is_boss){
model.is_kalami = true; model.is_kalami = true;
} }
// 构建技能表并注入运行时冷却字段 ccd
model.skills = {}; model.skills = {};
for (const key in hero.skills) { for (const key in hero.skills) {
const skill = hero.skills[key]; const skill = hero.skills[key];
if (!skill) continue; if (!skill) continue;
model.skills[skill.uuid] = { ...skill, ccd: skill.cd }; // 最终技能等级 = 初始技能等级 + 怪物等级增量,且下限为 0
model.skills[skill.uuid] = { ...skill, lv: Math.max(0,skill.lv + mon_lv - 2), ccd: 0 };
} }
// 缓存技能射程等派生数据,减少战斗帧内重复计算
model.updateSkillDistanceCache(); model.updateSkillDistanceCache();
//根据刷怪控制脚本对ap和hp进行加强
// 注册视图组件并重置对象池复用状态
this.add(view); this.add(view);
// 重置视图状态(对象池复用时必须)
view.init(); view.init();
// 广播怪物加载事件,供刷怪与战斗系统联动
oops.message.dispatchEvent("monster_load",this) oops.message.dispatchEvent("monster_load",this)
// 初始化移动参数,包括线路和生成顺序 // 初始化移动参数:方向、目标 X、站位基准 Y
const move = this.get(MoveComp); const move = this.get(MoveComp);
move.reset(); move.reset();
move.direction = -1; // 向左移动 move.direction = -1;
move.targetX = Math.max(-320, Math.min(320, pos.x)); move.targetX = Math.max(-320, Math.min(320, pos.x));
move.baseY = dropToY; move.baseY = dropToY;
move.moving = false; move.moving = false;
// 依据下落距离自适应入场时长,确保观感一致
const dropDistance = Math.abs(pos.y - dropToY); const dropDistance = Math.abs(pos.y - dropToY);
const dropDuration = Math.max(0.18, Math.min(0.38, dropDistance / 1200)); const dropDuration = Math.max(0.18, Math.min(0.38, dropDistance / 1200));
// 停止旧动画后执行下落 tween避免复用节点时动画叠加
Tween.stopAllByTarget(node); Tween.stopAllByTarget(node);
tween(node) tween(node)
.to(dropDuration, { position: v3(pos.x, dropToY, 0) }) .to(dropDuration, { position: v3(pos.x, dropToY, 0) })
.call(() => { .call(() => {
if (!node || !node.isValid) return; if (!node || !node.isValid) return;
// 落地后锁定最终位置,切换到落地完成状态
node.setPosition(pos.x, dropToY, 0); node.setPosition(pos.x, dropToY, 0);
view.playEnd("down"); view.playEnd("down");
move.moving = true; move.moving = true;
// 落地后启用怪物碰撞分组
if (collider) { if (collider) {
collider.enabled = true; collider.enabled = true;
collider.group = BoxSet.MONSTER; collider.group = BoxSet.MONSTER;
@@ -180,42 +214,14 @@ export class Monster extends ecs.Entity {
} }
}) })
.start(); .start();
// 维护关卡内怪物数量统计
smc.vmdata.mission_data.mon_num++ smc.vmdata.mission_data.mon_num++
} }
/** 重置入口:复用 destroy 的释放流程 */
reset() { reset() {
// 注: 自定义释放逻辑,视图层实现 ecs.IComp 接口的 ecs 组件需要手动释放
super.destroy(); super.destroy();
} }
} }
@ecs.register('MonLifecycleSystem')
export class MonLifecycleSystem extends ecs.ComblockSystem
implements ecs.IEntityEnterSystem, ecs.IEntityRemoveSystem {
debugMode: boolean = false; // 是否启用调试模式
filter() {
return ecs.allOf(MoveComp);
}
entityEnter(e: ecs.Entity): void {
// 怪物实体创建时的特殊处理
const heroAttrs = e.get(HeroAttrsComp);
if (heroAttrs) {
mLogger.log(this.debugMode, 'MonLifecycleSystem', `怪物进入世界: ${heroAttrs.hero_name}`);
} else {
mLogger.log(this.debugMode, 'MonLifecycleSystem', `怪物进入世界: 实体ID ${e.eid}`);
}
}
entityRemove(e: ecs.Entity): void {
// 怪物实体销毁时的清理工作
const heroAttrs = e.get(HeroAttrsComp);
if (heroAttrs) {
mLogger.log(this.debugMode, 'MonLifecycleSystem', `怪物离开世界: ${heroAttrs.hero_name}`);
} else {
mLogger.log(this.debugMode, 'MonLifecycleSystem', `怪物离开世界: 实体ID ${e.eid}`);
}
}
}

View File

@@ -204,10 +204,12 @@ export class SCastSystem extends ecs.ComblockSystem implements ecs.ISystemUpdate
const model = target.ent.get(HeroAttrsComp); const model = target.ent.get(HeroAttrsComp);
if (!model || model.is_dead) continue; if (!model || model.is_dead) continue;
if (kind === SkillKind.Heal && sAp !== 0) { if (kind === SkillKind.Heal && sAp !== 0) {
const addHp = model.add_hp(sAp*_cAttrsComp.ap); const addHp = Math.floor(sAp*_cAttrsComp.ap/100);//技能的ap是百分值 需要/100
model.add_hp(addHp);
target.health(addHp); target.health(addHp);
} else if (kind === SkillKind.Shield && sAp !== 0) { } else if (kind === SkillKind.Shield && sAp !== 0) {
model.add_shield(sAp*_cAttrsComp.ap); const addShield = Math.floor(sAp*_cAttrsComp.ap/100);
model.add_shield(addShield);
} }
if (!config.buffs || config.buffs.length === 0) continue; if (!config.buffs || config.buffs.length === 0) continue;
for (const buffConf of config.buffs) { for (const buffConf of config.buffs) {

View File

@@ -18,17 +18,19 @@ export const MonType = {
AP: 0, // 近战高功 AP: 0, // 近战高功
SPEED: 1, // 高速贴近 SPEED: 1, // 高速贴近
HP: 2, // 高血皮厚 HP: 2, // 高血皮厚
//远程攻击 RANGED: 3, // 射手
MAGE: 4, // 远程魔法
// //
} }
export const MonList = { export const MonList = {
[MonType.AP]: [6001,6002], // 近战高功 [MonType.AP]: [6001,6003], // 近战高功
[MonType.SPEED]: [6003], // 高速贴近 [MonType.SPEED]: [6002], // 高速贴近
[MonType.HP]: [6009], // 高血皮厚 [MonType.HP]: [6002], // 高血皮厚
//远程攻击 [MonType.RANGED]: [6004], // 射手
[MonType.MAGE]: [6005], // 远程魔法
// //
} }
export const BossList = [5701] export const BossList = [6006]
export const StageDuration = 30 export const StageDuration = 30
export const SpawnBaseCd = 1.6 export const SpawnBaseCd = 1.6
export const SpawnMinCd = 0.5 export const SpawnMinCd = 0.5

View File

@@ -11,7 +11,7 @@ export class SDataCom extends ecs.Comp {
group:BoxSet=BoxSet.HERO group:BoxSet=BoxSet.HERO
fac: number = 0; // 0:hero 1:monster fac: number = 0; // 0:hero 1:monster
s_uuid:number=0 s_uuid:number=0
skill_lv:number=1 skill_lv:number=0
ext_dmg:number=0 //额外伤害 ext_dmg:number=0 //额外伤害
dmg_ratio:number=1 //伤害比例 dmg_ratio:number=1 //伤害比例
hit_count:number=0 //击中数量 hit_count:number=0 //击中数量
@@ -21,7 +21,7 @@ export class SDataCom extends ecs.Comp {
this.group=BoxSet.HERO this.group=BoxSet.HERO
this.fac=0 this.fac=0
this.s_uuid=0 this.s_uuid=0
this.skill_lv=1 this.skill_lv=0
this.casterEid = -1; this.casterEid = -1;
this.hit_count=0 this.hit_count=0
this.max_hit_count=0 this.max_hit_count=0

View File

@@ -101,7 +101,7 @@ export class Skill extends ecs.Entity {
this.addComponents<SMoveDataComp>(SMoveDataComp); this.addComponents<SMoveDataComp>(SMoveDataComp);
} }
load(startPos: Vec3, parent: Node, s_uuid: number, targetPos: Vec3, load(startPos: Vec3, parent: Node, s_uuid: number, targetPos: Vec3,
caster:HeroViewComp,cAttrsComp:HeroAttrsComp, skill_lv:number=1, ext_dmg:number=0) { caster:HeroViewComp,cAttrsComp:HeroAttrsComp, skill_lv:number=0, ext_dmg:number=0) {
const config = SkillSet[s_uuid]; const config = SkillSet[s_uuid];
if (!config) { if (!config) {
mLogger.error(this.debugMode, 'Skill', "[Skill] 技能配置不存在:", s_uuid); mLogger.error(this.debugMode, 'Skill', "[Skill] 技能配置不存在:", s_uuid);
@@ -205,17 +205,17 @@ export class Skill extends ecs.Entity {
sDataCom.casterEid=caster.ent.eid sDataCom.casterEid=caster.ent.eid
sDataCom.Attrs = {}; sDataCom.Attrs = {};
const SUp=SkillUpList[s_uuid] ? SkillUpList[s_uuid]:SkillUpList[1001]; const SUp=SkillUpList[s_uuid] ? SkillUpList[s_uuid]:SkillUpList[1001];
const sCrt = (config.crt ?? 0)+SUp.crt*skill_lv; const sCrt = (config.crt ?? 0)+(SUp.crt*skill_lv);
const sFrz = (config.frz ?? 0)+SUp.frz*skill_lv; const sFrz = (config.frz ?? 0)+(SUp.frz*skill_lv);
const sBck = (config.bck ?? 0)+SUp.bck*skill_lv; const sBck = (config.bck ?? 0)+(SUp.bck*skill_lv);
const sAp =config.ap+SUp.ap*skill_lv; const sAp =config.ap+(SUp.ap*skill_lv);
const sHit=config.hit_count+SUp.hit_count*skill_lv + cAttrsComp.puncture const sHit=config.hit_count+(SUp.hit_count*skill_lv) + cAttrsComp.puncture
sDataCom.Attrs[Attrs.ap] = Math.floor(cAttrsComp.ap*sAp); sDataCom.Attrs[Attrs.ap] = Math.floor(cAttrsComp.ap*sAp/100); //技能的ap是百分值 需要/100 而且需要再最终计算总ap时再/100不然会出现ap为90%变0
sDataCom.Attrs[Attrs.critical] = cAttrsComp.critical + sCrt; sDataCom.Attrs[Attrs.critical] = cAttrsComp.critical + sCrt;
sDataCom.Attrs[Attrs.freeze_chance] = cAttrsComp.freeze_chance + sFrz; sDataCom.Attrs[Attrs.freeze_chance] = cAttrsComp.freeze_chance + sFrz;
sDataCom.Attrs[Attrs.back_chance] = cAttrsComp.back_chance + sBck; sDataCom.Attrs[Attrs.back_chance] = cAttrsComp.back_chance + sBck;
sDataCom.s_uuid=s_uuid sDataCom.s_uuid=s_uuid
sDataCom.skill_lv = Math.max(1, skill_lv); sDataCom.skill_lv = Math.max(0, skill_lv);
sDataCom.fac=cAttrsComp.fac sDataCom.fac=cAttrsComp.fac
sDataCom.ext_dmg=ext_dmg sDataCom.ext_dmg=ext_dmg
sDataCom.hit_count = 0 sDataCom.hit_count = 0

View File

@@ -1,6 +1,6 @@
import { oops } from "../../../../extensions/oops-plugin-framework/assets/core/Oops"; import { oops } from "../../../../extensions/oops-plugin-framework/assets/core/Oops";
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS"; import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
import { BoxSet } from "../common/config/GameSet"; import { BoxSet, FacSet } from "../common/config/GameSet";
import { SkillSet } from "../common/config/SkillSet"; import { SkillSet } from "../common/config/SkillSet";
import { smc } from "../common/SingletonModuleComp"; import { smc } from "../common/SingletonModuleComp";
import { TooltipCom } from "./TooltipCom"; import { TooltipCom } from "./TooltipCom";
@@ -60,7 +60,7 @@ export class Tooltip extends ecs.Entity {
this.remove(TooltipCom); this.remove(TooltipCom);
super.destroy(); super.destroy();
} }
static load(pos: Vec3 = Vec3.ZERO,type:number=1,vaule:string="",s_uuid:number=1001,parent:any=null,cd:number=1) { static load(pos: Vec3 = Vec3.ZERO,type:number=1,vaule:string="",s_uuid:number=1001,parent:any=null,cd:number=1,fac:number=FacSet.MON) {
let node: Node; let node: Node;
if (Tooltip.pool.size() > 0) { if (Tooltip.pool.size() > 0) {
node = Tooltip.pool.get()!; node = Tooltip.pool.get()!;
@@ -75,7 +75,7 @@ export class Tooltip extends ecs.Entity {
node.active = true; node.active = true;
var sv = node.getComponent(TooltipCom)!; var sv = node.getComponent(TooltipCom)!;
sv.init(type, vaule, s_uuid); sv.init(type, vaule, s_uuid, fac);
// this.add(sv); // 不要添加到单例实体上,否则会覆盖或导致单例被销毁 // this.add(sv); // 不要添加到单例实体上,否则会覆盖或导致单例被销毁
} }

View File

@@ -2,7 +2,7 @@ import { _decorator, Collider2D, Contact2DType, v3, IPhysics2DContact, Vec3, twe
import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS"; import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp"; import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp";
import { SkillSet } from "../common/config/SkillSet"; import { SkillSet } from "../common/config/SkillSet";
import { TooltipTypes } from "../common/config/GameSet"; import { FacSet, TooltipTypes } from "../common/config/GameSet";
import { Tooltip } from "./Tooltip"; import { Tooltip } from "./Tooltip";
const { ccclass, property } = _decorator; const { ccclass, property } = _decorator;
@@ -14,6 +14,7 @@ export class TooltipCom extends CCComp {
stype: number = 1; // 1:减少生命值2增加生命值3技能图标 stype: number = 1; // 1:减少生命值2增加生命值3技能图标
value: string = ""; value: string = "";
s_uuid: number = 1001; s_uuid: number = 1001;
fac: number = FacSet.MON;
// 动画参数配置 // 动画参数配置
private readonly popDuration = 0.15; private readonly popDuration = 0.15;
@@ -28,10 +29,11 @@ export class TooltipCom extends CCComp {
} }
/** 初始化并播放动画 */ /** 初始化并播放动画 */
init(type: number, value: string, uuid: number) { init(type: number, value: string, uuid: number, fac: number = FacSet.MON) {
this.stype = type; this.stype = type;
this.value = value; this.value = value;
this.s_uuid = uuid; this.s_uuid = uuid;
this.fac = fac;
// 初始化或获取 UIOpacity 组件 // 初始化或获取 UIOpacity 组件
this._uiOpacity = this.node.getComponent(UIOpacity); this._uiOpacity = this.node.getComponent(UIOpacity);
@@ -76,7 +78,7 @@ export class TooltipCom extends CCComp {
case TooltipTypes.life: // 普通伤害 case TooltipTypes.life: // 普通伤害
this.node.setPosition(v3(this.node.position.x + offsetX, currentY)); this.node.setPosition(v3(this.node.position.x + offsetX, currentY));
this.node.setSiblingIndex(topSiblingIndex); this.node.setSiblingIndex(topSiblingIndex);
this.setupLabel("loss_life", "hp", this.value); this.setupLabel(this.fac === FacSet.HERO ? "hloss" : "loss_life", "hp", this.value);
scaleMax = 1.5; scaleMax = 1.5;
break; break;
case TooltipTypes.health: // 治疗 case TooltipTypes.health: // 治疗