Files
Cocos3.8.5/assets/script/SplitRender/ToolsSplit.ts
ZhouXiao 487c68994d feat: add builder configuration file
feat: add cocos-service configuration file
feat: add device configuration file
feat: add engine configuration file
feat: add information configuration file
feat: add program configuration file
feat: add project configuration file
feat: add TypeScript configuration file
2025-12-22 11:42:51 +08:00

220 lines
7.3 KiB
TypeScript

import { SplitRenderHelper } from "./SplitRenderHelper";
import { SplitRender } from "./SplitRender";
import { _decorator, Component, Node, Texture2D, Graphics, Vec2, view, Vec3, SpriteFrame, EventTouch, v2, tween, Camera, color, Layers, profiler, UITransform, Sprite, RigidBody2D, ERigidBody2DType, PolygonCollider2D, Physics2DUtils, PhysicsSystem2D, ERaycast2DType, UIOpacity, Collider, Collider2D, director, Director, misc, Label, Color } from 'cc';
const { ccclass, property, executeInEditMode } = _decorator;
@ccclass('ToolsSplit')
export default class ToolsSplit extends Component {
@property(Node)
textureRoot: Node = null;
@property(Graphics)
graphics: Graphics = null;
@property(SpriteFrame)
pic: SpriteFrame = null;
@property(Camera)
cam: Camera = null;
@property(Label)
moveStepLabel: Label = null;
private textures: SplitRender[] = [];
private startPoint: Vec2 = null;
private endPoint: Vec2 = null;
gameWidth: number = 0;
gameHeight: number = 0;
canTouch: boolean = true;
protected onLoad(): void {
}
start() {
profiler.hideStats();
this.init();
this.node.on(Node.EventType.TOUCH_START, this.onTouchStart, this);
this.node.on(Node.EventType.TOUCH_MOVE, this.onTouchMove, this);
this.node.on(Node.EventType.TOUCH_END, this.onTouchEnd, this);
this.node.on(Node.EventType.TOUCH_CANCEL, this.onTouchEnd, this);
this.graphics.node.setPosition(new Vec3(-view.getVisibleSize().width / 2, -view.getVisibleSize().height / 2));
}
init() {
// let node = new Node();
// let t = node.addComponent(SplitRender);
// node.parent = this.textureRoot;
// node.layer = Layers.Enum.UI_2D;
// t.spriteFrame = this.pic;
// this.textures.push(t);
this.gameWidth = view.getVisibleSize().width;
this.gameHeight = view.getVisibleSize().height;
this.node.getComponent(UITransform).setContentSize(this.gameWidth, this.gameHeight);
}
setTextures(textures: SplitRender[]) {
for (let i = 0; i < textures.length; i++) {
const texture = textures[i];
this.textures.push(texture);
}
}
setPerTexture(texture: SplitRender) {
this.textures.push(texture);
}
onTouchStart(e: EventTouch) {
if (this.moveStepLabel.string == "0") {
return;
}
if (!this.canTouch) {
return;
}
this.startPoint = e.getUILocation();
}
onTouchMove(e: EventTouch) {
if (this.moveStepLabel.string == "0") {
return;
}
if (!this.canTouch) {
return;
}
this.graphics.clear();
this.graphics.moveTo(this.startPoint.x, this.startPoint.y);
let p = e.getUILocation();
this.graphics.lineTo(p.x, p.y);
this.graphics.stroke();
}
onTouchEnd(e: EventTouch) {
if (this.moveStepLabel.string == "0") {
return;
}
if (!this.canTouch) {
return;
}
this.canTouch = false;
this.graphics.clear();
this.endPoint = e.getUILocation();
}
cutPolygonCollider2D(originPolygon: Vec2[], startPoint: Vec2, endPoint: Vec2) {
let newPolygon = SplitRenderHelper.lineCutPolygon(startPoint, endPoint, originPolygon);
return newPolygon;
}
private doSplit() {
let h = this.pic.height, w = this.pic.width;
for (let i = 0; i < 15; i++) {
let p0 = v2(-(w / 2 + 10), (Math.random() * h) - h / 2);
let p1 = v2(w / 2 + 10, (Math.random() * h) - h / 2);
this.useLineCutPolygon(p0, p1, false);
}
for (let i = 0; i < 15; i++) {
let p0 = v2(Math.random() * w - w / 2, -(h / 2 + 10));
let p1 = v2(Math.random() * w - w / 2, (h / 2 + 10));
this.useLineCutPolygon(p0, p1, false);
}
}
private useLineCutPolygon(p0: Vec2, p1: Vec2, isWorld = true) {
for (let i = this.textures.length - 1; i >= 0; i--) {
let texture = this.textures[i];
let pa = p0.clone();
let pb = p1.clone();
if (isWorld) {
let mat = texture.node.worldMatrix.clone().invert();
pa = pa.transformMat4(mat);
pb = pb.transformMat4(mat);
}
let polygons = SplitRenderHelper.lineCutPolygon(pa, pb, texture.polygon);
if (polygons.length <= 0) {
console.log("No Polygon")
continue
};
this.splitTexture(texture, polygons);
}
}
private splitTexture(texture: SplitRender, polygons: Vec2[][]) {
texture.polygon = polygons[0];
let newnode: Node = null;
for (let i = 1; i < polygons.length; i++) {
let node = new Node("Split");
newnode = node;
node.layer = Layers.Enum.UI_2D;
let t = node.addComponent(SplitRender);
node.parent = this.textureRoot;
node.setPosition(new Vec3(texture.node.position.x, texture.node.position.y));
node.setRotationFromEuler(texture.node.eulerAngles.x, texture.node.eulerAngles.y, texture.node.eulerAngles.z);
t.spriteFrame = texture.spriteFrame;
t.polygon = polygons[i];
this.textures.push(t);
}
}
onClickFly() {
for (let i = 0; i < this.textures.length; i++) {
let center = this.getPolygonCenter(this.textures[i].polygon);
let dir = center.normalize();
tween(this.textures[i].node).by(0.5, { position: new Vec3(dir.x * 100, dir.y * 100, 0) }).start();
}
}
onClickReset() {
for (let i = 0; i < this.textures.length; i++) {
let center = this.getPolygonCenter(this.textures[i].polygon);
let dir = center.normalize();
tween(this.textures[i].node).by(0.5, { position: new Vec3(-dir.x * 100, -dir.y * 100, 0) }).call(() => {
if (i === this.textures.length - 1) {
this.textureRoot.destroyAllChildren();
this.textureRoot.removeAllChildren();
this.textures = [];
this.init();
}
}).start();
}
}
onFallDown() {
for (let i = 0; i < this.textures.length; i++) {
let center = this.getPolygonCenter(this.textures[i].polygon);
tween(this.textures[i].node).delay((center.y + this.pic.height) / this.pic.height).by(2, { position: new Vec3(0, -500, 0) }, { easing: 'circIn' }).start();
}
}
onResetFallDown() {
this.textureRoot.destroyAllChildren();
this.textureRoot.removeAllChildren();
this.textures = [];
this.init();
}
private getPolygonCenter(polygon: Vec2[]) {
let x = 0, y = 0;
for (let i = 0; i < polygon.length; i++) {
x += polygon[i].x;
y += polygon[i].y;
}
x = x / polygon.length;
y = y / polygon.length;
return v2(x, y)
}
getTextureList() {
return this.textures;
}
}