mirror of
				https://github.com/kirikayakazuto/CocosCreator_ECS
				synced 2025-10-30 19:05:52 +00:00 
			
		
		
		
	update
This commit is contained in:
		| @@ -1,5 +1,6 @@ | ||||
| import { ComAttackable } from "../components/ComAttackable"; | ||||
| import { ComBeAttacked } from "../components/ComBeAttacked"; | ||||
| import { ComMonitor } from "../components/ComMonitor"; | ||||
| import { ComRoleConfig } from "../components/ComRoleConfig"; | ||||
| import { ComTransform } from "../components/ComTransform"; | ||||
| import { ECSSystem } from "../lib/ECSSystem"; | ||||
| @@ -31,36 +32,79 @@ export class SysAttack extends ECSSystem { | ||||
|             let comTransSelf = world.getComponent(entity, ComTransform); | ||||
|             let comAttackable = world.getComponent(entity, ComAttackable); | ||||
|             let comRoleConfigSelf = world.getComponent(entity, ComRoleConfig); | ||||
|             if(comAttackable.countDown <= 0) return ; | ||||
|             comAttackable.countDown -= dt; | ||||
|             if(!comAttackable.dirty) return ; | ||||
|  | ||||
|             if(comAttackable.mustAttackFrame) | ||||
|             if(comAttackable.dirty && comAttackable.countDown <= comAttackable.hurtFrame) { | ||||
|             comAttackable.countDown -= dt; | ||||
|             if(comAttackable.countDown <= 0) { | ||||
|                 comAttackable.dirty = false; | ||||
|                 for(const entityOther of comAttackable.willHurts) { | ||||
|                     let comBeAttacked = world.getComponent(entityOther, ComBeAttacked); | ||||
|                     if(comBeAttacked && comBeAttacked.attacker == entity) comBeAttacked.attacker = -1; | ||||
|                 } | ||||
|                 comAttackable.willHurts.length = 0; | ||||
|             } | ||||
|  | ||||
|             let limitX = comTransSelf.x + Math.sign(comTransSelf.dir.x) * comAttackable.hurtArea.x; | ||||
|             let minX = Math.min(comTransSelf.x, limitX); | ||||
|             let maxX = Math.max(comTransSelf.x, limitX); | ||||
|             let minY = comTransSelf.y - comAttackable.hurtArea.y; | ||||
|             let maxY = comTransSelf.y + comAttackable.hurtArea.y; | ||||
|  | ||||
|             let _checkBeAttack = (entityOther: number) => { | ||||
|                 if(entity == entityOther) return false; | ||||
|                 let comRoleConfigOther = world.getComponent(entityOther, ComRoleConfig); | ||||
|                 if(!comRoleConfigOther || comRoleConfigOther.team == comRoleConfigSelf.team) return false; | ||||
|                 let comTransOther = world.getComponent(entityOther, ComTransform); | ||||
|                 if(comTransOther.x < minX || comTransOther.x > maxX || Math.abs(comTransOther.y - comTransSelf.y) >= comAttackable.hurtArea.y) { | ||||
|                     return false; | ||||
|                 } | ||||
|                 return true | ||||
|             } | ||||
|  | ||||
|             comAttackable.debugInfo = { | ||||
|                 points: [cc.v2(minX, minY), cc.v2(maxX, minY), cc.v2(maxX, maxY), cc.v2(minX, maxY)], | ||||
|                 color: cc.Color.RED, | ||||
|             }; | ||||
|  | ||||
|             // 即将攻击未完成, 并且处于即将攻击时间段 | ||||
|             if(!comAttackable.willHurtFrameCompleted && comAttackable.countDown <= comAttackable.willHurtFrame) { | ||||
|                 comAttackable.willHurtFrameCompleted = true; | ||||
|                 world.getFilter(FILTER_BEATTACKED).walk((entityOther: number) => { | ||||
|                     if(!_checkBeAttack(entityOther)) return ; | ||||
|                     let comBeAttackedOther = world.getComponent(entityOther, ComBeAttacked); | ||||
|                     comBeAttackedOther.attacker = entity; | ||||
|                     comAttackable.willHurts.push(entityOther) | ||||
|  | ||||
|                     return false; | ||||
|                 }) | ||||
|             } | ||||
|  | ||||
|             if(!comAttackable.hurtFrameCompleted && comAttackable.countDown <= comAttackable.hurtFrame) { | ||||
|                 comAttackable.hurtFrameCompleted = true; | ||||
|                 world.getFilter(FILTER_BEATTACKED).walk((entityOther: number) => { | ||||
|                     let comBeAttacked = world.getComponent(entityOther, ComBeAttacked); | ||||
|                     if(comBeAttacked && comBeAttacked.attacker == entity) comBeAttacked.attacker = -1; | ||||
|                     if(!_checkBeAttack(entityOther)) return ; | ||||
|      | ||||
|                     let comRoleConfigOther = world.getComponent(entityOther, ComRoleConfig); | ||||
|                     let comTransOther = world.getComponent(entityOther, ComTransform); | ||||
|                     if(!comRoleConfigOther || comRoleConfigOther.team == comRoleConfigSelf.team) return ; | ||||
|                     let xDiff = comTransOther.x - comTransSelf.x; | ||||
|                     if(xDiff * Math.sign(xDiff) >= comAttackable.hurtArea.x || Math.abs(comTransOther.y - comTransSelf.y) >= comAttackable.hurtArea.y) { | ||||
|                         return ; | ||||
|                     } | ||||
|                      | ||||
|                     // 扣血 | ||||
|                     if(!comRoleConfigOther || comRoleConfigOther.nowHP <= 0) return ; | ||||
|                     comRoleConfigOther.lastHP = comRoleConfigOther.nowHP; | ||||
|                     comRoleConfigOther.nowHP -= comAttackable.attack; | ||||
|                     comRoleConfigOther.HPDirty = true; | ||||
|  | ||||
|      | ||||
|                     // 打断对方的攻击动作 | ||||
|                     let comAttackableOther = world.getComponent(entityOther, ComAttackable); | ||||
|                     if(!comAttackableOther || comAttackableOther.countDown <= 0) return ; | ||||
|                     if(comAttackableOther.countDown >= comAttackableOther.mustAttackFrame) { | ||||
|                         comAttackableOther.dirty = false; | ||||
|                     comAttackableOther.hurtFrameCompleted = true; | ||||
|                     comAttackableOther.countDown = 0.25; | ||||
|  | ||||
|                     let comMonitorOther = world.getComponent(entityOther, ComMonitor); | ||||
|                     if(comMonitorOther.others.indexOf(entity) == -1) { | ||||
|                         comMonitorOther.others[0] = entity; | ||||
|                     } | ||||
|                      | ||||
|                     comAttackable.countDown = 0.25; | ||||
|                         | ||||
|                          | ||||
|                     return false; | ||||
|                 }); | ||||
|             } | ||||
|   | ||||
| @@ -41,27 +41,31 @@ export class SysMonitor extends ECSSystem { | ||||
|             let comTrans = world.getComponent(entity, ComTransform); | ||||
|             let comRoleConfig = world.getComponent(entity, ComRoleConfig); | ||||
|  | ||||
|             let a = cc.v2(comTrans.x, comTrans.y); | ||||
|             let centerPoint = a.add(comTrans.dir.mul(comMonitor.lookLen)); | ||||
|             let b = centerPoint.add(cc.v2(comTrans.dir.y, -comTrans.dir.x).mul(comMonitor.lookWidth)); | ||||
|             let c = centerPoint.add(cc.v2(-comTrans.dir.y, comTrans.dir.x).mul(comMonitor.lookWidth)); | ||||
|             let d = centerPoint.add(comTrans.dir.mul(comMonitor.outLen)); | ||||
|             comMonitor.debugInfo = { | ||||
|                 points: [a, b, d, c], | ||||
|                 color: cc.Color.BLUE, | ||||
|             }; | ||||
|  | ||||
|             // 判断当前monitor是否 | ||||
|             filter.entities.forEach((value: boolean, otherEntity: number) => { | ||||
|                 let comTransOther = world.getComponent(otherEntity, ComTransform); | ||||
|                 let comRoleConfigOther = world.getComponent(otherEntity, ComRoleConfig); | ||||
|                 if(entity == otherEntity || !comRoleConfigOther || comRoleConfigOther.team == comRoleConfig.team) return ; | ||||
|  | ||||
|                 let a = cc.v2(comTrans.x, comTrans.y); | ||||
|  | ||||
|                 let centerPoint = a.add(comTrans.dir.mul(comMonitor.lookLen)); | ||||
|                 let b = centerPoint.add(cc.v2(comTrans.dir.y, -comTrans.dir.x).mul(comMonitor.lookSize)); | ||||
|                 let c = centerPoint.add(cc.v2(-comTrans.dir.y, comTrans.dir.x).mul(comMonitor.lookSize)); | ||||
|  | ||||
|                 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)) | ||||
|                 } | ||||
|                 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); | ||||
|                     } | ||||
|                     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); | ||||
|   | ||||
| @@ -51,10 +51,12 @@ export class SysMovable extends ECSSystem { | ||||
|                     comMovable.pointIdx ++; | ||||
|                     continue; | ||||
|                 } | ||||
|                 comTrans.dir.x = offsetX / offsetLen; | ||||
|                 comTrans.dir.y = offsetY / offsetLen; | ||||
|                 comTrans.x += moveLen * comTrans.dir.x; | ||||
|                 comTrans.y += moveLen * comTrans.dir.y; | ||||
|                 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; | ||||
|             } | ||||
|   | ||||
| @@ -1,4 +1,5 @@ | ||||
| import { EventDeath, EventHPChange, EventHurt, EventRun, EventStand } from "../../Struct/NodeEvent"; | ||||
| import { EventDeath, EventGraphicsDraw, EventHPChange, EventHurt, EventRun, EventStand } from "../../Struct/NodeEvent"; | ||||
| import { ComAttackable } from "../components/ComAttackable"; | ||||
| import { ComBehaviorTree } from "../components/ComBehaviorTree"; | ||||
| import { ComCocosNode } from "../components/ComCocosNode"; | ||||
| import { ComMonitor } from "../components/ComMonitor"; | ||||
| @@ -33,6 +34,20 @@ export class SysRoleState extends ECSSystem { | ||||
|             if(!comCocosNode.loaded) return ; | ||||
|             let comRoleConfig = world.getComponent(entity, ComRoleConfig); | ||||
|             let comMovable = world.getComponent(entity, ComMovable); | ||||
|             let comMonitor = world.getComponent(entity, ComMonitor); | ||||
|             let comAttackable = world.getComponent(entity, ComAttackable); | ||||
|  | ||||
|             comCocosNode.events.push(new EventGraphicsDraw([])); | ||||
|  | ||||
|             if(comMonitor && comMonitor.debugInfo) { | ||||
|                 comCocosNode.events.push(new EventGraphicsDraw(comMonitor.debugInfo.points, comMonitor.debugInfo.color)); | ||||
|             } | ||||
|  | ||||
|             if(comAttackable && comAttackable.debugInfo) { | ||||
|                 comCocosNode.events.push(new EventGraphicsDraw(comAttackable.debugInfo.points, comAttackable.debugInfo.color)); | ||||
|             } | ||||
|  | ||||
|  | ||||
|  | ||||
|             if(comMovable && comMovable.speedDirty) { | ||||
|                 comMovable.speedDirty = false; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user