【求助疑似cocos的bug】(内有最简复现)精灵锚点(0.5,0.5)与TextureRect对物理引擎的奇怪影响

本人是新手,调了好几个钟了,最后发现这个奇怪的问题,请大神不吝赐教。

问题描述

在一个物理世界(用initWithPhysics初始化的场景)中,添加一个精灵,然后给这个精灵添加一个PhysicsBody组件,对其设置一个速度(setVelocidy)。

奇怪bug在于,在这个精灵正常运动时,给他重新设置一个不一样的TextureRect后,那么这个精灵的速度就会变化很大很大

更奇怪的地方在于,如果这个精灵的锚点不是(0.5, 0.5),就不会发生上述的灵异事件。哪怕这个锚点是(0.5, 0.5001)都不会有事,就是说当且仅当锚点恰好为(0.5, 0.5)时就会发生上述奇怪的bug,而默认的锚点就是这个。

最简复现代码

比如说我的HelloWord类继承Scene类,

bool HelloWorld::init() {
    if (!Scene::initWithPhysics()) {
        return false;
    }
    this->getPhysicsWorld()->setGravity(Vec2(0.0f, 0.0f));

    /* 新建一个Sprite */
    auto sprite = Sprite::create("HelloWorld.png");
    sprite->setPosition(300.0f, 300.0f);    // 随便设置一个
    addChild(sprite, 10, "sprite");         // zOrder随便设置的,名字是"sprite"方便之后查找

    /* 给sprite添加PhysicsBody组件 */
    auto pb = PhysicsBody::create();
    pb->setVelocity(Vec2(0.0f, 20.0f));
    sprite->addComponent(pb);

    /* 复现bug */
    sprite->scheduleOnce(schedule_selector(HelloWorld::test1), 3.0f);
    sprite->scheduleOnce(schedule_selector(HelloWorld::test2), 3.2f);

    return true;
}

void HelloWorld::test1(float t) {
    /* 先获取这个sprite */
    Sprite *sprite = (Sprite*)Director::getInstance()->getRunningScene()->getChildByNam("sprite");

    /* 重设其TextureRect,使宽度变为一半 */
    Rect rect = sprite->getTextureRect();
    int width = rect.getMaxX() - rect.getMinX();
    int height = rect.getMaxY() - rect.getMinY();
    rect.setRect(rect.getMinX(), rect.getMinY(), width * 0.5f, height);
    sprite->setTextureRect(rect);
}

void HelloWorld::test2(float t) {
    /* 同样先获取这个sprite */
    Sprite *sprite = (Sprite*)Director::getInstance()->getRunningScene()->getChildByNam("sprite");

    /* 重设其锚点为随便一个不是(0.5f, 0.5f)的 */
    sprite->setAnchorPoint(Vec2(0.5f, 0.5001f));
}

执行后就会发现,一开始精灵竖直向上运动,3秒后突然莫名其妙速度变得非常非常快而且还不是竖直向上,再过0.2秒后又恢复了平静,继续竖直向上运动。

哪位老司机帮忙指一指路啊,谢谢了!orz