2015-10-06 6 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

Прежде чем я отправлю ответ, я хочу спросить, почему вы не наследовали напрямую от спрайта? Это позволит вам использовать унаследованные функции инициализации, уже встроенные в спрайт. Кажется, вы добавляете слой абстракции, который в настоящее время для меня выглядит так, как будто он не имеет никакой цели. Каково ваше намерение для этого объекта? –

+0

Я смотрел на другой класс, который у меня уже был при написании этого. Предполагаете ли вы, что класс SpritePlayer должен наследовать от спрайта? Во всяком случае, мне все равно придется преобразовать 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 - это подкласс узла, поэтому с помощью addChild нет проблем. Эта линия является подозрительным:

playerSpritesList[i] = &SpritePlayer(); 

Я бы удалить SpritePlayer() конструктор из кода, потому что CREATE_FUNC (SpritePlayer) создает по умолчанию один, который управляет памятью. А затем вы можете вызвать playerSpritesList [i] = SpritePlayer :: create();

Также вы можете написать USING_NS_CC; в SpritePlayer (остерегайтесь Point struct - вам нужно написать cocos2d :: Point из-за конфликта пространства имен на iOS/Mac).

Также для имен функций конвенции должен начинаться с строчными буквами :)

Смежные вопросы