【LayaAir&TypeScript(TS)】游戏开发中遇到的小问题(持续更新)
由于是从其他技术转来的Laya,角度可能会不太一样,在这里记录一些发现的用法或是遇到问题解决办法,能留档也希望作个参考
(一)num和string类型转换的简便用法: “+”符号
在原本+号实现数字计算和字符串连接的基础上,它可以完成简便的强制类型转换(断言)
| 输入 | 输出 |
| +string | parseInt(string) |
| num+" " | num.toString() |
| num+string | num.toString() + string |
示例:
var a = "0";
console.log(+a);//输出0
console.log(5+a);//输出"50"
var b = 0;
console.log(b+"");//输出"0"
console.log(b+"5");//输出"05"
(二)多个需要前后衔接的动画使用“时间线”来使之按顺序完成播放、
在一些特定节点下的所有子节点都需要增加动画时,这个功能很实用
(如:单用于展示操作步骤的提示界面)
可以直接使用循环来添加动画,不用再使用多行代码逐个添加缓动并手动设置间隔和开始时间
示例:
场景中有ImageBox节点,我希望所放置好的子节点的图片逐个进行缩放展示:

public ImageBox!: Laya.Box;
private timeLine:Laya.TimeLine = new Laya.TimeLine();
onAwake(): void {
this.createTimerLine();
//初始状态缩放设为0
for (let i = 0; i < this.ImageBox.numChildren; i++) {
(this.ImageBox.getChildAt(i) as Laya.Image).scaleX = 0;
(this.ImageBox.getChildAt(i) as Laya.Image).scaleY = 0;
}
this.timeLine.play(0,false);
}
private createTimerLine() {
for (let i = 0; i < this.ImageBox.numChildren; i++) {
this.timeLine.addLabel("scareImage"+ i,0).to(this.ImageBox.getChildAt(i),{ scaleX: 1, scaleY: 1},200,null);
}
}
除了单种动画的复用,也可以完成多个不同动画的衔接播放:
示例:
this.timeLine.addLabel("lightShow", 0).to(this.light, { rotation: 300, scaleX: 1, scaleY: 1 }, 300, null);
this.timeLine.addLabel("lightRoate", 0).to(this.light, { rotation: 500}, 600, null);
this.timeLine.addLabel("lightClose", 0).to(this.light, { scaleX: 0, scaleY: 0 }, 200, null);
设置过后,按照需求再对时间线上的动画进行play播放就好,可以利用时间线分开批量管理动画,其中的动画功能不设限制,可以不同对象不同种类
(三)设置文本框自适应高度后,对高度进行获取和使用(以Lable组件为例)
文本框自适应高度或宽度在文本的Fit Content属性处设置:

在获取文本框高度进行其他使用时,要使用以下代码来获取动态改变后的高度
Label组件.textField.textHeight //Label组件为需要获取高度的Lable组件
如果只使用组件.Height,只能获取到原本动态改变之前的文本框高度
(四)文本字体大小自适应(常用于匹配多语言内容)
文本字体大小根据父节点宽度自适应可以通过以下代码实现:
//Lable组件为文本展示组件
if(this.Lable组件.textField.textWidth > this.Lable组件.width) {
this.Lable组件.fontSize = (this.Lable组件.fontSize * (this.Lable组件.width / this.Lable组件.textField.textWidth)) | 0;
}
末尾的| 0 是用于计算结果取整,对计算数据没有其他影响
(五)命名避免使用内部关键字
本人遇到的是,在UI界面,使用了mask作为头像的遮罩Mask,后来发现在遮罩区域出现异常显示,出现裂痕,但是刷新之后可以剔除,再次登录又重新出现。
要避免在项目中(包括代码和UI界面)使用一些关键字,防止出现一些摸不着头脑的错误,很难定位到出错位置
同理,如果出现一些找不到问题的不符合常理的错误或显示,可以考虑这个修改角度
(六)list中的最大展示数量
如果界面中最大可展示的数量不是整数个,在设置list的RepeatY和RepeatX时,需向上取整,否则会导致list内容的展示,如:list展示的item数量正确,但是在最后多出一个item的位置留空
(七)使用spread(…)运算符进行数组克隆
它可以将数组展开成单独的元素,用其他空数组接收就可以进行原数组克隆了
如:
let num:number[] = [1,2,3,4,5];
let num2 = [...num];//num2中为1,2,3,4,5
需要注意的是,这个属于浅拷贝,如果原数组内有引用类型,新的克隆数组中的元素依然会引用相同的对象,因此修改新数组内容时可能导致原数组的引用内容发生改变
(八)按钮的点击事件传参,在对应方法中undefined
刚开始的代码传参是
this._okBtn.on(Laya.Event.CLICK, this, this.onCheck, [this.inputBox]);
//this._inputBox代表的是需要操作的节点
onCheck(_input: Laya.Box[]){
//操作
}
但是进行控制台打印测试的时候,拿到的_input总为undefined,导致后续操作无法正确进行
后来有尝试过使用bind方法
this._okBtn.on(Laya.Event.CLICK, this, this.onCheck.bind(this, this.inputBox));
//this._inputBox代表的是需要操作的节点
onCheck(_input: Laya.Box){
//操作
}
但是bind方法依然没有解决问题
查出前面出错是由于参数传递的方式不正确导致的
最后还是使用箭头函数解决的问题,主要因为:它不会绑定自己的 this,也不会创建自己的 arguments 对象,因此可以更自然地处理闭包和参数传递
this._okBtn.on(Laya.Event.CLICK, this, ()=>this.onCheck(this._inputBox);
//this._inputBox代表的是需要操作的节点
onCheck(_input: Laya.Box){
//操作
}
更多推荐

所有评论(0)