134 lines
4.3 KiB
TypeScript
134 lines
4.3 KiB
TypeScript
import { Vec3, Collider2D } from 'cc';
|
|
import { _decorator, Component, Node } from 'cc';
|
|
import { UmLog } from '../../../../cc-common/cc-util/UmLog';
|
|
import { ColliderObject } from '../../base/ColliderObject';
|
|
import { UmUtil } from '../../../../cc-common/cc-util/UmUtil';
|
|
import { CCFloat } from 'cc';
|
|
import { ShootingDataInfo } from '../../global/GameInterface';
|
|
import { EACTIVE_SKILL_TYPE, EBULLET_DAMAGE_TYPE, EBULLET_TYPE, EPHYSIC_GROUP, ESKILL_SPECIAL_TYPE, GameDefine } from '../../config/GameDefine';
|
|
import { Enum } from 'cc';
|
|
import { RigidBody2D } from 'cc';
|
|
import { Sprite } from 'cc';
|
|
import { Color } from 'cc';
|
|
import { ActiveSkillBase } from '../hero/ActiveSkillBase';
|
|
const { ccclass, property } = _decorator;
|
|
|
|
@ccclass('BulletBase')
|
|
export class BulletBase extends Component {
|
|
@property(ColliderObject) colliderObject: ColliderObject = null!;
|
|
@property(RigidBody2D) rigibodyComponent: RigidBody2D = null!;
|
|
@property(Sprite) theme: Sprite = null!;
|
|
|
|
@property({ type: Enum(EBULLET_TYPE) }) public bulletType: EBULLET_TYPE = EBULLET_TYPE.NORMAL;
|
|
@property({ type: Enum(EBULLET_DAMAGE_TYPE) }) public bulletDamageType: EBULLET_DAMAGE_TYPE = EBULLET_DAMAGE_TYPE.HP;
|
|
public damage = 1;
|
|
|
|
protected start(): void {
|
|
this.registerColliderContact();
|
|
}
|
|
|
|
protected registerColliderContact() {
|
|
this.colliderObject.registerBeginContact(this.onBeginContact.bind(this), true);
|
|
this.colliderObject.registerEndContact(null, true);
|
|
}
|
|
|
|
protected offColliderContact() {
|
|
this.colliderObject.offContact();
|
|
}
|
|
|
|
onBeginContact(a: Collider2D, b: Collider2D) {
|
|
var bGroup = b.group;
|
|
// UmLog.log("BULLET | Contact Begin = " + GameDefine.getPhysicGroupName(a.group), " vs ", GameDefine.getPhysicGroupName(bGroup));
|
|
if (bGroup == Number(EPHYSIC_GROUP.OBSTACLE))
|
|
{
|
|
if (this.bulletType == EBULLET_TYPE.NORMAL)
|
|
this?.destroyNode();
|
|
|
|
return;
|
|
}
|
|
|
|
if (bGroup == Number(EPHYSIC_GROUP.ACTIVE_SKILL)) {
|
|
// if (this.bulletType == EBULLET_TYPE.NORMAL)
|
|
// var skillType = b.node.getComponent(ActiveSkillBase)?.skillType;
|
|
// if (skillType != Number(EACTIVE_SKILL_TYPE.SKILL_3))
|
|
// {
|
|
|
|
// }
|
|
this?.destroyNode();
|
|
|
|
return;
|
|
}
|
|
}
|
|
|
|
public shooting(targetWorldPoint, shootingDataInfo: ShootingDataInfo)
|
|
{
|
|
var origin = this.node.worldPosition;
|
|
//distance and direction to enemy target
|
|
var direction = UmUtil.subtractTwoVector3(targetWorldPoint, origin);
|
|
|
|
//Actual shooting distance according to shooting range
|
|
var distanceShoot = GameDefine.DISTANCE_UNIT * shootingDataInfo.AtkRange;
|
|
|
|
// UmLog.log("distanceShoot => ", distanceShoot, shootingDataInfo.shootRange);
|
|
var actualTarget = UmUtil.scaleVector3(direction.normalize(), distanceShoot);
|
|
actualTarget = UmUtil.plusTwoVector3(origin, actualTarget);
|
|
|
|
var duration = this.getTimeMove(shootingDataInfo.AtkSpeed, distanceShoot);
|
|
UmUtil.worldMoveTo(this.node, actualTarget, duration, 0, () => {
|
|
if (this.node?.active)
|
|
this.destroyNode();
|
|
});
|
|
}
|
|
|
|
getSpeed(speedScale)
|
|
{
|
|
return GameDefine.SPEED_TIME_UNIT / speedScale;
|
|
}
|
|
|
|
getTimeMove(speedScale, distance)
|
|
{
|
|
return distance * this.getSpeed(speedScale);
|
|
}
|
|
|
|
setEnableRigibody(isEnable: boolean) {
|
|
if (this.rigibodyComponent)
|
|
this.rigibodyComponent.enabled = isEnable;
|
|
}
|
|
|
|
public destroyNode()
|
|
{
|
|
// UmLog.log("BULLET destroyNode");
|
|
this.offColliderContact();
|
|
UmUtil.stopAllTweenTarget(this.node);
|
|
// UmUtil.delay(this.node, GameDefine.TIME_DELAY_DESTROY, () => {
|
|
// this.node?.destroy();
|
|
// });
|
|
|
|
//must destroy on thread
|
|
this.scheduleOnce(() => {
|
|
this.setEnableRigibody(false);
|
|
this.node?.destroy();
|
|
}, 0);
|
|
}
|
|
|
|
public setDamage(damage: number)
|
|
{
|
|
this.damage = damage;
|
|
}
|
|
|
|
public setSpecialSkill(skillId)
|
|
{
|
|
if (skillId == Number(ESKILL_SPECIAL_TYPE.SKILL_1))
|
|
{
|
|
this.theme.color = Color.GREEN;
|
|
}
|
|
}
|
|
|
|
public getColor(): Color
|
|
{
|
|
return this.theme?.color;
|
|
}
|
|
|
|
}
|
|
|