发现cocos2d-x3.0rc的一个位置同步的bug

在启用自带的物理特性的情况下:
layer是不开启物理特性的节点,位置为0,0
bird是开启物理特性的节点,位置为10,10
layer->addChild(bird)
这时候如果你设置layer位置为(-10, 0)
那么你会发现bird->getPosition变成了 20,10
bird和layer是相对不变的位置关系,坐标为啥会变?
看了下代码,发现
void PhysicsBody::update(float delta)
{
if (_node != nullptr)
{
Node* parent = _node->getParent();

    Point position = parent != nullptr ? parent->convertToNodeSpace(getPosition()) : getPosition();
    _positionResetTag = true;
    _rotationResetTag = true;
    _node->setPosition(position);
    _node->setRotation(getRotation());
    _positionResetTag = false;
    _rotationResetTag = false;
    
    // damping compute
    if (_isDamping && _dynamic && !isResting())
    {
        _info->getBody()->v.x *= cpfclamp(1.0f - delta * _linearDamping, 0.0f, 1.0f);
        _info->getBody()->v.y *= cpfclamp(1.0f - delta * _linearDamping, 0.0f, 1.0f);
        _info->getBody()->w *= cpfclamp(1.0f - delta * _angularDamping, 0.0f, 1.0f);
    }
}

}

这个函数同步了位置,我觉得是不是同步思路有问题,父节点改变位置的时候,应该检查子节点是不是有物理节点,然后修正子节点位置
而不是子节点主动同步,不然就会有我刚才那个问题,父节点修改位置,子节点也要修改,非常奇怪

目前我是这么处理的:
Point position = getPosition();
//Point position = parent != nullptr ? parent->convertToNodeSpace(getPosition()) : getPosition();
虽然这样会导致物理位置和实际位置不对
但你们那样虽然位置正确,却会导致位置乱飞
我可以通过其他方式判断碰撞先,希望你们尽快解决这个问题。

个人是这样理解的:同一个世界同一个梦想
个人的处理方法是:同一个layer来添加Sprite,重载Sprite的管理类(非其父类)setPosition方法来设置偏移位置。

这个问题主要还是在于物理的机制上和引擎机制上不同产生的,物理引擎没有父节点的概念,只有关节的概念,如果我们让子节点随着父节点的位置改变的同时还受物理的作用将会变得非常奇怪,比如父物体受重力影响往下掉落,那子物体同时受重力和父物体的位置影响就会变成双倍速度往下掉。。 类似可列举的情况非常多,所以我们更倾向于在物体在加入物理世界的时候只受物理世界影响而改变位置。
还有一个问题是,如果让子物体随着layer移动,那在概念上来说,layer的旋转和缩放同样会影响到子物体(或者说整个layer上的物理世界,如果把物理世界当成是在layer上的话),那基本上来说是无法实现的。。。因为chipmunk和box2d都是只模拟刚体的,而刚体无法实现缩放。。。
同时意识到很多人会有有移动整个物理世界的需求(比如模拟相机的移动),我们准备在PhysicsWorld上添加一个setPosition的方法。
下面是github上面此问题的讨论:
https://github.com/cocos2d/cocos2d-x/pull/5493
下面是添加PhysicsWorld::setPosition接口的issue:
http://cocos2d-x.org/issues/4426

有什么好的建议么?

cocos2d的scene graph与物理世界本身没有任何联系,3.0现在的物理集成只不过是做了rigid body与Node的位置和角度的同步,简化了不少代码。

楼主的需求可以通过移动cocos2d的camera来实现。由于 3.0现在没有camera接口,可以考虑给父前点设置transform来实现移动camera的效果。

— Begin quote from ____

引用第4楼子龙山人于2014-03-19 10:19发表的 回 楼主(yxriyin) 的帖子 :
cocos2d的scene graph与物理世界本身没有任何联系,3.0现在的物理集成只不过是做了rigid body与Node的位置和角度的同步,简化了不少代码。

楼主的需求可以通过移动cocos2d的camera来实现。由于 3.0现在没有camera接口,可以考虑给父前点设置transform来实现移动camera的效果。 http://www.cocoachina.com/bbs/job.php?action=topost&tid=194609&pid=906134

— End quote

是在父节点的update函数里改变父节点里的所有子节点的位置?

先mark一下,之后回来修改。我现在的做法是从parent里获取child进行统一的setViewPoint