MatchMaster/assets/cloud_rise_home/scripts/CloudRiseSurface.ts

31 lines
1.4 KiB
TypeScript

const { ccclass, property, executeInEditMode, requireComponent } = cc._decorator;
/** Editable rounded panels; geometry follows the prefab node size, with no generated child nodes. */
@ccclass
@executeInEditMode
@requireComponent(cc.Graphics)
export default class CloudRiseSurface extends cc.Component {
@property radius = 25;
@property borderWidth = 0;
@property fillOpacity = 255;
@property tailSize = 0;
@property(cc.Color) borderColor = cc.color(182, 132, 245);
private previous = "";
onEnable(): void { this.previous = ""; this.update(); }
update(): void {
const key = [this.node.width, this.node.height, this.node.color.toHEX(), this.radius, this.borderWidth, this.fillOpacity, this.tailSize, this.borderColor.toHEX()].join(":");
if (key === this.previous) return;
this.previous = key;
const g = this.getComponent(cc.Graphics); g.clear();
const fill = this.node.color; fill.a = this.fillOpacity; g.fillColor = fill;
g.strokeColor = this.borderColor; g.lineWidth = this.borderWidth;
g.roundRect(-this.node.width / 2, -this.node.height / 2, this.node.width, this.node.height, this.radius);
g.fill(); if (this.borderWidth > 0) g.stroke();
if (this.tailSize > 0) {
const y = -this.node.height / 2;
g.moveTo(-this.tailSize, y + 2); g.lineTo(0, y - this.tailSize); g.lineTo(this.tailSize, y + 2);
g.close(); g.fill();
}
}
}