将精灵添加到节点

Adding sprite to a node

我有一个 SpritePlayer class,里面装着我的精灵。

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() 函数。

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

playerSpritesList[i] = &SpritePlayer();

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

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

另外,为了约定函数名称应以小写字母开头:)

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