super-hero/assets/cc-game/scripts/game_play/bullet/BulletBase.ts

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;
}
}