使用Laya引擎和AS3(非原生AS)开发手游相关 总结常见bug

1,一般使用回调函数时,都少不了使用   “回掉函数名 .bind(this)”的形式 进行绑定,否则很有可能报错;

2,在和服务器进行交互的时候,要先进行监听,然后再发送消息,例如 就是先使用 subscribe 方法时刻监听,再调用send方法给后台发送消息,否则先发送消息再监听的话,可能会错过 消息;

3,在页面中某些变量的数量已经定义成固定的了,但在再次打开或关闭页面时出现了数量变化的 bug,例如:

上火岛游戏中的碎片的bug:在将拼图的碎片拼上后,碎片的数量正常减少,但是在关闭页面后再打开页面的时候,将碎片卸下,则会出现碎片的数量增加的bug,原因就是:在该页面中的open方法里定义了监听事件如subcribe,(正常不应该在这里面定义监听,而是在初始化这个页面的时候定义监听事件subcribe),在open里定义监听之后和在关闭页面时撤销监听会冲突。

1,如下图,原来的监听的方法是在onopen(就是刚打开页面时调用的)方法里,

使用Laya引擎和AS3(非原生AS)开发手游相关 总结常见bug

2,下图中,原来的取消监听的方法也可能有问题,所以注释掉

 使用Laya引擎和AS3(非原生AS)开发手游相关 总结常见bug

3,如下图,将监听加在页面刚初始化的时候:

使用Laya引擎和AS3(非原生AS)开发手游相关 总结常见bug

4,一般在内部函数里面不应该再定义内部函数,可能会报错;应该提取出来调用;

5,常见的搜索输入框功能实现:

使用Laya引擎和AS3(非原生AS)开发手游相关 总结常见bug

private function clickSearchBtn():void
  {
   var forNum:int=FriendModelLocator.instance.MyAllFriendInfos.length;
   
   var findArray:Array=[];
   for (var i:int = 0; i < forNum; i++)
   {
    var info:MFriendInfo=FriendModelLocator.instance.MyAllFriendInfos[i];
    
    if(info.name.indexOf(textinput.text)!=-1)
    {
     findArray.push(info);
    }
   }
   list.array=findArray;
  }

输入框里点击后,文字消失:

private function onFocus():void
  {
   // TODO Auto Generated method stub
   textinput.text="";
  }
  

 4, 有时,领取购买物品之后,对应的物品的数量并没有刷新,你可能在点击购买之后执行的方法里通过发送消息执行了刷新界面的方法,但是并未有效,是因为,发送消息过于早,不应该在点击购买之后进行发送消息刷新,而是要在服务器确定购买成功之后,再发送消息,首先要在 商城管理 里面,在调用 后台返回了购买成功 的方法中,对购买的商品进行通过使用派发事件,

使用Laya引擎和AS3(非原生AS)开发手游相关 总结常见bug

然后在 对应的界面如 在宠物的界面  购买宠物零食 之后,要刷新宠物的零食信息,就是在Petscreen 里面进行监听

使用Laya引擎和AS3(非原生AS)开发手游相关 总结常见bug

这样就能对 购买过的物品进行及时的刷新了

3,laya和as结合使用中,对于list和item问题,1)较为常见的是 通过获取的数据,有多少条数据,就显示多少个item,list.array = dataArr;

2)但是针对,先固定显示一定数量的模板 item,然后通过 获取多少数据,就显示几条数据,其余的仍然保持原来的模板状态,这种情况下,现在初始化的时候,使用 list.array = dataArr , 然后在通过 协议 获取数据的时候,使用循环,重新给dataArr中的单个元素赋值即可:

1)使用Laya引擎和AS3(非原生AS)开发手游相关 总结常见bug

2)使用Laya引擎和AS3(非原生AS)开发手游相关 总结常见bug

当数据里面没有索引,而在使用数据时,又要用到索引时, 就可以 在获取数据的时候,为其添加索引的属性,

 6,在调试过程中,有时可以使用模拟数据进行调试,按照正常返回的数据形式,自己编写个方法,创建虚拟数据:

 private function AttackRevengeList():Array
  {
   var charInfos:Array = new Array();
   
   var wheelRobotTemplate:WheelRobotTemplate = WheelManager.instance.GetWheelRobotTemplate(2);
   var wheelCharInfo:MWheelCharInfo = new MWheelCharInfo();
   wheelCharInfo.id = "222222222";
   wheelCharInfo.simpleInfo = new MWheelSimpleInfo();
   wheelCharInfo.simpleInfo.icon = "2";
   wheelCharInfo.simpleInfo.name = wheelRobotTemplate.name_zh;
   wheelCharInfo.simpleInfo.flag = 2;
   wheelCharInfo.simpleInfo.star = 45;
   wheelCharInfo.island = new MIsland();
   wheelCharInfo.island.id = 2;
   
   charInfos.push(wheelCharInfo);
   
   var newbieAttackRoleTemplate:NewbieAttackRoleTemplate = GuideManager.instance.GetNewbieAttackRoleTemplate();
   var wheelCharInfo2:MWheelCharInfo = new MWheelCharInfo();
   wheelCharInfo2.id = "333333333";
   wheelCharInfo2.simpleInfo = new MWheelSimpleInfo();
   wheelCharInfo2.simpleInfo.icon = newbieAttackRoleTemplate.icon;
   wheelCharInfo2.simpleInfo.name = newbieAttackRoleTemplate.name;
   wheelCharInfo2.simpleInfo.flag = newbieAttackRoleTemplate.flag;
   wheelCharInfo2.simpleInfo.star = 280;
   wheelCharInfo2.island = new MIsland();
   wheelCharInfo2.island.id = 11;
   
   charInfos.push(wheelCharInfo2);
   
   return charInfos;
  }

 public function SimulationCharInfo(charId:String):void
  {
   var charInfos:Array = AttackRevengeList();
   var scCharInfo:SCCharInfo = new SCCharInfo();
   for each (var charInfo:MWheelCharInfo in charInfos)
   {
    if (charInfo.id == charId)
    {
     scCharInfo.charInfo = charInfo;
     break;
    }
   }
   SendMsg(MessageType.SCCharInfo, scCharInfo);
  }

1,有时 ,当在项目文件中,要删除某个文件时,可能会提示‘你需要 xxxx的权限’的提示,这种情况有可能是  你在其他的文件夹里面 把这个文件 打开了。另一种情况就是 ,权限的问题,此时就可以 百度 搜索 这样常见的错误了,度娘会有解答的。

2,在声明变量时,要记得初始化new出来,尤其是声明数组 array 时,要 var arr:Array = new Array();

3,在使用Tween动画实现魔法树上的糖果左右摇晃的 效果时,正常的思路可能是 通过for循环 来遍历每个糖果,然后在 for循环里面对每个糖果进行 利用Tween 来实现 左右摇晃,但是实际运行时可能出现,在所有糖果里面只有最后一个糖果可以实现loop timer事件不停的左右摇晃,而其他糖果并不会执行timer,原因是在timer里面默认定义的那个延迟执行时间的参数,当for循环里面遍历所有的糖果的过程中,当执行延迟时间之后再执行摇晃的动作的时候,全部的糖果已经遍历完了,所以会出现只有最后一个糖果又效果的情况;

正常思路但是只有最后一个糖果有效:


// private function allLoop():void
// {
// var forNum:int=sprite.numChildren;
//
// for (var i:int = 0; i < forNum; i++)
// {
// var img:Image = sprite.getChildByName("boxImg"+i) as Image;
// Tween.to(img,{rotation:10},1500,Ease.linearIn,Handler.create(img,function(){Tween.to(img,{rotation:10},1500,Ease.linearIn})}));
// Tween.to(img,{rotation:-10},1500,Ease.linearIn,Handler.create(img,function(){Tween.to(img,{rotation:-10},1500,Ease.linearIn})}));
// }
//
// }

解决方法:

private function onLoop(img:Image):void
{
baseImg = img;
function tween1():void
{
Tween.to(img,{rotation:10},1500,Ease.linearIn,Handler.create(img,tween2));
}


function tween2():void
{
Tween.to(img,{rotation:-10},1500,Ease.linearIn,Handler.create(img,tween1));
}

tween1();

}