AI写的截图

public static captureNodeToSpriteFrame(targetNode: Node, camera?: Camera): SpriteFrame {

    try {

        if (!targetNode || !targetNode.isValid) {

            console.error('无效的节点');

            return null;

        }

        const nodeTransform = targetNode.getComponent(UITransform);

        if (!nodeTransform) {

            console.error('节点缺少UITransform组件');

            return null;

        }

        const nodeSize = nodeTransform.contentSize;

        if (nodeSize.width <= 0 || nodeSize.height <= 0) {

            console.error('节点尺寸无效');

            return null;

        }

        // 创建渲染纹理

        const renderTexture = new RenderTexture();

        const size = {

            width: Math.ceil(nodeSize.width),

            height: Math.ceil(nodeSize.height)

        };

        renderTexture.reset({

            width: size.width,

            height: size.height

        });

        // 创建临时相机

        let tempCamera: Camera = null;

        if (!camera) {

            const cameraNode = new Node('TempCamera');

            tempCamera = cameraNode.addComponent(Camera);

            tempCamera.clearFlags = Camera.ClearFlag.SOLID_COLOR;

            tempCamera.clearColor = new Color(0, 0, 0, 0);

            tempCamera.projection = Camera.ProjectionType.ORTHO;

            // 将相机添加到场景

            const scene = director.getScene();

            if (scene) {

                scene.addChild(cameraNode);

            } else {

                console.error('场景不存在');

                return null;

            }

            // 计算相机位置

            const worldPos = new Vec3();

            targetNode.getWorldPosition(worldPos);

           

            // 设置相机位置和参数

            cameraNode.setWorldPosition(worldPos.x, worldPos.y, 1000);

            tempCamera.orthoHeight = nodeSize.height / 2;

            tempCamera.near = 0.1;

            tempCamera.far = 2000;

            // 确保相机能看到目标节点

            tempCamera.visibility = targetNode.layer;

        }

        const captureCamera = camera || tempCamera;

       

        // 设置渲染目标

        captureCamera.targetTexture = renderTexture;

        // 确保相机和节点都是激活的

        if (tempCamera) {

            tempCamera.node.active = true;

        }

        const originalActive = targetNode.active;

        targetNode.active = true;

        // 强制更新场景

        director.root.frameMove(0);

        game.step();

        // 创建SpriteFrame

        const spriteFrame = new SpriteFrame();

        spriteFrame.texture = renderTexture;

        spriteFrame.originalSize = new Size(size.width, size.height);

        spriteFrame.rect = new Rect(0, 0, size.width, size.height);

        // 清理

        if (tempCamera) {

            tempCamera.targetTexture = null;

            tempCamera.node.destroy();

        }

        // 恢复节点状态

        targetNode.active = originalActive;

        return spriteFrame;

    } catch (error) {

        console.error('截图过程出错:', error);

        return null;

    }

}

public static captureNodeToSpriteFrameAsync(targetNode: Node, camera?: Camera): Promise<SpriteFrame> {

    return new Promise((resolve) => {

        // 等待两帧以确保渲染完成

        let frameCount = 0;

        const checkFrame = () => {

            frameCount++;

            if (frameCount >= 2) {

                const spriteFrame = this.captureNodeToSpriteFrame(targetNode, camera);

                resolve(spriteFrame);

            } else {

                director.once(Director.EVENT_AFTER_UPDATE, checkFrame);

            }

        };

        director.once(Director.EVENT_AFTER_UPDATE, checkFrame);

    });

}

先mark ,坐等结果