auto spritetet = Sprite::create(“maps/map_0_bg_0.png”);
this->addChild(spritetet, 1000, “test”);
spritetet->setPositionZ(300.f);
auto actionMove = MoveBy::create(5.f, Vec2(640.f, 0.f));
spritetet->runAction(actionMove);
图片在移动过程,还没有移出屏幕却突然消失了,这是什么原因
跟踪代码是发现cRenderer::checkVisibility返回的是false,但是对这个矩阵啊什么的不熟悉,不知道是哪步计算有问题,求指教啊
有人吗!!??,自己推测是应为z轴的改变,应该同时改变在窗口里sprite的显示size的大小,而Renderer::checkVisibility里检测用的size并没有改变,所以导致检测有偏差了,不知道对不对囧,要不模仿sprite3d的检测来改,把aabb长方体弄薄点?有空再试试。
自问自答真心high。。。。。。。
自己写个sprite,重载draw,修改检测checkVisibility的函数,用下面那个,当然仅对2d的sprite有用:
bool GLSprite::checkVisibility(const Mat4 &transform, const Size &size)
{
auto scene = Director::getInstance()->getRunningScene();
//If draw to Rendertexture, return true directly.
// only cull the default camera. The culling algorithm is valid for default camera.
if (!scene || (scene && scene->getDefaultCamera() != Camera::getVisitingCamera()))
return true;
auto director = Director::getInstance();
Rect visiableRect(director->getVisibleOrigin(), director->getVisibleSize());
// transform center point to screen space
float hSizeX = size.width / 2;
float hSizeY = size.height / 2;
Vec3 v3p(hSizeX, hSizeY, 0);
transform.transformPoint(&v3p);
Vec2 v2p = Camera::getVisitingCamera()->projectGL(v3p);
//修改的size的大小
auto eyesz = Camera::getVisitingCamera()->getPositionZ();
auto scale = eyesz / (eyesz- v3p.z);
hSizeX *= scale;
hSizeY *= scale;
// convert content size to world coordinates
float wshw = std::max(fabsf(hSizeX * transform.m + hSizeY * transform.m), fabsf(hSizeX * transform.m - hSizeY * transform.m));
float wshh = std::max(fabsf(hSizeX * transform.m + hSizeY * transform.m), fabsf(hSizeX * transform.m - hSizeY * transform.m));
// enlarge visible rect half size in screen coord
visiableRect.origin.x -= wshw;
visiableRect.origin.y -= wshh;
visiableRect.size.width += wshw * 2;
visiableRect.size.height += wshh * 2;
bool ret = visiableRect.containsPoint(v2p);
return ret;
}
这个改法还是有问题的,没有考虑到3d旋转的情况,3d旋转后还是会有问题的