2025-06-16 12:47:55 +08:00

89 lines
2.8 KiB
TypeScript

import gsap from "gsap";
import getDecorators from "inversify-inject-decorators";
import { Chip } from "../../chip/scripts/chip";
import { container } from "../../plugins/core";
const { ccclass, property } = cc._decorator;
const { lazyInject } = getDecorators(container, false);
@ccclass
export class ChipHandlerAnim extends cc.Component
{
@property(cc.Node)
private winNode: cc.Node = null;
@property(cc.Node)
private collectNode: cc.Node = null;
public hide(nodeTween: cc.Node): void
{
gsap.to(nodeTween, {
duration: 0.2,
opacity: 0,
onComplete: () =>
{
nodeTween.active = false;
}
});
}
public place(nodeTween: cc.Node): void
{
nodeTween.setPosition(this.getRandomRadianPosition(cc.Vec2.ZERO));
var currentPos = nodeTween.position;
var newPos = new cc.Vec2(currentPos.x, currentPos.y);
newPos.y += 40;
nodeTween.setPosition(newPos);
gsap.to(nodeTween, {
duration: 0.2,
x: currentPos.x,
y: currentPos.y,
});
}
public collect(chip: Chip, isDelayRandomTime: boolean): void
{
var startPos = chip.node.parent.convertToNodeSpaceAR(chip.node.convertToWorldSpaceAR(cc.Vec2.ZERO));
var endPos = chip.node.parent.convertToNodeSpaceAR(this.collectNode.convertToWorldSpaceAR(cc.Vec2.ZERO));
this.move(chip.node, startPos, this.getRandomRadianPosition(endPos), true, isDelayRandomTime);
}
public win(nodeTween: cc.Node): void
{
var startPos = nodeTween.parent.convertToNodeSpaceAR(this.winNode.convertToWorldSpaceAR(cc.Vec2.ZERO));
var endPos = nodeTween.parent.convertToNodeSpaceAR(this.node.convertToWorldSpaceAR(cc.Vec2.ZERO));
this.move(nodeTween, this.getRandomRadianPosition(startPos), this.getRandomRadianPosition(endPos), false, true);
}
private move(nodeTween: cc.Node, startPos: cc.Vec2, endPos: cc.Vec2, isHideOnComplete: Boolean = false, isRandomTime: Boolean = false)
{
nodeTween.setPosition(startPos);
var timeRandom = isRandomTime ? Math.random() * 1.5 : 0;
timeRandom += 0.5;
const timeline = gsap.timeline();
nodeTween.setPosition(startPos);
timeline.to(nodeTween, {
duration: timeRandom,
x: endPos.x,
y: endPos.y,
});
if (isHideOnComplete == true)
{
timeline.add(() =>
{
this.hide(nodeTween);
});
}
}
private getRandomRadianPosition(pos: cc.Vec2): cc.Vec2
{
var randomRadianPos = cc.v2(pos.x, pos.y);
randomRadianPos.x += Math.random() * 50 - 25;
randomRadianPos.y += Math.random() * 50 - 25;
return randomRadianPos;
}
}