Aplicación de pintura con gran canvas

Estoy trabajando en otra aplicación de dibujo con canvas que es muchas veces más grande que la pantalla. Necesito un consejo / dirección sobre cómo hacerlo.

Básicamente, lo que quiero es desplazarme por este gran canvas, dibujando solo en una región visible. Estaba pensando en dos enfoques:

  1. Tenga 64×64 (o lo que sea) "fichas" para dibujar, y luego en el desplazamiento simplemente cargue fichas nuevas.
  2. Grabe todos los trazos de usuario (puntos) y, en el desplazamiento, calcule los que se encuentran en la región especificada, y dibujelos, utilizando solo un canvas de tamaño de pantalla.

Si esto es importante, estoy usando cocos2d para el prototipo.

Olvídese de la limitación 2000×200, tengo un proyecto de código abierto que dibuja 18000 x 18000 imágenes de la NASA.

Sugiero que rompas esta tarea en dos partes. Primero, desplazamiento. Como lo sugirió CodaFi, cuando se desplaza, proporcionará CATiledLayers. Cada uno de esos será un CGImageRef que crees: una subimage de tu canvas realmente enorme. A continuación, puede apoyar fácilmente el acercamiento y alejamiento.

La segunda parte está interactuando con el usuario para dibujar o de otro modo afectar el canvas. Cuando el usuario deja de desplazarse, entonces crea una subclass UIView opaca, que agrega como una subvista a su vista principal, superponiendo la vista que aloja a CATiledLayers. En el momento en que necesita mostrar esta vista, rellénela con la información adecuada para que pueda dibujar esa parte de su canvas más grande correctamente (diga un círculo en este punto de tal o cual color, etc.).

Haría su dibujo usando drawRect: método de esta vista de superposition. Así como el usuario toma medidas que cambian la vista, usted hace un "setDisplayInRect:" según sea necesario para obligar a iOS a llamar a su drawRect :.

Cuando el usuario decide desplazarse, debe actualizar su model de canvas grande con cualquier cambio que haya hecho el usuario, luego quitar la superposition opaca y dejar que CATiledLayers dibuje las partes apropiadas de la image grande. Esta transición es probablemente la parte más complicada del process para evitar fallas visuales.

Supongamos que tiene una gran variedad de definiciones de objects utilizadas para su canvas. Cuando necesite crear un CGImageRef para un mosaico, escanee a través de él en busca de superposition entre el marco del object y el marco del mosaico, y solo dibujará los elementos necesarios para ese mosaico.

Muchos dispositivos mobilees no admiten texturas de más de 2048×2048. Entonces yo recomendaría:

  • haz tu gran superficie con grandes fichas de 2048×2048
  • dibujar solo la parte visible del mosaico actualmente visible en la pantalla
  • necesitarás dibujar hasta 4 fichas por cuadro, en caso de que el usuario se haya desplazado a una esquina de cuatro fichas, pero asegúrese de no dibujar nada extra si solo hay una ficha visible.

Esta es probablemente la manera más eficiente. Las baldosas de 64×64 son realmente demasiado pequeñas, y serán ineficientes ya que habrá una sobrecarga repetitiva grande para las llamadas "dibujar baldosas".

Hay un ejemplo de mosaico en Apples ScrollViewSuite No tiene nada que ver con la parte del dibujo, pero podría darle algunas ideas sobre cómo administrar la parte del mosaico de las cosas.

Puedes usar CATiledLayer. Ver la session 104 de WWDC2010

Pero para cocos2d, puede que no funcione.