2012-04-20 66 views
2

我正在繪製比畫面大很多倍的畫布應用程序。 我需要一些建議/方向如何。巨大的畫布繪畫應用程序

基本上我想要的是滾動這個大畫布,只繪製在可見區域。 我在想的兩種方法:

  1. 有無64×64(或其他)「磚」上繪製,然後在滾動只加載新的瓷磚。
  2. 記錄所有用戶筆畫(點)和滾動計算哪些在指定的區域,並繪製它們,只使用屏幕大小畫布。

如果這個問題,我使用cocos2d原型。

+1

也許一些CATiledLayer卡在自己的scrollView中會是完美的。 – CodaFi 2012-04-20 20:18:23

回答

5

忘記2000x200的限制,我有一個開源項目,可以繪製18000 x 18000的NASA圖像。

我建議你把這個任務分成兩部分。首先,滾動。正如CodaFi所建議的,當您滾動時,您將提供CATiledLayers。其中的每一個都將是您創建的CGImageRef - 您真正巨大的畫布的子圖像。然後,您可以輕鬆支持放大和縮小。

第二部分是與用戶交互繪製或以其他方式影響畫布。當用戶停止滾動時,您將創建一個不透明的UIView子類,並將其作爲子視圖添加到主視圖中,並覆蓋承載CATiledLayers的視圖。目前你需要顯示這個視圖,你用適當的信息填充它,以便它可以正確地繪製你的較大畫布的那個部分(比如在這種和那種顏色的這個點上的一個圓圈等)。

您將使用此覆蓋視圖的drawRect:方法執行繪製。因此,當用戶採取更改視圖的操作時,需要根據需要執行「setDisplayInRect:」以強制iOS調用drawRect :.

當用戶決定滾動時,您需要隨着用戶所做的任何更改更新大型畫布模型,然後移除不透明疊加層,並讓CATiledLayers繪製大圖像的適當部分。這種轉變可能是避免視覺故障的過程中最棘手的部分。

假設您有大量用於畫布的對象定義。當你需要爲一個圖塊創建一個CGImageRef時,你需要掃描它,尋找對象的圖框和圖塊的框架之間的重疊,然後才能繪製該圖塊所需的項目。

1

在Apples中有一個平鋪示例ScrollViewSuite與繪圖部分沒有任何關係,但它可能會給你一些關於如何管理圖塊部分的想法。

+0

是啊,謝謝,我看到了那個視頻,主意很不錯。雖然我正在考慮爲此使用opengl。 – 2012-07-09 21:46:48

2

許多移動設備不支持2048x2048以上的紋理。因此,我建議:

  • 讓你的大表面出大2048×2048瓦
  • 只繪製當前可見磚的可見部分的屏幕
  • 您需要拉昇至每幀4瓦,如果用戶已經滾動到四個瓷磚的角落,但確保你沒有畫任何額外的東西,如果只有一個可見的瓷磚。

這可能是最有效的方法。 64x64的貼圖實在太小了,而且效率不高,因爲「繪製貼圖」調用會有大量的重複開銷。

1

您可以使用CATiledLayer。 查看WWDC2010會話104

但對於cocos2d,它可能無法正常工作。