37 lines
1.2 KiB
TypeScript
37 lines
1.2 KiB
TypeScript
import { _decorator, Collider2D, Component, Contact2DType, Node, RigidBody2D, Vec2 } from 'cc';
|
|
import Utilities from './Utilities/Utilities';
|
|
const { ccclass, property } = _decorator;
|
|
|
|
@ccclass('Spring')
|
|
export class Spring extends Component {
|
|
@property(Collider2D)
|
|
private collider: Collider2D;
|
|
@property(Node)
|
|
private gate: Node;
|
|
@property(Node)
|
|
private lid: Node;
|
|
|
|
protected onLoad(): void {
|
|
this.collider.on(Contact2DType.BEGIN_CONTACT, this.onBeginContact, this);
|
|
this.gate.active = false;
|
|
}
|
|
|
|
private async onBeginContact(selfCollider: Collider2D, otherCollider: Collider2D) {
|
|
otherCollider.node.setWorldPosition(this.node.worldPosition);
|
|
const rigi = otherCollider.getComponent(RigidBody2D);
|
|
rigi.linearVelocity = Vec2.ZERO.clone();
|
|
rigi.angularVelocity = 0;
|
|
const gravity = rigi.gravityScale;
|
|
rigi.gravityScale = 0;
|
|
this.lid.active = false;
|
|
await Utilities.delay(1000);
|
|
rigi.gravityScale = gravity;
|
|
rigi.applyLinearImpulse(new Vec2(0, 100), Vec2.ZERO, true);
|
|
await Utilities.delay(500);
|
|
this.lid.active = true;
|
|
if (this.gate) {
|
|
this.gate.active = true;
|
|
}
|
|
}
|
|
}
|