iPhoneФорумПрограммирование

[ios] Cocos2D - меняются позиции на устройстве с ретина дисплеем.

#0
16:00, 14 июня 2013

Столкнулся с проблемой в Cocos2D. Когда игра запускается на устройстве с ретина дисплеем, координаты объктов увеличиваются в два раза. Например, если у меня объект находится в позиции 100х100 то на ретине он находится в позиции 200х200, что в моем случае не нужно. Пробовал указывать [director_ enableRetinaDisplay:NO], но в этом случае картинка становится 1024x768, мне же нужно чтоб в ретине все было просто в два раза меньше. Как можно решить проблему? Заранее благодарен.

#1
16:05, 14 июня 2013

Речь идет об афйоне или айпаде? Кокос2д по умолчанию работает с точками, то есть на ретине координата (x, y) в точках будет соответствовать координате (2*x, 2*y) в пикселях.

Может быть, ты используешь устаревшую версию?

Или может быть ты говоришь о координатах в пикселях? Тогда увеличение координат работает правильно, т.к. пикселей в два раза больше в обоих направлениях.

Покажи скриншоты для лучшего понимания проблемы.

#2
16:11, 14 июня 2013

Мне нужно чтоб одна точка соответсвовало одному пикселю, не зависимо от дисплея.

#3
16:29, 14 июня 2013

Я понял. Тогда, похоже, нужно использовать методы с суффиксом "InPixels": setPositionInPixels, contentSizeInPixels и т.д.

Еще как вариант -- переопределить макрос CC_CONTENT_SCALE_FACTOR(), чтобы он всегда возвращал 1.

Кстати, на гитхабе есть бранч с версией 2, я предполагаю, что это поддерживаемая на данный момент версия. Там пиксели в реализации CCNode уже вообще не фигурируют.

#4
17:13, 14 июня 2013

Как я понимаю CC_CONTENT_SCALE_FACTOR() можно изменить методом [director_ setContentScaleFactor:1], однако результат ровно такой же, как у [director_ enableRetinaDisplay:NO]. В кокосе, который стоит у меня, вроде нет "InPixels". Похоже, придется самостоятельно регулировать позиции в зависимости от устройства. Просто я думал что это можно как то отключить... Спасибо за ответы.

#5
1:41, 15 июня 2013
UIScreen* screen = [UIScreen mainScreen];
CGFloat scale = ([screen respondsToSelector:@selector(scale)] ? screen.scale : 1.0f);

м?

#6
17:22, 15 июня 2013

Вот что есть в CCNode.m

positionInPixels_ = ccpMult( newPosition,  CC_CONTENT_SCALE_FACTOR() );

попробуйте значение 0.5 или 1/CC_CONTENT_SCALE_FACTOR()

#7
0:12, 16 июня 2013

xmarat
>мне же нужно чтоб в ретине все было просто в два раза меньше. Как можно решить проблему?
Никак не решить.

Можно собрать новый атлас и предметы сделать аналогичными nonRetina, но сомневаюсь, что Apple пропустит такое решение.

#8
21:23, 18 июня 2013

Тут еще одна проблемка вышла. В 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, то все работает. Неужели везде, где загружается анимация, нужно прописывать проверку на устройство и добавлять нужный суффикс вручную?

#9
6:34, 19 июня 2013

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. Именно по этой причине у меня даже одиночные картинки а-ля сплэш/бэкграунд всегда находятся в атласе.

#10
16:58, 19 июня 2013

В Cocos2D я новичек, думал что имя в plist должно совпадать с именем файла, оказалось что не обязательно. Убрал суффиксы внутри plist'ов и все стало норм. CasDev, спасибо за подсказку!

iPhoneФорумПрограммирование

Тема в архиве.