Проблемы с сетчаткой Cocos2d / Cocos2d-x

У меня есть мультиплатформенная игра для iOS / Android, которую я запрограммировал в Cocos2d-x. У меня есть только один набор изображений для использования (я только после устройств с высоким разрешением), которые масштабируются в соответствии с разрешением устройства. Например, все изображения предназначены для iPad, но если вы используете Galaxy S, то на расположение и масштабирование изображений влияет GalaxyS_screenWidth / iPadscreenWidth.

Это отлично работает для всех устройств Android, а также на iPad, iPad2 и старых iPhone, но с Retina iPhone возникает проблема. На iPhone 4 все мои изображения выглядят чрезвычайно пиксельными в результате того, что изображения были масштабированы до разрешения iPhone без сетчатки, а затем снова масштабированы, чтобы заполнить экран.

Я попытался включить режим Retina, и изображения стали вдвое меньше их предполагаемого размера (возможно, из-за использования get winsize (), который использует точки), а масштабирование вручную вызывает другие проблемы. Я пробовал поиграть с множеством опций и атрибутов, но безуспешно, что мне теперь делать?

РЕДАКТИРОВАТЬ: это не только проблема с графикой, поскольку текст автоматически уменьшается, затем увеличивается и выглядит пиксельным.

РЕДАКТИРОВАТЬ 2: Шрифты - это растровые изображения, поэтому я плохо. Но я не хочу использовать сетчатку, так как по умолчанию все изображения уже являются сетчаткой. Все мои изображения настроены для iPad, поэтому для iPhone 4 я просто немного уменьшил их. Это работает с телефонами Android.

Например, у меня есть изображение, зависящее от разрешения экрана, полученного через getwinsize():

Если текущая ширина разрешения 1024, изображение остается прежним. Если текущая ширина разрешения составляет 900, изображение масштабируется на 900/1024, без проблем. Если устройство имеет разрешение iPhone 4, ширина составляет 480, поэтому изображение масштабируется на 480/1024, тогда cocos2d-x автоматически масштабирует результирующее изображение на 2, таким образом, пикселизацию. Я пробовал использовать getwinsizeinpixels, пробовал увеличивать размер экрана, пробовал много чего, но ничего не получалось из коробки, если только я не переделываю большую часть своего кода.

Итак, вопрос в том, как я могу позволить чертовому движку рассматривать iPhone 4 как телефон Android с разрешением 960x640?


person user1235155    schedule 30.07.2012    source источник
comment
Как вы назвали свои версии графики для сетчатки?   -  person Nick Bull    schedule 30.07.2012
comment
Их нет, есть только один набор графики, как указано в моем вопросе. Проблема заключается не только в графике, поскольку текст также уменьшается, а затем увеличивается, что приводит к массивной пикселизации.   -  person user1235155    schedule 30.07.2012
comment
Вы должны включить версии Retina. Как еще вы ожидаете, что он сможет показывать версии с высоким разрешением без пикселизации? Ваши шрифты, вероятно, также создаются из растровых шрифтов, а не из системных шрифтов, и в этом случае вам также требуются их версии Retina.   -  person Nick Bull    schedule 30.07.2012
comment
Мое плохое отношение к шрифтам, все изображения по умолчанию уже имеют сетчатку, прочтите, пожалуйста, Edit 2.   -  person user1235155    schedule 30.07.2012


Ответы (3)


Если вы хотите, чтобы изображения с разрешением Retina выглядели как изображения с разрешением Retina, эти изображения должны быть с разрешением Retina (960x480).

Если вы сначала уменьшите изображение до 480x320, а затем увеличите его на устройстве, оно, конечно, будет выглядеть размытым. Вы не можете волшебным образом заставить пиксели Retina появляться из изображения с более низким разрешением, увеличивая его.

person LearnCocos2D    schedule 30.07.2012
comment
Операция масштабирования с уменьшением масштаба выполняется без моего согласия и только на устройствах Retina. Это проблема, которой я хочу избежать (все мои изображения 960x480). - person user1235155; 30.07.2012
comment
Тогда зачем вообще масштабировать его на телефоне Retina? Как только вы масштабируете изображение, вы получаете эффекты сглаживания или фильтрации (размытия). - person LearnCocos2D; 31.07.2012
comment
Я масштабирую только некоторые меню и текст, основные элементы игрового процесса остаются прежними. Кнопки не масштабируются, как и некоторые игровые эффекты. Но проблема не в этом. В любом случае, я думаю, что мне удалось взломать, решив мою проблему. Я вернусь через час. - person user1235155; 31.07.2012

СИ не смог разобраться в этом, поэтому я применил хитрость. Я включил Retina Display, затем масштабировал все x2 с помощью кода, кроме текста. Звучит глупо, но это сработало, и пикселизация исчезла. Спасибо всем, кто потратил время, пытаясь мне помочь.

person user1235155    schedule 31.07.2012

Я попытался включить режим Retina, и изображения стали вдвое меньше предполагаемого размера.

когда вы включаете поддержку Retina, cocos2d получает изображения, добавляя @ "- hd" к их указанным именам файлов. Такие изображения должны быть вдвое больше «визуального» размера (в терминах iOS, пиксели против точек), чтобы их можно было как бы уменьшить, чтобы полностью использовать разрешение устройства.

Если вы посмотрите на класс CCDirectorIOS, вы найдете там несколько методов, работающих с этим, особенно те, которые имеют дело с scalingFactor. Я не знаю, какие изменения вам следует сделать, чтобы заставить его работать, но если вы войдете в эти методы и посмотрите на значения различных объектов, вы можете найти способ изменить поведение по умолчанию cocos2D для вашего конкретного случая.

Если это кажется сложным, вы можете попробовать изменить CC_RETINA_DISPLAY_FILENAME_SUFFIX, чтобы cocos2d не искал файлы со специальными именами для Retina iPhone, а просто использовал обычные.

Например, все изображения предназначены для iPad, но если вы используете Galaxy S, то на расположение и масштабирование изображений влияет GalaxyS_screenWidth / iPadscreenWidth.

Еще одна вещь, которую вы можете попробовать, - использовать не winSize, а winSizeInPixels, чтобы при уменьшении масштаба вы делали это до разрешения точки, а только до разрешения пикселей (что вдвое больше разрешения точки).

Надеюсь это поможет.

person sergio    schedule 30.07.2012