2011-08-07 108 views
2

我目前正在嘗試使用基於CALayers的Core Animation製作2D遊戲。我已經想出了用戶精靈層,但現在歸結爲遊戲對象。CALayers基於一層的多個圖層

用戶必須避免的對象將從屏幕頂部掉下來,如果它們從未與用戶接觸過,則會消失。然而,因爲所有這些障礙都將是相同的,所以我決定有一個單獨的.h和.m來定義對象,並且有幾行代碼使每個障礙物「進入遊戲」。

底線,我有兩個問題: 1.我如何將每個障礙物作爲CALayer導入主視圖?即使障礙物只是一個圖像,是否有障礙物的單獨文件是做事的最佳方式?

+0

你看過Cocos2D嗎?它是很多大牌遊戲使用的一款優秀的2D開源遊戲引擎。這真的簡化了很多。 – Dancreek

+0

@Dancreek我曾看過Cocos2D,但它並沒有讓我印象深刻。我不想使用任何第三方軟件。 –

+0

嗯,我不確切知道你的最終產品是什麼,但我不會寫得太快。閱讀一些評論。如果不需要,不要重新發明輪子。 – Dancreek

回答

2

如果您已經計算出用戶精靈,您可能會遇到addSublayer:,它會在另一圖層上調用以將其添加到圖層樹中。從根本上說,爲了添加障礙,您需要使用 - [CALayer圖層]實例化一個新圖層,配置它,[rootLayer addSublayer:obstacle];

現在爲您的問題單獨的文件:創建一個新的類與它自己的頭和實現是一個好主意。但是隻要做一個類(意思是一個.h/.m對)來定義Obstacle的工作方式,並通過發出 - [[Obstacle alloc] init]調用創建它的許多實例(確保在它們不是更長的可見度!)

「障礙物」如何導入並可見?你很可能會在一個CALayer類型的Obstacle的@interface {}中放置一個變量。 GameBoard(或者非常簡單的原型/應用程序的ViewController)可以有一個方法-addObstacle:它採用Obstacle,要求它爲它的圖層並將其添加到rootLayer。

在試圖徹底的時候,我可能錯過了你的問題,更符合「我應該有一個障礙課,還是僅僅是一個充滿CALayers的障礙物陣列?」的問題?鑑於遊戲的描述,你當然可以這樣做。但是,只要你想開始保存任何關於單個障礙物實例的信息,你最好讓對象自己回答有關這些信息的問題。我已經完成了大量原型/測試應用程序,這些應用程序只包含一系列圖層,因爲雖然CALayer堅定地位於MVC的視圖範圍內,但它通常包含我需要的所有模型信息:x,y,邊界,顏色,內容等等任何我變成真正的應用程序,但必須重新編寫大部分的可維護性。

+0

非常感謝你的迴應,它對我非常有幫助。然而,由於我幾乎是一個措辭不清,含糊不清的問題,我仍然需要幫助:如果我爲每個不同的障礙設置了類(因爲障礙是非常不同的),那麼編寫代碼的最佳/最短的方式是什麼?障礙課程?我可以使用initWithFrame嗎? –

1

我一直在研究2D塔防遊戲,並有一個很好的解決方案。你想爲你的障礙製作一個對象類,並將它們存儲在一個數組中。當障礙物進入屏幕底部時,它不會被破壞,而只是隱藏起來。當你想創建一個新的obstancle,你首先嚐試和回收舊的創建一個新的。我用它來處理成千上萬個不同的CALayer對象而沒有麻煩。

-(void)newObstacleAtLocation:(CGPoint)newPosition; 
{ 
    //create the array if it doesn't already exist - could add this to your init 
    if(!obstacles) 
    { 
     obstacles = [NSMutableArray array]; 
    } 
    for(obstacle* anObstacle in obstacles) 
    { 
     //find the first hidden coin and use it 
     if(anObstacle.hidden) 
     { 
      //reset the obstacles position to where you want the "new" obstacle 
      obstacle.position = newPosition; 
      obstacle.hidden = NO; 
      return; 
     } 
    } 
    //didn't find any unused obstacles - make a new one 
    [obstacles addObject:[[[obstacle alloc]initWithSuperLayer:self.mapLayer] autorelease]]; 
} 
+0

感謝您的迴應,我可以看到這將如何工作,但我收到一條錯誤消息,指出:「使用未聲明的標識符'障礙'」。我錯過了什麼嗎? –

相關問題