egret开发mud客户端解决socket发送多个包导致无法定点弹窗内容起点高度的问题。
以下为判断滚动窗口是否到达底部
if (this.messageContain.contentHeight > this.messageContain.height)
当每次前端回调接受一个socket信息的时候,会将信息添加到弹窗
this.messageContain.addChild(maintext);
但由于mud战斗或者其他操作上,一次性会发送多个包。例如释放pfm连招时。就要执行多次判断文字是否到达弹窗底部的定点代码。
每次文字到达底部会执行如下代码:
this.messageContain.scrollV = this.messageContain.contentHeight - this.messageContain.height;
将弹窗内容物起始点定点,但如果是一次性发送多个包多个文字时。将scrollv打印,会出现该属性会多次执行后保持不变。但是如果是单个包多行文字则不会出现这样的问题。
打印调试以后猜测原因:
首先打印addChild的执行毫秒数,查看egret官方文档。socket回调是异步方法。由此可知当由于将内容物执行进弹窗的运行比判断窗口慢,即便他们在同一方法内,但由于处理回调信息是异步的。同时addchild在运行时并不会阻碍下面的代码执行。所以定点代码永远执行比添加快。另外由于内容label添加进弹窗时会有一个5-6的高度错位,例如一个原来有1000高度滚动窗口,加入35高度的label以后,他的可视区域是1040,而不是1035.所以添加前添加后进行值判断代码都是不可取的。
这里是解决方法:`
if (this.messageContain.contentHeight > this.messageContain.height) {
var timer: egret.Timer = new egret.Timer(100, 1);
timer.addEventListener(egret.TimerEvent.TIMER_COMPLETE,function() {
this.messageContain.scrollV = this.messageContain.contentHeight - this.messageContain.height;
}, this);
timer.start();
console.error(this.messageContain.scrollV);
}
即将内容物添加进弹窗以后,延迟100毫秒调用定位代码。即可解决。