2012-04-20 2 views
2

Я работаю над еще одним графическим приложением с холстом, который во много раз больше экрана. Мне нужен совет/руководство по тому, как это сделать.Приложение для рисования с огромным холстом

В принципе, я хочу прокрутить этот большой холст, рисуя только в видимой области. Я думал о двух подходах:

  1. Have 64x64 (или любой другой) «плитки», чтобы рисовать на, а затем на свитке просто загрузить новые плитки.
  2. Запишите все пользовательские штрихи (точки) и прокрутки, которые указаны в указанной области, и нарисуйте их, используя только холст экрана.

Если это так, я использую cocos2d для прототипа.

+1

Возможно, несколько CATiledLayers, застрявших в их собственном scrollView, были бы идеальны тогда. – CodaFi

ответ

5

Забудьте об ограничении 2000x200, у меня есть проект с открытым исходным кодом, который рисует изображения NASA 18000 x 18000.

Предлагаю вам разбить эту задачу на две части. Сначала прокрутка. Как было предложено CodaFi, при прокрутке вы предоставите CATiledLayers. Каждый из них будет создаваться CGImageRef - суб-изображение вашего действительно огромного холста. Затем вы можете легко поддерживать масштабирование.

Вторая часть взаимодействует с пользователем, чтобы рисовать или иным образом воздействовать на холст. Когда пользователь перестает прокручивать, вы затем создаете непрозрачный подкласс UIView, который вы добавляете в качестве подзаголовка к основному виду, накладывая вид на хостинг, содержащий CATiledLayers. На данный момент вам нужно показать это представление, вы заполняете его соответствующей информацией, чтобы он мог нарисовать эту часть вашего большего холста правильно (скажем, круг в этот момент такого-то цвета и т. Д.).

Вы бы сделали свой чертеж, используя метод drawRect: этот вид наложения. Так как пользователь предпринимает действия, которые меняют представление, вы делаете «setDisplayInRect:» по мере необходимости, чтобы заставить iOS вызвать ваш drawRect :.

Когда пользователь решает прокрутить, вам необходимо обновить свою большую модель холста любыми изменениями, внесенными пользователем, а затем удалить непрозрачную накладку и позволить CATiledLayers нарисовать правильные части большого изображения. Этот переход, вероятно, является самой сложной частью процесса, чтобы избежать визуальных сбоев.

Предположим, что у вас есть большой массив определений объектов, используемых для вашего холста. Когда вам нужно создать CGImageRef для плитки, вы просматриваете ее, просматривая ее наложение между фреймом объекта и фреймом плитки и только затем нарисуйте те элементы, которые необходимы для этой плитки.

1

В примерах есть пример плитки ScrollViewSuite Не имеет ничего общего с частью чертежа, но он может дать вам некоторые идеи о том, как управлять частью плитки вещей.

+0

Да, спасибо, я видел видео на этом, идея довольно хорошая. Хотя я думал об использовании opengl для этого. –

2

Многие мобильные устройства не поддерживают текстуры более 2048x2048. Поэтому я бы рекомендовал:

  • сделать вашу большую поверхность из больших 2048x2048 плитки
  • рисовать только видимую часть текущего видимой плитки на экран
  • вам нужно будет сделать до 4 плитки в кадр , если пользователь прокручивается до угла из четырех фрагментов, но убедитесь, что вы не нарисуете ничего лишнего, если есть только одна видимая плитка.

Это, пожалуй, самый эффективный способ. Плиты 64x64 действительно слишком малы и будут неэффективными, так как будут многократные накладные расходы для вызовов «рисовать плитки».

1

Вы можете использовать CATiledLayer. См. Сессию WWDC2010 104

Но для cocos2d это может не сработать.

Смежные вопросы