iPhone: Создание игр для iOS (iPhone и iPad)
GameDev.ru / Сообщества / iPhone / Форум / [ios] Cocos2D - меняются позиции на устройстве с ретина дисплеем.

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

xmaratПостоялецwww14 июня 201316:00#0
Столкнулся с проблемой в Cocos2D. Когда игра запускается на устройстве с ретина дисплеем, координаты объктов увеличиваются в два раза. Например, если у меня объект находится в позиции 100х100 то на ретине он находится в позиции 200х200, что в моем случае не нужно. Пробовал указывать [director_ enableRetinaDisplay:NO], но в этом случае картинка становится 1024x768, мне же нужно чтоб в ретине все было просто в два раза меньше. Как можно решить проблему? Заранее благодарен.
alcoSHoLiKПостоялецwww14 июня 201316:05#1
Речь идет об афйоне или айпаде? Кокос2д по умолчанию работает с точками, то есть на ретине координата (x, y) в точках будет соответствовать координате (2*x, 2*y) в пикселях.

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

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

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

xmaratПостоялецwww14 июня 201316:11#2
Мне нужно чтоб одна точка соответсвовало одному пикселю, не зависимо от дисплея.
alcoSHoLiKПостоялецwww14 июня 201316:29#3
Я понял. Тогда, похоже, нужно использовать методы с суффиксом "InPixels": setPositionInPixels, contentSizeInPixels и т.д.

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

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

xmaratПостоялецwww14 июня 201317:13#4
Как я понимаю CC_CONTENT_SCALE_FACTOR() можно изменить методом [director_ setContentScaleFactor:1], однако результат ровно такой же, как у [director_ enableRetinaDisplay:NO]. В кокосе, который стоит у меня, вроде нет "InPixels". Похоже, придется самостоятельно регулировать позиции в зависимости от устройства. Просто я думал что это можно как то отключить... Спасибо за ответы.
SanПостоялецwww15 июня 20131:41#5
UIScreen* screen = [UIScreen mainScreen];
CGFloat scale = ([screen respondsToSelector:@selector(scale)] ? screen.scale : 1.0f);
м?
funiПостоялецwww15 июня 201317:22#6
Вот что есть в CCNode.m
positionInPixels_ = ccpMult( newPosition,  CC_CONTENT_SCALE_FACTOR() );
попробуйте значение 0.5 или 1/CC_CONTENT_SCALE_FACTOR()
CasDevПостоялецwww16 июня 20130:12#7
xmarat
>мне же нужно чтоб в ретине все было просто в два раза меньше. Как можно решить проблему?
Никак не решить.

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

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

CasDevПостоялецwww19 июня 20136:34#9
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. Именно по этой причине у меня даже одиночные картинки а-ля сплэш/бэкграунд всегда находятся в атласе.

xmaratПостоялецwww19 июня 201316:58#10
В Cocos2D я новичек, думал что имя в plist должно совпадать с именем файла, оказалось что не обязательно. Убрал суффиксы внутри plist'ов и все стало норм. CasDev, спасибо за подсказку!

/ Форум / iPhone: Создание игр / Программирование

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

2001—2018 © GameDev.ru — Разработка игр