2015-10-06 111 views
0

我有一個SpritePlayer類,它包含我的精靈。將精靈添加到節點

SpritePlayer.h:

class SpritePlayer : public cocos2d::Node 
{ 
public: 
    SpritePlayer(); 
    CREATE_FUNC(SpritePlayer); 
    void InitSpritePlayer(std::string pathToSptire); 
    cocos2d::Sprite *GetSprite(); 
(...) 
private: 
    cocos2d::Sprite *_sprite; 
} 

SpritePlayer.cpp:

void SpritePlayer::InitSpritePlayer(std::string pathToSprite) 
{ 
    _sprite = cocos2d::Sprite::create(pathToSprite); 
} 

cocos2d::Sprite *SpritePlayer::GetSprite() 
{ 
    return _sprite; 
} 
(...) 

MainScene.cpp我有:

for (int i = 0; i < 4; i++) 
{ 
    playerSpritesList[i] = &SpritePlayer(); 
    playerSpritesList[i]->InitSpritePlayer("ch2.png"); 
    this->addChild(playerSpritesList[i]->GetSprite(), 0); 
    //SpritePlayersNode->addChild(playerSpritesList[i]->GetSprite()) 
} 

現在的問題 - 我怎麼會這樣精靈添加到一個節點?
這兩條底線都會導致錯誤,因爲我必須將Node傳遞給addChild()函數。

+0

在我發佈答案之前我想問你爲什麼不直接從sprite繼承?這將允許您使用已經構建到sprite中的繼承的初始化功能。您似乎正在添加一個抽象層,目前對我而言,這看起來沒有任何用處。你對這個東西有什麼打算? –

+0

我正在看另一個課程,我已經寫了這個。你在暗示,SpritePlayer類應該從sprite繼承嗎? 無論如何,我仍然需要以某種方式將Sprite轉換爲Node,以將其添加到場景中。 – Sagittario

+0

Sprite是一個節點,你不需要轉換任何東西。我會在下面發佈你的問題的答案。 –

回答

1

你要它推出的抽象,你不需要有一個水平的方式。角色本身可以是一個精靈,你擁有它的方式你的SpriteCharacter實際上並不是一個精靈,它是一個角色精靈的管理者。我通常使用以下模式。

Character.h

class Character : public cocos2d::Sprite 
{ 
public: 
    Character* createCharacterSprite(Vec2 position, std::string fileName); 
private: 
    Character(); 
} 

Character.cpp

Character* Character::createCharacterSprite(Vec2 position, std::string fileName) 
{ 
    auto character = new Character(); 
    if(character && character->initWithFile(fileName)) 
    { 
    character->autorelease(); 
    return character; 
    } 
} 

MainScene.cpp

for (int i = 0; i < 4; i++) 
{ 
    auto character = Character::createCharacterSprite(characterPosition, "filename.png"); 
    this->addChild(character); 
} 

這樣你Ç在CharacterSprite中使用'this'來操作,而不是指向實際字符精靈的指針。定位和動畫也將變得容易得多,因爲在角色和MainScene圖層之間不會有另一個可能具有不同錨點的節點。

1

Sprite是Node的一個子類,所以使用addChild沒有問題。 此行是可疑的:

playerSpritesList[i] = &SpritePlayer(); 

我會從你的代碼中刪除SpritePlayer()構造函數,因爲CREATE_FUNC(SpritePlayer)創建默認之一,它管理內存。然後你可以調用playerSpritesList [i] = SpritePlayer :: create();

你也可以寫USING_NS_CC;在SpritePlayer中(小心點結構 - 你必須編寫cocos2d :: Point,因爲iOS/Mac上的命名空間衝突)。

也爲會議功能的名稱應該以小寫開始:)