From 511c1c6c1460f6afc2ab6a68fa14937b7bf2ca57 Mon Sep 17 00:00:00 2001 From: dgflash Date: Mon, 7 Feb 2022 16:43:15 +0800 Subject: [PATCH] . --- assets/resources/game/battle/role.prefab | 50 ++++++++--------- .../script/game/account/bll/AccountNetData.ts | 3 +- .../script/game/common/ecs/position/MoveTo.ts | 2 +- assets/script/game/role/Role.ts | 13 +++-- assets/script/game/role/bll/EcsRoleSystem.ts | 2 + assets/script/game/role/bll/RoleChangeJob.ts | 3 +- assets/script/game/role/bll/RoleUpgrade.ts | 47 ++++++++++++++++ .../RoleUpgrade.ts.meta} | 2 +- .../game/role/model/RoleBaseModelComp.ts | 2 +- .../game/role/model/RoleLevelModelComp.ts | 54 ++++++------------- .../script/game/role/model/RoleModelComp.ts | 2 +- .../game/role/model/RoleTableLevelUp.ts | 4 -- ...iewAnimatorComp.ts => RoleViewAnimator.ts} | 16 +++++- .../game/role/view/RoleViewAnimator.ts.meta | 9 ++++ assets/script/game/role/view/RoleViewComp.ts | 6 +-- 15 files changed, 133 insertions(+), 82 deletions(-) create mode 100644 assets/script/game/role/bll/RoleUpgrade.ts rename assets/script/game/role/{view/RoleViewAnimatorComp.ts.meta => bll/RoleUpgrade.ts.meta} (70%) rename assets/script/game/role/view/{RoleViewAnimatorComp.ts => RoleViewAnimator.ts} (80%) create mode 100644 assets/script/game/role/view/RoleViewAnimator.ts.meta diff --git a/assets/resources/game/battle/role.prefab b/assets/resources/game/battle/role.prefab index e82401f..125c820 100644 --- a/assets/resources/game/battle/role.prefab +++ b/assets/resources/game/battle/role.prefab @@ -189,29 +189,6 @@ "__type__": "cc.CompPrefabInfo", "fileId": "61JRCu+yBFXqyPTQa3ds3z" }, - { - "__type__": "c91b7jt8ipKHaJ87Nnfd3u5", - "_name": "", - "_objFlags": 0, - "node": { - "__id__": 3 - }, - "_enabled": true, - "__prefab": { - "__id__": 7 - }, - "AssetRawUrl": { - "__uuid__": "6ee5f40e-b1b2-47a9-b428-4147a1bd955a", - "__expectedType__": "cc.JsonAsset" - }, - "PlayOnStart": true, - "AutoUpdate": true, - "_id": "" - }, - { - "__type__": "cc.CompPrefabInfo", - "fileId": "064F3CrXRFH5675vAKcM65" - }, { "__type__": "sp.Skeleton", "_name": "", @@ -222,7 +199,7 @@ }, "_enabled": true, "__prefab": { - "__id__": 9 + "__id__": 7 }, "_visFlags": 0, "_customMaterial": null, @@ -255,6 +232,29 @@ "__type__": "cc.CompPrefabInfo", "fileId": "75PJPRcM5F2ai9GB8vX0Ni" }, + { + "__type__": "100adZTIqRBJqNLcy81+N4b", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 3 + }, + "_enabled": true, + "__prefab": { + "__id__": 9 + }, + "AssetRawUrl": { + "__uuid__": "6ee5f40e-b1b2-47a9-b428-4147a1bd955a", + "__expectedType__": "cc.JsonAsset" + }, + "PlayOnStart": true, + "AutoUpdate": true, + "_id": "" + }, + { + "__type__": "cc.CompPrefabInfo", + "fileId": "908ZWdysNJzqq4N39wqa7Q" + }, { "__type__": "cc.PrefabInfo", "root": null, @@ -337,7 +337,7 @@ "__id__": 17 }, "spine": { - "__id__": 8 + "__id__": 6 }, "_id": "" }, diff --git a/assets/script/game/account/bll/AccountNetData.ts b/assets/script/game/account/bll/AccountNetData.ts index 8f69378..11abc16 100644 --- a/assets/script/game/account/bll/AccountNetData.ts +++ b/assets/script/game/account/bll/AccountNetData.ts @@ -82,7 +82,8 @@ export class AccountNetDataSystem extends ecs.ComblockSystem implements ecs.IEnt role.RoleBaseModel.physical = data.physical; // 角色等级数据 - role.RoleLevelModel.lv = data.lv; + // role.RoleLevelModel.lv = data.lv; + role.upgrade(data.lv); // 角色职业数据 role.RoleJobModel.id = data.jobId; diff --git a/assets/script/game/common/ecs/position/MoveTo.ts b/assets/script/game/common/ecs/position/MoveTo.ts index 1ba099a..7a9568b 100644 --- a/assets/script/game/common/ecs/position/MoveTo.ts +++ b/assets/script/game/common/ecs/position/MoveTo.ts @@ -16,7 +16,7 @@ export class MoveToComp extends ecs.Comp { node: Node = null!; /** 移动方向 */ velocity: Vec3 = Vec3Util.zero; - /** 移动速度 */ + /** 移动速度(每秒移动的像素距离) */ speed: number = 0; /** 目标实体ECS编号、目标位置 */ target: Vec3 | Node | null = null; diff --git a/assets/script/game/role/Role.ts b/assets/script/game/role/Role.ts index 7c89c9e..cafaf61 100644 --- a/assets/script/game/role/Role.ts +++ b/assets/script/game/role/Role.ts @@ -10,6 +10,7 @@ import { ecs } from "../../core/libs/ECS"; import { ViewUtil } from "../../core/utils/ViewUtil"; import { MoveToComp } from "../common/ecs/position/MoveTo"; import { RoleChangeJobComp } from "./bll/RoleChangeJob"; +import { RoleUpgradeComp } from "./bll/RoleUpgrade"; import { RoleBaseModelComp } from "./model/RoleBaseModelComp"; import { RoleAnimatorType } from "./model/RoleEnum"; import { RoleJobModelComp } from "./model/RoleJobModelComp"; @@ -34,8 +35,9 @@ export class Role extends ecs.Entity { RoleJobModel!: RoleJobModelComp; RoleLevelModel!: RoleLevelModelComp; - // 玩法层 + // 业务层 RoleChangeJob!: RoleChangeJobComp; + RoleUpgrade!: RoleUpgradeComp; // 视图层 RoleView!: RoleViewComp; @@ -69,7 +71,7 @@ export class Role extends ecs.Entity { move.speed = 100; } - /** 攻击 */ + /** 攻击(DEMO没有战斗逻辑,所以只播放一个动画) */ attack() { this.RoleView.animator.setTrigger(RoleAnimatorType.Attack); } @@ -80,8 +82,9 @@ export class Role extends ecs.Entity { rcj.jobId = jobId; } - /** 角色升级 */ - upgrade() { - if (this.RoleLevelModel.lv < 100) this.RoleLevelModel.lv++; + /** 角色升级(升级只修改数据,通过MVVM级件自动绑定等级变化后的界面角色生命属性刷新) */ + upgrade(lv: number = 0) { + var ru = this.add(RoleUpgradeComp); + ru.lv = lv; } } \ No newline at end of file diff --git a/assets/script/game/role/bll/EcsRoleSystem.ts b/assets/script/game/role/bll/EcsRoleSystem.ts index 9f40433..a522a85 100644 --- a/assets/script/game/role/bll/EcsRoleSystem.ts +++ b/assets/script/game/role/bll/EcsRoleSystem.ts @@ -6,11 +6,13 @@ */ import { ecs } from "../../../core/libs/ECS"; import { RoleChangeJobSystem } from "./RoleChangeJob"; +import { RoleUpgradeSystem } from "./RoleUpgrade"; export class EcsRoleSystem extends ecs.System { constructor() { super(); this.add(new RoleChangeJobSystem()); + this.add(new RoleUpgradeSystem()); } } diff --git a/assets/script/game/role/bll/RoleChangeJob.ts b/assets/script/game/role/bll/RoleChangeJob.ts index 98c7948..8bf8e2d 100644 --- a/assets/script/game/role/bll/RoleChangeJob.ts +++ b/assets/script/game/role/bll/RoleChangeJob.ts @@ -6,6 +6,7 @@ */ import { ecs } from "../../../core/libs/ECS"; +import { RoleJobModelComp } from "../model/RoleJobModelComp"; import { Role } from "../Role"; /** @@ -32,7 +33,7 @@ export class RoleChangeJobComp extends ecs.Comp { export class RoleChangeJobSystem extends ecs.ComblockSystem implements ecs.IEntityEnterSystem { filter(): ecs.IMatcher { - return ecs.allOf(RoleChangeJobComp); + return ecs.allOf(RoleChangeJobComp, RoleJobModelComp); } entityEnter(entities: Role[]): void { diff --git a/assets/script/game/role/bll/RoleUpgrade.ts b/assets/script/game/role/bll/RoleUpgrade.ts new file mode 100644 index 0000000..cb7bfe1 --- /dev/null +++ b/assets/script/game/role/bll/RoleUpgrade.ts @@ -0,0 +1,47 @@ +import { ecs } from "../../../core/libs/ECS"; +import { RoleAttributeType } from "../model/RoleEnum"; +import { RoleLevelModelComp } from "../model/RoleLevelModelComp"; +import { Role } from "../Role"; + +/** + * 角色升级 + */ +@ecs.register('RoleUpgrade') +export class RoleUpgradeComp extends ecs.Comp { + /** 当前等级 */ + lv: number = 0; + + reset() { + this.lv = 0; + } +} + +export class RoleUpgradeSystem extends ecs.ComblockSystem implements ecs.IEntityEnterSystem { + filter(): ecs.IMatcher { + return ecs.allOf(RoleUpgradeComp, RoleLevelModelComp); + } + + entityEnter(entities: Role[]): void { + for (let e of entities) { + let rm = e.RoleModel; + let rlm = e.RoleLevelModel; + let ru = e.RoleUpgrade; + + if (ru.lv == 0) + rlm.vm.lv++; // 提升一级 + else + rlm.vm.lv = ru.lv; // 设置等级 + + // 当前等级配置 + rlm.rtluCurrent.init(rlm.vm.lv); + // 等级附加属性 + rm.attributes.get(RoleAttributeType.hp).level = rlm.rtluCurrent.hp; + + // 下个等级配置 + rlm.rtluNext.init(rlm.vm.lv + 1); + rlm.vm.expNext = rlm.rtluNext.needexp; + + e.remove(RoleUpgradeComp); + } + } +} \ No newline at end of file diff --git a/assets/script/game/role/view/RoleViewAnimatorComp.ts.meta b/assets/script/game/role/bll/RoleUpgrade.ts.meta similarity index 70% rename from assets/script/game/role/view/RoleViewAnimatorComp.ts.meta rename to assets/script/game/role/bll/RoleUpgrade.ts.meta index 21207cf..fb4c244 100644 --- a/assets/script/game/role/view/RoleViewAnimatorComp.ts.meta +++ b/assets/script/game/role/bll/RoleUpgrade.ts.meta @@ -2,7 +2,7 @@ "ver": "4.0.23", "importer": "typescript", "imported": true, - "uuid": "c91b78ed-f22a-4a1d-a27c-ecd9df777bb9", + "uuid": "7750b9a2-9bdc-408e-a020-aef84fe6c85e", "files": [], "subMetas": {}, "userData": {} diff --git a/assets/script/game/role/model/RoleBaseModelComp.ts b/assets/script/game/role/model/RoleBaseModelComp.ts index cd04119..2b19c9f 100644 --- a/assets/script/game/role/model/RoleBaseModelComp.ts +++ b/assets/script/game/role/model/RoleBaseModelComp.ts @@ -63,7 +63,7 @@ export class RoleBaseModelComp extends ecs.Comp { this.agile = 0; for (var key in this.vm) { - delete this.vm[key]; + this.vm[key] = 0; } } } \ No newline at end of file diff --git a/assets/script/game/role/model/RoleLevelModelComp.ts b/assets/script/game/role/model/RoleLevelModelComp.ts index a4cfb4a..5a411eb 100644 --- a/assets/script/game/role/model/RoleLevelModelComp.ts +++ b/assets/script/game/role/model/RoleLevelModelComp.ts @@ -6,8 +6,6 @@ */ import { ecs } from "../../../core/libs/ECS"; -import { RoleAttributeType } from "./RoleEnum"; -import { RoleModelComp } from "./RoleModelComp"; import { RoleTableLevelUp } from "./RoleTableLevelUp"; /** @@ -23,46 +21,28 @@ import { RoleTableLevelUp } from "./RoleTableLevelUp"; @ecs.register('RoleLevelModel') export class RoleLevelModelComp extends ecs.Comp { /** 提供 VM 组件使用的数据 */ - vm: any = {}; + vm: RoleLevelVM = new RoleLevelVM(); + /** 下个等级配置 */ + rtluNext: RoleTableLevelUp = new RoleTableLevelUp(); + /** 当前等级配置 */ + rtluCurrent: RoleTableLevelUp = new RoleTableLevelUp(); - /** 当前等级已获取的经验值 */ - private _exp: number = 0; - public get exp(): number { - return this._exp; - } - public set exp(value: number) { - this._exp = value; - this.vm.exp = value; + reset() { + this.vm.reset(); } +} - private _lv: number = 0; - /** 等级 */ - public get lv(): number { - return this._lv; - } - public set lv(value: number) { - this._lv = value; - this.vm.lv = value; - this.ent.get(RoleModelComp).attributes.get(RoleAttributeType.hp).level = this.rtlu.hp; - } - - private _rtlu: RoleTableLevelUp = null!; - /** 升级后的变化属性 */ - get rtlu(): RoleTableLevelUp { - if (this._rtlu == null) - this._rtlu = new RoleTableLevelUp(this.lv); - else if (this._rtlu.key != this.lv) - this._rtlu.init(this.lv); - return this._rtlu; - } +class RoleLevelVM { + /** 当前等级 */ + lv: number = 0; + /** 当前经验 */ + exp: number = 0; + /** 下级经验 */ + expNext: number = 0; reset() { this.lv = 0; this.exp = 0; - this._rtlu = null!; - - for (var key in this.vm) { - delete this.vm[key]; - } + this.expNext = 0; } -} +} \ No newline at end of file diff --git a/assets/script/game/role/model/RoleModelComp.ts b/assets/script/game/role/model/RoleModelComp.ts index bea227a..2ab7c43 100644 --- a/assets/script/game/role/model/RoleModelComp.ts +++ b/assets/script/game/role/model/RoleModelComp.ts @@ -48,7 +48,7 @@ export class RoleModelComp extends ecs.Comp { this.name = ""; for (var key in this.vm) { - delete this.vm[key]; + this.vm[key] = 0; } } diff --git a/assets/script/game/role/model/RoleTableLevelUp.ts b/assets/script/game/role/model/RoleTableLevelUp.ts index f60d427..550667a 100644 --- a/assets/script/game/role/model/RoleTableLevelUp.ts +++ b/assets/script/game/role/model/RoleTableLevelUp.ts @@ -10,10 +10,6 @@ import { JsonUtil } from "../../../core/utils/JsonUtil"; export class RoleTableLevelUp { static TableName: string = "herolvup"; - constructor(key: number) { - this.init(key); - } - /** 静态表中一条数据 */ private data: any; diff --git a/assets/script/game/role/view/RoleViewAnimatorComp.ts b/assets/script/game/role/view/RoleViewAnimator.ts similarity index 80% rename from assets/script/game/role/view/RoleViewAnimatorComp.ts rename to assets/script/game/role/view/RoleViewAnimator.ts index 2996b57..93127f0 100644 --- a/assets/script/game/role/view/RoleViewAnimatorComp.ts +++ b/assets/script/game/role/view/RoleViewAnimator.ts @@ -17,10 +17,21 @@ import { RoleViewComp } from "./RoleViewComp"; const { ccclass, property, requireComponent, disallowMultiple } = _decorator; -@ccclass("RoleViewAnimatorComp") +/** + * 角色SPINE动画控制 + * + * 实现功能 + * 1、控制动作变化 + * 2、控制武器变化 + * 3、控制脸的朝向 + * + * 技术分析 + * 1、角色动画组件未绑定到ECS实体上,是因为角色显示对象上就有动画组件的引用,直接可通过角色显示对象获取到动画对象 + */ +@ccclass("RoleViewAnimator") @disallowMultiple @requireComponent(sp.Skeleton) -export class RoleViewAnimatorComp extends AnimatorSpine { +export class RoleViewAnimator extends AnimatorSpine { /** 攻击行为完成 */ onAttackComplete: Function = null!; /** 受击动作完成 */ @@ -59,6 +70,7 @@ export class RoleViewAnimatorComp extends AnimatorSpine { /** 当前动作换职业动画 */ changeJob() { + // 状态机状态值未变时,不会触发状态变化事件,所以这里直接触发状态变化事件来触发后续流程 this.onStateChange(this._ac.curState, this._ac.curState); } diff --git a/assets/script/game/role/view/RoleViewAnimator.ts.meta b/assets/script/game/role/view/RoleViewAnimator.ts.meta new file mode 100644 index 0000000..2686538 --- /dev/null +++ b/assets/script/game/role/view/RoleViewAnimator.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.23", + "importer": "typescript", + "imported": true, + "uuid": "100ad653-22a4-4126-a34b-732f35f8de1b", + "files": [], + "subMetas": {}, + "userData": {} +} diff --git a/assets/script/game/role/view/RoleViewComp.ts b/assets/script/game/role/view/RoleViewComp.ts index d14c844..28f7636 100644 --- a/assets/script/game/role/view/RoleViewComp.ts +++ b/assets/script/game/role/view/RoleViewComp.ts @@ -13,7 +13,7 @@ import { config } from "../../common/config/Config"; import { CCComp } from "../../common/ecs/CCComp"; import { RoleModelComp } from "../model/RoleModelComp"; import { Role } from "../Role"; -import { RoleViewAnimatorComp } from "./RoleViewAnimatorComp"; +import { RoleViewAnimator } from "./RoleViewAnimator"; const { ccclass, property } = _decorator; @@ -25,11 +25,11 @@ export class RoleViewComp extends CCComp { spine: sp.Skeleton | null = null; /** 动画状态机 */ - animator: RoleViewAnimatorComp = null!; + animator: RoleViewAnimator = null!; onLoad() { this.node.active = false; - this.animator = this.spine!.getComponent(RoleViewAnimatorComp)!; + this.animator = this.spine!.getComponent(RoleViewAnimator)!; } load() {