This commit is contained in:
董刚
2022-03-09 17:56:44 +08:00
parent 01700c3945
commit 146f375bef
4 changed files with 59 additions and 60 deletions

View File

@@ -2,9 +2,10 @@
* @Author: dgflash
* @Date: 2021-11-23 15:51:15
* @LastEditors: dgflash
* @LastEditTime: 2022-02-10 10:01:34
* @LastEditTime: 2022-03-09 15:09:43
*/
import { v3 } from "cc";
import { Message } from "../../../core/common/event/MessageManager";
import { storage } from "../../../core/common/storage/SqlUtil";
import { ecs } from "../../../core/libs/ECS";
@@ -95,9 +96,7 @@ export class AccountNetDataSystem extends ecs.ComblockSystem implements ecs.IEnt
VM.add(role.RoleBaseModel.vm, "RoleBase");
// 角色动画显示对象
role.load();
role.RoleView.node.parent = oops.gui.game;
role.RoleView.node.setPosition(0, -300, 0);
role.load(oops.gui.game, v3(0, -300, 0));
e.AccountModel.role = role;
}

View File

@@ -3,7 +3,7 @@
* @Author: dgflash
* @Date: 2021-11-18 17:47:56
* @LastEditors: dgflash
* @LastEditTime: 2022-03-08 16:58:18
* @LastEditTime: 2022-03-09 16:36:35
*/
import { Node, Vec3 } from "cc";
import { ecs } from "../../core/libs/ECS";
@@ -31,18 +31,18 @@ import { RoleViewInfoComp } from "./view/RoleViewInfoComp";
export class Role extends ecs.Entity {
// 数据层
RoleModel!: RoleModelComp;
RoleBaseModel!: RoleBaseModelComp;
RoleJobModel!: RoleJobModelComp;
RoleBaseModel!: RoleBaseModelComp; // 角色初始资质
RoleJobModel!: RoleJobModelComp;
RoleLevelModel!: RoleLevelModelComp;
// 业务层
RoleChangeJob!: RoleChangeJobComp;
RoleUpgrade!: RoleUpgradeComp;
RoleMoveTo!: MoveToComp;
RoleChangeJob!: RoleChangeJobComp; // 转职
RoleUpgrade!: RoleUpgradeComp; // 升级
RoleMoveTo!: MoveToComp; // 移动
// 视图层
RoleView!: RoleViewComp;
RoleViewInfo!: RoleViewInfoComp;
RoleView!: RoleViewComp; // 动画
RoleViewInfo!: RoleViewInfoComp; // 属性界面
protected init() {
// 初始化实体常住 ECS 组件,定义实体特性
@@ -53,34 +53,6 @@ export class Role extends ecs.Entity {
RoleLevelModelComp);
}
destroy(): void {
// 如果该组件对象是由ecs系统外部创建的则不可回收需要用户自己手动进行回收。
this.remove(RoleViewComp);
super.destroy();
}
/** 加载角色显示对象cc.Component在创建后添加到ECS框架中使实体上任何一个ECS组件都可以通过 ECS API 获取到视图层对象 */
load(): Node {
var node = ViewUtil.createPrefabNode("game/battle/role");
var mv = node.getComponent(RoleViewComp)!;
this.add(mv);
mv.load();
return node;
}
/** 移动ECS System处理逻辑分享功能独立的业务代码 */
move(target: Vec3) {
var move = this.add(MoveToComp);
move.target = target;
move.node = this.RoleView.node;
move.speed = 100;
}
/** 攻击DEMO没有战斗逻辑所以只播放一个动画 */
attack() {
this.RoleView.animator.setTrigger(RoleAnimatorType.Attack);
}
/** 转职ECS System处理逻辑分享功能独立的业务代码 */
changeJob(jobId: number) {
var rcj = this.add(RoleChangeJobComp);
@@ -92,6 +64,35 @@ export class Role extends ecs.Entity {
var ru = this.add(RoleUpgradeComp);
ru.lv = lv;
}
/** 移动ECS System处理逻辑分享功能独立的业务代码 */
move(target: Vec3) {
var move = this.add(MoveToComp);
move.target = target;
move.node = this.RoleView.node;
move.speed = 100;
}
destroy(): void {
// 如果该组件对象是由ecs系统外部创建的则不可回收需要用户自己手动进行回收。
this.remove(RoleViewComp);
super.destroy();
}
/** 加载角色显示对象cc.Component在创建后添加到ECS框架中使实体上任何一个ECS组件都可以通过 ECS API 获取到视图层对象 */
load(parent: Node, pos: Vec3 = Vec3.ZERO) {
var node = ViewUtil.createPrefabNode("game/battle/role");
var mv = node.getComponent(RoleViewComp)!;
this.add(mv);
node.parent = parent;
node.setPosition(pos);
}
/** 攻击DEMO没有战斗逻辑所以只播放一个动画 */
attack() {
this.RoleView.animator.setTrigger(RoleAnimatorType.Attack);
}
}
export class EcsRoleSystem extends ecs.System {

View File

@@ -2,7 +2,7 @@
* @Author: dgflash
* @Date: 2021-11-18 15:56:01
* @LastEditors: dgflash
* @LastEditTime: 2022-02-10 10:05:30
* @LastEditTime: 2022-03-09 15:02:39
*/
import { ecs } from "../../../core/libs/ECS";
@@ -40,6 +40,9 @@ export class RoleModelComp extends ecs.Comp {
this.vm.name = value;
}
/** 动画名资源 */
anim: string = "model1";
/** 角色属性 */
attributes: RoleNumericMap = new RoleNumericMap(this.vm);

View File

@@ -2,7 +2,7 @@
* @Author: dgflash
* @Date: 2021-11-18 17:42:59
* @LastEditors: dgflash
* @LastEditTime: 2022-03-09 14:32:28
* @LastEditTime: 2022-03-09 15:10:54
*/
import { sp, _decorator } from "cc";
@@ -16,47 +16,43 @@ import { RoleViewLoader } from "./component/RoleViewLoader";
const { ccclass, property } = _decorator;
/** 角色显示组件 - 管理业务功能方法的定义与模块之间交互处理 */
/** 角色显示组件 */
@ccclass('RoleViewComp')
@ecs.register('RoleView', false)
export class RoleViewComp extends CCComp {
@property({ type: sp.Skeleton, tooltip: '角色动画' })
spine: sp.Skeleton = null!;
/** --- 演示视图层业务逻辑分离 --- */
/** 资源加载管理 */
/** 角色动画资源管理 */
loader: RoleViewLoader = null!;
/** 动画状态机 */
/** 角色动画规则管理 */
animator: RoleViewAnimator = null!;
/** 角色控制器 */
controller: RoleViewController = null!;
onLoad() {
var role = this.ent as Role;
this.loader = this.node.addComponent(RoleViewLoader);
this.loader.load(role.RoleModel.anim);
this.animator = this.spine.getComponent(RoleViewAnimator)!;
this.animator.role = role;
this.controller = this.node.addComponent(RoleViewController);
this.controller.role = role;
this.on(RoleEvent.ChangeJob, this.onHandler, this);
}
/** 全局事件处理器 - 模块之间解耦合 */
private onHandler(event: string, args: any) {
switch (event) {
case RoleEvent.ChangeJob:
// 切换职业动画 - 演示业务层通过事件控制视图层逻辑,避免两层代码直接偶合
this.animator.refresh();
break;
}
}
load() {
this.loader = this.node.addComponent(RoleViewLoader);
this.loader.load("model1");
this.animator = this.spine.getComponent(RoleViewAnimator)!;
this.animator.role = this.ent as Role;
this.controller = this.node.addComponent(RoleViewController);
this.controller.role = this.ent as Role;
}
reset() {
this.node.destroy();
}