在启用自带的物理特性的情况下:
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);
}
}
}
这个函数同步了位置,我觉得是不是同步思路有问题,父节点改变位置的时候,应该检查子节点是不是有物理节点,然后修正子节点位置
而不是子节点主动同步,不然就会有我刚才那个问题,父节点修改位置,子节点也要修改,非常奇怪