From 15b327d196a7130ca6255053b40c86f7c4357ae2 Mon Sep 17 00:00:00 2001 From: huanghaipeng Date: Tue, 10 Mar 2026 17:34:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8E=A8=E8=8D=90=E6=B5=81?= =?UTF-8?q?=E7=9B=B4=E7=8E=A9=E4=B8=8A=E4=BC=A0=E5=8A=A0=E8=BD=BD=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E7=9A=84=E4=BD=8D=E7=BD=AE=EF=BC=8C=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E9=80=9A=E8=A1=8C=E8=AF=81=E5=85=B3=E9=97=AD=E6=95=88=E6=9E=9C?= =?UTF-8?q?=E8=83=8C=E6=99=AF=E7=99=BD=E8=89=B2=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/Script/JiaZai.ts | 38 +--- assets/Script/Load.ts | 10 ++ assets/Script/Map.ts | 19 +- assets/Script/module/Tool/GameTool.ts | 8 +- assets/Script/module/Tool/GenieEffect.ts | 210 ++++++++++++----------- assets/shop/prefab/passCheck.prefab | 1 - 6 files changed, 141 insertions(+), 145 deletions(-) diff --git a/assets/Script/JiaZai.ts b/assets/Script/JiaZai.ts index 7efe435..78af906 100644 --- a/assets/Script/JiaZai.ts +++ b/assets/Script/JiaZai.ts @@ -52,7 +52,6 @@ export default class JiaZai extends cc.Component { private isGetSidebar: boolean = false; - @property(cc.EditBox) custom: cc.EditBox = null; @@ -651,16 +650,6 @@ export default class JiaZai extends cc.Component { top.getChildByName("hammer").active = false; } this.setAdaptation(); - // 加载广告 - // cc.fx.GameTool.preloadRewardedVideoAd().then((success) => { - // if (success) { - // console.log("HomeScene广告预加载初始化成功"); - // } else { - // console.log("HomeScene广告预加载初始化失败"); - // } - // }); - // 上报游戏加载完成时机(推荐流直玩需要) - cc.fx.GameTool.reportLoadComplete(); } // 适配pad @@ -3826,27 +3815,14 @@ export default class JiaZai extends cc.Component { sidebarBtn.active = false; } dy_kefu.active = true; - // 检测推荐流直玩场景 - const recommendFeedResult = cc.fx.GameTool.checkRecommendFeedLaunch(); - console.log("推荐流直玩场景检测结果", recommendFeedResult); - if (recommendFeedResult && recommendFeedResult.isRecommendFeedLaunch) { - // 检查 tt.getRecommendFeedInfo 是否存在 - //@ts-ignore - if (tt && tt.getRecommendFeedInfo) { - //@ts-ignore - tt.getRecommendFeedInfo({ - success: (res) => { - console.log("推荐流信息:", res); - // 处理推荐流信息 - }, - fail: (err) => { - console.error("获取推荐流信息失败:", err); - } - }); - } else { - console.log("tt.getRecommendFeedInfo 方法不可用,跳过获取推荐流信息"); - } + // 检测推荐流直玩场景(只在首次进入游戏时自动进入房间) + const recommendFeedResult = cc.fx.GameTool.checkRecommendFeedLaunch(); + // 安全检查,确保 cc.fx.GameConfig.GM_INFO 已初始化 + const hasAutoEntered = cc.fx && cc.fx.GameConfig && cc.fx.GameConfig.GM_INFO ? cc.fx.GameConfig.GM_INFO.hasAutoEntered : false; + if (!hasAutoEntered && recommendFeedResult && recommendFeedResult.isRecommendFeedLaunch) { + // 推荐流直玩,自动进入游戏房间 + this.startGame(); } // 初始化推荐流直玩监听器 diff --git a/assets/Script/Load.ts b/assets/Script/Load.ts index 58400f2..6add6f2 100644 --- a/assets/Script/Load.ts +++ b/assets/Script/Load.ts @@ -34,6 +34,16 @@ export default class NewClass extends cc.Component { cc.debug.setDisplayStats(false); let manager = cc.director.getCollisionManager(); manager.enabled = true; + + // 初始化推荐流自动进入标记(延迟初始化,确保 cc.fx 已加载) + setTimeout(() => { + if (cc.fx && cc.fx.GameConfig && cc.fx.GameConfig.GM_INFO) { + if (!cc.fx.GameConfig.GM_INFO.hasAutoEntered) { + cc.fx.GameConfig.GM_INFO.hasAutoEntered = false; + } + } + }, 100); + this.setWX(); // let version = cc.fx.GameTool.getWechatGameVersion(); diff --git a/assets/Script/Map.ts b/assets/Script/Map.ts index 1eabf65..4533c24 100644 --- a/assets/Script/Map.ts +++ b/assets/Script/Map.ts @@ -294,9 +294,12 @@ export default class MapConroler extends cc.Component { } } }, cc.fx.GameConfig.GM_INFO.address); + } start() { + + setTimeout(() => { cc.director.preloadScene("HomeScene", (err, asset) => { if (err) { @@ -315,14 +318,14 @@ export default class MapConroler extends cc.Component { // this.particleEffects = GameManager._instance.particleEffects; this.initMap(); - // 加载广告 - // cc.fx.GameTool.preloadRewardedVideoAd().then((success) => { - // if (success) { - // console.log("GameScene广告预加载初始化成功"); - // } else { - // console.log("GameScene广告预加载初始化失败"); - // } - // }); + // 上报游戏加载完成时机(推荐流直玩需要) + cc.fx.GameTool.reportLoadComplete(); + + // 标记已经自动进入过房间(安全检查) + if (cc.fx && cc.fx.GameConfig && cc.fx.GameConfig.GM_INFO) { + cc.fx.GameConfig.GM_INFO.hasAutoEntered = true; + } + } //道具数量 setPropNum() { diff --git a/assets/Script/module/Tool/GameTool.ts b/assets/Script/module/Tool/GameTool.ts index 3d21dad..d1de6e2 100644 --- a/assets/Script/module/Tool/GameTool.ts +++ b/assets/Script/module/Tool/GameTool.ts @@ -450,8 +450,8 @@ var GameTool = { //关卡上限 maxLevel() { let jg = false; - if (cc.fx.GameConfig.GM_INFO.level > 1299) { - cc.fx.GameConfig.GM_INFO.level = 1300; + if (cc.fx.GameConfig.GM_INFO.level > 1199) { + cc.fx.GameConfig.GM_INFO.level = 1200; jg = true; } return jg; @@ -2416,7 +2416,7 @@ var GameTool = { const query = launchOptions.query; // 检测是否为推荐流直玩场景(scene后四位是3041) - const isRecommendFeedLaunch = scene && typeof scene === 'string' && scene.slice(-4) === '3041'; + const isRecommendFeedLaunch = scene && typeof scene === 'string' && (scene.slice(-4) === '3041'); if (isRecommendFeedLaunch) { // 处理推荐流直玩参数 @@ -2503,7 +2503,7 @@ var GameTool = { const scene = launchOptions.scene; // 检测是否为推荐流直玩场景(scene后四位是3041) - const isRecommendFeedLaunch = scene && typeof scene === 'string' && scene.slice(-4) === '3041'; + const isRecommendFeedLaunch = scene && typeof scene === 'string' && (scene.slice(-4) === '3041'); if (isRecommendFeedLaunch) { // 上报预启动数据 diff --git a/assets/Script/module/Tool/GenieEffect.ts b/assets/Script/module/Tool/GenieEffect.ts index e172041..6f0ea8b 100644 --- a/assets/Script/module/Tool/GenieEffect.ts +++ b/assets/Script/module/Tool/GenieEffect.ts @@ -33,6 +33,16 @@ export default class GenieEffect extends cc.Component { const node = this.node; const size = node.getContentSize(); + // 检查是否包含滚动视图,临时禁用裁剪 + const scrollView = node.getComponent(cc.ScrollView); + const maskComponents = node.getComponentsInChildren(cc.Mask); + const originalMaskEnabled = maskComponents.map(m => m.enabled); + + // 临时禁用所有 Mask 组件 + maskComponents.forEach(mask => { + mask.enabled = false; + }); + // 创建 RenderTexture const renderTexture = new cc.RenderTexture(); renderTexture.initWithSize(size.width, size.height); @@ -49,12 +59,25 @@ export default class GenieEffect extends cc.Component { camera.zoomRatio = 1; camera.cullingMask = 0xffffffff; + // 特别处理:如果节点包含滚动视图,调整渲染设置 + if (scrollView) { + // 对于滚动视图,强制渲染所有内容 + camera.cullingMask = 0xffffffff; + // 设置更清晰的渲染质量 + camera.zoomRatio = 1.5; + } + // 渲染一帧 camera.render(); // 销毁相机节点 cameraNode.destroy(); + // 恢复 Mask 组件状态 + maskComponents.forEach((mask, index) => { + mask.enabled = originalMaskEnabled[index]; + }); + // 创建 SpriteFrame const spriteFrame = new cc.SpriteFrame(renderTexture); @@ -82,6 +105,10 @@ export default class GenieEffect extends cc.Component { const sprite = spriteNode.addComponent(cc.Sprite); sprite.spriteFrame = spriteFrame; + // 设置混合模式为透明 + sprite.srcBlendFactor = cc.macro.BlendFactor.SRC_ALPHA; + sprite.dstBlendFactor = cc.macro.BlendFactor.ONE_MINUS_SRC_ALPHA; + // 隐藏原节点 this.node.active = false; @@ -197,10 +224,11 @@ export default class GenieEffect extends cc.Component { // 获取 Sprite 组件 const sprite = captureNode.getComponent(cc.Sprite); - // 计算起始位置(世界坐标) + // 获取起始位置和目标位置(世界坐标) const fromWorldPos = fromNode.convertToWorldSpaceAR(cc.v2(0, 0)); + const targetWorldPos = this.node.convertToWorldSpaceAR(cc.v2(0, 0)); - // 设置材质参数(从完全吸入状态开始) + // 设置材质参数 const material = this.genieMaterial; material.setProperty('u_targetPos', [fromWorldPos.x, fromWorldPos.y]); material.setProperty('u_progress', 1); @@ -210,86 +238,103 @@ export default class GenieEffect extends cc.Component { // 应用材质 sprite.setMaterial(0, material); - // 播放动画(progress 从 1 到 0) + // 播放动画 - 同时移动节点和更新 Shader const animData = { progress: 1 }; + const startPos = captureNode.position; + const targetPos = captureNode.parent.convertToNodeSpaceAR(targetWorldPos); cc.tween(animData) .to(this.duration, { progress: 0 }, { - easing: 'quadOut', + easing: 'quadInOut', onUpdate: (target, ratio) => { if (material && sprite) { material.setProperty('u_progress', animData.progress); } + // 同时移动捕获节点向目标点靠近 + if (captureNode) { + const t = animData.progress; + // 使用缓动函数让移动更自然 + const easeT = t * t * (3 - 2 * t); // smoothstep + captureNode.x = startPos.x + (targetPos.x - startPos.x) * easeT; + captureNode.y = startPos.y + (targetPos.y - startPos.y) * easeT; + } } }) .call(() => { this._isPlaying = false; - // 显示原节点 - this.node.active = true; // 销毁捕获节点 if (captureNode) { captureNode.destroy(); } + // 显示原节点 + this.node.active = true; if (callback) callback(); }) .start(); } /** - * 默认关闭动画(当 Shader 不可用时使用) + * 默认关闭动画(不使用 Shader) */ - private playDefaultClose(targetNode: cc.Node, callback?: Function) { - const startPos = this.node.position; const targetWorldPos = targetNode.convertToWorldSpaceAR(cc.v2(0, 0)); - const targetLocalPos = this.node.parent.convertToNodeSpaceAR(targetWorldPos); + playDefaultClose(targetNode: cc.Node, callback?: Function) { + if (this._isPlaying) { + console.warn('GenieEffect: 动画正在播放中'); + return; + } + this._isPlaying = true; + + // 获取起始位置和目标位置(世界坐标) + const startWorldPos = this.node.convertToWorldSpaceAR(cc.v2(0, 0)); + const targetWorldPos = targetNode.convertToWorldSpaceAR(cc.v2(0, 0)); + + // 播放缩放和移动动画 cc.tween(this.node) - .to(this.duration * 0.5, { - position: cc.v3( - startPos.x + (targetLocalPos.x - startPos.x) * 0.5, - startPos.y + (targetLocalPos.y - startPos.y) * 0.5, - 0 - ), - scale: 0.6 - }, { easing: 'quadIn' }) - .to(this.duration * 0.5, { - position: cc.v3(targetLocalPos.x, targetLocalPos.y, 0), - scale: 0.01, - opacity: 0 - }, { easing: 'expoIn' }) + .to(this.duration, { + scale: 0, + position: new cc.Vec3(this.node.parent.convertToNodeSpaceAR(targetWorldPos).x, this.node.parent.convertToNodeSpaceAR(targetWorldPos).y, 0) + }, { + easing: 'quadInOut' + }) .call(() => { + this._isPlaying = false; + this.node.active = false; if (callback) callback(); }) .start(); } /** - * 默认打开动画(当 Shader 不可用时使用) + * 默认打开动画(不使用 Shader) */ - private playDefaultOpen(fromNode: cc.Node, callback?: Function) { + playDefaultOpen(fromNode: cc.Node, callback?: Function) { + if (this._isPlaying) { + console.warn('GenieEffect: 动画正在播放中'); + return; + } + + this._isPlaying = true; + + // 获取起始位置和目标位置(世界坐标) const fromWorldPos = fromNode.convertToWorldSpaceAR(cc.v2(0, 0)); - const fromLocalPos = this.node.parent.convertToNodeSpaceAR(fromWorldPos); - const endPos = this.node.position; + const targetWorldPos = this.node.convertToWorldSpaceAR(cc.v2(0, 0)); - this.node.scale = 0.01; - this.node.opacity = 0; - this.node.position = cc.v3(fromLocalPos.x, fromLocalPos.y, 0); + // 设置初始状态 + this.node.scale = 0; + const fromPos = this.node.parent.convertToNodeSpaceAR(fromWorldPos); + this.node.position = new cc.Vec3(fromPos.x, fromPos.y, 0); + this.node.active = true; + // 播放缩放和移动动画 cc.tween(this.node) - .to(this.duration * 0.5, { - position: cc.v3( - fromLocalPos.x + (endPos.x - fromLocalPos.x) * 0.5, - fromLocalPos.y + (endPos.y - fromLocalPos.y) * 0.5, - 0 - ), - scale: 0.6, - opacity: 128 - }, { easing: 'quadOut' }) - .to(this.duration * 0.5, { - position: endPos, + .to(this.duration, { scale: 1, - opacity: 255 - }, { easing: 'expoOut' }) + position: new cc.Vec3(this.node.parent.convertToNodeSpaceAR(targetWorldPos).x, this.node.parent.convertToNodeSpaceAR(targetWorldPos).y, 0) + }, { + easing: 'quadInOut' + }) .call(() => { + this._isPlaying = false; if (callback) callback(); }) .start(); @@ -297,70 +342,33 @@ export default class GenieEffect extends cc.Component { } /** - * 静态工具函数 - 方便外部调用 + * GenieEffect 工具类 + * 提供静态方法方便调用 */ -export namespace GenieEffectUtil { +export class GenieEffectUtil { /** - * 播放关闭动画(静态方法) - * @param node 目标节点(动画作用的节点) - * @param targetNode 吸入目标节点 - * @param callback 完成回调 - * @param material 材质(可选) - * @param duration 动画时长 + * 播放关闭动画 + * @param node 要播放动画的节点 + * @param targetNode 目标节点(吸入位置) + * @param callback 动画完成回调 + * @param material 可选的材质 */ - export function playClose( - node: cc.Node, - targetNode: cc.Node, - callback?: Function, - material?: cc.Material, - duration: number = 0.4 - ) { - const genieEffect = node.getComponent(GenieEffect); - if (genieEffect) { - genieEffect.playClose(targetNode, callback); - } else { - // 动态添加组件并播放 - const effect = node.addComponent(GenieEffect); - effect.duration = duration; - if (material) { - effect.genieMaterial = material; - } - - // 延迟一帧等待组件初始化 - cc.director.once(cc.Director.EVENT_AFTER_UPDATE, () => { - effect.playClose(targetNode, callback); - }); - } + static playClose(node: cc.Node, targetNode: cc.Node, callback?: Function, material?: cc.Material) { + const genieEffect = node.addComponent(GenieEffect); + genieEffect.genieMaterial = material; + genieEffect.playClose(targetNode, callback); } /** - * 播放打开动画(静态方法) - * @param node 目标节点(动画作用的节点) - * @param fromNode 展开起始节点 - * @param callback 完成回调 - * @param material 材质(可选) - * @param duration 动画时长 + * 播放打开动画 + * @param node 要播放动画的节点 + * @param fromNode 起始节点(展开位置) + * @param callback 动画完成回调 + * @param material 可选的材质 */ - export function playOpen( - node: cc.Node, - fromNode: cc.Node, - callback?: Function, - material?: cc.Material, - duration: number = 0.4 - ) { - const genieEffect = node.getComponent(GenieEffect); - if (genieEffect) { - genieEffect.playOpen(fromNode, callback); - } else { - const effect = node.addComponent(GenieEffect); - effect.duration = duration; - if (material) { - effect.genieMaterial = material; - } - - cc.director.once(cc.Director.EVENT_AFTER_UPDATE, () => { - effect.playOpen(fromNode, callback); - }); - } + static playOpen(node: cc.Node, fromNode: cc.Node, callback?: Function, material?: cc.Material) { + const genieEffect = node.addComponent(GenieEffect); + genieEffect.genieMaterial = material; + genieEffect.playOpen(fromNode, callback); } } diff --git a/assets/shop/prefab/passCheck.prefab b/assets/shop/prefab/passCheck.prefab index b66fba8..c32edf8 100644 --- a/assets/shop/prefab/passCheck.prefab +++ b/assets/shop/prefab/passCheck.prefab @@ -8752,7 +8752,6 @@ "buyActivate": { "__uuid__": "f0fbe7be-4949-478f-a6f5-06e86e7ffbdc" }, - "btnActivate1": null, "genieMaterial": { "__uuid__": "d53fa0ca-8b03-4458-8359-c0b3d5fd3821" },