本人是新手,调了好几个钟了,最后发现这个奇怪的问题,请大神不吝赐教。
问题描述
在一个物理世界(用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