首先,我们需要根据提供的文档内容重构代码。在Cocos Creator中开发小游戏时,通常需要将onLoad方法替换为start方法,以便在场景初始化时完成视频对象的创建和事件绑定。然而,对于多场景的小游戏,如果反复切换场景后再查看广告,可能会遇到奖励次数与观看次数不符的问题,这可能会导致审核打回。此外,offClose方法的使用也存在问题。 以下是重构后的代码:

// 在cocos creator开发的小游戏中,把onLoad换成start就差不多了,场景初始化的时候把视频对象初始化好,事件绑定好
function start() {
this.ad = tt.createRewardedVideoAd({
adUnitId: 'xxx', // 请替换为实际的广告单元ID
});
// 监听错误
this.ad.onError((err) => {
tt.hideLoading();
switch (err.errCode) {
case 1004:
// 无合适的广告
break;
default:
// 更多请参考错误码文档
}
});
// 监听视频播放完成
this.ad.onClose((data) => {
tt.hideLoading();
if (data.isEnded) {
console.log('观看了', data.count, '个视频');
} else {
console.log('未观看完视频');
}
});
// 预加载资源
this.ad.load();
}
// 处理用户点击
function handleClick() {
tt.showLoading();
this.ad.show();
}

请注意,上述代码中的'xxx'需要替换为实际的广告单元ID。同时,由于问题中提到了“offClose”方法的使用存在困难,因此我们没有使用该方法。 2023/07/12后续更新:在最近上架新的抖音小游戏时,我注意到视频激励广告中新增了一个名为RewardedVideoAd.destroy的方法。这个方法能销毁所有注册的事件,只需要在用户离开场景时调用它即可。也就是说,只要我们创建了RewardedVideoAd并在用户离开场景时调用destroy方法,就能确保不产生多播委托导致看一次广告获得多倍奖励的情况。

private videoAd start() {         let _this = this;         //预加载广告          this.videoAd = tt.createRewardedVideoAd({             adUnitId: "XXXXXXXXXXX", //广告位id             success(res) {             },             fail(res) {                 _this.showWarning('视频加载失败~')             }         });         this.videoAd.onLoad(() => {             console.log("广告加载完成");         });         this.videoAd.onError(() => {             _this.showWarning('视频加载失败~')         });         this.videoAd.onClose(res => {             // 用户点击了【关闭广告】按钮             // 小于 2.1.0 的基础库版本,res 是一个 undefined             if (res && res.isEnded || res === undefined) {                 // 正常播放结束,可以下发游戏奖励的逻辑                 })             }             else {                 // 播放中途退出,不下发游戏奖励                 _this.showWarning('观看中断!无法获取金币~')             }         })     }
//离开场景的按钮,调用一下销毁方法
this.leaveSceneButton.addEventListener('click', () => {
this.videoAd.destroy();
});

在这段代码中,主要涉及到的是视频广告的展示以及关闭。首先,通过调用onbtnLeave()函数,可以销毁当前的广告并跳转到其他的播放场景。然后,使用videoAd.show()方法来显示广告,如果显示失败,则通过catch语句捕获错误,并尝试重新加载广告。如果再次加载失败,则继续捕获错误,并在控制台打印出“激励视频 广告显示失败”的错误信息。 在这段代码中,还有一个问题需要注意,即插屏和banner广告有时候不显示。这是因为这些广告的展示取决于登录用户,有些用户可能被系统判定没有观看广告的价值或者与当前的广告定向不符,因此不会展示这些广告。这是正常的现象,只需要按照官方文档的说明进行操作即可。