2012-04-20 5 views
2

화면보다 몇 배나 큰 캔버스가있는 또 다른 그림 응용 프로그램을 만들고 있습니다. 그 방법에 대한 조언이나 방향이 필요합니다.거대한 캔버스로 그림 그리기

기본적으로 내가 원하는 것은 보이는 영역에만 그림을 그려 큰 캔버스 주위를 스크롤하는 것입니다. 나는 두 가지 방법을 생각했다 :

  1. 되세요 64 × 64를 (또는 무엇이든) "타일"을 그린 다음 스크롤에 단지 새로운 타일을로드합니다.
  2. 화면 크기 캔버스 만 사용하여 모든 사용자 획 (점)과 지정한 지역에있는 스크롤 계산을 기록한 다음 그립니다.

이 문제는 프로토 타입 용으로 cocos2d를 사용하고 있습니다.

+1

아마도 자신의 scrollView에 고정 된 몇 개의 CATiledLayers가 완벽 할 것입니다. – CodaFi

답변

5

2000x200 제한을 잊어 버렸습니다. 18000 x 18000 NASA 이미지를 그리는 오픈 소스 프로젝트가 있습니다.

이 작업을 두 부분으로 나누는 것이 좋습니다. 첫째, 스크롤. CodaFi가 제안한 것처럼 스크롤하면 CATiledLayers가 제공됩니다. 각각의 CGImageRef는 사용자가 만든 거대한 캔버스의 하위 이미지입니다. 그러면 확대/축소를 쉽게 지원할 수 있습니다.

두 번째 부분은 사용자와 상호 작용하여 캔버스를 그리거나 효과를냅니다. 사용자가 스크롤을 멈 추면 불투명 한 UIView 하위 클래스를 만들고 하위 뷰로 추가하여 기본 뷰에 추가하고 CATiledLayers를 호스팅하는 뷰를 오버레이합니다. 이 뷰를 표시해야하는 순간 적절한 정보로 채워 지므로 큰 캔버스의 해당 부분을 제대로 그릴 수 있습니다 (이 시점에서 원과 같은 색상 등).

이 오버레이보기의 drawRect : 메소드를 사용하여 그림을 만들 것입니다. 따라서 사용자가보기를 변경하는 동작을 수행 할 때 iOS가 drawRect :를 호출하도록 강제하는 데 필요한대로 "setDisplayInRect :"를 수행합니다.

사용자가 스크롤하기로 결정하면 사용자가 변경 한 내용으로 큰 캔버스 모델을 업데이트 한 다음 불투명 한 오버레이를 제거하고 CATiledLayers가 큰 이미지의 적절한 부분을 그려야합니다. 이 전환은 아마도 시각적 인 결함을 피하는 과정에서 가장 까다로운 부분 일 것입니다.

캔버스에 사용 된 많은 개체 정의가 있다고 가정하십시오. 타일에 CGImageRef를 생성해야하는 경우 객체의 프레임과 타일 프레임 사이의 겹침을 찾아 스캔 한 다음 해당 타일에 필요한 항목 만 그립니다.

1

사과에 바둑판 식 예제가 있습니다. ScrollViewSuite 그림 부분과 관련이 없지만 사물의 타일 부분을 관리하는 방법에 대한 아이디어를 줄 수 있습니다.

+0

그래, 덕분에, 그 비디오를 보았다, 아이디어는 꽤 좋다. 비록 내가 이것을 위해 OpenGL을 사용하는 것에 대해 생각하고 있었지만. –

2

많은 휴대 기기는 2048x2048 이상의 텍스처를 지원하지 않습니다. 그래서 추천 할 것입니다 :

  • 당신이 프레임 당 4 개 타일로 작성해야합니다 화면에 현재 보이는 타일의 보이는 부분을 그릴 큰 최대 2048x2048 타일에서 당신의 큰 표면을 사용자가 네 개의 타일로 모서리를 스크롤했을 때 표시되는 타일이 하나 뿐인 경우 추가로 그릴 필요가 없습니다.

아마도 가장 효율적인 방법 일 것입니다. 64x64 타일은 실제로 너무 작기 때문에 '타일 그리기'호출에 대해 반복되는 오버 헤드가 있으므로 비효율적입니다.

1

CATiledLayer를 사용할 수 있습니다. WWDC2010 세션 104 참조

하지만 cocos2d의 경우 작동하지 않을 수 있습니다.