消消方块阵换皮表情
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

179 lines
6.8 KiB

/**
* 手电筒激光武器持续攻击
*/
import { _decorator, Component, isValid, Node, sp, UITransform, Vec3 } from 'cc';
import { IWeaponProperty } from '../BattleDataManager';
import { BattleType } from '../../../manager/ChapterDataManager';
import { Monster } from '../Monster';
const { ccclass, property } = _decorator;
@ccclass('FlashlightSchedule')
export class FlashlightSchedule extends Component {
_dt: number = 0;
_dtAll: number = 0; //累计时间
_weaponid: number = 0;
_damageInterval: number = 1; //伤害间隔
_weaponContinueTime: number = 0; //持续时间
isCanAtk: boolean = false; //是否可以攻击造成伤害
isStartGame: boolean = false; //是否开始游戏
_updatePosiTime: number = 0//0.05; //更新位置时间
_updatePosiInterval: number = 0.03; //更新位置间隔
private _scale: number;
private _weaponLaunchNode: Node | null = null;
protected onLoad(): void {
//console.log('手电筒激光武器持续攻击 onLoad')
this.isStartGame = false
this.isCanAtk = false
}
start() {
//console.log('手电筒激光武器持续攻击 start')
}
update(deltaTime: number) {
//this.node.worldPosition = gg.game.CurentBattle.playerController.playerNode.getChildByName('weaponLaunchNode').worldPosition.clone()
if (!gg.game.CurentBattle.canUpdateFrame()) return;
const scaledDt = deltaTime * gg.game.CurentBattle.TimeScale;
// 与伤害 CD、持续时间同一套时间,避免 TimeScale 下不同步
this._updatePosiTime += scaledDt;
if (this._updatePosiTime >= this._updatePosiInterval) {
this._updatePosiTime = 0;
if (!this._weaponLaunchNode || !this._weaponLaunchNode.isValid) {
this._weaponLaunchNode = gg.game.CurentBattle.PlayerController.playerNode.getChildByName('weaponLaunchNode');
}
const launchPos = this._weaponLaunchNode!.worldPosition;
this.node.setWorldPosition(launchPos.x, launchPos.y, launchPos.z);
// 仅同步位置;伤害只由 _damageInterval 触发,避免与 CD 同一帧打两次
}
if (!this.isStartGame) {
return;
}
this._dtAll += scaledDt;
this._dt += scaledDt;
if (this._dtAll >= this._weaponContinueTime) {
this.isStartGame = false;
this.isCanAtk = false;
this.destroyNode();
} else if (this._damageInterval > 0 && this._dt >= this._damageInterval) {
this._dt -= this._damageInterval;
this.isCanAtk = true;
this.attackMonstersInFlashlightRange();
}
//可以攻击的状态,间隔多少秒刷新, 持续时间到了会自动销毁
}
destroyNode() {
this.unscheduleAllCallbacks();
//移除当前脚本
this.removeSelf();
gg.res.putNode(this.node);
}
/**刷新激光武器ui */
removeSelf() {
this.destroy()
}
onDestroy() {
this.unscheduleAllCallbacks();
// console.log('LaserContinueSchedule组件已被移除');
}
atkToMonster(weaponId: number, index: number, weaponProperty: IWeaponProperty, scale: number, isGold) {
//console.log('手电筒激光武器持续攻击 atkToMonster')
this.unscheduleAllCallbacks();
this.isStartGame = false;
this._dtAll = 0;
this._updatePosiTime = 0;
this._weaponid = weaponId;
this._scale = scale;
this.isCanAtk = false;
this._damageInterval = weaponProperty.damageInterval;
this._weaponContinueTime = weaponProperty.weaponContinueTime;
let playAnimStart = this.node.getChildByName('手电筒技能特效3');
this.node.getChildByName('手电筒技能特效1').active = false
this.node.getChildByName('手电筒技能特效2').active = false
playAnimStart.active = true
playAnimStart.getComponent(sp.Skeleton).setAnimation(0, '效果示意', false)
if (isGold) {
playAnimStart.getComponent(sp.Skeleton).setSkin('橙色手电筒')
} else {
playAnimStart.getComponent(sp.Skeleton).setSkin('蓝色手电筒')
}
this.scheduleOnce(() => {
if (!isValid(this.node)) return;
playAnimStart.active = false;
if (isGold) {
if (index == 1) {
this.node.getChildByName('手电筒技能特效1').active = true;
this.node.getChildByName('手电筒技能特效2').active = true;
} else {
this.node.getChildByName('手电筒技能特效2').active = true;
}
} else {
this.node.getChildByName('手电筒技能特效1').active = true;
this.node.getChildByName('手电筒技能特效2').active = true;
}
if (isGold) {
this.node.getChildByName('手电筒技能特效1').getComponent(sp.Skeleton).setSkin('橙色手电筒');
this.node.getChildByName('手电筒技能特效2').getComponent(sp.Skeleton).setSkin('橙色手电筒');
} else {
this.node.getChildByName('手电筒技能特效1').getComponent(sp.Skeleton).setSkin('蓝色手电筒');
this.node.getChildByName('手电筒技能特效2').getComponent(sp.Skeleton).setSkin('蓝色手电筒');
}
}, 1.5);
this.scheduleOnce(() => {
if (!isValid(this.node)) return;
//可以开始攻击
this.isStartGame = true;
this.isCanAtk = true;
// 与首开对齐:下一帧 _dt 累加后即可满足 >= _damageInterval(原为位置分支抢先打第一下)
this._dt = this._damageInterval;
}, 1.2);
//this.isCanAtk = true
this._dt = 0;
//console.log('手电筒激光武器攻击怪物atkToMonster',weaponId,index,this._damageInterval,this._weaponContinueTime)
}
attackMonstersInFlashlightRange() {
//找出怪物坐标在激光武器范围的怪物
if (!this.isCanAtk) return;
let selectMonster = gg.game.CurentBattle.MonsterSpawner.getFlashlighttMonster(this.node, this._scale)
//console.log('手电筒激光武器攻击怪物',selectMonster.length)
if (selectMonster.length > 0) {
for (let i = 0; i < selectMonster.length; i++) {
selectMonster[i].getComponent(Monster).attackByWeapon(this._weaponid)
}
}
// 勿与武器发射共用 audio_timeStamp;节流由 SoundManager.shouldPlayWeaponSfx 按名处理
gg.audio.playEffect({ name: '彩虹飞弹命中', path: 'sound/武器音效/' });
this.isCanAtk = false;
//this._targetMonster.getComponent(Monster).attackByWeapon(this._weaponid)
}
}