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);
});
}