3.0 移动层 刚体不移动


auto sp = Sprite::create(“Icon-40.png”);
sp->setPosition(100,100);
map->addChild(sp); //map是一个层
auto body = PhysicsBody::createBox(sp->getContentSize(),PHYSICSBODY_MATERIAL_DEFAULT);
sp->setPhysicsBody(body);

当我移动map层时
map->setPosition(map->getPosition() + Point(-5 , 0));

刚体不会移动,如果不设置刚体的话,精灵时会跟着动的

我试过在下面再加一句
sp->setPosition(sp->getPosition() + Point(-5 ,0));

这时候能移动了,但是能看到精灵一直再抖动,不平滑,求解好方法

不对,补充一下,再添了最下面那句后,精灵会移动得比层快

刚体使用的是物理世界的坐标,这样当然移不动,因为sp 在 map的位置都没有变化,你可以通过重载Sprite的setPosition来转换坐标!也可以到node里面改变其setPosition时对body位置的设置!

不是很明白怎么重载。。。新手啊

就是新建一个Sprite类,重载其virtual void setPosition(const Point& position)函数。
void setPosition(const Point& position){
Sprite::setPosition(position)
获取body,不等于空,转换为世界坐标convertToWorldSpace【好像是这个,没打错吧?】
}

没打错,这个方法node里面有啊
if (_physicsBody)
{
Node* parent = getParent();
Point pos = parent != nullptr ? parent->convertToWorldSpace(getPosition()) : getPosition();
_physicsBody->setPosition(pos);
}

,还有获取body后,转换世界坐标,body位置还是没变啊

你这里需要重载的是map对应的对象,不是当前对象。
因为移动坐标的是map,不会触发sp的setPosition.

map里就要有获取sp的方法成员变量]了

就是说,重载map对象的setPosition方法,先继承父类的setPosition,然后再获取sp的body,如果不为空,就转换世界坐标,是这样子吗?

大大,这个方法是保护的,调用不了啊
_physicsBody->setPosition(pos);

你看看我是这样写的
void PKTmxTileMap::setPosition(const cocos2d::Point &position)
{
Node::setPosition(position);
for (auto sp : getChildren()) {
if (sp->getPhysicsBody() != nullptr) {
auto po = sp->convertToWorldSpace(sp->getPosition());
sp->getPhysicsBody()->setPosition(po);
}
}
}

我不是大神,这个需要在PhysicsBody里面添加友员类map,搞复杂了。

说个我自己的做法吧!
我是把所有需要添加的刚体都放在场景所添加的类里,这样所有的坐标都是左下角了和物理世界一样。
如果A的移动会影响B【通常是B添加到A里,即B作为A的子节点】,那么初始化即计算B对A的偏移量。移动A的时候,B对A的偏移量不变!

这样做我个人认为不复杂,不太清楚你的判断!

我移动这个层其实就是要做镜头跟随的,通过判断精灵偏移量,来设置背景层的偏移,做法是,比如精灵向右移动5,那么背景层就相应的向左移动5,同时因为精灵在背景层里,也跟着向左移动5,看起来精灵就跟没动一样,而背景层在动,达到镜头跟随效果,但是,加了刚体后,刚体不随背景层动,就实现不了这个效果了,你这边的意思就是说刚体不要放在Map层是吧?再次感谢热心回答啊!