lufy's legend

标题: 子图层增加父图层减少的相对位移处理 [打印本页]

作者: leauna    时间: 2019-4-24 18:40
标题: 子图层增加父图层减少的相对位移处理
我做相对位移时遇到的,子图层增加一个位移,其父图层减少一个位移,因为是子图层设置位移后,由子图层改变父图层的位移,导致显示过程的不同步
解决:我目前采用的是延迟一个执行做的,就是子图层触发父图层后,子图层的位移在下次帧刷新后再执行,问题解决了
想问:有没有更好的解决方案

最后:好久不来了,论坛感觉卡了不少


作者: lufy    时间: 2019-4-25 16:21
在LEvent.ENTER_FRAME里做应该不会吧,是这样吗
  1.                         LInit(1000/60, "legend", 800, 480, main);
  2.                         function main () {
  3.                                 var layer = new LSprite();
  4.                                 addChild(layer);
  5.                 var child = new LSprite();
  6.                                 layer.addChild(child);
  7.                                 child.graphics.drawRect(1, "#ff0000", [0, 0, 100, 100], true, "#880088");
  8.                                 layer.addEventListener(LEvent.ENTER_FRAME,onframe);
  9.                 child.addEventListener(LEvent.ENTER_FRAME,onframeChild);
  10.                         }
  11.                         function onframe(event){
  12.                                 var layer = event.currentTarget;
  13.                                 layer.x += 1;
  14.                         }
  15.                         function onframeChild(event){
  16.                                 var target = event.currentTarget;
  17.                                 target.x -= 1;
  18.                         }
复制代码

作者: leauna    时间: 2019-5-10 18:38
本帖最后由 leauna 于 2019-5-10 18:40 编辑

我的代码逻辑简单来说,大概是这个意思,子改动完顺便设置父改动,比如移动10次,会出现第一帧突进1最后一帧后退1(像素眼,哈哈),
  1.                         LInit(1000/60, "legend", 800, 480, main);
  2.                         function main () {
  3.                                 var layer = new LSprite();
  4.                                 addChild(layer);
  5.                 var child = new LSprite();
  6.                                 layer.addChild(child);
  7.                                 child.graphics.drawRect(1, "#ff0000", [0, 0, 100, 100], true, "#880088");
  8.                                 //layer.addEventListener(LEvent.ENTER_FRAME,onframe);

  9.                 chlid.parentLayer = layer;
  10.                 child.addEventListener(LEvent.ENTER_FRAME,onframeChild);
  11.                         }
  12.                         //function onframe(event){
  13.                                // var layer = event.currentTarget;
  14.                                // layer.x += 1;
  15.                         //}
  16.                         function onframeChild(event){
  17.                                 var target = event.currentTarget;
  18.                                 target.x -= 1;
  19.                                 target.parentLayer.x +=1;
  20.                         }
复制代码
底下是我目前的解决方式

  1.                         function onframeChild(event){
  2.                                 var target = event.currentTarget;
  3.                                 if(target.awaitCallback){target.awaitCallback()};//同步执行
  4.                                 target.parentLayer.x -=1;
  5.                                 target.awaitCallback = function(){ target.x += 1; target.awaitCallback=null};//延后一次,和父层同步更改
  6.                                 
  7.                         }
复制代码
顺便,我可以帮你维护论坛吗?不知道是不是服务器带宽问题,网络响应有点慢了。
作者: lufy    时间: 2019-5-10 23:16
leauna 发表于 2019-5-10 18:38
我的代码逻辑简单来说,大概是这个意思,子改动完顺便设置父改动,比如移动10次,会出现第一帧突进1最后一 ...

引擎中处理的顺序是,
对象先根据自己本身的坐标进行移动,移动结束之后开始绘制子对象
所以说,在子对象的ENTER_FRAME中设定父对象的坐标时,实际上父对象的坐标的相关处理已经结束,所以只能在下一贞才能有效
而父对象的ENTER_FRAME中设置子对象的坐标是没问题的,但是反过来就会出现上述问题了
你可以按照你的方法解决,也可以像我上面那样,分别给子对象和父对象加事件,或者把针对父对象相关的操作放到父对象的ENTER_FRAME中来做




欢迎光临 lufy's legend (http://lufylegend.com/forum/) Powered by Discuz! X2.5