2011-05-12 64 views
0

幾天前,我開始使用cocos2d。我非常喜歡這個框架。我想用cocos2d創建一個遊戲,並有一個可能很簡單的問題...子類化cocos2d中的精靈

我製作了一個4個字符的遊戲,它們都具有類似的特徵,但具有「類型」和「點」 。我想將子類分成一個類,它處理所有的邏輯,繪圖和動畫。

雖然我的問題是,我怎麼稱爲sprite類與說,一個「類型」參數1,2,3或4,然後讓這個類繪製正確的精靈到我的場景與所有它的個人邏輯?

謝謝!

回答

0

你應該擁有一個敵人類,它包含特定敵人的屬性並且不是類型特定的(比如位置,當前健康狀況,CCSprite實例?)和一個EnemyType類,其中包含特定敵人之間共享的屬性類型(最大健康,最大速度,大小,精靈文件名)。你應該在加載關卡前加載你的敵人類型,而不是在構造函數中使用適當的類型實例化每個敵人。

例如,如果在一級文件你的敵人元素看起來像這樣

<enemy><type>spider</type>...more properties...</enemy> 

代碼(僞)會做類似

EnemyType *enemyType = nil; 
    if (typeElement.value == "spider") 
    { 
     enemyType = spiderType; 
    } 
    Enemy *newEnemy = [Enemy enemyWithType:enemyType]; 

能敵類應該包含表示CCSprite它,而不是子類。敵人不是精靈,所以除非我失去了一些東西,就像我看到的那樣,敵人不應該繼承精靈。我讀過when to contain and when to inherit

編輯: Another nice post to read似乎非常相關的,或許可以傳達一些其他的東西比我更好。

無論如何,我的意圖是不是讓你覺得你應該重新考慮你的整個設計。我提議的是「更好」的MVC方式,但這並不意味着它對你的遊戲更好。如果你把所有的時間花在「設計正確性」上,你永遠不會得到一個遊戲,特別是如果你只是在學習cocos2d框架,我實際上是在不久之前做了一個學習項目,Steve McConnel本人也會過來,如果他看到它,我會打我。

如果你在單獨製作一個遊戲,並且它是一個小型項目,如果它對你來說更容易管理,那麼繼續前進並繼承子類,包括「設計正確性」在內的所有內容都需要適當量化(除了可能的用法「goto」聲明:))。

+0

當然,讓你的答案比我的好。我只能假設@尼克會做一些學習,並希望如果他的第一次嘗試不像他所希望的那樣乾淨和容易擴展,那麼他不會灰心。 – 2011-05-12 18:22:08

+0

@Grady Player我剛剛提出了一些不同的東西,在構建學習項目時,清潔不應該成爲最關心的問題。然而,這是一個設計問題,所以我覺得我不得不回答它並指出某件事情,我認爲是一個設計缺陷,無論如何,我編輯了我的答案,我想要的最後一件事是阻止任何人:) – 2011-05-12 19:38:24

+0

@Grady玩家也是向場景添加對象的cocos2d範例看起來好像乞求你爲對象進行子類化,並將它們添加到場景中的敵人和炮塔上,所以正如我在原始答案中提到的那樣,如果這是一種傳統的做法在科科斯島的事情,有人請把我放在我的位置 – 2011-05-12 19:41:07

0

多態性這樣可以做到一對夫婦不同的方式,一些比別人做得更好。 1)你可以試着重寫init或node方法,並在那裏設置你的對象。

+(CCSprite *)node 
{ 
    MySprite * returnSprite = [super node]; 
    returnSprite.hat = @"fedora"; 
    returnSprite.hatImage = [CCSprite spriteWithImage:...]; 

} 

2)使用反射(僞碼)

-(void)drawingMethodHere 
{ 
    [self.hat drawAtPoint:somePoint]; 
} 

然後覆蓋-(CCNode *)hat反映的類型。

在開始之前,你可能需要做二者的某種結合,但計劃一點點,你最終會節省大量的時間。

0

您應該繼承CCNode而不是繼承CCSprite的子類。

我覺得你的問題很簡單。只需創建一個名爲Character的基類,它具有共同的邏輯,屬性等等。然後,您可以創建4個其他類,如敵人,玩家等等以及字符基類的子類。請注意,字符庫應該是CCNode的子類。

現在您重寫邏輯以適合您的需求在特定的類中。現在你將能夠使用多態,這是很好的。

對於你的精靈,我會說創建一個CCSprite類型的實例變量,然後創建方法來初始化一個圖像。然後,只需在初始化對象時將該精靈添加爲子對象。