import { _decorator, CCInteger, Collider2D, Component, Contact2DType, EventHandler, tween, Vec2 } from 'cc'; import { Ball } from './Ball'; import Utilities from '../Utilities'; const { ccclass, property } = _decorator; @ccclass('Cannon') export class Cannon extends Component { @property({ type: Collider2D, visible: true }) private _collider: Collider2D; @property({ type: CCInteger, visible: true }) private _force = 30; @property({ type: EventHandler, visible: true }) private onDone: EventHandler[] = []; protected onLoad(): void { this._collider.on(Contact2DType.BEGIN_CONTACT, this.onBeginContact, this); } private async onBeginContact(seft: Collider2D, other: Collider2D) { const ball = other.getComponent(Ball); this._collider.enabled = false; if (ball) { ball.setActiveRigi(false); tween(ball.node).to(0.1, { worldPosition: this.node.worldPosition }).start(); await Utilities.delay(1000); ball.setActiveRigi(true); ball.throwBall(new Vec2(0, this._force)); await Utilities.delay(500); this._collider.enabled = true; EventHandler.emitEvents(this.onDone, ball); } } }