From 1785cbedea447db5f24d66541d556b9b7a484441 Mon Sep 17 00:00:00 2001
From: honmono <1099263878@qq.com>
Date: Wed, 30 Mar 2022 10:57:19 +0800
Subject: [PATCH] update readme
---
BehaviorTree.dio | 46 +++
ECS.dio | 152 ++++++++
README.md | 422 ++++++++++++++++++++-
assets/Scene/helloworld.fire | 402 +++++++++++++++++++-
assets/Script/Core/RoleEventProcess.ts | 9 +-
assets/Script/ECS/components/ComMovable.ts | 2 -
assets/Script/ECS/systems/SysAttack.ts | 8 +-
assets/Script/ECS/systems/SysCocosView.ts | 9 +
assets/Script/ECS/systems/SysMonitor.ts | 10 +-
assets/Script/Main.ts | 24 +-
images/2022-03-30-00-58-10-image.png | Bin 0 -> 50462 bytes
images/2022-03-30-01-04-53-image.png | Bin 0 -> 11878 bytes
images/2022-03-30-01-11-22-image.png | Bin 0 -> 282496 bytes
images/巡逻.gif | Bin 0 -> 1396468 bytes
images/打斗.gif | Bin 0 -> 1806245 bytes
role1behaviortree.dio | 34 +-
16 files changed, 1073 insertions(+), 45 deletions(-)
create mode 100644 BehaviorTree.dio
create mode 100644 ECS.dio
mode change 100755 => 100644 README.md
create mode 100644 images/2022-03-30-00-58-10-image.png
create mode 100644 images/2022-03-30-01-04-53-image.png
create mode 100644 images/2022-03-30-01-11-22-image.png
create mode 100644 images/巡逻.gif
create mode 100644 images/打斗.gif
diff --git a/BehaviorTree.dio b/BehaviorTree.dio
new file mode 100644
index 0000000..236e5a8
--- /dev/null
+++ b/BehaviorTree.dio
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ECS.dio b/ECS.dio
new file mode 100644
index 0000000..70c654c
--- /dev/null
+++ b/ECS.dio
@@ -0,0 +1,152 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/README.md b/README.md
old mode 100755
new mode 100644
index 09b0019..576fa74
--- a/README.md
+++ b/README.md
@@ -1,2 +1,420 @@
-# hello-world
-Hello world new project template.
+# 在Cocos中使用ECS + BehaviorTree 实现格斗AI
+### 成品展示
+
+demo 角色AI包含了巡逻, 追踪, 攻击, 躲避攻击, 受伤打断攻击, 攻击打断闪避等. 可以细心看一下二图.
+
+巡逻中
+
+
+
+追逐打斗
+
+
+
+
+
+完整展示视频链接:
+
+https://www.bilibili.com/video/bv1hi4y1Q7Uv
+
+
+
+代码链接在文章末位.
+
+
+
+### 1. 写一个ECS框架
+
+**ECS** 全称 Entity - Component - System(实体 - 组件 - 系统).
+
+**组件只有属性没有行为, 系统只有行为没有属性.**
+
+-------
+
+本来这里想介绍一下ECS的概念, 但是写起来感觉像是记流水账, 网上已经有很多ECS的介绍文章了, 所以觉得不如贴几篇我个人觉得写的好的, 谈一谈我的理解.
+
+[浅谈《守望先锋》中的 ECS 构架](https://blog.codingnow.com/2017/06/overwatch_ecs.html)
+
+这篇文章应该是最早一批介绍ECS架构的文章了, 看过好几遍, 不仅全面的介绍了ECS架构, 还对比了ECS和传统游戏开发架构的区别. 以及在网络同步时的处理.
+
+[游戏开发中的ECS 架构概述](https://zhuanlan.zhihu.com/p/30538626)
+
+这篇文章比较接地气
+
+> ***ECS***,即 Entity-Component-System(实体-组件-系统) 的缩写,其模式遵循[组合优于继承](https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/Composition_over_inheritance)原则,游戏内的每一个基本单元都是一个**实体**,每个**实体**又由一个或多个**组件**构成,每个**组件**仅仅包含代表其特性的数据(即在组件中没有任何方法),例如:移动相关的组件`MoveComponent`包含速度、位置、朝向等属性,一旦一个实体拥有了`MoveComponent`组件便可以认为它拥有了移动的能力,**系统**便是来处理拥有一个或多个相同**组件**的**实体**集合的工具,其只拥有行为(即在系统中没有任何数据),在这个例子中,处理移动的**系统**仅仅关心拥有移动能力的**实体**,它会遍历所有拥有`MoveComponent`**组件**的**实体**,并根据相关的数据(速度、位置、朝向等),更新实体的位置。
+>
+> **实体**与**组件**是一个一对多的关系,**实体**拥有怎样的能力,完全是取决于其拥有哪些**组件**,通过动态添加或删除**组件**,可以在(游戏)运行时改变**实体**的行为。
+
+
+
+**这段话对于ECS的关系也是我设计的框架遵守的规则.** 即Component只包含属性, System只包含行为.
+
+
+
+#### 1. 这个ECS框架做了什么
+
+World-Entity-Component-System的关系图
+
+
+
+**World每帧根据顺序调用所有的System, System中会处理对应的Component. 在这个过程中, 使用者可以动态的创建或销毁Entity, 给Entity添加或移除Component.**
+
+
+
+为了更高效的维护Entity-Component-System的关系, 我采取了一些办法.
+
+###### 1. 所有的Component都通过其对应的ComponentPool维护.
+
+例如MoveComponent会生成一个MoveComponentPool进行维护, 方便实现复用. 外面不直接持有Component, 而是通过component在pool中的index索引便可以在对应的pool中获取到对应的Component.
+
+###### 2. Entity使用自增Id标识.
+
+外部不需要持有Entity对象, 或者说没有Entity对象, 所有的Entity都是一个Id, 通过这个Id在world内进行操作.
+
+###### 3. System通过Filter类管理关注的Entity.
+
+上文中提到System为了处理其关心的ComponentA, 会遍历所有拥有该ComponentA的Entity. 但是怎么判断哪下Entity有这个ComponentA呢? 传统的方法会遍历所有的Entity, 判断其是否有ComponentA, 这种方案明显是不够高效的. 所以这里引入了Filter类, 其方法的核心是空间换时间并有一套判断规则(接收某些类型的组件, 拒接某些类型的组件), 当每次进行AddComponent和RemoveComponent 或者RemoveEntity等会影响实体的操作时, 会通知所有的Filter有实体进行了修改,Filter会判断该实体是否还符合条件(也就是判断是否有ComponentA), 选择是否在Filter中保留该实体. 那么当System需要遍历某些特定的Entity时, 就可以直接通过对应的Filter就可以获得了.
+
+###### 4. Entity和Component的关系可以用一张二维表维护.
+
+| | ComponentA | ComponentB | ComponentC | ComponentD |
+|:-------:|:----------:|:----------:|:----------:|:----------:|
+| Entity1 | -1 | 0 | -1 | 0 |
+| Entity2 | -1 | 1 | 0 | -1 |
+
+如上述表格中Component数字的意思是其在Pool中的index索引, -1表示没有.
+
+所以Entity1有组件ComponentB, ComponentD.Entity1有组件ComponentB, ComponentC.
+
+**还有最后一个问题就是 如何将Entity和Component转换成0~N的整数以方便构建二维数组呢?**
+
+对于Entity可以通过id的自增实现, 每创建一个Entity, id++.
+
+而Component可以根据类型的枚举值得到唯一标识. 如下面的枚举值.
+
+```typescript
+export enum ComType {
+ ComCocosNode = 0,
+ ComMovable = 1,
+ ComNodeConfig = 2,
+ ComBehaviorTree = 3,
+ ComTransform = 4,
+ ComMonitor = 5,
+ ComRoleConfig = 6,
+ ComAttackable = 7,
+ ComBeAttacked = 8
+}
+```
+
+这样就可以构建出上面的二维表了.
+
+
+
+最后还可以通过ts的注解, 将ComType注入到对应的Component类中. 将type和component一一对应起来.
+
+```typescript
+// 项目中一个Component.
+@ECSComponent(ComType.ComMovable)
+export class ComMovable {
+ public running = false;
+ public speed = 0;
+ public points: cc.Vec2[] = [];
+ public pointIdx = 0;
+ public keepDir = false;
+ public speedDirty = false;
+}
+```
+
+###### 小结: 到这一步就已经完成框架部分了, 再展示一下ComMovable对应的SysMovable. 这个System会每帧根据ComMovable的当前状态, 计算出下一帧的ComMovable状态.
+
+这里插入一下对于Filter的更详细的介绍, Filter的判断规则是通过参数判断接收某些类型的组件, 拒接某些类型的组件. 比如这个参数[ComMovable, ComTransform, ComCocosNode])表示这个Filter保存的是同时含有ComMovable,ComTransform,ComCocosNode组件的实体.
+
+```
+const FILTER_MOVE = GenFilterKey([ComMovable, ComTransform, ComCocosNode]);
+export class SysMovable extends ECSSystem {
+ /** 更新 */
+ public onUpdate(world: ECSWorld, dt:number): void {
+ world.getFilter(FILTER_MOVE).walk((entity: number) => {
+ let comMovable = world.getComponent(entity, ComMovable);
+ let comTrans = world.getComponent(entity, ComTransform);
+ if(comMovable.speed <= 0 || comMovable.pointIdx >= comMovable.points.length) {
+ return ;
+ }
+ if(!comMovable.running) {
+ comMovable.running = true;
+ }
+ let moveLen = comMovable.speed * dt;
+ while(moveLen > 0 && comMovable.pointIdx < comMovable.points.length) {
+ let nextPoint = comMovable.points[comMovable.pointIdx];
+ let offsetX = nextPoint.x - comTrans.x;
+ let offsetY = nextPoint.y - comTrans.y;
+ let offsetLen = Math.sqrt(offsetX * offsetX + offsetY * offsetY);
+ if(offsetLen <= moveLen) {
+ moveLen -= offsetLen;
+ comTrans.x = nextPoint.x;
+ comTrans.y = nextPoint.y;
+ comMovable.pointIdx ++;
+ continue;
+ }
+ if(!comMovable.keepDir) {
+ comTrans.dir.x = offsetX / offsetLen || comTrans.dir.x;
+ comTrans.dir.y = offsetY / offsetLen;
+ }
+ comTrans.x += moveLen * offsetX / offsetLen;
+ comTrans.y += moveLen * offsetY / offsetLen;
+
+ moveLen = -1;
+ }
+ if(comMovable.pointIdx >= comMovable.points.length) {
+ comMovable.speed = 0;
+ comMovable.speedDirty = true;
+ }
+ return false;
+ });
+ }
+}
+```
+
+
+
+#### 2. ECS框架和Cocos Creator结合
+
+
+
+ECS框架本身的实现不难, 核心代码只有几百行的样子, 但是如何将这个框架和Cocos Creator结合起来, 或者说怎么展示一个Node, 并可以通过ECS的方式操控Node呢?
+
+
+
+以上面的ComMovable和SysMovable为例, ECS本身更多的是数据上的逻辑处理, Entity添加了ComMovable组件就获得了SysMovable的能力, 那么给Entity添加一个显示Node的组件(ComCocosNode), 在通过一个处理ComCocosNode的System(SysCocosView)是不是就实现了展示node的能力呢.
+
+
+
+###### 1. 设计结合Cocos中Node的组件
+
+基于这个想法我设计了ComCocosNode.
+
+```typescript
+@ECSComponent(ComType.ComCocosNode)
+export class ComCocosNode {
+ public node: cc.Node = null;
+ public loaded = false;
+ public events: EventBase[] = [];
+}
+```
+
+ComCocosNode中有node属性. 通过Entity获取到ComCocosNode组件就可以修改node的属性了, 而events是因为对于node我们不仅有同步的处理, 也有一些异步的处理, 比如播放一系列动画, 这种可以通过添加事件的方式, 即在system不直接调用node的组件方法, 而是让组件自己读取event, 自己去处理.
+
+
+
+这个时候node还没有赋值, 所以我又设计了一个组件ComNodeConfig
+
+```typescript
+@ECSComponent(ComType.ComNodeConfig)
+export class ComNodeConfig {
+ id = 0; // 唯一标识
+ prefabUrl = ''
+ layer = 0; // 层级
+}
+```
+
+这里可能会有人有疑问, 为什么不把这两个组件的属性合并到一起, 这个其实是为了方便配置, ComNodeConfig的属性都是可以直接配置在表上的, 这样的话就方便配置同学了.
+
+
+
+###### 2. 设计处理ComNodeConfig的System
+
+最后通过一个SysCocosView系统, 这个系统处理的实体是 有ComNodeConfig组件, 但是没有ComCocosNode组件的实体. 每次遍历时根据ComNodeConfig组件的prefabUrl加载prefab生成node, 根据layer层级将node添加到指定位置, 然后给这个实体添加ComCocosNode组件, 将node值赋上. 这样下一次就不会处理这个实体了. 下面的代码是demo已经完成后的代码了, 我就不还原到刚开始时候的样子了.
+
+```typescript
+const FILTER_COCOS_NODE = GenFillterKey([ComNodeConfig], [ComCocosNode]);
+const FILTER_NODE_EVENT = GenFillterKey([ComCocosNode, ComTransform]);
+export class SysCocosView extends ECSSystem implements ITouchProcessor {
+
+ onUpdate(world:ECSWorld, dt:number) {
+ world.getFilter(FILTER_COCOS_NODE).walk((entity: number) => {
+ let comNodeConfig = world.getComponent(entity, ComNodeConfig);
+ let comView = world.addComponent(entity, ComCocosNode);
+ let comRoleConfig = world.getComponent(entity, ComRoleConfig);
+ this._loadView(world, entity, comNodeConfig).then((node: cc.Node) => {
+ console.log('load view success');
+ });
+ return false;
+ });
+
+ world.getFilter(FILTER_NODE_EVENT).walk((entity: number) => {
+ let comCocosNode = world.getComponent(entity, ComCocosNode);
+ if(!comCocosNode.loaded) return ;
+ let eventProcess = comCocosNode.node.getComponent(EventProcess);
+ if(!eventProcess) return ;
+ let comTrans = world.getComponent(entity, ComTransform);
+ eventProcess.sync(comTrans.x, comTrans.y, comTrans.dir);
+ while(comCocosNode.events.length) {
+ let event = comCocosNode.events.shift();
+ eventProcess.processEvent(event);
+ }
+ return true;
+ });
+ }
+}
+```
+
+
+
+### 写一个BehaviorTree(行为树)
+
+###### 1. BehaviroTree是什么?
+
+介绍行为树网上也有很多文章了, 我这里也就不赘述了.
+
+[游戏AI之决策结构—行为树 - KillerAery - 博客园](https://www.cnblogs.com/KillerAery/p/10007887.html)
+
+[AI 行为树的工作原理 | indienova 独立游戏](https://indienova.com/indie-game-development/ai-behavior-trees-how-they-work/)
+
+> 行为树的名字很好地解释了它是什么。不像有限状态机(Finite State Machine)或其他用于 AI 编程的系统,行为树是一棵用于控制 AI 决策行为的、包含了层级节点的树结构。树的最末端——叶子,就是这些 AI 实际上去做事情的命令;连接树叶的树枝,就是各种类型的节点,这些节点决定了 AI 如何从树的顶端根据不同的情况,来沿着不同的路径来到最终的叶子这一过程。
+>
+> 行为树可以非常地“深”,层层节点向下延伸。凭借调用实现具体功能的子行为树,开发者可以建立相互连接的行为树库来做出非常让人信服的 AI 行为。并且,行为树的开发是高度迭代的,你可以从一个很简单的行为开始,然后做一些分支来应对不同的情境或是实现不同的目标,让 AI 的诉求来驱动行为,或是允许 AI 在行为树没有覆盖到的情境下使用备用方案等等。
+
+树的最末端叶子是AI实际上做的事的命令可以称为行为, 行为是需要用户编写的具体的动作, 比如移动到某位置, 攻击, 闪避等. 联系根到叶子的节点的中间节点可以称为决策节点, 决策节点并没有实际的行为,而是决定是否可以向下执行到叶子节点.
+
+
+
+如何决定呢?
+
+每一个结点执行后都会返回一个状态, 状态有三种1, Success. 2, Fail. 3, Running.
+
+Success和Fail很好理解, 比如一个监视节点, 看到了敌人返回success, 没看到返回Fail.
+
+但是对于一个需要执行一段时间的节点, 比如1s内移动五步, 在不到1s时去看节点的状态, 这个时候返回成功或者失败都是不合理的, 所以这种情况应该返回Running表示这个节点还在执行中. 等下一帧在继续判断.
+
+
+
+这个时候我们可以设计这样一个节点, 它的状态是和子节点状态挂钩的, 按顺序执行子节点,如果遇到了执行失败的结点则返回失败, 如果全部执行成功则返回成功. 这种结点可以称为Sequence.
+
+类似的结点还有Select, 这个节点的状态是按顺序执行子节点,如果全部执行失败则返回失败, 如果遇到执行成功则返回成功.
+
+下面是一个实际项目Sequence的实现.
+
+```typescript
+/** Sequence node */
+NodeHandlers[NodeType.Sequence] = {
+ onEnter(node: SequenceNode, context: ExecuteContext) : void {
+ node.currIdx = 0;
+ context.executor.onEnterBTNode(node.children[node.currIdx], context);
+ node.state = NodeState.Executing;
+ },
+ onUpdate(node: SequenceNode, context: ExecuteContext) : void {
+ if(node.currIdx < 0 || node.currIdx >= node.children.length) {
+ // 越界了, 不应该发生, 直接认为是失败了
+ node.state = NodeState.Fail;
+ return;
+ }
+ // 检查前置条件是否满足
+ for(let i=0; i
+
+
+
+###### 2. 决策的时效性
+
+根据我看的一些文档, 对于行为树的决策是每一帧都要更新的, 比如现在有一个场景, 用户可以输入文本, 输入move让方块A向前移动10格子, 输入stop方块A停止移动. 那么对于行为树来说, 每一帧都要判断当前用户输入的是move,还是stop, 从而下达是移动还是停止的行为.
+
+对于移动, 行为是sequence([用户输入move, 移动]); 用ActionA代替
+
+对于停止, 行为是sequence([用户输入stop, 停止]);用ActionB代替
+
+最终行为是select([ActionA, ActionB])
+
+> sequence表示按顺序执行子行为, 如果遇到子行为执行失败, 那么立刻停止, 并返回失败, 如果全部执行成功, 那么返回成功.
+
+> select表示按顺序执行子行为, 如果遇到子行为执行成功, 那么立即停止, 并返回成功. 如果全部执行失败, 那么返回失败.
+
+假设现在用户点击一下, 那么每帧都需要从头一层层向下判断执行, 直到判断到移动再执行.
+
+当然这是有必要的, 对于行为来说 确定自己能否应该执行是十分重要的.
+
+但是这对执行一个 持续性的行为很不友好. 假设还是上面的场景, 用户输入sleep, 方块停止移动2s. 就是sequence([用户输入sleep, 停止移动2s]). 这个时候行为树是 select([ActionA, ActionB, ActionC]);
+
+那么当我输入sleep, 方块停止移动的时间内, 输入move, 那么下一帧的决策就进入了ActionA, 导致方块移动. 停止移动2s的行为被打断了.
+
+这个问题我称为行为树决策的时效性, 也就是行为得到的决策, 并不能维持一定时间.
+
+这个决策其实目前只是sequence和Select 才拥有的.
+
+## 如何解决:
+
+因为我是自己想的, 所以解决方案可能不是最优的.
+
+首先我加入了具有时效性的LockedSequence, LockedSelect, 也就是当前行为的决策一旦做出, 就必须在当前行为完全结束后才能被修改.
+
+```
+class NodeHandler {
+
+onEnter:(node: NodeBase, context: ExecuteContext) => void;
+
+onUpdate:(node: NodeBase, context: ExecuteContext) => void;
+
+}
+```
+
+引入一丢丢代码, 在onEnter时, 将当前行为的状态置为 running, 在onUpdate时判断, 如果当前状态不是running就return. 所以一旦状态确定, 就不会再onUpdate中被修改, 直到下一次进入onEnter.
+
+这个时候在带入上述的场景就没问题了, 当用户输入sleep时, 方块停止移动2s, 在2s内输入move, 并不会导致ActionC的决策更改, 直到停止移动2s的行为结束, 进入下一个周期后才会进入ActionA
+
+但是这个同样也导致了另一个问题, 就是并行的行为. 比如假设一个场景, 士兵一边巡逻, 一边观察是否有敌人, 如果有敌人, 那么停止巡逻, 去追击敌人.
+
+行为树如下:
+
+ActionA = 巡逻
+
+ActionB = sequence([观察是否有敌人, 追击敌人]);
+
+repeat(sequence([ActionB, ActionA]))
+
+因为上面的方法在行为结束前不会修改决策, 那么就会出现, 士兵先观察是否有敌人, 没有就去巡逻, 巡逻完了, 再去观察是否有敌人, 这就太蠢了.
+
+我解决上面的问题的方案是添加一个新的决策Node, 这个Node就是处理并行行为的.
+
+parallel 的能力是 顺序处理子节点, 但是并不需要等待前一个节点执行完毕后才能执行后一个. 当有行为返回失败时, 立即退出返回失败, 当所有行为返回成功时, 停止返回成功.
+
+行为树如下:
+
+repeat(selector([parallel([Inverter(观察是否有敌人), 巡逻]), 追击敌人]))
+
+> Inverter表示取反
+
+当前没有发现有敌人, 那么行为在巡逻, parallel还在running阶段, 因为巡逻不会失败, 所以最后一种情况是 如果发现敌人, 那么parallel立即返回失败, 那么行为就到了追击敌人了.
+
+
+
+最后展示一下Demo中的行为树.
+
+
+
diff --git a/assets/Scene/helloworld.fire b/assets/Scene/helloworld.fire
index 21f83de..baba273 100755
--- a/assets/Scene/helloworld.fire
+++ b/assets/Scene/helloworld.fire
@@ -82,18 +82,21 @@
},
{
"__id__": 18
+ },
+ {
+ "__id__": 26
}
],
"_active": true,
"_components": [
{
- "__id__": 26
+ "__id__": 34
},
{
- "__id__": 27
+ "__id__": 35
},
{
- "__id__": 28
+ "__id__": 36
}
],
"_prefab": null,
@@ -698,8 +701,8 @@
],
"_srcBlendFactor": 770,
"_dstBlendFactor": 771,
- "_string": "button",
- "_N$string": "button",
+ "_string": "add a",
+ "_N$string": "add a",
"_fontSize": 20,
"_lineHeight": 40,
"_enableWrapText": false,
@@ -1083,8 +1086,8 @@
],
"_srcBlendFactor": 770,
"_dstBlendFactor": 771,
- "_string": "button",
- "_N$string": "button",
+ "_string": "add b",
+ "_N$string": "add b",
"_fontSize": 20,
"_lineHeight": 40,
"_enableWrapText": false,
@@ -1256,6 +1259,391 @@
"handler": "onClick2",
"customEventData": ""
},
+ {
+ "__type__": "cc.Node",
+ "_name": "New Button",
+ "_objFlags": 0,
+ "_parent": {
+ "__id__": 2
+ },
+ "_children": [
+ {
+ "__id__": 27
+ }
+ ],
+ "_active": true,
+ "_components": [
+ {
+ "__id__": 32
+ }
+ ],
+ "_prefab": null,
+ "_opacity": 255,
+ "_color": {
+ "__type__": "cc.Color",
+ "r": 255,
+ "g": 255,
+ "b": 255,
+ "a": 255
+ },
+ "_contentSize": {
+ "__type__": "cc.Size",
+ "width": 100,
+ "height": 40
+ },
+ "_anchorPoint": {
+ "__type__": "cc.Vec2",
+ "x": 0.5,
+ "y": 0.5
+ },
+ "_trs": {
+ "__type__": "TypedArray",
+ "ctor": "Float64Array",
+ "array": [
+ 473.095,
+ 245.37,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 1,
+ 1,
+ 1
+ ]
+ },
+ "_eulerAngles": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_skewX": 0,
+ "_skewY": 0,
+ "_is3DNode": false,
+ "_groupIndex": 0,
+ "groupIndex": 0,
+ "_id": "85qrRc4bZJc5jmPaLOoN5t"
+ },
+ {
+ "__type__": "cc.Node",
+ "_name": "Background",
+ "_objFlags": 512,
+ "_parent": {
+ "__id__": 26
+ },
+ "_children": [
+ {
+ "__id__": 28
+ }
+ ],
+ "_active": true,
+ "_components": [
+ {
+ "__id__": 30
+ },
+ {
+ "__id__": 31
+ }
+ ],
+ "_prefab": null,
+ "_opacity": 255,
+ "_color": {
+ "__type__": "cc.Color",
+ "r": 255,
+ "g": 255,
+ "b": 255,
+ "a": 255
+ },
+ "_contentSize": {
+ "__type__": "cc.Size",
+ "width": 100,
+ "height": 40
+ },
+ "_anchorPoint": {
+ "__type__": "cc.Vec2",
+ "x": 0.5,
+ "y": 0.5
+ },
+ "_trs": {
+ "__type__": "TypedArray",
+ "ctor": "Float64Array",
+ "array": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 1,
+ 1,
+ 0
+ ]
+ },
+ "_eulerAngles": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_skewX": 0,
+ "_skewY": 0,
+ "_is3DNode": false,
+ "_groupIndex": 0,
+ "groupIndex": 0,
+ "_id": "0ekZoSTDRBLICbpC5YU3je"
+ },
+ {
+ "__type__": "cc.Node",
+ "_name": "Label",
+ "_objFlags": 512,
+ "_parent": {
+ "__id__": 27
+ },
+ "_children": [],
+ "_active": true,
+ "_components": [
+ {
+ "__id__": 29
+ }
+ ],
+ "_prefab": null,
+ "_opacity": 255,
+ "_color": {
+ "__type__": "cc.Color",
+ "r": 0,
+ "g": 0,
+ "b": 0,
+ "a": 255
+ },
+ "_contentSize": {
+ "__type__": "cc.Size",
+ "width": 100,
+ "height": 40
+ },
+ "_anchorPoint": {
+ "__type__": "cc.Vec2",
+ "x": 0.5,
+ "y": 0.5
+ },
+ "_trs": {
+ "__type__": "TypedArray",
+ "ctor": "Float64Array",
+ "array": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1,
+ 1,
+ 1,
+ 1
+ ]
+ },
+ "_eulerAngles": {
+ "__type__": "cc.Vec3",
+ "x": 0,
+ "y": 0,
+ "z": 0
+ },
+ "_skewX": 0,
+ "_skewY": 0,
+ "_is3DNode": false,
+ "_groupIndex": 0,
+ "groupIndex": 0,
+ "_id": "b1O0CAOdZBz5+5gIn3dR5n"
+ },
+ {
+ "__type__": "cc.Label",
+ "_name": "",
+ "_objFlags": 0,
+ "node": {
+ "__id__": 28
+ },
+ "_enabled": true,
+ "_materials": [
+ {
+ "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432"
+ }
+ ],
+ "_srcBlendFactor": 770,
+ "_dstBlendFactor": 771,
+ "_string": "debug",
+ "_N$string": "debug",
+ "_fontSize": 20,
+ "_lineHeight": 40,
+ "_enableWrapText": false,
+ "_N$file": null,
+ "_isSystemFontUsed": true,
+ "_spacingX": 0,
+ "_batchAsBitmap": false,
+ "_styleFlags": 0,
+ "_underlineHeight": 0,
+ "_N$horizontalAlign": 1,
+ "_N$verticalAlign": 1,
+ "_N$fontFamily": "Arial",
+ "_N$overflow": 1,
+ "_N$cacheMode": 1,
+ "_id": "6cPxNByvpCFJiTXSiCxOaC"
+ },
+ {
+ "__type__": "cc.Sprite",
+ "_name": "",
+ "_objFlags": 0,
+ "node": {
+ "__id__": 27
+ },
+ "_enabled": true,
+ "_materials": [
+ {
+ "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432"
+ }
+ ],
+ "_srcBlendFactor": 770,
+ "_dstBlendFactor": 771,
+ "_spriteFrame": {
+ "__uuid__": "f0048c10-f03e-4c97-b9d3-3506e1d58952"
+ },
+ "_type": 1,
+ "_sizeMode": 0,
+ "_fillType": 0,
+ "_fillCenter": {
+ "__type__": "cc.Vec2",
+ "x": 0,
+ "y": 0
+ },
+ "_fillStart": 0,
+ "_fillRange": 0,
+ "_isTrimmedMode": true,
+ "_atlas": null,
+ "_id": "adrDAfICJAQ4XbjieFeAUn"
+ },
+ {
+ "__type__": "cc.Widget",
+ "_name": "",
+ "_objFlags": 0,
+ "node": {
+ "__id__": 27
+ },
+ "_enabled": true,
+ "alignMode": 0,
+ "_target": null,
+ "_alignFlags": 45,
+ "_left": 0,
+ "_right": 0,
+ "_top": 0,
+ "_bottom": 0,
+ "_verticalCenter": 0,
+ "_horizontalCenter": 0,
+ "_isAbsLeft": true,
+ "_isAbsRight": true,
+ "_isAbsTop": true,
+ "_isAbsBottom": true,
+ "_isAbsHorizontalCenter": true,
+ "_isAbsVerticalCenter": true,
+ "_originalWidth": 100,
+ "_originalHeight": 40,
+ "_id": "d4dYinX5hGWaxVDkLesoz7"
+ },
+ {
+ "__type__": "cc.Button",
+ "_name": "",
+ "_objFlags": 0,
+ "node": {
+ "__id__": 26
+ },
+ "_enabled": true,
+ "_normalMaterial": null,
+ "_grayMaterial": null,
+ "duration": 0.1,
+ "zoomScale": 1.2,
+ "clickEvents": [
+ {
+ "__id__": 33
+ }
+ ],
+ "_N$interactable": true,
+ "_N$enableAutoGrayEffect": false,
+ "_N$transition": 3,
+ "transition": 3,
+ "_N$normalColor": {
+ "__type__": "cc.Color",
+ "r": 230,
+ "g": 230,
+ "b": 230,
+ "a": 255
+ },
+ "_N$pressedColor": {
+ "__type__": "cc.Color",
+ "r": 200,
+ "g": 200,
+ "b": 200,
+ "a": 255
+ },
+ "pressedColor": {
+ "__type__": "cc.Color",
+ "r": 200,
+ "g": 200,
+ "b": 200,
+ "a": 255
+ },
+ "_N$hoverColor": {
+ "__type__": "cc.Color",
+ "r": 255,
+ "g": 255,
+ "b": 255,
+ "a": 255
+ },
+ "hoverColor": {
+ "__type__": "cc.Color",
+ "r": 255,
+ "g": 255,
+ "b": 255,
+ "a": 255
+ },
+ "_N$disabledColor": {
+ "__type__": "cc.Color",
+ "r": 120,
+ "g": 120,
+ "b": 120,
+ "a": 200
+ },
+ "_N$normalSprite": {
+ "__uuid__": "f0048c10-f03e-4c97-b9d3-3506e1d58952"
+ },
+ "_N$pressedSprite": {
+ "__uuid__": "e9ec654c-97a2-4787-9325-e6a10375219a"
+ },
+ "pressedSprite": {
+ "__uuid__": "e9ec654c-97a2-4787-9325-e6a10375219a"
+ },
+ "_N$hoverSprite": {
+ "__uuid__": "f0048c10-f03e-4c97-b9d3-3506e1d58952"
+ },
+ "hoverSprite": {
+ "__uuid__": "f0048c10-f03e-4c97-b9d3-3506e1d58952"
+ },
+ "_N$disabledSprite": {
+ "__uuid__": "29158224-f8dd-4661-a796-1ffab537140e"
+ },
+ "_N$target": {
+ "__id__": 27
+ },
+ "_id": "749WE4zm1JhpiMAmdyMCeA"
+ },
+ {
+ "__type__": "cc.ClickEvent",
+ "target": {
+ "__id__": 2
+ },
+ "component": "",
+ "_componentId": "e1b90/rohdEk4SdmmEZANaD",
+ "handler": "onClick3",
+ "customEventData": ""
+ },
{
"__type__": "cc.Canvas",
"_name": "",
diff --git a/assets/Script/Core/RoleEventProcess.ts b/assets/Script/Core/RoleEventProcess.ts
index 12d9a20..eb02598 100644
--- a/assets/Script/Core/RoleEventProcess.ts
+++ b/assets/Script/Core/RoleEventProcess.ts
@@ -59,7 +59,12 @@ export default class RoleEventProcess extends EventProcess {
break;
case EventType.GraphicsDraw:
- this._graphicsDraw(event as EventGraphicsDraw);
+ if(cc.debug.isDisplayStats()) {
+ this._graphicsDraw(event as EventGraphicsDraw);
+ }else {
+ this._graphicsDraw(null);
+ }
+
break;
@@ -76,7 +81,7 @@ export default class RoleEventProcess extends EventProcess {
}
private _graphicsDraw(event: EventGraphicsDraw) {
- if(event.points.length <= 0) {
+ if(!event || event.points.length <= 0) {
this.graphics.clear();
return ;
}
diff --git a/assets/Script/ECS/components/ComMovable.ts b/assets/Script/ECS/components/ComMovable.ts
index 39fa82d..0166722 100755
--- a/assets/Script/ECS/components/ComMovable.ts
+++ b/assets/Script/ECS/components/ComMovable.ts
@@ -7,8 +7,6 @@ export class ComMovable {
public speed = 0;
public points: cc.Vec2[] = [];
public pointIdx = 0;
-
public keepDir = false;
-
public speedDirty = false;
}
\ No newline at end of file
diff --git a/assets/Script/ECS/systems/SysAttack.ts b/assets/Script/ECS/systems/SysAttack.ts
index d8c671d..bf1ea3e 100644
--- a/assets/Script/ECS/systems/SysAttack.ts
+++ b/assets/Script/ECS/systems/SysAttack.ts
@@ -23,7 +23,13 @@ export class SysAttack extends ECSSystem {
}
/** */
public onEntityLeave(world: ECSWorld, entity: number): void {
-
+ let filter = world.getFilter(FILTER_ATTACKABLE);
+ // 判断当前monitor是否
+ filter.entities.forEach((value: boolean, otherEntity: number) => {
+ let comBeAttacked = world.getComponent(otherEntity, ComBeAttacked);
+ if(!comBeAttacked) return ;
+ if(comBeAttacked.attacker == entity) comBeAttacked.attacker = -1;
+ });
}
/** 更新 */
public onUpdate(world: ECSWorld, dt: number): void {
diff --git a/assets/Script/ECS/systems/SysCocosView.ts b/assets/Script/ECS/systems/SysCocosView.ts
index 05d6b71..0c7ad43 100755
--- a/assets/Script/ECS/systems/SysCocosView.ts
+++ b/assets/Script/ECS/systems/SysCocosView.ts
@@ -19,9 +19,18 @@ const FILTER_NODE_EVENT = GenFillterKey([ComCocosNode, ComTransform]);
export class SysCocosView extends ECSSystem implements ITouchProcessor {
onTouchStart(worldPos: cc.Vec2, world: ECSWorld): boolean {
+
return false;
}
+ onTouchMove(worldPos: cc.Vec2, world: ECSWorld): void {
+
+ }
+
+ onTouchCancel(worldPos: cc.Vec2, world: ECSWorld): void {
+
+ }
+
onAdd(world: ECSWorld) {
}
diff --git a/assets/Script/ECS/systems/SysMonitor.ts b/assets/Script/ECS/systems/SysMonitor.ts
index d1f4a9b..9f753ea 100644
--- a/assets/Script/ECS/systems/SysMonitor.ts
+++ b/assets/Script/ECS/systems/SysMonitor.ts
@@ -21,8 +21,8 @@ export class SysMonitor extends ECSSystem {
/** */
public onEntityLeave(world: ECSWorld, entity: number): void {
let filter = world.getFilter(FILTER_MONITOR);
- // 判断当前monitor是否
- filter.entities.forEach((value: boolean, otherEntity: number) => {
+ // 判断当前monitor是否
+ filter.entities.forEach((value: boolean, otherEntity: number) => {
let comMonitor = world.getComponent(otherEntity, ComMonitor);
if(!comMonitor) return ;
for(let i=comMonitor.others.length-1; i>=0; i--) {
@@ -60,12 +60,6 @@ export class SysMonitor extends ECSSystem {
let _check = (com: ComTransform) => {
return (a.sub(cc.v2(com.x, com.y)).len() < comMonitor.aroundLen || isInTriangle(cc.v2(com.x, com.y), a, b, c) || isInTriangle(cc.v2(com.x, com.y), b, c, d))
}
- // for(let i=comMonitor.others.length-1; i>=0; i--) {
- // const com = world.getComponent(comMonitor.others[i], ComTransform);
- // if(!com || !_check(com)) {
- // comMonitor.others.splice(i, 1);
- // }
- // }
if(comMonitor.others.indexOf(otherEntity) == -1 && _check(comTransOther)) {
comMonitor.others.push(otherEntity);
diff --git a/assets/Script/Main.ts b/assets/Script/Main.ts
index 7e4ce61..51e72ae 100644
--- a/assets/Script/Main.ts
+++ b/assets/Script/Main.ts
@@ -28,6 +28,8 @@ export default class Main extends cc.Component {
this.regiestTouchEvent();
+ //this.regiestTouchHandler();
+
}
onClick1() {
@@ -38,6 +40,10 @@ export default class Main extends cc.Component {
this.ecsController.createRoleEntity("Cyborg");
}
+ onClick3() {
+ cc.debug.setDisplayStats(!cc.debug.isDisplayStats());
+ }
+
protected update(dt: number): void {
if(this._world) this._world.update(dt);
}
@@ -54,14 +60,20 @@ export default class Main extends cc.Component {
this._touchHandler[i].onTouchStart(e.getLocation(), this._world);
}
}
- private _onTouchMove() {
-
+ private _onTouchMove(e: cc.Event.EventTouch) {
+ for(let i = 0; i < this._touchHandler.length; i++) {
+ this._touchHandler[i].onTouchMove(e.getLocation(), this._world);
+ }
}
- private _onTouchEnd() {
-
+ private _onTouchEnd(e: cc.Event.EventTouch) {
+ for(let i = 0; i < this._touchHandler.length; i++) {
+ this._touchHandler[i].onTouchEnd(e.getLocation(), this._world);
+ }
}
- private _onTouchCancel() {
-
+ private _onTouchCancel(e: cc.Event.EventTouch) {
+ for(let i = 0; i < this._touchHandler.length; i++) {
+ this._touchHandler[i].onTouchCancel(e.getLocation(), this._world);
+ }
}
public regiestTouchHandler(handler: ITouchProcessor) {
diff --git a/images/2022-03-30-00-58-10-image.png b/images/2022-03-30-00-58-10-image.png
new file mode 100644
index 0000000000000000000000000000000000000000..1058c14310ea311d6b06dff6c382df4bce1b358e
GIT binary patch
literal 50462
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
literal 0
HcmV?d00001
diff --git a/images/2022-03-30-01-04-53-image.png b/images/2022-03-30-01-04-53-image.png
new file mode 100644
index 0000000000000000000000000000000000000000..d6c9f214555dd47296b11f094af7c7265510ef8f
GIT binary patch
literal 11878
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