[]LayaRender渲染含有多个part的Body存在Bug

layaair版本:1.7.19.1beta
项目类型:全部(目前测试的有JS和TS)
环境:Win7 x64  laya + matter.js
问题描述:
    对于带多个part的body(组合body),修改其part(子body)属性(比如旋转角度等),外观并不刷新。
   例如:如下代码,创建两个body:partA和partB,然后创建comp,将这两个body组合起来。测试代码如下:
function createBody()
{
var size = 200, x = 200, y = 200;
var sp = new Laya.Sprite();
var text = Laya.loader.getRes("res/bar.png");
var w = size, h = size/5;
sp.pivot(w/2, h/2);
sp.graphics.fillTexture(text, 0, 0, w, h);
partA = Matter.Bodies.rectangle(x, y, w, h, {
isStatic:true,
layaSprite:sp,
}); 
sp = new Laya.Sprite();
w = size/5, h=size;
sp.pivot(w/2, h/2);
sp.graphics.fillTexture(text, 0, 0, w, h);
partB = Matter.Bodies.rectangle(x, y, w, h, {
isStatic:true,
layaSprite:sp,
}); 
var comp = Matter.Body.create({
isStatic:true,
parts: [partA, partB],
render:{
visible:true,
}
}); 
Matter.World.add(engine.world, comp);
}    随后修改partA的旋转属性,界面并不会刷新。
   修改代码
function keyDown(e)
{
if(Laya.KeyBoardManager.hasKeyDown(87)) //'w'
{
Matter.Body.setAngle(partA, Math.PI/6);
}
};
注意,不要在创建comp的时候立刻对comp调用setAngle。
 
 
 问题分析:
       查看LayaRender.Body渲染函数发现,Body的渲染只是渲染body自己,并没有对所有part进行渲染(只是初始化,这也是为什么上面我提到‘不要在创建创建comp的时候立刻对comp调用setAngle的原因)。
 
解决办法:
       修改LayaRender.js文件的LayaRender.Body()函数,增加对part的渲染。
      步骤1:将原来的LayaRender.Body函数重命名为LayaRender.Body_imp
      步骤2:新增加LayaRender.Body函数实现如下:
LayaRender.body = function (render, body)
    {
        LayaRender.body_impl(render, body); 
        for (var i = 1; i < body.parts.length; i++) {
            LayaRender.body(render, body.parts);
        }
    } 
  备注:
       由于comp是组合body,其本身也是body,LayaRender.Body在初始化此comp body时会对齐所有part创建sprite(或者根据texture创建,或者直接顶点绘制边框),也就是说,虽然在上面的案例应用场景里头,我们只想显示bodyA和bodyB即可,但实际上我们可以看到除了bodyA和bodyB之外,还有线框的存在,这个是comp body渲染的效果。 为此,我在comp创建的时候增加了render.visible = false属性,让comp body不渲染。
已邀请:

Aar0n

赞同来自:

已经在审核,如果采纳会在下个版本纳入。

Aar0n

赞同来自:

https://ask.layabox.com/question/13081  参考这个帖子 修复了一些bug

要回复问题请先

商务合作
商务合作