将精灵添加到节点

问题描述:

我有一个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是一个节点,你不需要转换任何东西。我会在下面发布你的问题的答案。 –

你要它推出的抽象,你不需要有一个水平的方式。角色本身可以是一个精灵,你拥有它的方式你的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图层之间不会有另一个可能具有不同锚点的节点。

Sprite是Node的一个子类,所以使用addChild没有问题。 此行是可疑的:

playerSpritesList[i] = &SpritePlayer(); 

我会从你的代码中删除SpritePlayer()构造函数,因为CREATE_FUNC(SpritePlayer)创建默认之一,它管理内存。然后你可以调用playerSpritesList [i] = SpritePlayer :: create();

你也可以写USING_NS_CC;在SpritePlayer中(小心点结构 - 你必须编写cocos2d :: Point,因为iOS/Mac上的命名空间冲突)。

也为会议功能的名称应该以小写开始:)