123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308 |
- /** @format */
- import {
- EventAttack,
- EventBase,
- EventDie,
- EventGraphicsDraw,
- EventHPChange,
- EventRoleTip,
- EventSkill,
- EventType,
- } from './NodeEvent'
- import {ccUtils} from '../../utils/ccUtils'
- import FrameAnimation from '../../uiutils/FrameAnimation'
- import {Data} from '../../GameControl'
- import {IRoleConfig} from '../../config/RoleConfig'
- import {GAME_ROLE_TIP, MONSTER_TYPE, ROLE_TYPE} from '../../enums/Enum'
- import {EventProcess} from './EventProcess'
- import {IBuff} from './GameInterface'
- import {FlashColor} from './FlashColor'
- const {ccclass, property} = cc._decorator
- @ccclass
- export class RoleEventProcess extends EventProcess {
- public roleConfig: IRoleConfig
- public isFriend: boolean
- private eventDeath: EventDie
- private eventRoleTipMap: Map<string, EventRoleTip[]>
- private eventRoleTipTimeMap: Map<string, number>
- private frameAniNode: cc.Node
- private roleTipParents: Map<string, cc.Node>
- private roleHeight: number = 100
- private roleWidth: number = 60
- private HPNode: cc.Node
- private HP: cc.Node
- private HPS: cc.Node
- private HPShield: cc.Node
- protected onLoad() {
- this.HPNode = cc.find('hpNode', this.node)
- this.HP = cc.find('hpNode/HP', this.node)
- this.HPShield = cc.find('hpNode/HPshield', this.node)
- this.HPS = cc.find('hpNode/HPS', this.node)
- this.frameAniNode = cc.find('fa', this.node)
- this.roleTipParents = new Map()
- this.eventRoleTipMap = new Map()
- this.eventRoleTipTimeMap = new Map()
- for (let key in GAME_ROLE_TIP) {
- let parent = cc.find(`tips/${key}Parent`, this.node)
- if (!parent) {
- console.error('role预制体tips下缺少' + key + '父节点')
- } else {
- this.roleTipParents.set(key, parent)
- this.eventRoleTipMap.set(key, [])
- this.eventRoleTipTimeMap.set(key, 0)
- }
- }
- }
- onAttach(): void {
- this.frameAnimation = this.frameAniNode.getComponent(FrameAnimation)
- this._initHPNode()
- }
- onDetach(): void {}
- init(cfg: IRoleConfig, isFriend: boolean, width: number, height: number) {
- this.isFriend = isFriend
- this.roleConfig = cfg
- this.roleWidth = width
- this.roleHeight = height
- this.eventRoleTipMap.forEach((value, key) => {
- value.length = 0
- })
- this.node.name = this.roleConfig.url
- let entityLb = cc.find('entity', this.node)
- if (entityLb) entityLb.color = this.isFriend ? cc.Color.GREEN : cc.Color.RED
- this.HPNode.active = false
- }
- public syncDir(dir: cc.Vec2) {
- let scaleRate = 1
- this.frameAniNode.scaleX = dir.x >= 0 ? scaleRate : -scaleRate
- }
- processEvent(event: EventBase): void {
- if (!cc.isValid(this.node)) return
- switch (event.type) {
- case EventType.Enter:
- break
- case EventType.Stand:
- break
- case EventType.Run:
- break
- case EventType.Attack:
- let attackEvent: EventAttack = event as EventAttack
- this.syncDir(attackEvent.dir)
- break
- case EventType.Skill:
- break
- case EventType.RoleTip:
- let eventRoleTip: EventRoleTip = event as EventRoleTip
- let roleTips = this.eventRoleTipMap.get(eventRoleTip.tipType)
- roleTips.push(eventRoleTip)
- break
- case EventType.Die:
- this.eventDeath = event as EventDie
- break
- case EventType.HPChange:
- this._changeHP(event as EventHPChange)
- break
- // case EventType.BuffChange:
- // let eventBuff = event as EventBuffChange
- // this.initBuff(eventBuff.buffs)
- // break
- case EventType.GraphicsDraw:
- if (cc.debug.isDisplayStats()) {
- this.graphicsDraw(event as EventGraphicsDraw)
- } else {
- this.graphicsDraw(null)
- }
- break
- }
- }
- private _initHPNode() {
- if (!this.roleConfig) {
- console.warn('没有角色配置')
- return
- }
- let hpNode = this.HPNode
- let isBase = this.roleConfig.type == ROLE_TYPE.base
- //let hpWidth = isBase ? 200 : 100
- //修改为配置
- let hpWidth = this.roleConfig.hplength
- let hpHeight = isBase ? 20 : 10
- let roleHeight = this.roleHeight
- let baseHeight = 454
- let baseDurX = 350 - Data.game.fightSizeMaxX
- let baseDurY = 88 - (Data.game.fightSizeMaxY + Data.game.fightSizeMinY) / 2
- hpNode.x = isBase ? (this.isFriend ? -1 : 1) * baseDurX : 0
- hpNode.y = isBase ? baseHeight / 2 + baseDurY - hpHeight : roleHeight + hpHeight / 2
- cc.find('green', this.HP).active = this.isFriend
- cc.find('red', this.HP).active = !this.isFriend
- this.HP.getComponent(cc.ProgressBar).barSprite = cc
- .find(this.isFriend ? 'green' : 'red', this.HP)
- .getComponent(cc.Sprite)
- this.setHPPbSize(this.HP, hpWidth, hpHeight)
- this.setHPPbSize(this.HPShield, hpWidth, hpHeight)
- let baseHPbg = cc.find('castle_blood_bottom', hpNode)
- baseHPbg.active = isBase
- baseHPbg.width = hpWidth + 8
- baseHPbg.height = hpHeight + 8
- this.HPS.width = hpWidth
- this.HPS.x = -hpWidth / 2
- this.HPS.height = hpHeight
- this.HPS.children.forEach(v => (v.height = hpHeight))
- }
- private setHPPbSize(node: cc.Node, width: number, height: number) {
- node.width = width
- node.height = height
- let pb = node.getComponent(cc.ProgressBar)
- pb.totalLength = width
- pb.barSprite.node.x = -width / 2
- node.children.forEach(v => (v.height = height))
- }
- private _changeHP(event: EventHPChange) {
- //let lastAllHp = event.HP
- let isFriend =
- this.roleConfig.type == ROLE_TYPE.normal ||
- this.roleConfig.type == ROLE_TYPE.only ||
- this.roleConfig.type == ROLE_TYPE.totem
- let isBase = this.roleConfig.type == ROLE_TYPE.base
- let isBoss = this.roleConfig.type == MONSTER_TYPE.boss
- if (!this.HPNode.active && !isBoss && !isBase && (event.HP != event.nowHP || event.shieldHP > 0) && !isFriend)
- this.HPNode.active = true
- if (!this.HPNode.active) return
- let allHp = event.HP
- //if (event.lastHP + event.lastShieldHP > lastAllHp) lastAllHp = event.lastHP + event.lastShieldHP
- if (event.nowHP + event.shieldHP > allHp) allHp = event.nowHP + event.shieldHP
- //let from = event.lastHP / lastAllHp
- this.HP.getComponent(cc.ProgressBar).progress = event.nowHP / allHp
- //let from = (event.lastHP + event.lastShieldHP) / lastAllHp
- this.HPShield.getComponent(cc.ProgressBar).progress = (event.nowHP + event.shieldHP) / allHp
- let hpCellNum = Math.ceil(allHp / 100)
- //if (hpCellNum > 10) hpCellNum = 10
- //修改为固定10格血
- if (hpCellNum > 10) hpCellNum = 10
- if (hpCellNum != this.HPS.children.length) {
- ccUtils.instantChildren(cc.find('hp', this.HPS), hpCellNum)
- }
- }
- private _showNextRoleTip(tipType: string) {
- let fightCore = this.world.fightCore
- let roleTips = this.eventRoleTipMap.get(tipType)
- if (roleTips.length > 0 && this.node.isValid && fightCore.node.isValid) {
- let roleTip: EventRoleTip = roleTips.shift() // 取出下一个提示对象
- let tipNode = null
- let key = roleTip.tipType
- let pool = fightCore.roleTipPool.get(key)
- if (pool.size() > 0 && pool.size() < 100) {
- tipNode = pool.get()
- } else {
- tipNode = cc.instantiate(Data.game.gameAssetMap.get(`prefab/fight/roleTip/${key}`))
- }
- let t = cc.tween
- let tipX: number, tipY: number, tipOpacity: number, moveTime: number, delayTime: number, tween: cc.Tween
- let scale = 1
- let actionCallback = () => {
- tipNode.removeFromParent()
- fightCore.node.isValid && pool.put(tipNode)
- }
- let attackLbDur = 50
- switch (roleTip.tipType) {
- case GAME_ROLE_TIP.buffTip:
- tipX = 0
- tipY = this.roleHeight / 2
- tipOpacity = 255
- moveTime = 1
- tween = t().by(moveTime, {y: this.roleHeight / 2})
- let upNode = cc.find('up', tipNode)
- upNode.active = roleTip.num == 1
- let downNode = cc.find('down', tipNode)
- downNode.active = roleTip.num == 2
- let showNode = upNode.active ? upNode : downNode
- ccUtils.setLabel(roleTip.tip, showNode, 'lb')
- break
- case GAME_ROLE_TIP.hpTip:
- tipX = 0
- tipY = 0
- tipOpacity = 255
- moveTime = 0.5
- tween = t().by(moveTime, {y: this.roleHeight / 2})
- break
- case GAME_ROLE_TIP.critTip:
- tipX = Math.randomRangeInt(-this.roleWidth / 4, this.roleWidth / 4)
- let left = tipX < 0 ? -1 : 1
- tipY = this.roleHeight / 2 + Math.randomRangeInt(0, 20)
- scale = 1
- tipOpacity = 255
- moveTime = 1
- tween = t().by(moveTime * 0.4, {
- x: (left * this.roleWidth) / 8,
- y: this.HP.height + tipNode.height + 30,
- })
- tween = t().parallel(
- tween,
- t()
- .to(moveTime * 0.1, {scale: 3})
- .to(moveTime * 0.3, {scale: 1})
- .union(),
- )
- tween = t().sequence(tween, t().to(moveTime, {opacity: 0}).by(moveTime, {y: 10}).union())
- break
- case GAME_ROLE_TIP.damageTip:
- tipX = this.isFriend ? -attackLbDur : attackLbDur
- tipY = this.HP.parent.y - this.HP.height
- scale = 2
- tipOpacity = 0
- moveTime = 0.5
- delayTime = 0.5
- tween = t().by(moveTime, {y: 30})
- tween = t().parallel(tween, t().to(moveTime, {opacity: 255, scale: 1.2}).delay(delayTime))
- break
- case GAME_ROLE_TIP.missTip:
- tipX = this.isFriend ? -attackLbDur : attackLbDur
- tipY = this.HP.parent.y - this.HP.height
- tipOpacity = 0
- moveTime = 0.5
- delayTime = 0.5
- tween = t().by(moveTime, {y: 30})
- tween = t().parallel(tween, t().to(moveTime, {opacity: 255, scale: 1.2}).delay(delayTime))
- break
- }
- if (roleTip.tipType != GAME_ROLE_TIP.buffTip) ccUtils.setLabel(roleTip.tip, tipNode)
- this.roleTipParents.get(key).addChild(tipNode)
- tipNode.stopAllActions()
- tipNode.scale = scale
- tipNode.x = tipX
- tipNode.y = tipY
- tipNode.opacity = tipOpacity
- // 执行飘出动画效果
- t(tipNode).then(tween).call(actionCallback).start()
- }
- }
- update(dt) {
- this.eventRoleTipMap.forEach((roleTips, key) => {
- let time = this.eventRoleTipTimeMap.get(key)
- if (roleTips.length > 0 && time <= 0) {
- this._showNextRoleTip(key)
- time = 0.5
- }
- time -= dt
- if (time < 0) time = 0
- this.eventRoleTipTimeMap.set(key, time)
- })
- }
- }
|