cocos creator 3.6 发布web手机端 加载进度条添加

cocos creator 升级到3.x之后加载进度条取消了,测试了多个3.x版本最终以creator 3.6.3版本,构建了简单的进度加载

参考链接:

https://forum.cocos.org/t/topic/137113

打包web-mobile后,没有进度条。加载的时候只显示一个黑屏。 - Creator 3.x - Cocos中文社区

cocos creator 3.6.x 版本H5下 启动页做进度条加载 - 掘金

 参考了多个实例,大部分之解决到了第一个场景的加载进度,但creater 中cc.js加载时还是会留下空白时间,所以做了个伪进度条,让进度更平滑

主要对以下文件修改

设计思路:添加个计时函数,让进度每秒都长,确保每个时间都在增长,然后在一些关键点,插入手动更新,让进度更真实平滑

//------------------中间是新增加内容-----------------------

//-------------------end-----------------

1、 style.css中添加进度条及logo的布局
html {-ms-touch-action: none;
}body, canvas, div {display: block;outline: none;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);user-select: none;-moz-user-select: none;-webkit-user-select: none;-ms-user-select: none;-khtml-user-select: none;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}/* Remove spin of input type number */
input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button {/* display: none; <- Crashes Chrome on hover */-webkit-appearance: none;margin: 0; /* <-- Apparently some margin are still there even though it's hidden */
}body {position: absolute;top: 0;left: 0;width: 100%;height: 100%;padding: 0;border: 0;margin: 0;cursor: default;color: #888;background-color: #333;text-align: center;font-family: Helvetica, Verdana, Arial, sans-serif;display: flex;flex-direction: column;
}canvas {background-color: rgba(0, 0, 0, 0);
}#GameDiv, #Cocos3dGameContainer, #GameCanvas {width: 100%;height: 100%;
}
/******************以下 进度条和logo **********/
.progress-bar {background-color: #1a1a1a;position: absolute;left: 25%;top: 80%;height: 14px;padding: 5px;width: 50%;/*margin: 0 -175px;         */border-radius: 5px;box-shadow: 0 1px 5px #000 inset, 0 1px 0 #444;           
}.progress-bar span {display: block;height: 100%;border-radius: 3px;box-shadow: 0 1px 0 rgba(255, 255, 255, .5) inset;transition: width .4s ease-in-out; background-color: #34c2e3;    
}.stripes span {background-size: 30px 30px;background-image: linear-gradient(135deg, rgba(255, 255, 255, .15) 25%, transparent 25%,transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%,transparent 75%, transparent);            animation: animate-stripes 1s linear infinite;             
}#splash {position: absolute;top: 0;left: 0;width: 100%;height: 100%;background: #171717 url(./splash.png) no-repeat center;background-size: 45%;
}
/******************end**********/
2、 index.html中添加节点,并且启动显示
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>Cocos Creator | spider</title><!--http://www.html5rocks.com/en/mobile/mobifying/--><meta name="viewport"content="width=device-width,user-scalable=no,initial-scale=1,minimum-scale=1,maximum-scale=1,minimal-ui=true"/><!--https://developer.apple.com/library/safari/documentation/AppleApplications/Reference/SafariHTMLRef/Articles/MetaTags.html--><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"><meta name="format-detection" content="telephone=no"><!-- force webkit on 360 --><meta name="renderer" content="webkit"/><meta name="force-rendering" content="webkit"/><!-- force edge on IE --><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/><meta name="msapplication-tap-highlight" content="no"><!-- force full screen on some browser --><meta name="full-screen" content="yes"/><meta name="x5-fullscreen" content="true"/><meta name="360-fullscreen" content="true"/><!--fix fireball/issues/3568 --><!--<meta name="browsermode" content="application">--><meta name="x5-page-mode" content="app"><!--<link rel="apple-touch-icon" href=".png" />--><!--<link rel="apple-touch-icon-precomposed" href=".png" />--><link rel="stylesheet" type="text/css" href="style.css"/></head>
<body><div id="GameDiv" cc_exact_fit_screen="true"><div id="Cocos3dGameContainer"><canvas id="GameCanvas" oncontextmenu="event.preventDefault()" tabindex="99"></canvas></div></div><!--------------添加节点 --------------><div id="splash"><div class="progress-bar stripes"><span style="width: 0%"></span></div></div><!-----------------end---------------><!-- Polyfills bundle. -->
<script src="src/polyfills.bundle.js" charset="utf-8"> </script><!-- SystemJS support. -->
<script src="src/system.bundle.js" charset="utf-8"> </script><!-- Import map -->
<script src="src/import-map.json" type="systemjs-importmap" charset="utf-8"> </script><script>System.import('./index.js').catch(function(err) { console.error(err); })
</script>
<!--------------启动显示进度 -------------->
<script type="text/javascript">(function () { var splash = document.getElementById('splash');splash.style.display = 'block';})();
</script>
<!--------------end -------------->
</body>
</html>
3、 添加进度条更新onProgress,和自动一个计时更新函数,onProgress手动调用分的越细节,进度曲线越平滑
System.register([], function (_export, _context) {"use strict";var cc, Application;//---------------计时函数 和更新进度函数--------------var percentJd=0;//每秒更新进度条var timer =setInterval(() => {const now = new Date();//console.log(now.toString());if (percentJd<90) {percentJd=percentJd+1;onProgress(percentJd);} else{clearInterval(timer);}}, 1000);//刷新ui 及进度function onProgress(percent){//用于手动跟新,比每秒进度大就更新if (percent>percentJd) {percentJd=percent;}var progressBar = splash.querySelector('.progress-bar span');// var percent = 100 * finish / total;if (progressBar) {progressBar.style.width = percent + '%';}}//---------------------------end-----------------function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }return {setters: [],execute: function () {_export("Application", Application = /*#__PURE__*/function () {function Application() {_classCallCheck(this, Application);this.settingsPath = 'src/settings.json';this.showFPS = false;}_createClass(Application, [{key: "init",value: function init(engine) {cc = engine;cc.game.onPostBaseInitDelegate.add(this.onPostInitBase.bind(this));cc.game.onPostSubsystemInitDelegate.add(this.onPostSystemInit.bind(this));}}, {key: "onPostInitBase",value: function onPostInitBase() {// cc.settings.overrideSettings('assets', 'server', '');// do custom logic}}, {key: "onPostSystemInit",value: function onPostSystemInit() {// do custom logic}}, {key: "start",value: function start() {、//---------------手动更新进度条--------------//上面的其他函数中可以拆分更细致onProgress(50);,//game.init,初始化第一个场景,第一个场景比较大的话也会比较耗时,所以定在50%//----------------------------------------return cc.game.init({debugMode: false ? cc.DebugMode.INFO : cc.DebugMode.ERROR,settingsPath: this.settingsPath,overrideSettings: {// assets: {//      preloadBundles: [{ bundle: 'main', version: 'xxx' }],// }profiling: {showFPS: this.showFPS}}}).then(function () {return cc.game.run();});}}]);return Application;}());}};
});
4、关闭进度条和logo的显示的监听
System.register(["./application.js"], function (_export, _context) {"use strict";var Application, canvas, $p, bcr, application;//------注册第一个场景 是否加载完成监听-----------------function setLoadingDisplay () {console.log('Engine is initialized');cc.director.once(cc.Director.EVENT_AFTER_SCENE_LAUNCH, function () {console.log('game run over' );  //关闭进度条显示splash.style.display = 'none';//关闭计时,但有时无效,未找到原因,有好的修改方案告知下if (application.timer) {clearInterval(application.timer);}});}//------ end-----------------function topLevelImport(url) {return System["import"](url);}return {setters: [function (_applicationJs) {Application = _applicationJs.Application;}],execute: function () {canvas = document.getElementById('GameCanvas');$p = canvas.parentElement;bcr = $p.getBoundingClientRect();canvas.width = bcr.width;canvas.height = bcr.height;application = new Application();topLevelImport('cc').then(function (engine) {//------cc 文件加载完后,添加监听-----------------setLoadingDisplay();//------end-----------------return application.init(engine);}).then(function () {return application.start();})["catch"](function (err) {console.error(err);});}};
});
以上就是全部修改内容,但由于每次发布都得修改,所以我将以上内容放入到引擎默认模板中,splash.png放在了项目模板下,就可以勾选md5 也不会更新不到了
5、修改引擎模板

路劲:F:\cocos-dashboard-editors\3.6.3\resources\resources\3d\engine\templates\web-mobile

index.html-》index.ejs 

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title><%= projectName %></title><!--http://www.html5rocks.com/en/mobile/mobifying/--><meta name="viewport"content="width=device-width,user-scalable=no,initial-scale=1,minimum-scale=1,maximum-scale=1,minimal-ui=true"/><!--https://developer.apple.com/library/safari/documentation/AppleApplications/Reference/SafariHTMLRef/Articles/MetaTags.html--><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"><meta name="format-detection" content="telephone=no"><!-- force webkit on 360 --><meta name="renderer" content="webkit"/><meta name="force-rendering" content="webkit"/><!-- force edge on IE --><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/><meta name="msapplication-tap-highlight" content="no"><!-- force full screen on some browser --><meta name="full-screen" content="yes"/><meta name="x5-fullscreen" content="true"/><meta name="360-fullscreen" content="true"/><!--fix fireball/issues/3568 --><!--<meta name="browsermode" content="application">--><meta name="x5-page-mode" content="app"><!--<link rel="apple-touch-icon" href=".png" />--><!--<link rel="apple-touch-icon-precomposed" href=".png" />--><link rel="stylesheet" type="text/css" href="<%= cssUrl %>"/></head>
<body><div id="GameDiv" cc_exact_fit_screen="true"><div id="Cocos3dGameContainer"><canvas id="GameCanvas" oncontextmenu="event.preventDefault()" tabindex="99"></canvas></div></div><div id="splash"><div class="progress-bar stripes"><span style="width: 0%"></span></div></div><%- include(cocosTemplate, {}) %><script type="text/javascript">(function () {var splash = document.getElementById('splash');splash.style.display = 'block';})();</script>
</body>
</html>

 index.js-》index.js.ejs

import { Application } from '<%= applicationJS %>';const canvas = document.getElementById('GameCanvas');
const $p = canvas.parentElement;
const bcr = $p.getBoundingClientRect();
canvas.width = bcr.width;
canvas.height = bcr.height;// 是否加载执行完成
function setLoadingDisplay () {console.log('Engine is initialized');cc.director.once(cc.Director.EVENT_AFTER_SCENE_LAUNCH, function () {console.log('game run over' );  splash.style.display = 'none';if (application.timer) {clearInterval(application.timer);}});
}function topLevelImport (url) {return System.import(url);
}const application = new Application();topLevelImport('cc')
.then((engine) => {//监听setLoadingDisplay();return application.init(engine);
}).then(() => {return application.start();
}).catch((err) => {console.error(err);
});

style.css

html {-ms-touch-action: none;
}body, canvas, div {display: block;outline: none;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);user-select: none;-moz-user-select: none;-webkit-user-select: none;-ms-user-select: none;-khtml-user-select: none;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}/* Remove spin of input type number */
input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button {/* display: none; <- Crashes Chrome on hover */-webkit-appearance: none;margin: 0; /* <-- Apparently some margin are still there even though it's hidden */
}body {position: absolute;top: 0;left: 0;width: 100%;height: 100%;padding: 0;border: 0;margin: 0;cursor: default;color: #888;background-color: #333;text-align: center;font-family: Helvetica, Verdana, Arial, sans-serif;display: flex;flex-direction: column;
}canvas {background-color: rgba(0, 0, 0, 0);
}#GameDiv, #Cocos3dGameContainer, #GameCanvas {width: 100%;height: 100%;
}
/********************进度条********************/
.progress-bar {background-color: #1a1a1a;position: absolute;left: 25%;top: 80%;height: 14px;padding: 5px;width: 50%;/*margin: 0 -175px;         */border-radius: 5px;box-shadow: 0 1px 5px #000 inset, 0 1px 0 #444;           
}.progress-bar span {display: block;height: 100%;border-radius: 3px;box-shadow: 0 1px 0 rgba(255, 255, 255, .5) inset;transition: width .4s ease-in-out; background-color: #34c2e3;    
}.stripes span {background-size: 30px 30px;background-image: linear-gradient(135deg, rgba(255, 255, 255, .15) 25%, transparent 25%,transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%,transparent 75%, transparent);            animation: animate-stripes 1s linear infinite;             
}#splash {position: absolute;top: 0;left: 0;width: 100%;height: 100%;background: #171717 url(./splash.png) no-repeat center;background-size: 45%;
}

 application.js-》application.ejs

F:\cocos-dashboard-editors\3.6.3\resources\resources\3d\engine\templates\launcher

<%- include(versionCheckTemplate, { version: '1.0.0'}) %>
let cc;//---------------自动 updata Progress--------------
var percentJd=0;
var timer =setInterval(() => {const now = new Date();//console.log(now.toString());if (percentJd<90) {percentJd=percentJd+1;onProgress(percentJd);} else{clearInterval(timer);}
}, 1000);function onProgress(percent){if (percent>percentJd) {percentJd=percent;}var progressBar = splash.querySelector('.progress-bar span');// var percent = 100 * finish / total;if (progressBar) {progressBar.style.width = percent + '%';}
}
//------------end-----------------export class Application {constructor () {this.settingsPath = '<%= settingsJsonPath %>';this.showFPS = <%= showFPS %>;}init (engine) {cc = engine;cc.game.onPostBaseInitDelegate.add(this.onPostInitBase.bind(this));cc.game.onPostSubsystemInitDelegate.add(this.onPostSystemInit.bind(this));}onPostInitBase () {// cc.settings.overrideSettings('assets', 'server', '');// do custom logic}onPostSystemInit () {// do custom logic}start () {// 手动更新onProgress(50);return cc.game.init({debugMode: <%= debugMode %> ? cc.DebugMode.INFO : cc.DebugMode.ERROR,settingsPath: this.settingsPath,overrideSettings: {// assets: {//      preloadBundles: [{ bundle: 'main', version: 'xxx' }],// }profiling: {showFPS: this.showFPS,}}}).then(() => cc.game.run());}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/1187.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【小程序】IOS wx小程序解压获取源文件

根据自己手机的系统&#xff0c;获取wx小程序的缓存目录 一、微信小程序文件存放路径 安卓&#xff1a; /data/data/com.tencent.mm/MicroMsg/{{user哈希值}}/appbrand/pkg/iOS越狱&#xff1a; /User/Containers/Data/Application/{{系统UUID}}/Library/WechatPrivate/{{user…

1.为什么选择Vue框架

参考&#xff1a;百战程序员 为什么选择Vue框架 Vue是什么&#xff1f; 渐进式 JavaScript 框架&#xff0c;易学易用&#xff0c;性能出色&#xff0c;适用场景丰富的 Web 前端框架 为什么要学习Vue Vue是目前前端最火的框架之一Vue是目前企业技术栈中要求的知识点Vue可以…

HarmonyOS 状态管理

在声明式 UI 框架中&#xff0c;数据的改变触发 UI 的重新渲染。在 ArkUI 中不是所有数据的变化都会触发 UI 重新渲染&#xff0c;只有 状态变量 才会引起 UI 重新渲染。 状态变量 状态变量&#xff1a; 指被状态装饰器装饰的变量&#xff0c;只有这种变量的改变才会引起 UI …

【leetcode面试经典150题】63. 删除链表的倒数第 N 个结点(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

软考141-上午题-【软件工程】-杂题+小结

一、杂题 真题1&#xff1a; 真题2&#xff1a; 真题3&#xff1a; 真题4&#xff1a; 真题5&#xff1a; 真题6&#xff1a; 真题7&#xff1a; 真题8&#xff1a; 真题9&#xff1a; 真题10&#xff1a; 真题11&#xff1a; 真题12&#xff1a; 真题13&#xff1a; 真题14&a…

paddlepaddle-gpu安装

背景 之前安装paddlepaddle-gpu遇到各种问题&#xff0c;安装不成功&#xff0c;之前使用了wsldocker的方式&#xff0c;可查看我之前博客&#xff1a;记录paddlepaddle-gpu安装&#xff0c;这要会导致我整个开发流程比较割裂 cuda版本 强烈推荐cuda11.8&#xff0c;paddlep…

SpringBoot项目错误:找不到主类(解决办法)

清理和重新编译项目即可&#xff0c;在项目中点击右键Maven-Reload project&#xff0c;之后再重新运行就行了

蓝桥杯第十五界软件测试线下省赛题目分析及解决

PS 需要第十五界蓝桥杯被测系统或者功能测试模板、单元测试被测代码、自动化测试被测代码请加&#x1f427;:1940787338 备注&#xff1a;15界蓝桥杯省赛软件测试 题目1&#xff1a;功能测试 题目描述 ​ 某物流公司的货运收费标准根据重量、距离和节假日三个因素来确定。如…

聊聊应用商城评分4.9的Apipost IDEA插件

Apipost Helper&#xff0c;作为IDEA插件&#xff0c;可以快速生成和查询API文档&#xff0c;直观友好地在IDE中调试接口。它简化了开发流程并提升效率&#xff0c;即使新手也能够迅速掌握。Apipost Helper提供了诸多便捷功能&#xff0c;如通过代码查找接口或者通过接口查找代…

UE5、CesiumForUnreal实现建筑白模生成及白模美化功能

1.实现目标 在专栏上篇文章基于GeoJson文件生成城市级白模(本文建筑白模数量12w+)的基础上修改,计算法线和纹理坐标,并基于特定材质进行美化,美化后的白模GIF动图如下所示: 文章目录 1.实现目标2.实现过程2.1 基于Cesium材质美化2.1.1实现原理2.1.2 C++代码2.1.3 蓝图应…

(自学用)正演理论

基于波动方程如何解决数值频散问题——快速正演方法 NAD方法&#xff1a; 怎样离散/逼近高阶偏导数&#xff08;如何采样&#xff09;&#xff1a; 传统方法是用某一点及其周围点的函数f的线性组合来逼近导数。只有函数值&#xff0c;要想提高精度&#xff0c;压制数值频散就必…

【Django】学习笔记

文章目录 [toc]MVC与MTVMVC设计模式MTV设计模式 Django下载Django工程创建与运行创建工程运行工程 子应用创建与注册安装创建子应用注册安装子应用 数据模型ORM框架模型迁移 Admin站点修改语言和时区设置管理员账号密码模型注册显示对象名称模型显示中文App显示中文 视图函数与…

分布式锁实现方案-基于zookeeper的分布式锁实现(原理与代码)

目录 一、基于zookeeper的分布式锁 1.1 基于Zookeeper实现分布式锁的原理 1.1.1 分布式锁特性说明 1.1.1.1 特点分析 1.1.1.2 本质 1.1.2 Zookeeper 分布式锁实现原理 1.1.2.1 Zookeeper临时顺序节点特性 1.1.2.2 Zookeeper满足分布式锁基本要求 1.1.2.3 Watcher机制 …

UE5增强输入系统 Enhanced Input

关键字&#xff1a; Enhanced Input 、 输入、映射、事件、鼠标、键盘、键鼠、动作、Trigger、触发器、 疑问&#xff1a; 新输入系统怎么做一个基础的案例&#xff1f;Trigger修改器中每个项都是什么功能&#xff1f;功能边界问题&#xff1a;如时刻、时段、单次事件、持续事…

Linux驱动开发——(一)设备树的基本属性及其应用

目录 一、常见基本属性 1.1 compatible属性 1.2 status属性 1.3 reg属性 1.4 #address-cells属性和#size-cells属性 二、基本属性在设备树的表现 三、基本属性在驱动代码的表现 3.1 驱动代码 3.2 驱动代码中的OF函数 3.2.1 of_find_node_by_path 3.2.2 of_find_prope…

Unity类银河恶魔城学习记录13-5,6 p146 Delete save file,p147 Encryption of saved data源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili FileDataHandler.cs using System; using System.IO; using UnityEngine; p…

Spring Boot + Thymeleaf 实现的任务发布网站

角色&#xff1a; 管理员雇主雇员 功能 雇主&#xff1a;登录、注册、发布任务、选择中标雇员、评价雇员雇员&#xff1a;登录、注册、查看任务列表、投标任务、收藏任务、完成任务管理员、登录、任务管理、雇主管理、雇员管理 部分功能截图 部署 导入数据库…

.NET 邮件发送 SMTP邮件发送

SMTP&#xff08;Simple Mail Transfer Protocol&#xff09;是用于电子邮件传输的规则集&#xff0c;可以从邮件客户端向接收电子邮件服务器发送、中继或转发邮件。发件人可使用SMTP 服务器来执行发送电子邮件的过程。SMTP服务器则是按照这些规则中转电子邮件的服务器。 IMAP…

视频质量评价 PSNR 算法详细介绍

PSNR PSNR(Peak Signal-to-Noise Ratio,峰值信噪比)是一种常用的评价图像质量的指标,尤其在图像压缩和图像处理领域。它基于最大可能的图像信号功率和图像的噪声功率之间的比率,通常用于衡量图像恢复或图像压缩算法的效果。 原理 PSNR是基于MSE(Mean Squared Error,均…

node-sass报错

node-sass报错 解决方案 有几种解决方案&#xff0c;但感觉都是为了下载vsta_sdk这个工具的。 有的电脑下载C开发程序时可以顺带下载这个插件。 可以直接下载VS之后点击下载C桌面开发&#xff0c;但是有的不行&#xff0c;所以网上也就有另外一种方式&#xff0c;就是下载V…