我智商爆棚
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

60 lines
1.7 KiB

const { ccclass, property } = cc._decorator;
@ccclass
export default class CirculateTweenAnimation extends cc.Component {
@property(cc.Node)
circulateNode: cc.Node = null;
@property(cc.Vec3)
startPoint: cc.Vec3 = null;
@property(cc.Vec3)
endPoint: cc.Vec3 = null;
@property()
speed: number = 10;
directionVector: cc.Vec3 = null;
isCirculate: boolean = true;
protected onEnable(): void {
if (!this.circulateNode) {
this.circulateNode = this.node;
}
this.directionVector = this.endPoint.sub(this.startPoint).normalize();
this.circulateNode.setPosition(this.startPoint);
this.node.attr({
setSpeed: (speed: number) => {
this.speed = speed;
if (speed == 0) {
this.isCirculate = false;
}
}
});
}
update(dt) {
if (this.isCirculate) {
let pos = this.circulateNode.position.add(this.directionVector.mul(this.speed).mul(dt));
this.circulateNode.setPosition(pos);
if (this.determine(this.startPoint, this.endPoint, this.circulateNode.position)) {
this.circulateNode.setPosition(this.startPoint);
}
}
}
determine(startPoint: cc.Vec3, endPoint: cc.Vec3, curPoint: cc.Vec3) {
if (startPoint.y == endPoint.y) {
let direction = (endPoint.x >= startPoint.x) ? 1 : 2;
let isGreater = (curPoint.x >= endPoint.x) ? 1 : 2;
return direction == isGreater;
} else {
let direction = (endPoint.y >= startPoint.y) ? 1 : 2;
let isGreater = (curPoint.y >= endPoint.y) ? 1 : 2;
return direction == isGreater;
}
}
}