Преобразование координат дочерних координат CCSprite завершается неудачно при использовании CCLayerPanZoom и CCRenderTexture?
Спасибо за прочтение.
Я работаю над настройкой в Cocos2D 1.x, где у меня есть огромный CCLayerPanZoom в сцене с бесплатным панорамированием и масштабированием. В каждом кадре мне нужно дополнительно нарисовать текстуру CCRenderTexture сверху, чтобы создать "темноту" (я вырезаю свет). Это хорошо работает.
Теперь я добавил отдельные спрайты на поверхность, и ими управляет Box2D. Это также работает. Я могу перевести на RenderTexture, где должны быть источники света, и они хорошо отрисовываются.
А потом я хотел добавить слой HUD сверху, добавив CCLayer на сцену. Этот слой должен содержать несколько спрайтов, расположенных друг над другом, как элементы пользовательского интерфейса.
Только все эти элементы не рисуются там, где они мне нужны: точно в центре экрана. Все спрайты, добавленные на слой HUD, отключены, и я перебрал практически все варианты "convertToWorldSpace", "convertToNodeSpace" и т. Д.
Как будто постоянное масштабирование с помощью CCPanZoomLayer в фоновом режиме отбрасывает опорные точки в слое над каждым кадром, и их сброс не помогает. Кажется, что все они по умолчанию находятся в одном из углов ограничивающего прямоугольника узла, к которому они прикреплены, как будто их преобразование заблокировано или установлено в ноль, когда дело доходит до чертежа.
Кто-нибудь сталкивался с этой проблемой? Является ли это известной проблемой при использовании CCLayerPanZoom и рисовании пользовательской CCRenderTexture поверх каждого кадра?
1 ответ
Ха! Я нашел виновника! В Cocos2D есть ошибка использования данных Zwoptex. (Я использую Cocos2D v 1.0.1).
Кажется, что при загрузке в данные Zwoptex v3 данные смещения обрезки спрайтовых кадров игнорируются, когда вычисляется фактическая точка привязки спрайтовых кадров. Эффект заключается в том, что ни одна точка привязки на спрайте со смещением обрезки в его определении (например, в листе) не имеет правильно установленной точки привязки. Действительно странно... Интересно, произошло ли это с кем-нибудь еще? Это вопиющая проблема.
Вот как воспроизвести: Создайте любые данные для фрейма спрайта в формате zwoptex v3 (тот, который использует данные обрезки). Убедитесь, что у вас действительно есть обрезанный спрайт, т.е. смещение должно быть больше нуля, а размер изображения должен быть больше исходного. Загрузите спрайт и попытайтесь расположить его в центре экрана. Вы увидите, что это выключено. Вот как правильно вычислить вашу опорную точку:
CCSprite *floor = [CCSprite spriteWithSpriteFrameName:@"Menu_OmeFloor.png"]; //create a sprite
CCSpriteFrame *frame=[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:@"Menu_OmeFloor.png"]; //get its frame to access frame data
[floor setTextureRectInPixels:frame.rect rotated:frame.rotated untrimmedSize:frame.originalSizeInPixels]; //re-set its texture rect
//Ensure that the coordinates are right: Texture frame offset is not counted in when determining normal anchor point:
xa = 0.5 + (frame.offsetInPixels.x / frame.originalSizeInPixels.width);
ya = 0.5 + (frame.offsetInPixels.y / frame.originalSizeInPixels.height);
[floor setAnchorPoint:ccp(xa,ya)];
floor.position=(where you need it);
Замените 0.5 в формуле xa/ya требуемыми значениями точки привязки.