31 lines
1.4 KiB
TypeScript
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();
|
|
}
|
|
}
|
|
}
|