Столкнулся с проблемой в Cocos2D. Когда игра запускается на устройстве с ретина дисплеем, координаты объктов увеличиваются в два раза. Например, если у меня объект находится в позиции 100х100 то на ретине он находится в позиции 200х200, что в моем случае не нужно. Пробовал указывать [director_ enableRetinaDisplay:NO], но в этом случае картинка становится 1024x768, мне же нужно чтоб в ретине все было просто в два раза меньше. Как можно решить проблему? Заранее благодарен.
Речь идет об афйоне или айпаде? Кокос2д по умолчанию работает с точками, то есть на ретине координата (x, y) в точках будет соответствовать координате (2*x, 2*y) в пикселях.
Может быть, ты используешь устаревшую версию?
Или может быть ты говоришь о координатах в пикселях? Тогда увеличение координат работает правильно, т.к. пикселей в два раза больше в обоих направлениях.
Покажи скриншоты для лучшего понимания проблемы.
Мне нужно чтоб одна точка соответсвовало одному пикселю, не зависимо от дисплея.
Я понял. Тогда, похоже, нужно использовать методы с суффиксом "InPixels": setPositionInPixels, contentSizeInPixels и т.д.
Еще как вариант -- переопределить макрос CC_CONTENT_SCALE_FACTOR(), чтобы он всегда возвращал 1.
Кстати, на гитхабе есть бранч с версией 2, я предполагаю, что это поддерживаемая на данный момент версия. Там пиксели в реализации CCNode уже вообще не фигурируют.
Как я понимаю CC_CONTENT_SCALE_FACTOR() можно изменить методом [director_ setContentScaleFactor:1], однако результат ровно такой же, как у [director_ enableRetinaDisplay:NO]. В кокосе, который стоит у меня, вроде нет "InPixels". Похоже, придется самостоятельно регулировать позиции в зависимости от устройства. Просто я думал что это можно как то отключить... Спасибо за ответы.
UIScreen* screen = [UIScreen mainScreen]; CGFloat scale = ([screen respondsToSelector:@selector(scale)] ? screen.scale : 1.0f);
м?
Вот что есть в CCNode.m
positionInPixels_ = ccpMult( newPosition, CC_CONTENT_SCALE_FACTOR() );
попробуйте значение 0.5 или 1/CC_CONTENT_SCALE_FACTOR()
xmarat
>мне же нужно чтоб в ретине все было просто в два раза меньше. Как можно решить проблему?
Никак не решить.
Можно собрать новый атлас и предметы сделать аналогичными nonRetina, но сомневаюсь, что Apple пропустит такое решение.
Тут еще одна проблемка вышла. В AppDelegate.m задал:
[sharedFileUtils setEnableFallbackSuffixes:YES]; [sharedFileUtils setiPhoneRetinaDisplaySuffix:@"-hd"]; [sharedFileUtils setiPadSuffix:@"-ipad"]; [sharedFileUtils setiPadRetinaDisplaySuffix:@"-ipadhd"];
Простые рисунки загружаются как надо, т.е. если iPad одни рисунки, если iPhone другие и т.д. Однако если загружать анимацию - приложение падает. Анимацию загружаю так:
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"Animation.plist"]; ... for (int i = 1; i <= 10; ++i) { NSString * frameName = [NSString stringWithFormat:@"Animation_%d.png", i]; [animation_array addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:frameName]]; } ...
Интересен тот факт, что если например указать @"Animation-hd_%d.png", при загрузке iPhone retina, то все работает. Неужели везде, где загружается анимация, нужно прописывать проверку на устройство и добавлять нужный суффикс вручную?
xmarat
OMG (((
Я почему-то сходу написал небольшой workaround для того, чтобы загружать нужный АТЛАС с НУЖНЫМ суффиксом (поскольку для iPad-nonRetina и iPhone-retina часть ресурсов обычно одинаковы), и внутри атласа обходиться БЕЗ суффиксов.
То есть допустим анимация crush_%d.png есть в 3 атласах - atlas_crush.png, atlas_crush-ipad.png, atlas_crush-ipadhd.png.
Таким образом обеспечив загрузку нужного атласа для слоя/сцены, над суффиксами самих spriteframe можно не париться, поскольку они суффиксов не имеют.
P.S. Именно по этой причине у меня даже одиночные картинки а-ля сплэш/бэкграунд всегда находятся в атласе.
В Cocos2D я новичек, думал что имя в plist должно совпадать с именем файла, оказалось что не обязательно. Убрал суффиксы внутри plist'ов и все стало норм. CasDev, спасибо за подсказку!
Тема в архиве.