CocosCreator2.x 开发笔记
笔记目录
- 一. 组件相关
- 1. Canvas 组件
- 1.1 画布透明
- 2. Label 组件
- 2.1 截屏时字体有黑边
- 2.2 动态改变字体颜色
- 2.3 动态获取文字高度
- 2.4 通过脚本添加 Label
- 3. Widget (对齐挂件)
- 3.1 使用方法
- 4. BlockInputEvents 防止事件穿透
- 4.1 使用方法
- 5. ScrollView 组件
- 5.1 滚动到顶部
- 5.2 规定时间内滚动指定百分比位置上
- 6. WebView 组件
- 6.1 url改变后的适配问题
- 7. Sprite 组件
- 7.1 图片置灰
- 7.1.1 置灰显示
- 7.1.2 代码控制
- 参考链接
- 二. 常用方法
- 1. 加载微信头像
- 2. 开发环境判断
- 3. 游戏全局变量
- 4. 从父节点中删除该节点
- 5. 转化局部坐标系、获取包围盒、判断某个区域是否包含指定坐标点
- 6. 克隆clone节点
- 7. 获取屏幕尺寸
- 8. 打开网址
- 9. 上传base64数据到oss
- 参考链接
- 三. 使用技巧
- 1. 自定义loading样式
- 2. 字体制作的公共字符集
- 3. 获取地址参数函数
- 4. 上下滑动事件
- 5. 随机函数
- 6. 像素间隔Bug
- 7. 远程打包
- 8. 接口请求超时处理
- 9. CNZZ事件统计
- 10. 创建一个连续数字的数组
一. 组件相关
1. Canvas 组件
1.1 画布透明
场景描述
设置画布透明。
解决方法
开启宏,并且设置Camera的alpha为0。
cc.macro.ENABLE_TRANSPARENT_CANVAS = true;
2. Label 组件
2.1 截屏时字体有黑边
场景描述
海报生成类H5,截屏时 label 字体有黑边。
解决方法
把Label组件的 Src Blend Factior 设为 预乘处理 ONE
参考链接
2.0.0 b7 字体有黑边
2.2 动态改变字体颜色
this.labelTip.node.color = new cc.Color(62, 62, 62);
2.3 动态获取文字高度
Label 组件 overflow 设置为 resize_height 属性之后,动态获取文字高度,以便初始化 ScrollView 的 content高度。
this.labelResult.string = 'xxx';
(<any>this.labelResult)._forceUpdateRenderData();
console.log(this.labelResult.node.height);
2.4 通过脚本添加 Label
// 游戏加分动效
let labelScore = new cc.Node();
labelScore.color = new cc.Color(255, 199, 112);
labelScore.addComponent(cc.Label);
labelScore.getComponent(cc.Label).fontSize = 48;
labelScore.getComponent(cc.Label).string = '+' + score;
labelScore.name = 'score';
labelScore.parent = scoreLayer;
labelScore.setPosition(0, 0);
3. Widget (对齐挂件)
3.1 使用方法
通过 Widget (对齐挂件) 组件使元素固定在相当于屏幕的某个位置,注意target属性设置要为canvas。
4. BlockInputEvents 防止事件穿透
4.1 使用方法
在上层UI背景添加 BlockInputEvents 组件 防止事件穿透。
5. ScrollView 组件
5.1 滚动到顶部
scrollView.getComponent(cc.ScrollView).scrollToTop(0);
5.2 规定时间内滚动指定百分比位置上
scrollView.scrollToPercentHorizontal(0.22);
scrollView.scrollToPercentHorizontal(0.22, 0.1);scrollView.scrollToPercentVertical(0.5, 0.1);
6. WebView 组件
6.1 url改变后的适配问题
WebView改变url后,iPhone底部出现导航栏,尺寸改变,出现顶部显示不全的适配问题。
// 改变 webview url
WebView.url = 'http://xxx';// 监听屏幕尺寸改变,重新做顶部适配
window.addEventListener('resize', () => {let adaptHeight = 1514 - 750 * window.innerHeight / window.innerWidth;this.pageGroup.y = - adaptHeight / 2;
});
7. Sprite 组件
7.1 图片置灰
将彩色图片以黑白图片切换显示。
7.1.1 置灰显示
Sprite 的 Materials 属性默认为 builtin-2d-sprite.mtl,内置灰色Material为 builtin-2d-gray-sprite.mtl,把其拖到Sprite 插槽即可把图片置灰。
7.1.2 代码控制
// 图片节点
@property(cc.Sprite)
card: cc.Sprite = null;
// 材质数组:0=builtin-2d-sprite.mtl;1=builtin-2d-gray-sprite.mtl;
@property([cc.Material])
cardMatArray: cc.Material[] = [];// 根据代码逻辑,为图片设置材质
if (gray == true) {this.card.setMaterial(0, this.cardMatArray[1]);
} else {this.card.setMaterial(0, this.cardMatArray[0]);
}
参考链接
CocosCreator 图片置灰(Material/按钮/图片/Spine)
二. 常用方法
1. 加载微信头像
场景描述
H5生成海报,加载用户微信头像及昵称。
解决方法
使用cc.assetManager.loadRemote加载远程贴图资源。
let headimgurl = 'https://thirdwx.qlogo.cn/xxx';
cc.assetManager.loadRemote<cc.Texture2D>(headimgurl, {ext: '.png'}, (err, texture: cc.Texture2D) => {// Use texture to create sprite framelet sf = new cc.SpriteFrame(texture);this.itemHead.spriteFrame = sf;
});
2. 开发环境判断
if (CC_DEBUG) {console.log('debug');
} else {console.log('release');
}
3. 游戏全局变量
通过 window[‘game’] 设置游戏的全局变量,注意在 onLoad() 里赋值
@property // 关卡数据
levelInfo = [];onLoad() {window['gameData'] = this;this.init();
}
init() {this.levelInfo = [];
}
4. 从父节点中删除该节点
node.removeFromParent();
5. 转化局部坐标系、获取包围盒、判断某个区域是否包含指定坐标点
let p_start = this.nodeParent.convertToNodeSpaceAR(e.getLocation()); // convertToNodeSpace 将一个点转换到节点 (局部) 坐标系,并加上锚点的坐标。
let rect_block = children[i].getBoundingBox(); // getBoundingBox 返回父节坐标系下的轴向对齐的包围盒。
if(rect_block.contains(p_start)){} // contains 当前矩形是否包含指定坐标点。
6. 克隆clone节点
let node = cc.instantiate(this.target);
node.parent = scene;
node.setPosition(0, 0);
7. 获取屏幕尺寸
// 返回视图的设计分辨率(开发分辨率),如:750*1514
cc.view.getDesignResolutionSize().width
cc.view.getDesignResolutionSize().height// 返回可见区域尺寸,如:750*1334
cc.view.getVisibleSize().width
cc.view.getVisibleSize().height
8. 打开网址
cc.sys.openURL('http://www');
9. 上传base64数据到oss
屏幕截图后,将base64数据上传至oss,并返回图片链接。
需引用sdk
<script src="http://gosspublic.alicdn.com/aliyun-oss-sdk-4.4.4.min.js"></script>
/*** 截图函数*/
screenShot() {...const dataURL = canvas.toDataURL("image/jpeg", 1.0);this.uploadToOss(dataURL);
}/*** base64转blob*/
toBlob(urlData, fileType) {let bytes = window.atob(urlData);let n = bytes.length;let u8arr = new Uint8Array(n);while (n--) {u8arr[n] = bytes.charCodeAt(n);}return new Blob([u8arr], { type: fileType });
}/** * 上传base64到oss* urlData: 图像数据 (data:image/png;base64,iVBOR...yssDuN70DiAAAAABJRU5ErkJggg==)*/
uploadToOss(urlData) {const self = this; // 图像数据const base64 = urlData.split(',').pop();const fileType = urlData.split(';').shift().split(':').pop();// base64转blobconst blob = this.toBlob(base64, fileType);// blob转arrayBufferconst reader = new FileReader();reader.readAsArrayBuffer(blob);reader.onload = function (event) {// 配置OSSconst client = new OSS.Wrapper({region: '<Your region>',accessKeyId: '<Your AccessKeyId>',accessKeySecret: '<Your AccessKeySecret>',bucket: 'Your bucket name'});// 路径const dirname = 'xxx/upload/'// 文件名const objectKey = `${new Date().getTime()}.${fileType.split('/').pop()}`;// arrayBuffer转Bufferconst buffer = new OSS.Buffer(event.target.result);// 上传client.put(dirname + objectKey, buffer).then(function (result) {// console.log(result);self.uploadImg = `http://xxx/upload/${objectKey}`; }).catch(function (err) {console.log(err);});}
}
参考链接
base64数据流、blob对象上传OSS
三. 使用技巧
1. 自定义loading样式
场景描述
H5加载页面,不使用cocos默认样式,改为白色页面显示加载百分比。
解决方法
使用自定义发布模版,新建build-templates/web-mobile目录,新建index.html、main.js文件。
index.html添加代码,
<style>html, body {-ms-touch-action: none;touch-action: none;background: #fff;padding: 0;border: 0;margin: 0;height: 100%;}.landscape-tip {display: none;position: fixed;left: 0;top: 0;width: 100%;height: 100%;background: #000;z-index: 1000;}.landtip {position: fixed;left: 50%;top: 50%;margin: -146px 0 0 -146px;width: 292px;height: 370px;background: url(http://xxx/land-tip.png) no-repeat center center;-webkit-transform: scale(.5, .5);transform: scale(.5, .5);}#splash {background: #fff;}#precent {position: absolute;left: 50%;top: 50%;color: #000;-webkit-transform: translate(-50%, -50%);transform: translate(-50%, -50%);}.progress-bar {display: none;}
</style>
...
<!-- 横屏提示 -->
<div class="landscape-tip" id="landscape"><div class="landtip"></div>
</div>
...
<script>var landscape = document.getElementById('landscape');function orientationChange() {switch (window.orientation) {case 0:landscape.style.display = 'none';break;case -90:landscape.style.display = 'block';break;case 90:landscape.style.display = 'block';break;}}window.addEventListener("onorientationchange" in window ? "orientationchange" : "resize", orientationChange, false);
</script>
main.js添加代码,
function setLoadingDisplay () {// ...var percent = 100 * finish / total;if (progressBar && percent < 100) {progressBar.style.width = percent.toFixed(2) + '%';document.getElementById('precent').innerHTML = 'Loading...' + percent.toFixed(0) + '%';}// ...
}
2. 字体制作的公共字符集
场景
制作字体文件,如:加载文字、游戏提示语、游戏结果等字符集合。
abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.:,;'"(!?)+-*/=%
3. 获取地址参数函数
// 获取地址参数, 参数可以是中文也可以是英文
getUrlParam(key) {let url = window.location.search;let reg = new RegExp("(^|&)" + key + "=([^&]*)(&|$)");let result = url.substr(1).match(reg);return result ? decodeURIComponent(result[2]) : null;
}
4. 上下滑动事件
let startPosY = 0;
this.eventLayer.node.on(cc.Node.EventType.TOUCH_START, function (e) {startPosY = e.getLocationY();
}, this);
this.eventLayer.node.on(cc.Node.EventType.TOUCH_END, function (e) {if(e.getLocationY() - startPosY > 15) {cc.log('上滑');}else if(e.getLocationY() - startPosY < -15){cc.log('下滑');}
}, this);
5. 随机函数
// 随机数函数,num:随机数数量,from-to:随机数取值范围
createRandom(num, from, to) {let array = [];for (let i = from; i <= to; i++) array.push(i);array.sort(() => {return 0.5 - Math.random();});array.length = num;return array;
}
6. 像素间隔Bug
场景描述
本来间隔应该是1个像素,但会有规律地出现2个像素间隔的情况。
// 添加以下代码
let size = cc.view.getVisibleSizeInPixel();
cc.view.setDesignResolutionSize(size.width, size.height, cc.ResolutionPolicy.FIXED_WIDTH);
7. 远程打包
场景描述
v2.4版本项目需要首页和资源代码分离部署。
解决方法
修改index.html、main.js文件。
main.js修改代码,
var remote_url = "https://xxx/assets/";
window.boot = function () {...function cb (err) {if (err) return console.error(err.message, err.stack);count++;if (count === bundleRoot.length + 1) {cc.assetManager.loadBundle(remote_url + MAIN, function (err) {if (!err) cc.game.run(option, onStart);});}}...for (var i = 0; i < bundleRoot.length; i++) {cc.assetManager.loadBundle(remote_url + bundleRoot[i], cb);}
};if (window.jsb) {var isRuntime = (typeof loadRuntime === 'function');if (isRuntime) {require('https://xxx/src/settings.js');...}else {require('https://xxx/src/settings.js');...}...
}
index.html修改代码,
<head><link rel="stylesheet" type="text/css" href="https://xxx/style-mobile.css"/><link rel="icon" href="https://xxx/favicon.ico"/>
</head>
<body>
...
<script src="https://xxx/src/settings.js" charset="utf-8"></script>
<script src="https://xxx/main.js" charset="utf-8"></script>
<script type="text/javascript">
(function () {...loadScript(debug ? 'cocos2d-js.js' : 'https://xxx/cocos2d-js-min.js', function () {if (CC_PHYSICS_BUILTIN || CC_PHYSICS_CANNON) {loadScript(debug ? 'physics.js' : 'physics-min.js', window.boot);}else {window.boot();}});
})();
</script>
</body>
参考链接
Cocos Creator 打包WebMobile,实现资源代码分离,部署 cdn
8. 接口请求超时处理
// 接口请求
apiPost() {...let params = 'xxx';let xhr = new XMLHttpRequest();xhr.open('POST', 'xxx');xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');xhr.send(params);let timeState = false; // 是否超时let timer = setTimeout(() => {timeState = true;xhr.abort(); // 请求中止// 隐藏加载提示...}, 20000);xhr.timeout = 20000; // 20秒超时时间xhr.onreadystatechange = () => {if (xhr.readyState == 4 && (xhr.status >= 200 && xhr.status < 400)) {let response = eval('(' + xhr.responseText + ')');...// 程序部分...if (timeState) return; // 请求已经超时,忽略中止请求clearTimeout(timer); // 取消等待的超时 }};
}
参考链接
cocos creator 网络http请求超时处理
9. CNZZ事件统计
// cnzz统计
_czc.push(['_trackEvent', '按钮点击', '开始游戏按钮']);
10. 创建一个连续数字的数组
/*** 生成一个从 start 到 end 的连续数组* @param start* @param end*/
generateArray (start: number, end: number) {return Array.from(new Array(end + 1).keys()).slice(start);
}
CocosCreator2.x 开发笔记相关推荐
- 运维开发笔记整理-前后端分离
运维开发笔记整理-前后端分离 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.为什么要进行前后端分离 1>.pc, app, pad多端适应 2>.SPA开发式的流 ...
- iOS开发笔记-两种单例模式的写法
iOS开发笔记-两种单例模式的写法 单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h"st ...
- 【Visual C++】游戏开发笔记十三 游戏输入消息处理(二) 鼠标消息处理
本系列文章由zhmxy555编写,转载请注明出处. http://blog.csdn.net/zhmxy555/article/details/7405479 作者:毛星云 邮箱: happyl ...
- 【Visual C++】游戏开发笔记二十七 Direct3D 11入门级知识介绍
游戏开发笔记二十七 Direct3D 11入门级知识介绍 作者:毛星云 邮箱: happylifemxy@163.com 期待着与志同道合的朋友们相互交流 上一节里我们介绍了在迈入Dire ...
- Android移动APP开发笔记——最新版Cordova 5.3.1(PhoneGap)搭建开发环境
引言 简单介绍一下Cordova的来历,Cordova的前身叫PhoneGap,自被Adobe收购后交由Apache管理,并将其核心功能开源改名为Cordova.它能让你使用HTML5轻松调用本地AP ...
- 安卓开发笔记——自定义广告轮播Banner(实现无限循环)
关于广告轮播,大家肯定不会陌生,它在现手机市场各大APP出现的频率极高,它的优点在于"不占屏",可以仅用小小的固定空位来展示几个甚至几十个广告条,而且动态效果很好,具有很好的用户& ...
- os-cocos2d游戏开发基础-进度条-开发笔记
os-cocos2d游戏开发基础-进度条-开发笔记(十) ios-cocos2d游戏开发基础-游戏音效-开发笔记(九) ios-cocos2d游戏开发基础-CCLayer和Touch ...
- 【Visual C++】游戏开发笔记四十一 浅墨DirectX教程之九 为三维世界添彩:纹理映射技术(一)...
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8523341 作者:毛星云(浅墨 ...
- 【Android】Parse开发笔记(1)—— 准备
一.简介 Parse是由 YC 孵化出来的.专为移动应用提供后台服务的云计算平台,为开发者包办繁琐的后台服务,让开发者只需专注于具体的开发工作.它提供任意数据保存.照片或其它文件存储.发送推送通知.创 ...
最新文章
- 字符串全排列的问题 python和c语言实现
- Ocelot + IdentityServer4 构建 GateWay
- java web 中有效解决中文乱码问题-pageEncoding与charset区别, response和request的setCharacterEncoding 区别
- 计算机专业的书普遍都这么贵,Github上的计算机电子书很多~~~
- shiro将session认证改成token认证_Shiro 运行过程
- 金融信息交换协议(FIX)v5.0
- java hashmap读,java – ConcurrentHashmap – 读取和删除
- 很容易学习的JQuery库 : (八) 杂项 noConflict() 方法
- 数据结构专题(二):2.3链表插入元素,尾插法
- linux 7 kdump设置,Centos7/RHEL7 开启kdump
- java两人猜数字游戏,三人背后猜数字游戏
- 如何使用Java进行简单爬虫
- 程序员的 升级 ,价值观的改变
- idea 正则表达式替换
- 微信小程序报错 40125 已解决
- SIEBEL基础学习
- puppet kick 报错返回值code3 求解答(finished with exit code 3)
- 微信小程序-分享页面到微信群或者好友携带分享者身份信息
- win10家庭版如何修改用户名对应的用户文件夹下的用户文件名字(中文该成英文字符)
- 【干货】新显卡太贵,便宜老卡怎么选?二手亮机卡过渡指南!
热门文章
- 教你如何看清一个人的本质 很靠谱的
- pdk开发学习之路-QA
- 电影垂直社交观影和亲友们在家一起看电影吧
- 笔记本电脑双机无线互联
- 创新沙盒 软件定义安全SDS走向应用
- 【BEV】HDMapNet: An Online HD Map Construction and Evaluation Framework
- 微信公众号关闭H5页面,回到公众号首页
- H5混合开发中android终端和ios终端常见的兼容问题1
- 强大的Android汉字转拼音开源库TinyPinyin
- virtuoso从电路图导入版图_基于Virtuoso平台的单片射频收发系统PCB电路仿真与版图设计...