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.
88 lines
2.7 KiB
88 lines
2.7 KiB
import { _decorator, Collider2D, Component, Node, Vec3, v3 } from 'cc';
|
|
import { zidanScript } from './zidanScript';
|
|
const { ccclass, property } = _decorator;
|
|
|
|
@ccclass('atgSkill')
|
|
export class atgSkill extends Component {
|
|
|
|
zidanCore:zidanScript = null;
|
|
moveDir: Vec3 = v3(0, 1, 0);
|
|
|
|
//子弹上携带的数字
|
|
zidanTakeNumber = 1;
|
|
|
|
/** 子弹归属:player=主角发射(不应触发主角吃子弹),enemy=门/敌方发射(会被主角消化) */
|
|
owner: 'player' | 'enemy' = 'enemy';
|
|
|
|
// 防止“从某个门生成的子弹”立刻再次与该门碰撞,造成递归触发卡死
|
|
ignoreDoorUuid: string | null = null;
|
|
ignoreContactFrames: number = 0;
|
|
|
|
/** 主角阶段:已进入“待回收”队列,避免与主角/墙 AABB 多帧重叠时重复计入 hitZhujue */
|
|
queuedForPlayerHit: boolean = false;
|
|
|
|
/** 由哪一扇门生成(同门再次碰撞时永久忽略,防止倍率门指数递归) */
|
|
generatedByDoorUuid: string | null = null;
|
|
|
|
/** 同一颗子弹对同一扇门只处理一次(用于屏蔽物理重复 BEGIN_CONTACT / 多碰撞体回调) */
|
|
processedDoorUuids: Record<string, true> = {};
|
|
|
|
/** 正在回收/已回收进对象池:忽略所有碰撞回调(防止回调队列重复触发) */
|
|
isRecycling: boolean = false;
|
|
isDie: boolean = false;
|
|
start() {
|
|
|
|
}
|
|
setIsDie(isDie: boolean) {
|
|
this.isDie = isDie
|
|
}
|
|
|
|
getIsDie() {
|
|
return this.isDie
|
|
}
|
|
|
|
setSkillData(zidanCore: zidanScript, zidanTakeNumber=1){
|
|
this.zidanCore = zidanCore;
|
|
// 从对象池取出时重置一次性状态
|
|
this.isDie = false
|
|
this.zidanTakeNumber = zidanTakeNumber
|
|
this.owner = 'enemy';
|
|
this.queuedForPlayerHit = false;
|
|
this.ignoreDoorUuid = null;
|
|
this.ignoreContactFrames = 0;
|
|
this.generatedByDoorUuid = null;
|
|
this.processedDoorUuids = {};
|
|
this.isRecycling = false;
|
|
// const col = this.getComponent(Collider2D);
|
|
// if (col) col.enabled = true;
|
|
}
|
|
|
|
setMoveDir(dir: Vec3) {
|
|
// 防御:避免外部复用同一个 Vec3 被意外改写
|
|
this.moveDir = dir.clone();
|
|
}
|
|
|
|
setIgnoreDoor(doorNode: Node, frames: number = 12) {
|
|
this.ignoreDoorUuid = doorNode?.uuid ?? null;
|
|
this.ignoreContactFrames = frames;
|
|
this.generatedByDoorUuid = doorNode?.uuid ?? null;
|
|
}
|
|
|
|
|
|
//移除子弹
|
|
removeZidan(){
|
|
if (!this.zidanCore) {
|
|
console.log('zidanCore is null');
|
|
return;
|
|
};
|
|
this.isRecycling = true;
|
|
// const col = this.getComponent(Collider2D);
|
|
// if (col) col.enabled = false;
|
|
|
|
this.zidanCore.putZidan(this.node);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|