了解 move 用法
This commit is contained in:
@@ -12,6 +12,7 @@ import { ecs } from '../../extensions/oops-plugin-framework/assets/libs/ecs/ECS'
|
||||
import { UIConfigData } from './game/common/config/GameUIConfig';
|
||||
import { smc } from './game/common/SingletonModuleComp';
|
||||
import { Initialize } from './game/initialize/Initialize';
|
||||
import { EcsPositionSystem } from './game/common/ecs/position/EcsPositionSystem';
|
||||
|
||||
const { ccclass, property } = _decorator;
|
||||
|
||||
@@ -34,7 +35,10 @@ export class Main extends Root {
|
||||
oops.gui.init(UIConfigData);
|
||||
}
|
||||
|
||||
protected initEcsSystem() {
|
||||
|
||||
protected async initEcsSystem() {
|
||||
oops.ecs.add(new EcsPositionSystem())
|
||||
// oops.ecs.add(new EcsAccountSystem());
|
||||
// oops.ecs.add(new EcsRoleSystem());
|
||||
// oops.ecs.add(new EcsInitializeSystem());
|
||||
}
|
||||
}
|
||||
@@ -15,11 +15,14 @@ import { RoleModelComp } from "./RoleModelComp";
|
||||
import { RoleSpine } from "./RoleSpine";
|
||||
import { RoleViewComp } from "./RoleViewComp";
|
||||
import { RoleSet } from "../common/config/RoleSet";
|
||||
import { MoveToComp } from "../common/ecs/position/MoveTo";
|
||||
/** 角色实体 */
|
||||
@ecs.register(`Role`)
|
||||
export class Role extends ecs.Entity {
|
||||
// 数据层
|
||||
RoleModel!: RoleModelComp;
|
||||
RoleMoveTo!: MoveToComp; // 移动
|
||||
|
||||
// 视图层
|
||||
RoleView!: RoleViewComp;
|
||||
|
||||
@@ -57,7 +60,12 @@ export class Role extends ecs.Entity {
|
||||
this.hero_init(uuid,node)
|
||||
|
||||
}
|
||||
|
||||
move(target: Vec3) {
|
||||
var move = this.get(MoveToComp) || this.add(MoveToComp);
|
||||
move.target = target;
|
||||
move.node = this.RoleView.node;
|
||||
move.speed = 100;
|
||||
}
|
||||
hero_init(uuid:number=1001,node:Node,pos:Vec3=v3(0,0,0)){
|
||||
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ import { SkillSet } from "../common/config/SkillSet";
|
||||
import { Timer } from "../../../../extensions/oops-plugin-framework/assets/core/common/timer/Timer";
|
||||
import { RandomManager } from "../../../../extensions/oops-plugin-framework/assets/core/common/random/RandomManager";
|
||||
import { oops } from "../../../../extensions/oops-plugin-framework/assets/core/Oops";
|
||||
import { MoveToComp } from "../common/ecs/position/MoveTo";
|
||||
const { ccclass, property } = _decorator;
|
||||
|
||||
/** 角色显示组件 */
|
||||
@@ -82,6 +83,7 @@ export class RoleViewComp extends CCComp {
|
||||
|
||||
|
||||
}
|
||||
|
||||
add_hp(hp:number){
|
||||
console.log("role add hp",hp);
|
||||
}
|
||||
|
||||
9
assets/script/game/common/ecs.meta
Normal file
9
assets/script/game/common/ecs.meta
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"ver": "1.2.0",
|
||||
"importer": "directory",
|
||||
"imported": true,
|
||||
"uuid": "635cbba2-f16e-4c87-b7c5-d9d2bc107de0",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"ver": "4.0.24",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "c1147d9a-3dcd-4fd0-ad87-f4d964ee62a8",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {}
|
||||
}
|
||||
12
assets/script/game/common/ecs/position.meta
Normal file
12
assets/script/game/common/ecs/position.meta
Normal file
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"ver": "1.2.0",
|
||||
"importer": "directory",
|
||||
"imported": true,
|
||||
"uuid": "d2d775f5-1dc0-455e-89d7-4a17f43170e0",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {
|
||||
"compressionType": {},
|
||||
"isRemoteBundle": {}
|
||||
}
|
||||
}
|
||||
15
assets/script/game/common/ecs/position/EcsPositionSystem.ts
Normal file
15
assets/script/game/common/ecs/position/EcsPositionSystem.ts
Normal file
@@ -0,0 +1,15 @@
|
||||
/*
|
||||
* @Author: dgflash
|
||||
* @Date: 2021-08-11 16:41:12
|
||||
* @LastEditors: dgflash
|
||||
* @LastEditTime: 2022-07-25 17:05:02
|
||||
*/
|
||||
import { ecs } from "../../../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
|
||||
import { MoveToSystem } from "./MoveTo";
|
||||
|
||||
export class EcsPositionSystem extends ecs.System {
|
||||
constructor() {
|
||||
super();
|
||||
this.add(new MoveToSystem());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "b44c446b-ce5f-4079-ac42-269837dbf580",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {}
|
||||
}
|
||||
136
assets/script/game/common/ecs/position/MoveTo.ts
Normal file
136
assets/script/game/common/ecs/position/MoveTo.ts
Normal file
@@ -0,0 +1,136 @@
|
||||
/*
|
||||
* @Author: dgflash
|
||||
* @Date: 2021-08-11 16:41:12
|
||||
* @LastEditors: dgflash
|
||||
* @LastEditTime: 2023-01-19 15:27:24
|
||||
*/
|
||||
import { Node, Vec3 } from "cc";
|
||||
import { Timer } from "../../../../../../extensions/oops-plugin-framework/assets/core/common/timer/Timer";
|
||||
import { Vec3Util } from "../../../../../../extensions/oops-plugin-framework/assets/core/utils/Vec3Util";
|
||||
import { ecs } from "../../../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS";
|
||||
|
||||
/** 向目标移动,移动过程中目标位置变化会自动修正移动目标点,直到未修正前移动到目标点停止 */
|
||||
@ecs.register('MoveTo')
|
||||
export class MoveToComp extends ecs.Comp {
|
||||
/** 移动节点 */
|
||||
node: Node = null!;
|
||||
/** 移动方向 */
|
||||
velocity: Vec3 = Vec3Util.zero;
|
||||
/** 移动速度(每秒移动的像素距离) */
|
||||
speed: number = 0;
|
||||
/** 目标实体ECS编号、目标位置 */
|
||||
target: Vec3 | Node | null = null;
|
||||
|
||||
/** 坐标标(默认本地坐标) */
|
||||
ns: number = Node.NodeSpace.LOCAL;
|
||||
/** 偏移距离 */
|
||||
offset: number = 0;
|
||||
/** 偏移向量 */
|
||||
offsetVector: Vec3 | null = null;
|
||||
/** 移动完成回调 */
|
||||
onComplete: Function | null = null;
|
||||
/** 距离变化时 */
|
||||
onChange: Function | null = null;
|
||||
|
||||
reset() {
|
||||
this.ns = Node.NodeSpace.LOCAL;
|
||||
this.offset = 0;
|
||||
this.target = null;
|
||||
this.offsetVector = null;
|
||||
this.onComplete = null;
|
||||
this.onChange = null;
|
||||
}
|
||||
}
|
||||
|
||||
@ecs.register('VariableMoveTo')
|
||||
class VariableMoveToComponent extends ecs.Comp {
|
||||
/** 延时触发器 */
|
||||
timer: Timer = new Timer();
|
||||
/** 终点备份 */
|
||||
end: Vec3 | null = null;
|
||||
/** 目标位置 */
|
||||
target!: Vec3;
|
||||
|
||||
reset() {
|
||||
this.end = null;
|
||||
this.timer.reset();
|
||||
}
|
||||
}
|
||||
|
||||
/** 跟踪移动到目标位置 */
|
||||
export class MoveToSystem extends ecs.ComblockSystem<ecs.Entity> implements ecs.IEntityEnterSystem, ecs.IEntityRemoveSystem, ecs.ISystemUpdate {
|
||||
filter(): ecs.IMatcher {
|
||||
return ecs.allOf(MoveToComp);
|
||||
}
|
||||
|
||||
entityEnter(e: ecs.Entity): void {
|
||||
e.add(VariableMoveToComponent);
|
||||
}
|
||||
|
||||
entityRemove(e: ecs.Entity): void {
|
||||
e.remove(VariableMoveToComponent);
|
||||
}
|
||||
|
||||
update(e: ecs.Entity) {
|
||||
let move = e.get(MoveToComp);
|
||||
let mtv = e.get(VariableMoveToComponent);
|
||||
let end: Vec3;
|
||||
|
||||
console.assert(move.speed > 0, "移动速度必须要大于零");
|
||||
|
||||
if (move.target instanceof Node) {
|
||||
end = move.ns == Node.NodeSpace.WORLD ? move.target.worldPosition : move.target.position;
|
||||
}
|
||||
else {
|
||||
end = move.target as Vec3;
|
||||
}
|
||||
|
||||
// 目标移动后,重计算移动方向与移动到目标点的速度
|
||||
if (mtv.end == null || !mtv.end.strictEquals(end)) {
|
||||
let target = end.clone();
|
||||
if (move.offsetVector) {
|
||||
target = target.add(move.offsetVector); // 这里的问题
|
||||
}
|
||||
|
||||
// 移动方向与移动数度
|
||||
let start = move.ns == Node.NodeSpace.WORLD ? move.node.worldPosition : move.node.position;
|
||||
move.velocity = Vec3Util.sub(target, start).normalize();
|
||||
|
||||
// 移动时间与目标偏位置计算
|
||||
let distance = Vec3.distance(start, target) - move.offset;
|
||||
|
||||
move.onChange?.call(this);
|
||||
|
||||
if (distance - move.offset <= 0) {
|
||||
this.exit(e);
|
||||
}
|
||||
else {
|
||||
mtv.timer.step = distance / move.speed;
|
||||
mtv.end = end.clone();
|
||||
mtv.target = move.velocity.clone().multiplyScalar(distance).add(start);
|
||||
}
|
||||
}
|
||||
|
||||
if (move.speed > 0) {
|
||||
let trans = Vec3Util.mul(move.velocity, move.speed * this.dt);
|
||||
move.node.translate(trans, Node.NodeSpace.LOCAL);
|
||||
}
|
||||
|
||||
// 移动完成事件
|
||||
if (mtv.timer.update(this.dt)) {
|
||||
if (move.ns == Node.NodeSpace.WORLD)
|
||||
move.node.worldPosition = mtv.target;
|
||||
else
|
||||
move.node.position = mtv.target;
|
||||
|
||||
this.exit(e);
|
||||
}
|
||||
}
|
||||
|
||||
private exit(e: ecs.Entity) {
|
||||
let move = e.get(MoveToComp);
|
||||
move.onComplete?.call(this);
|
||||
e.remove(VariableMoveToComponent);
|
||||
e.remove(MoveToComp);
|
||||
}
|
||||
}
|
||||
9
assets/script/game/common/ecs/position/MoveTo.ts.meta
Normal file
9
assets/script/game/common/ecs/position/MoveTo.ts.meta
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"ver": "4.0.23",
|
||||
"importer": "typescript",
|
||||
"imported": true,
|
||||
"uuid": "eb55eb50-dace-4e75-8965-3475c0b11835",
|
||||
"files": [],
|
||||
"subMetas": {},
|
||||
"userData": {}
|
||||
}
|
||||
@@ -32,7 +32,8 @@ export class MapViewComp extends CCComp {
|
||||
this.addHero(args.uuid)
|
||||
}
|
||||
reset(): void {
|
||||
|
||||
//撤销监听
|
||||
// oops.message.off("do_add_hero", this.on_do_add_hero, this);
|
||||
}
|
||||
|
||||
start() {
|
||||
@@ -45,6 +46,7 @@ export class MapViewComp extends CCComp {
|
||||
let pos = v3(BoxSet.HERO_START-50,BoxSet.GAME_LINE)
|
||||
role.load(pos,108,"Character07")
|
||||
smc.Role=role
|
||||
|
||||
}
|
||||
load_data(){
|
||||
// let heros = oops.res.get("config/game/heros")
|
||||
|
||||
Reference in New Issue
Block a user